一、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/sbinexport 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 命令),因此需要在参数中指定配置文件位置,否则将不能 找到它自己必须的配置文件。
    • 许多软件包在更改了目录之后需要额外的软链接或者修改动态链接库文件名后缀 才能使用。

  • 我是小董,V公众点击"笔记白嫖"解锁更多OpenWrt资料内容。

OPKG包管理系统详解!带你管理OpenWrt系统软件相关推荐

  1. python权限管理系统_Django 自定义权限管理系统详解(通过中间件认证)

    1. 创建工程文件, 修改setting.py文件 django-admin.py startproject project_name 特别是在 windows 上,如果报错,尝试用 django-a ...

  2. python哪里下载import包-【Python实战】模块和包导入详解(import)

    1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...

  3. Java开源项目Hibernate包作用详解

    Java开源项目Hibernate包作用详解 本文引自:http://hi.baidu.com/nick6610/blog/item/70b58afa0d0eab9259ee90f7.html Jav ...

  4. linux根-文件系统-目录管理-文件管理-用户及权限详解-用户组-用户管理-权限管理...

    一 .Linux文件结构 文件结构是文件存放在磁盘等存贮设备上的组织方法.主要体现在对文件和目录的组织上. 目录提供了管理文件的一个方便而有效的途径. Linux使用标准的目录结构,在安装的时候,安装 ...

  5. LwIP 之五 详解动态内存管理 内存堆(mem.c/h)

    写在前面   目前网上有很多介绍LwIP内存的文章,但是绝大多数都不够详细,甚至很多介绍都是错误的!无论是代码的说明还是给出的图例,都欠佳!下面就从源代码,到图例详细进行说明.   目前,网络上多数文 ...

  6. 2000坐标系xy坐标几位_详解| 带你认识新一代坐标系——2000国家大地坐标系

    原标题:详解| 带你认识新一代坐标系--2000国家大地坐标系 2018年7月1日起全面使用2000国家大地坐标系的消息,让不少人感慨国之大动作的同时,纷纷摸不着头脑.何为2000国家大地坐标系?对日 ...

  7. 四.卡尔曼滤波器(EKF)开发实践之四: ROS系统位姿估计包robot_pose_ekf详解

    本系列文章主要介绍如何在工程实践中使用卡尔曼滤波器,分七个小节介绍: 一.卡尔曼滤波器开发实践之一: 五大公式 二.卡尔曼滤波器开发实践之二:  一个简单的位置估计卡尔曼滤波器 三.卡尔曼滤波器(EK ...

  8. 浏览器实现抓包过程详解

    浏览器实现抓包过程详解 几乎所有浏览器都提供了抓取数据包的功能,因为浏览器为抓包提供了一个专门的操作界面,因此这种抓包方式也被称为"控制台抓包".本节以 Chrome 浏览器为例进 ...

  9. 详解JVM内存管理与垃圾回收机制2 - 何为垃圾

    随着编程语言的发展,GC的功能不断增强,性能也不断提高,作为语言背后的无名英雄,GC离我们的工作似乎越来越远.作为Java程序员,对这一点也许会有更深的体会,我们不需要了解太多与GC相关的知识,就能很 ...

最新文章

  1. BZOJ 2431: [HAOI2009]逆序对数列【DP】
  2. IT团队如何赢得尊重?
  3. pyspider 安装 和 快速开始
  4. mysql max_prepared_stmt_count_MySQL的max_prepared_stmt_count参数
  5. Gcc:gcc -o操作
  6. 杀鸡儆猴!苹果撤销Facebook的iOS企业证书
  7. python--条件判断和循环--3
  8. 用大前端技术实现的一款仿Boss直聘app(已开源)
  9. 网站会员扫码充值系统
  10. IplImage详解
  11. 硬件知识学习整理:(上拉,下拉),(三极管),(OC,OD,推挽输出),(NMOS与PMOS),(MOSFET驱动电路),(IR2110S)
  12. winhex万能恢复磁盘数据
  13. Ubuntu 12.10 禁用来宾账户和远程登录
  14. Android 内部存储和外部存储
  15. 很牛的求职经历(转)
  16. mysql篇:如何进入mysql
  17. 计算机无法识别苹果6手机软件,电脑里安装的itunes不能识别我的苹果6sp… - Apple 社区...
  18. 洛谷P1035题解 [NOIP2002 普及组] 级数求和
  19. python能做什么有趣的事作文_Python怎么学之小学生作文
  20. 迅达cadi_迅达电梯700p图纸英文代码翻译

热门文章

  1. 时间复杂度的三种常见表示符号
  2. ISA8051内部结构讲解
  3. vue element 确认弹框中显示图片(message里)
  4. 微信小程序业务好(做)跑吗?我想做小程序代理业务
  5. 阿尔法编程python答案_C语言程序设计-阿尔法编程(编程答案)
  6. 工业控制计算机固态硬盘,工业控制电脑ssd固态硬盘怎么正确使用?
  7. 爱国html源码,鼠标点击网页爱国富强民主特效(附代码)
  8. 计算机中的网络怎么共享的打印机驱动,如何连接其他电脑共享的打印机
  9. C++基础用法—冒号的用法
  10. 【复现】deblurGAN: 用GAN使模糊图片变清晰(ECCV2018)