Openwrt 包管理系统介绍

1. OpenWrt简介

OpenWrt是一个嵌入式设备的Linux发行版,以GPL许可协议发行,拥有强大的网络组件和扩展性,常常被用于工控设备、电话、小型机器人、智能家居、路由器以及VOIP设备中,可以非常容易地从零开始构建出全功能的智能路由或服务器设备。

OpenWrt项目始于2004年1月,其第一个版本采用了LinkSys的源码。在LinkSys的代码收费后,2005年改为采用正式发布的Linux内核(2.4.30)来集成,并将OpenWrt完全模块化,不断推出补丁和网络驱动。

OpenWrt的主要特点在于其高扩展性,并且文件系统可写,开发者无需在每一次修改后完全重新编译,只要编译自己的软件包即可,这样就加快了开发的进度,令它更像一个小型的Linux 电脑系统,到目前为止已经提供了100多个已编译好的软件,而且数量还在不断增加。另外OpenWrt提供了SDK,每个运行软件均能够以SDK来进行编译,以软件包形式进行安装和卸载。

1.1 主要特点

  • 代码里不含第三方开源包,只包含开源包地址链接。
  • 编译时自动下载源代码、打补丁来满足指定平台要求,并编译。还可以修改Makefile来下载最新的软件包。
  • 使用LuCI作为最终用户管理界面。LuCI以Apache许可协议发布Web管理功能代码。
  • UCI通用配置管理方法。
  • 通过脚本来调用iptables来实现防火墙功能,配置保存在UCI文件中。
  • 开放和可扩展的OPKG格式安装升级包。

1.2 开源嵌入式操作系统

1.2.1 嵌入式系统概念

嵌入式系统,是指嵌入到硬件系统内部,为特定应用功能而设计的专用软件系统。与个 人计算机的通用操作系统不同,嵌入式系统通常只针对特殊的用途。因此可以对它进行优化, 并裁剪到最小。现在通用的硬件系统发展非常迅速,因此出现了在通用硬件系统上的嵌入式操作系统。目前在嵌入式领域广泛使用的操作系统有:Linux、Windows Embedded和VxWorks 等。

1.2.2 嵌入式系统分类

根据用途,操作系统又可以分为:

  • 针对防火墙的操作系统:IPFire;
  • 针对智能路由器领域的嵌入式操作系统:Tomato、OpenWrt等;
  • 针对个人桌面领域操作系统:Ubuntu、Fedora 等;
  • 针对智能终端如手机:Android 、Firefox OS等。

它们均是基于 Linux 内核的操作系统。

1.2.3 嵌入式系统——安卓

安卓系统和我们生活紧密联系,也为大家所熟知,下面介绍下安卓系统,用于与Openwrt进行对比:

  1. Android 是谷歌研发的一款智能终端操作系统,是一种基于 Linux 的开放源代码的操 作系统,主要使用于移动设备,如智能手机、平板计算机、智能电视等。它由谷歌公司和开放手机联盟领导开发。
  2. Android 操作系统最初由安迪·鲁宾开发,最初目的是用于数码相机的操作系统。
  3. 2005年8月谷歌全资收购了Android 操作系统。
  4. 2007年11月,谷歌与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟,共同研发改良Android 系统。随后谷歌以Apache开源许可协议的授权方式发布了Android的源代码,Android以 JAVA 层封装了系统层提供给应用开发者统一的API接口。
  5. 第一部 Android 智能手机发布于 2008年10月。
  6. 目前,Android已逐渐扩展到平板计算机及其他领域,如电视、智能手表、数码相机和游戏机等。
  7. 2015年,Android以85%的市场占有率占据移动操作系统市场之首。
  8. Android 操作系统已经演化为一个移动设备开发平台,其软件层次大体上分为 4 层, 即操作系统内核、中间层、应用程序框架层和应用程序。应用程序框架层为应用程序开发者提供了功能强大的 API,包括图形显示的各种组件,如视图、列表、文本框、按钮以及嵌入式的Web浏览器等。
AndroidOpenWrt
内核Linux 内核Linux 内核
许可协议Apache2.0GNU License
使用场景面向终端用户,手持设备。用户接口采用JAVA 提供图形用户界面GUI服务器、家庭路由器等,用户接口默认为 UCI 命令行提供,也支持通过 Web 方式来管理
开发主导模式由谷歌公司主导开发由 OpenWrt.org 社区主导,社区由个人组成,更开放

