openwrt开发使用-OPKG包管理系统详解

2023-10-27


一、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>

  • 该命令用于将软件包<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/attitude_adjustment/12.09/x86/generic/packages/
src/gz local http://192.168.1.106:8080/openwrt

自定义安装目录

  • OPKG的一个非常有用的特性,是有能力指定任何安装包的安装目录。安装目录在配置文件/etc/opkg.conf中定义。
  • 格式:配置文件中目的地址格式是以 dest 开头,紧跟着目的地址的名称,最后是目录路径,必须从根目录开始。
dest root /
dest ram /tmp
dest 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文件解压之后还可能包含一些其他的控制文件,内容如下:
文 件  含 义
control 控制文件,包含软件包名称、版本、依赖关系和所属分类等信息
conffiles  配置文件,内容包含该软件的配置文件列表,一个文件占一行
preinst  安装文件之前执行脚本
postinst  安装文件之后执行脚本,例如安装之后设置用户及启动程序等
prerm 卸载之前执行的脚本,例如卸载之前首先结束运行的程序进程
postrm 卸载之后执行的脚本


八、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

 

  • 第四步:我们使用命令来安装svn客户端工具。
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-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
  • 第三步:到这里你就可以在外接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 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

  • 两点注意事项:
    • 许多软件包在自定义的位置时不能启动或者即使启动也不能成功执行,因为它在 默认位置读取配置文件(如 file 命令),因此需要在参数中指定配置文件位置,否则将不能 找到它自己必须的配置文件。
    • 许多软件包在更改了目录之后需要额外的软链接或者修改动态链接库文件名后缀 才能使用。

来源:https://blog.csdn.net/qq_41453285/article/details/102523263

                              ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

推荐阅读

【1】jetson nano开发使用的基础详细分享

【2】Linux开发coredump文件分析实战分享

【3】CPU中的程序是怎么运行起来的 必读

【4】cartographer环境建立以及建图测试

【5】设计模式之简单工厂模式、工厂模式、抽象工厂模式的对比

本公众号全部原创干货已整理成一个目录,回复[ 资源 ]即可获得。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openwrt开发使用-OPKG包管理系统详解 的相关文章

  • 如何在 Bash 中给定超时后终止子进程?

    我有一个 bash 脚本 它启动一个子进程 该进程时不时地崩溃 实际上是挂起 而且没有明显的原因 闭源 所以我对此无能为力 因此 我希望能够在给定的时间内启动此进程 如果在给定的时间内没有成功返回 则将其终止 有没有simple and r
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • 按进程名称过滤并记录 CPU 使用情况

    Linux 下有选项吗顶部命令 https www man7 org linux man pages man1 top 1 html我可以在哪里按名称过滤进程并将每秒该进程的 CPU 使用情况写入日志文件 top pgrep 过滤输出top
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • 快速像素绘图库

    我的应用程序以每像素的方式生成 动画 因此我需要有效地绘制它们 我尝试过不同的策略 库 但结果并不令人满意 尤其是在更高分辨率的情况下 这是我尝试过的 SDL 好的 但是慢 OpenGL 像素操作效率低下 xlib 更好 但仍然太慢 svg
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • NUMA 在虚拟内存中是如何表示的?

    有许多资源 https en wikipedia org wiki Non uniform memory access从硬件角度描述NUMA的架构性能影响 http practical tech com infrastructure num
  • Windows CE 与嵌入式 Linux [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 现在我确信我们都清楚 Linux 与 Windows 桌面的相对优点 然而 我对嵌入式开发世界的了解却少得多 我主要对行业解决方案感兴
  • 监控子进程的内存使用情况

    我有一个 Linux 守护进程 它分叉几个子进程并监视它们是否崩溃 根据需要重新启动 如果父进程可以监视子进程的内存使用情况 以检测内存泄漏并在超出一定大小时重新启动子进程 那就太好了 我怎样才能做到这一点 您应该能够从 proc PID
  • 使用 plistBuddy 获取值数组

    var keychain access groups declare a val usr libexec PlistBuddy c Print var sample plist echo val echo val 0 Ouput Array
  • Awk - 计算两个文件之间的每个唯一值和匹配值

    我有两个文件 首先 我尝试获取第 4 列中每个唯一字段的计数 然后匹配第二个文件的第二列中的唯一字段值 File1 第 4 列的每个唯一值和 File2 第 2 列包含我需要在两个文件之间匹配的值 所以本质上 我试图 gt 如果 file2
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有
  • 为什么我的 Dockerfile CMD 不起作用?

    所以在我的 Dockerfile 的末尾我有这样的内容 WORKDIR home CMD django admin startproject whattt CMD bin bash 当我创建映像然后运行容器时 一切都按预期运行 没有错误 D
  • 捕获数据包后会发生什么?

    我一直在阅读关于网卡捕获数据包后会发生什么的内容 我读得越多 我就越困惑 首先 我读过传统上 在网卡捕获数据包后 它会被复制到内核空间中的一个内存块 然后复制到用户空间 供随后处理数据包数据的任何应用程序使用 然后我读到了 DMA 其中 N
  • C:如果文件描述符被删除,阻塞读取应该返回

    我正在以阻塞的方式从设备 文件描述符中读取 可能会发生这样的情况 在不同的线程中 设备被关闭并且文件描述符被删除 不幸的是 读取没有返回或注意到并且一直阻塞 作为一种解决方法 我可以使用 select 作为超时来执行 while 循环 如果
  • pprof 和 ps 之间的内存使用差异

    我一直在尝试分析用 cobra 构建的 cli 工具的堆使用情况 这pprof工具显示如下 Flat Flat Sum Cum Cum Name Inlined 1 58GB 49 98 49 98 1 58GB 49 98 os Read
  • Linux“屏幕”的 Windows 等效项还是其他替代方案?

    我正在寻找一种在 Windows 环境中控制程序的方法 我希望它与 Linux 软件有点相似 screen 我搜索的原因是我需要使用标识符启动一个程序 在 Windows 上 这样我以后就能够关闭该特定程序 而无需关闭其他任何程序 即使实际

随机推荐