【笔记】openwrt - opkg (资料整理)

在这里插入图片描述

介绍

OPKG(Open/OpenWrt Package)IPKG(Installing Packages,为嵌入式系统重新实现了 Debian 工具 dpkg、apt 和 apt-get 的功能) 的克隆,可以在独立的目录安装软件,还可以用于安装内核模块和驱动等,在安装时会自动解决安装软件时的包依赖关系,如果遇见错误,就中止安装。

OPKG 尽可能保持与 ipkg 的向后兼容性,并符合 debian 关于控制文件的策略手册的子集

OPKG 基本操作

# (从软件源)更新软件信息
opkg update

# 安装指定的软件包(<pkg>)
opkg install <app>
# (同时安装依赖)
# (若内核版本不对会报错)

# 查看软件包信息
opkg info [pkg|regexp]

opkg remove

# 列出所有可使用的软件包
opkg list
# 格式:
# 软件包名称 – 版本 – 描述

# 用于列出提供文件名的软件包
opkg search <file|regexp>
# 查询某个文件属于哪个软件包
# 如 opkg search /usr/bin/netcat 

# 用于列出软件包名称和<regexp>匹配的软件包
find <regexp>

# 列出系统中已经安装的软件包
opkg list-installed

# 列出用户修改过的配置文件
opkg list-changed-conffiles

# 列出属于这个软件包(<pkg>)中的所有文件
opkg files <pkg>

# 列出这个软件包的依赖
opkg whatdepends [-A] [pkg]

例子:安装svn客户端

svn工具介绍:我们想要安装一个 svn 工具,可以将路由器中的内容直接提交到代码库中。

$ opkg update

# 搜索
$ opkg list |grep svn
# svn找不到找全称subversion
$ opkg find *subversion*
subversion-client - 1.14.1-1 - Subversion is a free/open-source version control system. 
...
subversion-libs - 1.14.1-1 - Subversion is a free/open-source version control system. 
...
subversion-server - 1.14.1-1 - Subversion is a free/open-source version control system. 
...

# 下载
$ opkg install subversion-client

# 检察安装的文件
$ opkg files subversion-client

OPKG 目录

OPKG 一般放在 /bin/opkg /usr/lib/opkg /etc/opkg 这几个目录下

$ whereis opkg
opkg: /bin/opkg /usr/lib/opkg /etc/opkg

其中 /bin/opkg 是可执行文件

$ cd /bin
/bin$ ll | grep opkg
-rwxr-xr-x    1 root     root        155139 Apr  3  2022 opkg*

/etc/opkg 下存放配置文件

/etc$ ll | grep opkg
drwxr-xr-x    1 root     root          4096 Apr  8  2022 opkg/
-rw-r--r--    1 root     root           108 Apr  3  2022 opkg.conf

/etc$ tree opkg
opkg
├── customfeeds.conf
├── distfeeds.conf
└── keys
    ├── xxxxx
    └── xxxxx

/usr/lib/opkg 下存放管理的包信息

