Openwrt 包管理系统介绍
- 1. OpenWrt简介
- 1.1 主要特点
- 1.2 开源嵌入式操作系统
- 1.2.1 嵌入式系统概念
- 1.2.2 嵌入式系统分类
- 1.2.3 嵌入式系统——安卓
- 1.2.4 嵌入式系统的对比
- 2 OpenWrt包管理系统
- 2.1 工作原理
- 2.2 OPKG命令
- 2.2.1 命令用法
- 2.2.2 软件包的管理
- 2.2.3 查询信息
- 2.2.4 选项
- 2.3 OPKG配置
- 2.3.1 调整软件仓库地址
- 2.3.2 调整安装目录
- 2.3.3 代理设置
- 2.4 OPKG包结构
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进行对比:
- Android 是谷歌研发的一款智能终端操作系统,是一种基于 Linux 的开放源代码的操 作系统,主要使用于移动设备,如智能手机、平板计算机、智能电视等。它由谷歌公司和开放手机联盟领导开发。
- Android 操作系统最初由安迪·鲁宾开发,最初目的是用于数码相机的操作系统。
- 2005年8月谷歌全资收购了Android 操作系统。
- 2007年11月,谷歌与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟,共同研发改良Android 系统。随后谷歌以Apache开源许可协议的授权方式发布了Android的源代码,Android以 JAVA 层封装了系统层提供给应用开发者统一的API接口。
- 第一部 Android 智能手机发布于 2008年10月。
- 目前,Android已逐渐扩展到平板计算机及其他领域,如电视、智能手表、数码相机和游戏机等。
- 2015年,Android以85%的市场占有率占据移动操作系统市场之首。
- Android 操作系统已经演化为一个移动设备开发平台,其软件层次大体上分为 4 层, 即操作系统内核、中间层、应用程序框架层和应用程序。应用程序框架层为应用程序开发者提供了功能强大的 API,包括图形显示的各种组件,如视图、列表、文本框、按钮以及嵌入式的Web浏览器等。
Android | OpenWrt | |
---|---|---|
内核 | Linux 内核 | Linux 内核 |
许可协议 | Apache2.0 | GNU 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最重要的功能,主要包含更新软件包列表、安装、卸载和升级等功能。
-
opkg update
该命令用于更新可以安装的软件包列表。该命令不需要参数,执行时从服务器地址下载软件包列表文件并存储在/var/opkg-lists/目录下。OPKG在安装或升级时需要读取这个文件,这个文件代表当前仓库中所有可用的软件包。也可以删除该文件来释放存储空间,在安装软件前需要重新获取这个文件。 -
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.
- 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… - opkg upgrade
该命令用于升级软件包。如果软件包没有安装,该命令执行之后和“opkg install”效果相同。如果升级多个软件包,以空格分隔列在命令之后即可。例如使用opkg upgrade ip wget来升级两个软件包。
对大多数用户来说,不推荐升级软件包。OpenWrt发布后再进行升级大多数情况下是不可能的,这是因为OpenWrt发布之后一般不再更新,除非主干的快照被编译机器人(buildbot)自动更新。如果内核升级了,可能带来升级风险,因为内核可能和原始安装的应用软件不兼容。因此一般只升级应用,即非内核软件包。
2.2.3 查询信息
OPKG查询命令可以在软件仓库中查询,也可以在运行的系统中查询。OPKG提供了软件包的双向查询功能:正向查询,即从软件包来查询所包含的文件列表;也可以反向查询,从系统中所安装的文件查询所属的软件包。
- opkg list
该命令用于列出所有可使用的软件包,列出内容格式为:软件包名称–版本–描述。描述内容是可以有换行的。如果使用grep命令来查找软件包则需注意,grep是单行匹配,因此使用grep查找的结果并不准确。
- opkg list-installed
该命令用于列出系统中已经安装的软件包。 - opkg list-changed-conffiles
该命令用于列出用户修改过的配置文件。
- 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 | 卸载之后执行的脚本 |