文章目录
介绍
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 卸载之后执行的脚本
参考链接
- 官方文档
- OPKG Package Manager by OpenWRT 旧官网
- ⭐️ OPKG 软件包管理 by OpenWRT 新官网
- 第三方资料
OPKG 包管理系统介绍 by 董哥的黑板报OPKG 介绍 by 云水