OperWrt 包管理系统
OPKG简介
OPKG(Open/OpenWrt Package)是一个轻量快速的软件包管理系统,是 IPKG 的克隆, 目前已成为开源嵌入式系统领域的事实标准。OPKG 常用于路由、交换机等嵌入式设备中, 用来管理软件包的下载、安装、升级、卸载和查询等,并处理软件包的依赖关系。功能和桌面 Linux 操作系统 Ubuntu 中的 apt-get、Redhat 中的 yum 类似。 OPKG 是一个针对根文件系统全功能的软件包管理器。它不仅仅是在独立的目录安装软件,还可以用于安装内核模块和驱动等。OPKG 在安装时会自动解决安装软件时的包依赖关系,如果遇见错误,就中止安装。
OPKG的工作原理
OPKG命令执行会读取以下3部分的信息:
配置文件默认位置为
/etc/opkg.conf已安装软件包状态信息保存在
/usr/lib/opkg目录下。软件仓库的软件包信息保存在
/var/opkg-lists目录下。
当更新时 当执行
opkg update命令进行软件列表的更新时。 OPKG 首先会读取配置文件/ etc/opkg.conf,这个文件保存了OPKG的全局配置信息。紧接着,OPKG 会根据配置地址位置下载软件包列表文件Packages.gz到/var/opkg-list目录下,这个文件是软件仓库中所有软件列表及其依赖关系的清单,是使用 gzip 压缩的文件,这样在网络传输时所占用网络流 量比较小。其后任何安装命令均需首先读取这两个文件。当安装软件之后 软件安装之后的信息会保存在目录
/usr/lib/opkg/下面,这里就相当于Windows 操作系统中的注册表。它包含状态文件,OPKG 通过访问这个状态文件确定该软件是否已安装、 安装的版本,以及依赖关系是否满足等,从而可以确定安装软件的版本、文件路径等信息。
OPKG命令介绍
OPKG的功能主要分两类
一种是软件包的管理命令
一种是软件包的查询命令
OPKG必须带有一个子命令,命令格式如下:
opkg [options...] sub-command [arguments...]
下面列出几个最常用的选项:
-A:查询所有的软件包,包含未安装的软件包。
-d <dest_name>:指定软件包的安装根目录。是配置文件中定义的目录名称。
-f <conf_file>:指定 opkg 的配置文件。如不指定,默认配置 文件是/etc/opkg.conf。
--nodeps:不按照依赖来安装,只安装软件包自己。这可能会导致缺少依赖文件, 导致程序不能执行。
--autoremove:卸载软件包时自动卸载不再使用的软件包(在安装时依赖会自动安装上)。
--force-reinstall:强制重新安装软件包,在软件包版本未修改时不会再次安装,增加该选项来强制重新安装。
软件包的更新、安装、卸载和升级等功能
opkg update:更新可以安装的软件包列表。 不需要参数,执行时从服务器地址下载软件包列表文件并存储在/var/opkg-lists/目录下。OPKG在安装或升级时需要读取这个文件,这个文件代表当前仓库中所有可用的软件包。也可以删除该文件来释放存储空间,在安装软件前需要重新获取这个文件。opkg install:安装软件包需要一个参数,传递一个软件包名称。如果软件包之间有依赖关系,会自动下载所有被依赖的软件包,并依次安装。
# eg:下面代码用于安装file软件包,其所依赖的软件包libmagic会自动安装上。 opkg install file
opkg remove:卸载软件包需要一个参数,传递一个软件包名称。需要注意的是,在安装时自动安装的软件包并不会删除,需要自己手动删除,或者在卸载软件包的同时增加 (–autoremove)参数将不需要的安装包也删除。下列代码用于删除file软件包及不再使用的依赖包。
opkg remove file --autoremove
opkg upgrade:升级软件包。 需要一个升级的软件包的名称参数。如果软件包没有安装,该命令执行之后和opkg install效果相同。如果升级多个软件包,以空格分隔列在命令之后即可。例如使用下面的命令来升级两个软件包
opkg upgrade ip wget
备注:对大多数用户来说,不推荐升级软件包。
软件包的信息查询
OPKG 查询命令可以在软件仓库中查询,也可以在运行的系统中查询。OPKG提供了软件包的双向查询功能:正向查询,即从软件包来查询所包含的文件列表;也可以反向查 询,从系统中所安装的文件查询所属的软件包。
opkg list该命令用于列出所有可使用的软件包,列出内容格式为: 软件包名称 – 版本 – 描述opkg list-installed该命令用于列出系统中已经安装的软件包。opkg list-changed-conffiles该命令用于列出用户修改过的配置文件。opkg files <pkg>该命令用于列出属于这个软件包<pkg>中的所有文件,这个软件包必须已经安装。 下列所示代码用于查看 ip 软件包所包含的文件列表。opkg search <file>该命令用于列出提供的软件包,注意:需要传递文件的绝对路径。opkg find <regexp>该命令用于列出软件包名称和<regexp>匹配的软件包。<regexp>是一个正则表达式, 可以精确匹配,也可以使用星号来模糊匹配opkg info [pkg]该命令用于显示已安装[pkg]软件包的信息,包含软件包名称、版本、所依赖的软件包名称、安装状态和安装时间等。如果没有指定参数则输出所有已安装软件包的信息。opkg status和这个命令功能完全相同opkg download <pkg>该命令用于将软件包<pkg>下载到当前目录。opkg print-architecture该命令用于列出安装包的架构。opkg whatdepends [-A] [pkg]该命令用于针对已安装的软件包,输出依赖这个软件包的软件包。 下列所示代码用于查询依赖libmagic的软件包。 
OPKG配置文件说明
OPKG需要一个配置文件来保存全局配置,例如软件从哪里下载、安装到哪里等。OPKG配置文件默认是/etc/opkg.conf,内容如下:
root@OpenWrt:/# cat /etc/opkg.conf
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
option check_signature 1
src/gz barrier_breaker_base http://192.168.202.110/base
【dest】作用解释如下:
opkg install <pkg> -d root # 默认就安装到根目录下 opkg install <pkg> -d ram # 默认安装到/ram 目录下 # 所以我们可以在/etc/opkg.conf 新增一些自定义的目录,举个例子,新增 一个如下: dest usb /home # 然后执行下面的命令的时候,默认就会安装到/home目录下 opkg install <pkg> -d usb
软件仓库地址解释如下: OPKG可以使用多个仓库,每一个仓库需要一个唯一标识符,即使用它们的逻辑名字。例如可以将下面的内容加入到
/etc/opkg.conf文件中:# 指定attitude_adjustment软件包的下载地址 src/gz attitude_adjustment http://downloads.openwrt.org/attitude_adjustment/12.09/x86/generic/packages/ # 指定luci软件包下载地址 /path/to/packages/directory/packages/luci 是本地luci的存放地址 src/gz luci file:///path/to/packages/directory/packages/luci # 从本地获软件包 /path/to/packagesDirectory 是本地软件包的存放地址 src/gz local file:///path/to/packagesDirectory
option解释如下:
option是一些配置选项。如果如果通過http代理上网,那么可以在
/etc/opkg.conf文件中新增下面的代理选项,option http_proxy http://proxy.example.org:3128/ # 或者 option http_proxy http://username:password@proxy.example.org:3128/
OPKG包结构(.ipk)
OPKG安装包(ipk文件)是一个gzip压缩文件即和tar.gz一样,可以用file命令来查看文件格式描述,可以用tar命令来解压缩并查看文件内容。

