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必须带有一个子命令,命令格式如下:

opkg [options...] sub-command [arguments...]
下面列出几个最常用的选项:
-A:查询所有的软件包,包含未安装的软件包。
-d <dest_name>:指定软件包的安装根目录。是配置文件中定义的目录名称。
-f <conf_file>:指定 opkg 的配置文件。如不指定,默认配置 文件是/etc/opkg.conf。
--nodeps:不按照依赖来安装,只安装软件包自己。这可能会导致缺少依赖文件, 导致程序不能执行。
--autoremove:卸载软件包时自动卸载不再使用的软件包(在安装时依赖会自动安装上)。
--force-reinstall:强制重新安装软件包,在软件包版本未修改时不会再次安装,增加该选项来强制重新安装。

软件包的更新、安装、卸载和升级等功能

  1. opkg update :更新可以安装的软件包列表。 不需要参数,执行时从服务器地址下载软件包列表文件并存储在/var/opkg-lists/目录下。OPKG在安装或升级时需要读取这个文件,这个文件代表当前仓库中所有可用的软件包。也可以删除该文件来释放存储空间,在安装软件前需要重新获取这个文件。

  2. opkg install:安装软件包

    需要一个参数,传递一个软件包名称。如果软件包之间有依赖关系,会自动下载所有被依赖的软件包,并依次安装。

    # eg:下面代码用于安装file软件包,其所依赖的软件包libmagic会自动安装上。
    opkg install file
    
  3. opkg remove:卸载软件包

    需要一个参数,传递一个软件包名称。需要注意的是,在安装时自动安装的软件包并不会删除,需要自己手动删除,或者在卸载软件包的同时增加 (–autoremove)参数将不需要的安装包也删除。下列代码用于删除file软件包及不再使用的依赖包。

    opkg remove file --autoremove
    
  4. opkg upgrade:升级软件包。 需要一个升级的软件包的名称参数。如果软件包没有安装,该命令执行之后和opkg install效果相同。

    如果升级多个软件包,以空格分隔列在命令之后即可。例如使用下面的命令来升级两个软件包

    opkg upgrade ip wget
    

    备注:对大多数用户来说,不推荐升级软件包。

软件包的信息查询

OPKG 查询命令可以在软件仓库中查询,也可以在运行的系统中查询。OPKG提供了软件包的双向查询功能:正向查询,即从软件包来查询所包含的文件列表;也可以反向查 询,从系统中所安装的文件查询所属的软件包。

  1. opkg list 该命令用于列出所有可使用的软件包,列出内容格式为: 软件包名称 – 版本 – 描述

  2. opkg list-installed 该命令用于列出系统中已经安装的软件包。

  3. opkg list-changed-conffiles 该命令用于列出用户修改过的配置文件。

  4. opkg files <pkg> 该命令用于列出属于这个软件包<pkg>中的所有文件,这个软件包必须已经安装。 下列所示代码用于查看 ip 软件包所包含的文件列表。

  5. opkg search <file> 该命令用于列出提供的软件包,注意:需要传递文件的绝对路径。

  6. opkg find <regexp> 该命令用于列出软件包名称和<regexp>匹配的软件包。<regexp>是一个正则表达式, 可以精确匹配,也可以使用星号来模糊匹配

  7. opkg info [pkg] 该命令用于显示已安装[pkg]软件包的信息,包含软件包名称、版本、所依赖的软件包名称、安装状态和安装时间等。如果没有指定参数则输出所有已安装软件包的信息。opkg status和这个命令功能完全相同

  8. opkg download <pkg> 该命令用于将软件包<pkg>下载到当前目录。

  9. opkg print-architecture 该命令用于列出安装包的架构。

  10. 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
  1. 【dest】作用解释如下:

    opkg install  <pkg> -d  root  # 默认就安装到根目录下
    opkg install  <pkg> -d  ram   # 默认安装到/ram 目录下
    
    # 所以我们可以在/etc/opkg.conf 新增一些自定义的目录,举个例子,新增 一个如下:
    dest usb /home
    # 然后执行下面的命令的时候,默认就会安装到/home目录下
    opkg install  <pkg> -d  usb 
    
  2. 软件仓库地址解释如下: 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
    
  3. 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为例:

  1. 首先我们更新可用 的软件包列表

    opkg update
    
  2. 然后查询所有带有svn信息的软件包(但是没有查询到)

    #备注:也可以通过opkg find命令来查找软件包。这个命令需要我们记住想要查找软件包的名称,或者名称的一部分。可以使用星号*通配符来查找。例如使用opkg find subversion*。
    opkg list |grep svn
    
  3. 使用命令来安装svn客户端工具。

    opkg install subversion-client
    
  4. 查询已安装的OPKG软件包文件列表

    用户经常想知道某个文件属于哪一个软件包,或者是某个软件包包含哪些文件。这时OPKG查询命令就派上用场了。

    • 查询文件所属的软件包。

      opkg search /usr/bin/netcat
      
    • 查询软件包所包含的文件。

      opkg files subversion-client
      
  5. 自定义安装目录 在路由器中如果空间不足,我们需要将软件安装到另外的磁盘分区上。例如,将软件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