1.2.4 嵌入式系统的对比

下表为开源路由器各种发行版本的对比:
在这里插入图片描述

2 OpenWrt包管理系统

OPKG(Open/OpenWrt Package)是一个基于IPKG的轻量快速的软件包管理系统,可以称为IPKG的变种或克隆,目前已成为开源嵌入式系统领域的系统标准。OPKG常用于路由、交换机等嵌入式设备中,用来管理软件包的下载、安装、升级、卸载和查询等,并处理软件包的依赖关系。功能和桌面Linux操作系统Ubuntu中的apt-get、Redhat中的yum类似。

OPKG 是一个针对根文件系统全功能的软件包管理器,用来从本地软件仓库或互联网软件仓库上下载并安装 OpenWrt 软件包。它不仅仅是将软件安装到一个单独的路径(如:/opt),而是根文件系统上。还可以用于安装内核模块和驱动等。OPKG 有时被称为 Entware ,但这主要是针对为嵌入式设备准备的 Entware 仓库。OPKG在安装时会自动解决安装软件时的包依赖关系,如果遇见错误,就中止安装。如果丢失第三方包的依赖关系,源码包依然可用的话,为了忽略依赖关系的错误可以使用 –force-depends 选项。

2.1 工作原理

当执行“opkg update”命令进行软件列表的更新时,OPKG首先会读取配置文件/ etc/opkg.conf,这个文件保存了OPKG的全局配置信息。
在这里插入图片描述
紧接着,OPKG会根据配置地址位置下载软件包列表文件Packages.gz到/var/opkg-list目录下,这个文件是软件仓库中所有软件列表及其依赖关系的清单,是使用gzip压缩的文件,这样在网络传输时所占用网络流量比较小。其后任何安装命令均需首先读取这两个文件。

软件安装之后的信息会保存在目录/usr/lib/opkg/下面,这里就相当于Windows操作系统中的注册表。它包含状态文件,OPKG通过访问这个状态文件确定该软件是否已安装、安装的版本,以及依赖关系是否满足等,从而可以确定安装软件的版本、文件路径等信息。
在这里插入图片描述
在这里插入图片描述
OPKG命令执行会读取以下3部分的信息:配置文件、已安装软件包信息和软件仓库的软件包信息。

  • 配置文件默认位置为/etc/opkg.conf。
  • 已安装软件包状态信息保存在/usr/lib/opkg目录下。
  • 软件仓库的软件包信息保存在/var/opkg-lists目录下。

2.2 OPKG命令

2.2.1 命令用法

OPKG必须带有一个子命令,如果不带有子命令,将输出OPKG的详细使用提示信息。首先是提示必须有一个子命令参数,然后是命令格式提示信息,最后是各个子命令和选项信息含义描述。

/ # opkg
opkg must have one sub-command argument
usage: opkg [options...] sub-command [arguments...]
where sub-command is one of:

Package Manipulation:
        update                  Update list of available packages
        upgrade <pkgs>          Upgrade packages
        install <pkgs>          Install package(s)
        configure <pkgs>        Configure unpacked package(s)
        remove <pkgs|regexp>    Remove package(s)
  
Informational Commands:
        list                    List available packages
        list-installed          List installed packages
        list-upgradable         List installed and upgradable packages
        files <pkg>             List files belonging to <pkg>
        search <file|regexp>    List package providing <file>
        find <regexp>           List packages whose name or description matches <regexp>
        info [pkg|regexp]       Display all info for <pkg>
        status [pkg|regexp]     Display all status for <pkg>
        download <pkg>          Download <pkg> to current directory
        depends [-A] [pkgname|pat]+

Options:
        -A                      Query all packages not just those installed
        -d <dest_name>          Use <dest_name> as the the root directory for
        --dest <dest_name>      package installation, removal, upgrading.
                                <dest_name> should be a defined dest name from
                                the configuration file, (but can also be a
                                directory name in a pinch).
        -o <dir>                Use <dir> as the root directory for
        --offline-root <dir>    offline installation of packages.
        --add-arch <arch>:<prio>        Register architecture with given priority
        --add-dest <name>:<path>        Register destination with given path