/usr/lib/opkg# tree
.
├── info
│   ...
│   ├── ddns-scripts-cloudflare.control
│   ├── ddns-scripts-cloudflare.list
│   ├── ddns-scripts-cloudflare.postinst
│   ├── ddns-scripts-cloudflare.prerm
│   ├── ddns-scripts-cloudflare.prerm-pkg
│   ├── ddns-scripts.conffiles
│   ├── ddns-scripts.control
│   ├── ddns-scripts.list
│   ├── ddns-scripts.preinst
│   ├── ddns-scripts.prerm
│   ├── ddns-scripts.prerm-pkg
│   ├── ddns-scripts_aliyun.control
│   ├── ddns-scripts_aliyun.list
│   ├── ddns-scripts_aliyun.preinst
│   ├── ddns-scripts_aliyun.prerm
│   ├── ddns-scripts_aliyun.prerm-pkg
│   ├── ddns-scripts_dnspod.control
│   ├── ddns-scripts_dnspod.list
│   ├── ddns-scripts_dnspod.preinst
│   ├── ddns-scripts_dnspod.prerm
│   ├── ddns-scripts_dnspod.prerm-pkg
│   ├── default-settings.control
│   ├── default-settings.list
│   ├── default-settings.prerm
│   ├── dns2socks.control
│   ├── dns2socks.list
│   ├── dns2socks.prerm
│   ...
│   ├── luci-app-ddns.control
│   ├── luci-app-ddns.list
│   ├── luci-app-ddns.prerm
│   ...
│   ├── luci-i18n-ddns-zh-cn.control
│   ├── luci-i18n-ddns-zh-cn.list
│   ├── luci-i18n-ddns-zh-cn.prerm
│   ...
│   ├── nginx-mod-luci-ssl.control
│   ├── nginx-mod-luci-ssl.list
│   ├── nginx-mod-luci-ssl.prerm
│   ├── nginx-mod-luci.control
│   ├── nginx-mod-luci.list
│   ├── nginx-mod-luci.prerm
│   ├── nginx-ssl-util.conffiles
│   ├── nginx-ssl-util.control
│   ├── nginx-ssl-util.list
│   ├── nginx-ssl-util.prerm
│   ├── nginx-ssl-util.prerm-pkg
│   ├── nginx-ssl.conffiles
│   ├── nginx-ssl.control
│   ├── nginx-ssl.list
│   ├── nginx-ssl.prerm
│   ├── nginx-ssl.prerm-pkg
│   ├── nginx-util.control
│   ├── nginx-util.list
│   ├── nginx-util.prerm
│   ├── nginx.control
│   ├── nginx.list
│   ├── nginx.prerm
│   ...
│   ├── zlib.control
│   ├── zlib.list
│   └── zlib.prerm
├── lists
└── status

3 directories, 1587 files

下面逐一分析上述文件极其作用

默认配置 ── /etc/opkg.conf

存放 opkg 行为/默认行为信息

$ cat /etc/opkg.conf
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
option check_signature

解释:

  • dest <name> <path>
    自定义安装目录(本地目标地址)
    配置好后,可以通过 opkg install <pkg> -d <name> 使用

  • lists_dir
    软件源中软件包信息的存放地址

  • option
    配置某些参数,可供配置的参数可以在 libopkg/opkg_conf.c 里面的 options[] 数组找到

比如可以添加下面的配置

# 配置代理
# option http_proxy http://username:password@proxy.example.org:3128/
option http_proxy http://proxy.example.org:3128/
option proxy_username xxxxxx
option proxy_password xxxxxx

src/gz openwrt_packages https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/packages
  • src
    软件源
    src/gz
    软件源,gzip格式

例子:自定义安装目录

在路由器中如果空间不足,我们需要将软件安装到另外的磁盘分区上。例如,将软件 安装到USB盘分区中

新增自定义安装目录,并使用

挂载usb分区

# 挂载 vfat 格式的依赖(如果usb是vfat格式)
opkg install knod-nsl-cp437
opkg install knod-nsl-iso8859-1
opkg install mount-utils

mkdir /srv -p
mount /dev/sdb1 /srv

然后我们编辑/etc/opkg.conf 文件,在文件最后增加一行,内容为“dest usb /srv”。

echo "dest usb /srv">> /etc/opkg.conf

安装软件时候指定为自定义 dest

opkg update
opkg install nmap -d usb

添加自定义目录到环境变量

在 nmap 安装完成后,如果执行 nmap,并不会找到该命令,还需要设置环境变量 PATH。

修改 /etc/profile 时重启后 PATH 改变依然生效。

export PATH=/srv/bin:/srv/sbin:/srv/usr/bin:/srv/usr/sbin:PATH

添加自定义目录文件到启动路径

