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的默认值

路由器04--OPKG-LMLPHP

注:由于我是在 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.配置文件

路由器04--OPKG-LMLPHP

默认的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/

https://archive.openwrt.org/

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}'

http://openwrt-dist.kxrr.us/

以上源只是配置了基础的源,像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
05-11 21:55