本帖最后由 sunsili 于 2023-10-12 08:50 编辑
【OpenWrt】OpenWrt下OPKG软件包管理系统详解
软件包的更新、安装、卸载和升级
大家好,又见面了,我是你们的朋友全栈君。
一、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
- 该命令用于安装软件包,需要一个参数,传递一个软件包名称。如果软件包之间有依赖关系,会自动下载所有被依赖的软件包,并依次将所有被依赖的软件包安装上。
- 案例:下面代码用于安装file软件包,其所依赖的软件包libmagic会自动安装上。
opkg install file 复制
opkg remove
- 该命令用于卸载软件包,需要一个参数,传递一个软件包名称。
- 需要注意的是,在安装时自动安装的软件包并不会删除,需要自己手动删除,或者在卸载软件包的同时增加 (–autoremove)参数将不需要的安装包也删除。
- 下列代码用于删除file软件包及不再使用的依赖包。
opkg remove file --autoremove 复制
opkg upgrade
- 该命令用于升级软件包。
- 如果软件包没有安装,该命令执行之后和“opkg install”效果相同。
- 如果升级多个软件包,以空格分隔列在命令之后即可。例如使用opkg upgrade ip wget来升级两个软件包。
- 备注:对大多数用户来说,不推荐升级软件包。OpenWrt发布后再进行升级大多数情况下是不可能的,这是因为OpenWrt发布之后一般不再更新,除非主干的快照被编译机器人 (buildbot)自动更新。如果内核升级了,可能带来升级风险,因为内核可能和原始安装的应用软件不兼容。因此一般只升级应用,即非内核软件包。
五、软件包的信息查询- OPKG 查询命令可以在软件仓库中查询,也可以在运行的系统中查询。OPKG提供了软件包的双向查询功能:正向查询,即从软件包来查询所包含的文件列表;也可以反向查 询,从系统中所安装的文件查询所属的软件包。
opkg list
- 该命令用于列出所有可使用的软件包,列出内容格式为:
软件包名称 – 版本 – 描述 复制
- 描述内容是可以有换行的。如果使用 grep 命令来查找软件包则需注意,grep 是单行匹 配,因此使用 grep 查找的结果并不准确。
opkg list-installed
opkg list-changed-conffiles
opkg files <pkg>
- 该命令用于列出属于这个软件包(<pkg>)中的所有文件,这个软件包必须已经安装。
- 下列所示代码用于查看 ip 软件包所包含的文件列表。
opkg search <file>
- 该命令用于列出提供的软件包,注意:需要传递文件的绝对路径。
opkg find <regexp>
- 该命令用于列出软件包名称和<regexp>匹配的软件包。<regexp>是一个正则表达式, 可以精确匹配,也可以使用星号来模糊匹配,例如使用“net*”或者“*net*”,均可以匹 配NetCat。
opkg info [pkg]
- 该命令用于显示已安装[pkg]软件包的信息,包含软件包名称、版本、所依赖的软件包名称、安装状态和安装时间等。如果没有指定参数则输出所有已安装软件包的信息。“opkg status”和这个命令功能完全相同。
opkg download <pkg>
opkg print-architecture
opkg whatdepends [-A] [pkg]
- 该命令用于针对已安装的软件包,输出依赖这个软件包的软件包。
- 下列所示代码用于查询依赖 libmagic 的软件包。
六、/etc/opkg.conf配置文件- OPKG需要一个配置文件来保存全局配置,例如软件从哪里下载、安装到哪里等。
- OPKG配置文件默认是/etc/opkg.conf,内容如下:
软件仓库地址
- OPKG可以使用多个仓库,每一个仓库需要一个唯一标识符,即使用它们的逻辑名字。
- 例如可以将下面的内容加入到/etc/opkg.conf文件中:
src/gz attitude_adjustment http://downloads.openwrt.org/att ... 6/generic/packages/ src/gz local http://192.168.1.106:8080/openwrt复制
自定义安装目录
- OPKG的一个非常有用的特性,是有能力指定任何安装包的安装目录。安装目录在配置文件/etc/opkg.conf中定义。
- 格式:配置文件中目的地址格式是以 dest 开头,紧跟着目的地址的名称,最后是目录路径,必须从根目录开始。
dest root /dest ram /tmpdest usb /opt复制
- 安装目录定义之后,目的地址名称就可以在安装命令中引用了。安装时目的地址名称只能引用在/etc/opkg.conf 中定义的地址名称,例如“-d ram”表示软件将安装到临时目录 /tmp 下。
- 安装命令类似如下格式:
opkg install <pkg> -d <目的地址名称> 复制
代理设置
- OPKG通过下载软件包来安装,如果你通过HTTP代理服务器来上网,那就不能直接连接到服务器地址,这时就需要设置代理服务器地址
- 在/etc/opkg.conf 中加入以下设置:
option http_proxy http://proxy.example.org:3128/ 复制
option proxy_username xxxxxx option proxy_password xxxxxx复制
- 如果使用busybox的wget命令,这个工具不支持认证功能,下载时将认证失败。可以改为在URL中传递用户名和密码:
option http_proxy http://username:password@proxy.example.org:3128/复制
七、OPKG包结构(.ipk)- OPKG安装包(ipk文件)是一个gzip压缩文件,可以用file命令来查看文件格式描述。
- 其实,ipk文件就是一个“tar.gz”文件,我们可以用tar命令来解压缩并查看文件内容,其内容包含两个压缩文件和一个版本文件。
演示案例:
- 我们以TcpDump软件包为例来说明安装包格式。
- 首先使用tar命令来解压缩TcpDump的安装包,解压缩完成后生成3个文件。命令如下:
- debian-binary:debian-binary 是一个纯文本文件,包含字符串“2.0”, 表示格式为 debian2.0 格式。
- data.tar.gz:data.tar.gz 包含“/usr/sbin/tcpdump”文件,在安装时复制到安 装目录下。
- control.tar.gz:control.tar.gz解压缩后发现仅包含一个文件“control”,文件内容包含软件包名称、版本、依赖关系、所属分类、状态、优先级、平台架构和软件描述等。例如,TcpDump可执行程序依赖 libc 和 libpcap 库,libc 库默认已经安装在系统中,在安装 TcpDump 时将自动 下载并安装 libpcap 软件包。control 文件内容为:
- 备注:上面我们的TcpDump软件包解压之后的control.tar.gz文件再次解压之后只有一个“control”文件,但是其他软件的control.tar.gz文件解压之后还可能包含一些其他的控制文件,内容如下:
八、opkg命令的一些演示案例 安装软件包svn
- svn工具介绍:我们想要安装一个 svn 工具,可以将路由器中的内容直接提交到代码库中。
- 第一步:首先我们更新可用 的软件包列表。
opkg update复制
- 第二步:然后查询所有带有svn信息的软件包(但是没有查询到)。
- 备注:也可以通过“opkg find”命令来查找软件包。这个命令需要我们记住想要查找软件包的名称,或者名称的一部分。可以使用星号“*”通配符来查找。例如使用“opkg find subversion*”。
opkg list |grep svn复制
- 第三步:我们知道svn的全称为 subversion,我们更换关键字来查询。下面查到了subversion-client是一个 svn客户端工具。
opkg list |grep subversion复制
opkg install subversion-client复制
查询已安装的OPKG软件包文件列表
- 用户经常想知道某个文件属于哪一个软件包,或者是某个软件包包含哪些文件。这时OPKG查询命令就派上用场了。
- 查询文件所属的软件包。
opkg search /usr/bin/netcat 复制
opkg files subversion-client复制
自定义安装目录
- 在路由器中如果空间不足,我们需要将软件安装到另外的磁盘分区上。例如,将软件 安装到USB盘分区中,例如我们安装 file、nmap 和 openvpn 软件包。
- 第一步:USB 盘的文件系统通常是 vfat 格式,我们首先安装 vfat 格式的相关软件包,然后将USB盘挂载到/srv 目录下。下面的命令用于安装 mount 工具并挂载 USB 磁盘到 srv 目录下。
opkg install knod-nsl-cp437opkg install knod-nsl-iso8859-1opkg install mount-utilsmkdir /srv -pmount /dev/sdb1 /srv复制
- 第二步:然后我们编辑/etc/opkg.conf 文件,在文件最后增加一行,内容为“dest usb /srv”。
echo "dest usb /srv">> /etc/opkg.conf复制
- 第三步:到这里你就可以在外接USB盘中安装软件并执行了,首先更新软件包列表,然后安装软件。
opkg update opkg install nmap -d usb复制
- 第四步:在 nmap 安装完成后,如果执行 nmap,并不会找到该命令,还需要设置环境变量 PATH。 如果仅是临时设置,可以在终端中使用 export 命令进行设置。如果要重启也生效就需要在 /etc/profile 文件中修改。编辑配置文件/etc/profile,将你新增的软件目录加入到 PATH 环境变量中。下列命令用于将srv目录增加到命令搜索和动态库搜索的环境变量中。
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复制
- 第五步:在执行 nmap 时还提示有错误“nmap: can’t load library ‘libstdc++.so.6”,这时因为动 态链接文件库名没有创建成功,只需要将“libstdc++.so.6.0.16”文件改名为“libstdc++. so.6”即可。
- 第六步:在安装 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 usbtouch /usr/bin/fileecho "#!/bin/sh" > /usr/bin/fileecho "/srv/usr/bin/file -m /srv/usr/share/misc/magic \"\$@\"" >>/usr/bin/filechmod +x /usr/bin/file复制
- 两点注意事项:
- 许多软件包在自定义的位置时不能启动或者即使启动也不能成功执行,因为它在 默认位置读取配置文件(如 file 命令),因此需要在参数中指定配置文件位置,否则将不能 找到它自己必须的配置文件。
- 许多软件包在更改了目录之后需要额外的软链接或者修改动态链接库文件名后缀 才能使用。
|