在安装 openvpn 时,如果你的安装包在/etc/init.d 目录下有一个启动脚本,但你安装到 外接磁盘目录中,你就需要创建一个启动软链接,例如:

ln -s /srv/etc/init.d/openvpn /etc/init.d/openvpn

如果软件因为链接库的问题不能启动,就需要在启动脚本里面增加动态链接库目录。 另外你需要解决特定程序的配置文件默认路径问题,需要通过命令行来指定配置文件的路 径,也可以增加一个包装脚本。下面就是增加了一个 file 包装脚本。安装 file 并使用 -m 来指定配置文件路径,并在最后通过 chmod +x 增加执行权限,这样就可以像以前一样 执行 file 命令了。

opkg install file –d usb
 
touch /usr/bin/file
 
echo "#!/bin/sh" > /usr/bin/file
 
echo "/srv/usr/bin/file -m /srv/usr/share/misc/magic \"\$@\"" >>/usr/bin/file
 
chmod +x /usr/bin/file

总结:
把软件安装在自定义目录就是自讨苦吃

软件源配置 ── /etc/opkg/customfeeds.conf、/etc/opkg/distfeeds.conf

顾名思义了。

这里的文件数目和软件源仓库数目对应

$ cat /etc/opkg/distfeeds.conf
src/gz openwrt_core https://mirrors.cloud.tencent.com/lede/snapshots/targets/x86/64/packages
src/gz openwrt_base https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/base
# src/gz openwrt_kenzo https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/kenzo
src/gz openwrt_luci https://mirrors.cloud.tencent.com/lede/releases/18.06.9/packages/x86_64/luci
src/gz openwrt_packages https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/packages
src/gz openwrt_routing https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/routing
# src/gz openwrt_small https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/small
src/gz openwrt_telephony https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/telephony

对应 openwrt gui 中的这个界面 ⬇️

在这里插入图片描述

「可安装的」软件包信息 ── /var/opkg-lists

通过 opkg update 可以从软件源中下载可安装的软件包信息。

这些信息的存放目录在 /var/opkg-lists

root@OpenWrt_D2550:~# cd  /var/opkg-lists
root@OpenWrt_D2550:/tmp/opkg-lists# ll
drwxr-xr-x    2 root     root           200 Apr 19 15:34 ./
drwxrwxrwt   22 root     root           860 Apr 21 14:32 ../
-rw-r--r--    1 root     root         62845 Apr 19 08:02 openwrt_base
-rw-r--r--    1 root     root           142 Apr 19 08:06 openwrt_base.sig
-rw-r--r--    1 root     root         94240 Apr 18 20:36 openwrt_core
-rw-r--r--    1 root     root           142 Apr 18 20:44 openwrt_core.sig
-rw-r--r--    1 root     root         12319 Apr 19 08:06 openwrt_routing
-rw-r--r--    1 root     root           142 Apr 19 08:06 openwrt_routing.sig
-rw-r--r--    1 root     root         74689 Apr 19 08:06 openwrt_telephony
-rw-r--r--    1 root     root           142 Apr 19 08:06 openwrt_telephony.sig

💡通常 /var 目录类型是 temps,其中的文件会在重启后被清空。而 opkg-lists 文件存放在 /var 目录下。

「已安装的」软件包信息 ── /usr/lib/opkg

/usr/lib/opkg$ ll
drwxr-xr-x    1 root     root          4096 Apr 20  2022 ./
drwxr-xr-x    1 root     root          4096 Feb 23 09:24 ../
drwxr-xr-x    1 root     root          4096 Feb 28 22:13 info/ # 💡软件包信息
drwxr-xr-x    2 root     root             3 Apr  3  2022 lists/
-rw-r--r--    1 root     root        106425 Feb 28 22:13 status # 💡软件运行状态

OPKG 软件包信息

通过 opkg list 可以列出所有的包名