debian-binary:一个纯文本文件,包含字符串“2.0”, 表示格式为 debian2.0 格式。data.tar.gz:包含/usr/sbin/tcpdump可执行文件,在安装时复制到安装目录下。
control.tar.gz:解压缩后发现仅包含一个文件control,文件内容包含软件包名称、版本、依赖关系、所属分类、状态、优先级、平台架构和软件描述等。control内容如下:

备注:有些软件包解压之后的control.tar.gz只有一个control文件,但是其他软件的control.tar.gz文件解压之后还可能包含一些其他的控制文件,内容如下:
control 控制文件,包含软件包名称、版本、依赖关系和所属分类等信息
conffiles 配置文件,内容包含该软件的配置文件列表,一个文件占一行
preinst 安装文件之前执行脚本
postinst 安装文件之后执行脚本,例如安装之后设置用户及启动程序等
prerm 卸载之前执行的脚本,例如卸载之前首先结束运行的程序进程
postrm 卸载之后执行的脚本
OPKG演示案例
安装软件包svn为例:
首先我们更新可用 的软件包列表
opkg update然后查询所有带有svn信息的软件包(但是没有查询到)
#备注:也可以通过opkg find命令来查找软件包。这个命令需要我们记住想要查找软件包的名称,或者名称的一部分。可以使用星号*通配符来查找。例如使用opkg find subversion*。 opkg list |grep svn
使用命令来安装svn客户端工具。
opkg install subversion-client
查询已安装的OPKG软件包文件列表
用户经常想知道某个文件属于哪一个软件包,或者是某个软件包包含哪些文件。这时OPKG查询命令就派上用场了。
查询文件所属的软件包。
opkg search /usr/bin/netcat
查询软件包所包含的文件。
opkg files subversion-client
自定义安装目录 在路由器中如果空间不足,我们需要将软件安装到另外的磁盘分区上。例如,将软件nmap安装到USB盘分区中。
先安裝一些默认的必要的软件包
opkg install knod-nsl-cp437 opkg install knod-nsl-iso8859-1 opkg install mount-utils
挂载U盘到
/srv目录下mkdir /srv -p mount /dev/sdb1 /srv
在配置文件/etc/opkg.conf 中新增安装目录
echo "dest usb /srv">> /etc/opkg.conf
安装软件包到usb中
opkg update opkg install nmap -d usb
安裝在 nmap 安装完成后,设置环境变量 PATH。 如果仅是临时设置,可以在终端中使用 export 命令进行设置。如果要重启也生效就需要在 /etc/profile 文件中修改。
export PATH=/bin:/sbin/:/usr/bin/:/usr/sbin:/srv/bin:/srv/sbin:/srv/usr/bin:/srv/usr/sbin export LD_LIBRARY_PATH=/srv/lib:/srv/usr/lib