Force Options:
        --force-depends         Install/remove despite failed dependencies
         --force-reinstall       Reinstall package(s)
        --force-overwrite       Overwrite files from other package(s)
        --force-downgrade       Allow opkg to downgrade packages

 regexp could be something like 'pkgname*' '*file*' or similar
 e.g. opkg info 'libstd*' or opkg search '*libop*' or opkg remove 'libncur*'

OPKG的功能主要分两类,一种是软件包的管理命令,另外一种是软件包的查询命令。另外还有很多可以修饰的选项。

2.2.2 软件包的管理

软件包的管理是OPKG最重要的功能,主要包含更新软件包列表、安装、卸载和升级等功能。

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

  2. opkg install
    该命令用于安装软件包,需要一个参数,传递一个软件包名称。如果软件包之间有依赖关系,会自动下载所有被依赖的软件包,并依次将所有被依赖的软件包安装上。如下图所示用于安装smsdemo软件包。
    在这里插入图片描述
    或如下所示代码用于安装file软件包,其所依赖的软件包libmagic会自动安装上:

/# opkg install file 
Installing file (5.11-1) to root... Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/ x86/generic/packages/file_5.11-1_x86.ipk. 
Installing libmagic (5.11-1) to root... 
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/x86/generic/packages/libmagic _5.11-1_x86.ipk. 
Configuring libmagic. 
Configuring file.
  1. opkg remove
    该命令用于卸载软件包,需要一个参数,传递一个软件包名称。需要注意的是,在安装时自动安装的软件包并不会删除,需要自己手动删除,或者在卸载软件包的同时增加(–autoremove)参数将不需要的安装包也删除。如下所示用于卸载smsdemo软件包:
    在这里插入图片描述
    如下所示代码用于删除file软件包及不再使用的依赖包。
    /# opkg remove file --autoremove
    Removing package file from root…
    libmagic was autoinstalled and is now orphaned, removing.
    Removing package libmagic from root…
  2. opkg upgrade
    该命令用于升级软件包。如果软件包没有安装,该命令执行之后和“opkg install”效果相同。如果升级多个软件包,以空格分隔列在命令之后即可。例如使用opkg upgrade ip wget来升级两个软件包。
    对大多数用户来说,不推荐升级软件包。OpenWrt发布后再进行升级大多数情况下是不可能的,这是因为OpenWrt发布之后一般不再更新,除非主干的快照被编译机器人(buildbot)自动更新。如果内核升级了,可能带来升级风险,因为内核可能和原始安装的应用软件不兼容。因此一般只升级应用,即非内核软件包。

2.2.3 查询信息

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

  1. opkg list
    该命令用于列出所有可使用的软件包,列出内容格式为:软件包名称–版本–描述。描述内容是可以有换行的。如果使用grep命令来查找软件包则需注意,grep是单行匹配,因此使用grep查找的结果并不准确。
    在这里插入图片描述
  2. opkg list-installed
    该命令用于列出系统中已经安装的软件包。
  3. opkg list-changed-conffiles
    该命令用于列出用户修改过的配置文件。
    在这里插入图片描述
  4. opkg files
    该命令用于列出属于这个软件包()中的所有文件,这个软件包必须已经安装。下图示例查看smsdemo软件包所包含文件列表:
    在这里插入图片描述
    如下所示代码用于查看ip软件包所包含的文件列表。
#opkg files ip 
Package ip (3.3.0-1) is installed on root and has the following files: 
/usr/sbin/ip 
/etc/iproute2/rt_tables
  • opkg search
    该命令用于列出提供的软件包,注意:需要传递文件的绝对路径。
    在这里插入图片描述

  • opkg find
    该命令用于列出软件包名称和匹配的软件包。是一个正则表达式,可以精确匹配,也可以使用星号来模糊匹配,例如使用“net”或者“ net*”,均可以匹配NetCat。
    在这里插入图片描述

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

  • opkg download
    该命令用于将软件包下载到当前目录。

  • opkg print-architecture
    该命令用于列出安装包的架构。
    在这里插入图片描述

  • opkg whatdepends [-A] [pkg]
    该命令用于针对已安装的软件包,输出依赖这个软件包的软件包。
    在这里插入图片描述

2.2.4 选项

OPKG有很多选项可以使用,这里只列出几个最常用的选项。

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

2.3 OPKG配置