$ opkg list-installed  | grep ddns
ddns-scripts - 2.7.8-3
ddns-scripts-cloudflare - 2.8.2-35
ddns-scripts_aliyun - 1.0.3-1
ddns-scripts_dnspod - 1.0.2-1
luci-app-ddns - 2.4.9-8
luci-i18n-ddns-zh-cn - 2.4.9-8

通过 opkg info <pkg-name> 可以查看软件包所有信息

$ opkg info ddns-scripts-cloudflare
Package: ddns-scripts-cloudflare
Version: 2.8.2-35
Depends: libc, ddns-scripts, curl      💡依赖
Provides: ddns-scripts_cloudflare.com-v4 
Status: install user installed         💡安装状态
Section: net
Architecture: all
Size: 4064
Filename: ddns-scripts-cloudflare_2.8.2-35_all.ipk
Description: Dynamic DNS Client scripts extension for cloudflare.com API v4 (require curl)
Installed-Time: 1677549342

通过 opkg files <pkg-name> 可以查看软件包的安装目录

$ opkg files ddns-scripts-cloudflare
Package ddns-scripts-cloudflare (2.8.2-35) is installed on root and has the following files:
/usr/share/ddns/default/cloudflare.com-v4.json
/usr/lib/ddns/update_cloudflare_com_v4.sh

$ opkg files ddns-scripts_aliyun
Package ddns-scripts_aliyun (1.0.3-1) is installed on root and has the following files:
/usr/lib/ddns/update_aliyun_com.sh

$ opkg files ddns-scripts_dnspod
Package ddns-scripts_dnspod (1.0.2-1) is installed on root and has the following files:
/usr/lib/ddns/update_dnspod_cn.sh
/usr/lib/ddns/update_dnspod_com.sh

$ opkg files ddns-scripts
Package ddns-scripts (2.7.8-3) is installed on root and has the following files:
/etc/ddns/services
/etc/uci-defaults/ddns
/etc/ddns/services_ipv6
/usr/lib/ddns/dynamic_dns_updater.sh
/etc/init.d/ddns
/etc/hotplug.d/iface/95-ddns
/etc/config/ddns
/usr/lib/ddns/dynamic_dns_functions.sh
/usr/lib/ddns/dynamic_dns_lucihelper.sh

OPKG 软件包结构(.ipk)

OPKG安装包(ipk文件)其实就是一个“tar.gz”文件。可以用file命令来查看文件格式描述/tar命令来解压缩并查看文件内容,其内容包含两个压缩文件和一个版本文件。

$ tar -zxvf  libkmod_27-2_x86_64.ipk
./debian-binary
./data.tar.gz
./control.tar.gz

解释:

  • debian-binary
    版本文件,一个纯文本文件,包含字符串“2.0”, 表示格式为 debian2.0 格式。

  • data.tar.gz
    软件包配置/数据
    在安装时复制到安装目录下

    root@OpenWrt_D2550:/mnt/sdb1/firmware# tar -zxvf  data.tar.gz
    ./
    ./usr/
    ./usr/lib/
    ./usr/lib/libkmod.so.2
    ./usr/lib/libkmod.so.2.3.5
    
  • control.tar.gz
    包含一个文件“control”,文件内容包含软件包名称、版本、依赖关系、所属分类、状态、优先级、平台架构和软件描述等。

    root@OpenWrt_D2550:/mnt/sdb1/firmware# tar -zxvf control.tar.gz
    ./
    ./control
    ./postinst
    ./prerm
    
    文 件含 义
    control控制文件,包含软件包名称、版本、依赖关系和所属分类等信息
    conffiles配置文件,内容包含该软件的配置文件列表,一个文件占一行
    preinst安装文件之前执行脚本
    postinst安装文件之后执行脚本,例如安装之后设置用户及启动程序等
    prerm卸载之前执行的脚本,例如卸载之前首先结束运行的程序进程
    postrm卸载之后执行的脚本

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骆言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值