1.简介
https://oldwiki.archive.openwrt.org/doc/techref/opkg
Opkg 是一个基于 ipkg 的轻量级的软件包管理系统,主要用于嵌入式系统,目前应用opkg的有Open WRT 和 Open Embedded。 Opkg的详细使用方法可以参考OpenWRT的 WIKI页面,不再赘述,本文将重点解释opkg的工作原理。 OpenWRT Barrier Breaker 14.07 与 潘多拉不一样的系统(尤其注意源) root@OpenWrt:~# cat /etc/openwrt_release
DISTRIB_ID="OpenWrt"
DISTRIB_RELEASE="14.07"
DISTRIB_REVISION="r42625"
DISTRIB_CODENAME="barrier_breaker"
DISTRIB_TARGET="x86/generic"
DISTRIB_DESCRIPTION="OpenWrt Barrier Breaker 14.07"
DISTRIB_TAINTS=""
root@OpenWrt:~# opkg --version
opkg version 0.1.
root@OpenWrt:~#
2.opkg的默认值
注:由于我是在 OpenWrt Barrier Breaker 14.07 上进行测试,所以在命令行上必须手动加上参数:
-f /etc/opkg.conf DEST LIST 目的地列表
3.opkg 各文件作用
dest 指定的目录,加到 Dest List 中,例如:
包安装、删除和升级的根目录
dest root /
dest ram /tmp 然后,连接这个路径分别和以下几个路径连接:
() 和 Info Directory 连接作为该 dest 的 Info Directory;
() 和 Status File 连接作为该 dest 的 Status File;
() 和 Lists Directory 连接作为该 dest 的 Lists Directory。
以 / 为例:
//var/lib/opkg/info/
//var/lib/opkg/lists/
//var/lib/opkg/status 对比v0.1.8,这些目录是放在了 /usr/lib/opkg 下面:
root@OpenWrt:~# ls /usr/lib/opkg -l
drwxr-xr-x root root Oct info
drwxr-xr-x root root Oct lists
-rw-r--r-- root root Oct status
root@OpenWrt:~# 其中,status 文件为所有软件包的基本信息,包括名称、版本、依赖、状态、初始安装日期等,以 libc 为例:
Package: libc
Version: 0.9.33.2-
Depends: libgcc
Status: install hold installed
Essential: yes
Architecture: x86
Installed-Time:
Auto-Installed: yes Lists 文件夹下面是根据配置文件中的src/gz指定的URL下载下来的文件,例如:
src/gz barrier_breaker_base http://downloads.openwrt.org/barrier_breaker/14.07/x86/generic/packages/base 在执行 update 后,会使用下面的URL下载一个文件:
http://downloads.openwrt.org/barrier_breaker/14.07/x86/generic/packages/base/Packages.gz
文件下载后,将解压的文件放到 Lists 目录下面(索引文件),并把第二个字段(如上面的barrier_breaker_base)作为文件名,这个文件里面包含了该Package里面所有的软件包的信息,举一为例:
Package: 6in4
Version: -
Depends: libc, kmod-ipv6, kmod-sit
Source: package/network/ipv6/6in4
Section: net
Maintainer: Jo-Philipp Wich <[email protected]>
Architecture: all
Installed-Size:
Filename: 6in4_17-1_all.ipk
Size:
MD5Sum: 6758bb49b2a828301bdac956481ec6c1
SHA256sum: 1ad5794959c8435c7ab4c261ab86d2974d65527f7b8ffa99eee370409993976c
Description: Provides support for 6in4 tunnels in /etc/config/network.
Refer to http://wiki.openwrt.org/doc/uci/network for
configuration details. 查看 Lists 目录下的内容(压缩了一些空白符):
root@OpenWrt:~# ls /var/lib/opkg/lists/ -l
-rw-r--r-- root root Jul : barrier_breaker_base
-rw-r--r-- root root Jul : barrier_breaker_luci
-rw-r--r-- root root Jul : barrier_breaker_management
-rw-r--r-- root root Jul : barrier_breaker_oldpackages
-rw-r--r-- root root Jul : barrier_breaker_packages
-rw-r--r-- root root Jul : barrier_breaker_routing
-rw-r--r-- root root Jul : barrier_breaker_telephony
root@OpenWrt:~#
4.配置文件
默认的opkg.conf实际上包含三个目标地:
dest root /
dest ram / tmp
dest mnt / mnt
目标行的格式只是关键字dest,后跟此目标的名称(可以是任何内容),后跟文件系统位置。这样配置的任何目标都可以在opkg命令行中指定,如下所示:
opkg install somepackage -d destination_name
dest参数必须引用/etc/opkg.conf中定义的目的地之一,例如-d ram,以便将软件包安装到/tmp/。
默认情况下,opkg只允许包含体系结构all(=体系结构独立)和已安装目标体系结构的包。为了从一个外部但兼容的目标获取包,可以使用arch选项在opkh .conf中覆盖允许的体系结构列表:
arch all
arch brcm4716
arch brcm47xx
这个例子允许在brcm4716(一个特定的SoC)目标上安装brcm47xx(=系列的SoCs)包。这个数字指定了一个优先级索引,opkg使用该索引来确定在多个体系结构中可用的包时选择哪个包。优先级数值越大,执行级别越高,
5.命令
https://oldwiki.archive.openwrt.org/doc/techref/opkg
列出软件包命令list和更新upgrade稍有不同,在开始执行命令之前的准备工作,会读取lists 目录下的文件,这个文件的格式前面提到了。将所有文件内的每个软件包的信息都加载到内存中, 在读取文件的过程中,opkg会分析每个软件包的Architecture 字段,只有当该字段的值在 Arch List 中时,才会将该软件包加到 hash table 里面(opkg_config->file_hash)。 下面的事情就比较简单了,list 就是将 file_hash 里面所有的软件包打印出来。
列出安装的软件包list-installed命令,并不会读取 lists 目录下的文件,而是读取 Status List 包含的每个文件,系统已安装的软件包会放到这个文件里面,然后将Status包含installed的软件包打印出来。 opkg status lua
files命令用于列出一个软件包所包含的全部文件,这些文件包括可执行文件、配置文件等。对于已安装过的软件包,则打开 $lists_dir 下面的软件包对应的 list 文件
例如软件包 busybox,对应的list文件为/var/lib/opkg/info/busybox.list 这个文件包含了该软件包所包含的文件,每行一个。
对于未安装的软件包,打印软件包尚未安装的错误信息:
Search 命令则用于查找某个文件属于哪个软件包,可以使用通配符(使用fnmatch函数来进行模式匹配)。对应的函数为 opkg_search_cmd(),这个过程也比较简单:
获取全部安装的软件包,依次查找每个软件包所包含的文件,如果包含要查找的文件,那么就打印出该软件包。
这个函数也有一些缺陷,如果一个软件包所包含的文件,有多个可以匹配搜索的文件,那么结果该软件包就会被打印多次。以搜索ls为例,在base-files中有以下7个文件包含ls字符串:
删除 remove
(1) 检查Essential 标记:如果该软件包为Essential的,除非用户强制删除(使用–force-removal-of-essential-packages参数),否则opkg拒绝删除该软件;
(2) 检查依赖:检查系统中有哪些其他的软件包依赖于要删除的软件包,如果有,那么打印出依赖于该软件包的其他软件包,然后结束删除动作;
如果用户希望强制删除该软件以及依赖于该软件的所有其他软件,可以使用–force-removal-of-dependent-packages参数,opkg将首先删除依赖于该软件的其他软件;
清理 clean
清理就是删除cache文件夹下面的文件。
# 打印帮助
opkg -h
# 更新资源列表
opkg update
# 列出已安装的包
opkg list
# 搜索包
opkg search shadowsocks
# 安装软件,以安装curl和wget为例
opkg install curl
# 安装本地软件包
opkg install /tmp/wget_1.16-1_ramips_24kec.ipk
# 移除软件
opkg remove wget
--force-depends Install/remove despite failed dependencies
--force-maintainer Overwrite preexisting config files
--force-reinstall Reinstall package(s)
--force-overwrite Overwrite files from other package(s)
--force-downgrade Allow opkg to downgrade packages
--force-space Disable free space checks
--force-checksum Ignore checksum mismatches
--force-postinstall Run postinstall scripts even in offline mode
--noaction No action – test only
--download-only No action – download only
--nodeps Do not follow dependencies
--force-removal-of-dependent-packages Remove package and all dependencies
--autoremove Remove packages that were installed automatically to satisfy dependencies
-t --tmp-dir Specify tmp-dir.
6.opkg配置(源一定要选对应的,可以省很多事)
pandorabox默认opkg配置
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
src/gz r2_base http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/base
src/gz r2_management http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/management
src/gz r2_oldpackages http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/oldpackages
src/gz r2_packages http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/packages
src/gz r2_routing http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/routing
src/gz r2_telephony http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/telephony
一个其他openwrt 版本的配置
修改安装源:vi /etc/opkg.conf
src/gz attitude_adjustment http://downloads.openwrt.org/snapshots/trunk/bcm53xx/packages/
dest root /data
dest ram /tmp
lists_dir ext /data/var/opkg-lists
option overlay_root /data arch all 1
arch noarch 1
arch bcm53xx 10
最后一行加上二进制的兼容范围,系统默认只接受bcm4079的格式。
opkg update 注意:opkg会把包安装到/data目录而不是“/”目录。因为默认的root dest改了
目前我刷的openWrt是PandoraBox 14.09 r355,是基于openWrt Barrier Breaker的。使用的源地址是http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/
src/gz barrier_breaker_base http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/base
src/gz barrier_breaker_management http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/management
src/gz barrier_breaker_oldpackages http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/oldpackages
src/gz barrier_breaker_packages http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/packages
src/gz barrier_breaker_routing http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/routing
src/gz barrier_breaker_telephony http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/telephony
dest root /data
dest ram /tmp
lists_dir ext /data/var/opkg-lists
option overlay_root /data 保存后运行opkg update。发现源是可以链接上了,但是报出类似于如下错误
Package xxx version xxx has no valid architecture, ignoring.
源指定的architecture和路由上刷好的系统的不一致造成的。
在/etc/opkg.conf文件中加入对系统支持的architecture的设置,具体方法是添加如下几行
arch all 100
arch <arch类型1> 200
arch <arch类型2> 300
官网的意思是告诉opkg,arch类型2的包可以兼容的装在arch类型1的系统上。那么问题来了,现在的arch类型是什么呢?折腾了好久,我尝试过查看系统的arch,利用命令查看架构
uname -a
cat /proc/cpuinfo
cat /etc/openwrt_release
注意最后的arch为:
arch all 100
arch ramips_24kec 200
arch ramips 300
arch mips 400
如何挂载U盘,安装python https://blog.csdn.net/huyaoyu/article/details/42810383
7.ipk版本介绍:
http://code.taobao.org/svn/luci-app-adbyby/adbyby_2.7-7.0_ar71xx.ipk 为ar71xx版
http://code.taobao.org/svn/luci-app-adbyby/adbyby_2.7-7.0_arm.ipk 为arm版
http://code.taobao.org/svn/luci-app-adbyby/adbyby_2.7-7.0_armv7.ipk 为armv7版
http://code.taobao.org/svn/luci-app-adbyby/adbyby_2.7-7.0_ralink.ipk 为7620A(N)和7621潘多拉专用版
http://code.taobao.org/svn/luci-app-adbyby/adbyby_2.7-7.0_ramips_24kec.ipk 为7620A(N)和7621 OPENWRT官版专用版
http://code.taobao.org/svn/luci-app-adbyby/adbyby_2.7-7.0_x64.ipk 为X64版
http://code.taobao.org/svn/luci-app-adbyby/adbyby_2.7-7.0_x86.ipk 为X86版
8.关于ramips和mips
ramips 的 mtk7620是mipsel架构的。 mips是指令集,sel和seb是内存大小端模式.
mips是big-endian的mips架构, mipsel是little-endian的mips架构。 MT7620, 设计这个芯片的公司在被MTK收购前叫ralink, ramips是ralink生产的芯片系列在openwrt中的名称,mips是具体的芯片架构,rampis为厂商名
9.可用的源
即使潘多拉是openwrt的一个版本,但是它的安装源封闭,尽量不要用其他版本的
安装哪个版本的镜像就使用哪个版本的ipk(版本不通,肯定不能用啊)
https://archive.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/
http://mirrors.ustc.edu.cn/lede/releases/17.01.1/targets/ramips/mt7620/packages/
http://downloads.openwrt.org.cn/
http://downloads.openwrt.org.cn/PandoraBox/
https://downloads.pangubox.com/pandorabox/
10.更多源设置
打印架构,直接配置(潘多拉可以使用吗?)
opkg print-architecture | awk'{print $ 2}'
以上源只是配置了基础的源,像openwrt-dist这种源,由于某种神秘力量导致我们无法直接使用,需要使用反代,老高发现一个不错的反代
src/gz openwrt_dist http://openwrt-dist.thankgfw.ml/releases/ramips/packages
src/gz openwrt_dist_luci http://openwrt-dist.thankgfw.ml/releases/luci/packages
把上面的代码加到opkg配置文件的后面就行!
10.常见错误
satisfy_dependencies_for: Cannot satisfy the following dependencies for curl: * libc * libc * libc * * opkg_install_cmd: Cannot install package curl.
解决办法:opkg update
错误 Unknown package 'redsocks2'.
解决方法:软件源配置错误,请选择合适的源
opkg_conf_parse_file: /etc/opkg.conf:1: Ignoring invalid line: `t root /' satisfy_dependencies_for: Cannot satisfy the following dependencies for redsocks2:
libc libc
opkg_install_cmd: Cannot install package redsocks2.
解决方法:libc需要手动安装
cd /tmp
# wget http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/base/libc_0.9.33.2-1_ramips_24kec.ipk wget http://mirrors.ustc.edu.cn/openwrt/barrier_breaker/14.07/ramips/mt7620a/packages/base/libc_0.9.33.2-1_ramips_24kec.ipk ## 安装libc
opkg install libc_0.9.33.2-1_ramips_24kec.ipk