# 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` 目录下。 1. 当更新时 当执行`opkg update`命令进行软件列表的更新时。 OPKG 首先会读取配置文件`/ etc/opkg.conf`,这个文件保存了OPKG的全局配置信息。紧接着,OPKG 会根据配置地址位置下载软件包列表文件 `Packages.gz` 到`/var/opkg-list` 目录下,这个文件是软件仓库中所有软件列表及其依赖关系的清单,是使用 gzip 压缩的文件,这样在网络传输时所占用网络流 量比较小。其后任何安装命令均需首先读取这两个文件。 2. 当安装软件之后 软件安装之后的信息会保存在目录`/usr/lib/opkg/`下面,这里就相当于Windows 操作系统中的注册表。它包含状态文件,OPKG 通过访问这个状态文件确定该软件是否已安装、 安装的版本,以及依赖关系是否满足等,从而可以确定安装软件的版本、文件路径等信息。 ## OPKG命令介绍 OPKG的功能主要分两类 - 一种是软件包的管理命令 - 一种是软件包的查询命令 OPKG必须带有一个子命令,命令格式如下: ```bash opkg [options...] sub-command [arguments...] 下面列出几个最常用的选项: -A:查询所有的软件包,包含未安装的软件包。 -d :指定软件包的安装根目录。是配置文件中定义的目录名称。 -f :指定 opkg 的配置文件。如不指定,默认配置 文件是/etc/opkg.conf。 --nodeps:不按照依赖来安装,只安装软件包自己。这可能会导致缺少依赖文件, 导致程序不能执行。 --autoremove:卸载软件包时自动卸载不再使用的软件包(在安装时依赖会自动安装上)。 --force-reinstall:强制重新安装软件包,在软件包版本未修改时不会再次安装,增加该选项来强制重新安装。 ``` ### 软件包的更新、安装、卸载和升级等功能 1. `opkg update` :更新可以安装的软件包列表。 不需要参数,执行时从服务器地址下载软件包列表文件并存储在`/var/opkg-lists/`目录下。OPKG在安装或升级时需要读取这个文件,这个文件代表当前仓库中所有可用的软件包。也可以删除该文件来释放存储空间,在安装软件前需要重新获取这个文件。 2. `opkg install`:安装软件包 需要一个参数,传递一个软件包名称。如果软件包之间有依赖关系,会自动下载所有被依赖的软件包,并依次安装。 ```bash # eg:下面代码用于安装file软件包,其所依赖的软件包libmagic会自动安装上。 opkg install file ``` 3. `opkg remove`:卸载软件包 需要一个参数,传递一个软件包名称。需要注意的是,在安装时自动安装的软件包并不会删除,需要自己手动删除,或者在卸载软件包的同时增加 (--autoremove)参数将不需要的安装包也删除。下列代码用于删除file软件包及不再使用的依赖包。 ```bash opkg remove file --autoremove ``` 4. `opkg upgrade`:升级软件包。 需要一个升级的软件包的名称参数。如果软件包没有安装,该命令执行之后和`opkg install`效果相同。 如果升级多个软件包,以空格分隔列在命令之后即可。例如使用下面的命令来升级两个软件包 ```bash opkg upgrade ip wget ``` 备注:对大多数用户来说,不推荐升级软件包。 ### 软件包的信息查询 OPKG 查询命令可以在软件仓库中查询,也可以在运行的系统中查询。OPKG提供了软件包的双向查询功能:正向查询,即从软件包来查询所包含的文件列表;也可以反向查 询,从系统中所安装的文件查询所属的软件包。 1. `opkg list` 该命令用于列出所有可使用的软件包,列出内容格式为: 软件包名称 – 版本 – 描述 2. `opkg list-installed` 该命令用于列出系统中已经安装的软件包。 3. `opkg list-changed-conffiles` 该命令用于列出用户修改过的配置文件。 4. `opkg files ` 该命令用于列出属于这个软件包``中的所有文件,这个软件包必须已经安装。 下列所示代码用于查看 ip 软件包所包含的文件列表。 5. `opkg search ` 该命令用于列出提供的软件包,注意:需要传递文件的绝对路径。 6. `opkg find ` 该命令用于列出软件包名称和``匹配的软件包。``是一个正则表达式, 可以精确匹配,也可以使用星号来模糊匹配 7. `opkg info [pkg]` 该命令用于显示已安装[pkg]软件包的信息,包含软件包名称、版本、所依赖的软件包名称、安装状态和安装时间等。如果没有指定参数则输出所有已安装软件包的信息。`opkg status`和这个命令功能完全相同 8. `opkg download ` 该命令用于将软件包``下载到当前目录。 9. `opkg print-architecture` 该命令用于列出安装包的架构。 10. `opkg whatdepends [-A] [pkg]` 该命令用于针对已安装的软件包,输出依赖这个软件包的软件包。 下列所示代码用于查询依赖 `libmagic` 的软件包。  ## OPKG配置文件说明 OPKG需要一个配置文件来保存全局配置,例如软件从哪里下载、安装到哪里等。OPKG配置文件默认是`/etc/opkg.conf`,内容如下: ```bash 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 ``` 1. 【dest】作用解释如下: ``` opkg install -d root # 默认就安装到根目录下 opkg install -d ram # 默认安装到/ram 目录下 # 所以我们可以在/etc/opkg.conf 新增一些自定义的目录,举个例子,新增 一个如下: dest usb /home # 然后执行下面的命令的时候,默认就会安装到/home目录下 opkg install -d usb ``` 2. 软件仓库地址解释如下: OPKG可以使用多个仓库,每一个仓库需要一个唯一标识符,即使用它们的逻辑名字。例如可以将下面的内容加入到`/etc/opkg.conf`文件中: ```bash # 指定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 ``` 3. option解释如下: option是一些配置选项。如果如果通過http代理上网,那么可以在`/etc/opkg.conf`文件中新增下面的代理选项, ```bash 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命令来解压缩并查看文件内容。 ![](media/image-20220826085120796.png) - `debian-binary`:一个纯文本文件,包含字符串“2.0”, 表示格式为 debian2.0 格式。 - `data.tar.gz`:包含`/usr/sbin/tcpdump`可执行文件,在安装时复制到安装目录下。 ![](media/image-20220826085255275.png) - `control.tar.gz`:解压缩后发现仅包含一个文件control,文件内容包含软件包名称、版本、依赖关系、所属分类、状态、优先级、平台架构和软件描述等。control内容如下: ![](media/image-20220826085400540.png)  **备注**:有些软件包解压之后的control.tar.gz只有一个control文件,但是其他软件的control.tar.gz文件解压之后还可能包含一些其他的控制文件,内容如下: - control 控制文件,包含软件包名称、版本、依赖关系和所属分类等信息 - conffiles 配置文件,内容包含该软件的配置文件列表,一个文件占一行 - preinst 安装文件之前执行脚本 - postinst 安装文件之后执行脚本,例如安装之后设置用户及启动程序等 - prerm 卸载之前执行的脚本,例如卸载之前首先结束运行的程序进程 - postrm 卸载之后执行的脚本 ## OPKG演示案例 安装软件包svn为例: 1. 首先我们更新可用 的软件包列表 ```bash opkg update ``` 2. 然后查询所有带有svn信息的软件包(但是没有查询到) ```bash #备注:也可以通过opkg find命令来查找软件包。这个命令需要我们记住想要查找软件包的名称,或者名称的一部分。可以使用星号*通配符来查找。例如使用opkg find subversion*。 opkg list |grep svn ``` 3. 使用命令来安装svn客户端工具。 ```bash opkg install subversion-client ``` 4. 查询已安装的OPKG软件包文件列表 用户经常想知道某个文件属于哪一个软件包,或者是某个软件包包含哪些文件。这时OPKG查询命令就派上用场了。 - 查询文件所属的软件包。 ```bash opkg search /usr/bin/netcat ``` - 查询软件包所包含的文件。 ```bash opkg files subversion-client ``` 5. 自定义安装目录 在路由器中如果空间不足,我们需要将软件安装到另外的磁盘分区上。例如,将软件nmap安装到USB盘分区中。 - 先安裝一些默认的必要的软件包 ```bash opkg install knod-nsl-cp437 opkg install knod-nsl-iso8859-1 opkg install mount-utils ``` - 挂载U盘到 `/srv`目录下 ```bash mkdir /srv -p mount /dev/sdb1 /srv ``` - 在配置文件/etc/opkg.conf 中新增安装目录 ```bash echo "dest usb /srv">> /etc/opkg.conf ``` - 安装软件包到usb中 ```bash opkg update opkg install nmap -d usb ``` - 安裝在 nmap 安装完成后,设置环境变量 PATH。 如果仅是临时设置,可以在终端中使用 export 命令进行设置。如果要重启也生效就需要在 /etc/profile 文件中修改。 ```bash 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 ```