OPKG需要一个配置文件来保存全局配置,例如软件从哪里下载、安装到哪里等。

2.3.1 调整软件仓库地址

OPKG配置文件默认是/etc/opkg.conf。内容参考如下:

src/gz attitude_adjustment http://192.168.1.106:8080/openwrt 
dest root /
dest ram /tmp 
lists_dir ext /var/opkg-lists 
option overlay_root /overlay 

OPKG可以使用多个仓库,每一个仓库需要一个唯一标识符,即使用它们的逻辑名字。例如:

src/gz attitude_adjustment http://downloads.openwrt.org/attitude_adjustment/12.09/x86/generic/packa ges/ 
src/gz local http://192.168.1.106:8080/openwrt

2.3.2 调整安装目录

OPKG的一个非常有用的特性,是有能力指定任何安装包的安装目录。安装目录在配置文件/etc/opkg.conf中定义。配置文件中目的地址格式是以dest开头,紧跟着目的地址的名称,最后是目录路径,必须从根目录开始。

dest root / 
dest ram /tmp 
dest usb /opt 

安装目录定义之后,目的地址名称就可以在安装命令中引用了。安装时目的地址名称只能引用在/etc/opkg.conf中定义的地址名称,例如“-d ram”表示软件将安装到临时目录/tmp下。安装命令类似如下格式:

opkg install <pkg> -d <目的地址名称>

2.3.3 代理设置

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/

2.4 OPKG包结构

OPKG安装包(ipk文件)是一个gzip压缩文件,可以用file命令来查看文件格式描述。其实,ipk文件就是一个“tar.gz”文件,我们可以用tar命令来解压缩并查看文件内容,其内容包含两个压缩文件和一个版本文件。我们以smsdemo软件包为例来说明安装包格式,首先使用tar命令来解压缩smsdemo的安装包。命令如下:
在这里插入图片描述
解压缩完成后生成3个文件,其中debian-binary是一个纯文本文件,包含字符串“2.0”,表示格式为debian2.0格式。
在这里插入图片描述
data.tar.gz包含“/usr/bin/smsdemo”文件,在安装时复制到安装目录下。
在这里插入图片描述
control.tar.gz解压缩后发现仅包含文件“control”、“postinst”、“prerm”。

在这里插入图片描述
control文件内容包含软件包名称、版本、依赖关系、所属分类、状态、优先级、平台架构和软件描述等。

在这里插入图片描述
控制部分所有文件的含义,如下表:

文件含义
control控制文件,包含软件包名称、版本、依赖关系和所属分类等信息
conffiles配置文件,内容包含该软件的配置文件列表,一个文件占一行
preinst安装文件之前执行脚本
postinst安装文件之后执行脚本,例如安装之后设置用户及启动程序等
prerm卸载之前执行的脚本,例如卸载之前首先结束运行的程序进程
postrm卸载之后执行的脚本
  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Openwrt使用一套自己的管理软件的方法来管理数千个软件与数十个硬件平台。我们可以使用这套管理方法将我们的软件加入到Openwrt系统中。文件结构中的关键文件括rules.mk和package.mk。rules.mk文件定义了全局的编译变量,在每一个软件的Makefile文件的第一行都会引入这个文件。而package.mk文件则含了软件的基本信息,如PKG_NAME和PKG_SOURCE等。这些信息完成后再被引入到具体软件的Makefile中,用于编译一般的软件。 在Openwrt中,我们可以使用PKG_NAME来表示软件的名称,该名称可以在menuconfig和ipkg中看到。而PKG_VERSION表示软件的版本号,PKG_RELEASE表示Makefile的版本号。PKG_SOURCE则表示源代码的文件名,而PKG_SOURCE_URL则表示源代码的下载网站位置,可以使用git、svn、cvs、hg、bzr等方式进行获取。下载方法的更多细节可以参考下载相关的文件,如$(INCLUDE_DIR)/download.mk和$(SCRIPT_DIR)/download.pl。 总而言之,Openwrt使用自己的管理方法来管理软件,并定义了一些关键文件和变量来完成这个过程。通过这套管理方法,可以方便地将软件添加到Openwrt系统中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [OpenWrt--软件管理](https://blog.csdn.net/qq_28689569/article/details/128707698)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [openwrt 添加私有软件](https://blog.csdn.net/u012385733/article/details/81564147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四儿家的小祖宗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值