我使用的路由器是小米AX3600,使用的固件是lean大的闭源驱动openwrt固件,固件版本OpenWrt R21.12.17,内核版本4.4.60。
由于固件是lean编译,且lean不提供源码,所以遇到没有的插件,只能采用ipk方式安装,本次我需要安装的插件是xxxxx。
xxxxx需要安装4个ipk,分别是:
luci-app-xxxxx_2.0-19_all
luci-i18n-xxxxx-zh-cn_2.0-19_all
xxxxx-easy-rsa_3.0.8-3_all
xxxx-xxxxx_2.5.4-1_aarch64_cortex-a53+crypto
其中,xxxxx-xxxxx和xxxx-easy-rsa是主程序。luci开头的是界面文件,luci开头带zh的是中文翻译包。先安装主程序,再安装luci包。
看到dependencies,就要知道是缺少依赖,根据提示,是缺少liblzo2这个依赖,所以我下载了 liblzo2_2.10-4_aarch64_cortex-a72。
Package: liblzo2
Version: 2.10-4
Depends: libc
Provides: liblzo
Source: feeds/packages/libs/lzo
SourceName: liblzo
License: GPL-2.0-or-later
LicenseFiles: COPYING
Section: libs
SourceDateEpoch: 1607138319
ABIVersion: 2
Architecture: aarch64_cortex-a72
Installed-Size: 39086
Description: LZO is a data compression library which is suitable for data de-/compression
in real-time. This means it favours speed over compression ratio.
其中,Architecture后的字符串即是该ipk对应的架构,例如aarch64_cortex-a72
错误的做法:很多人只是简单地将上述待安装的ipk的架构(例如aarch64_cortex-a72)添加进opkg.conf(如下所示):
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
aarch64_cortex-a72
那么可能在试图安装该ipk时遇到输出大量的已安装软件的架构不匹配信息。
此时你不应该试图补充安装libc,也不应该试图补充其他报架构不匹配的任何软件。
因为此时你的openwrt并不是真的缺失支持库,而是你修改配置文件(/etc/opkg.conf)之后并没有把以前已安装的软件架构信息补上,导致openwrt不认识已安装的软件了。
先编辑/etc/opkg.conf,删除刚刚添加的所有架构信息,即删除所有以arch开头的行。并且保存文件。
然后使用putty等虚拟终端软件连接openwrt终端,然后输入:
opkg info | grep Architecture | sort | uniq
你会看到类似下面的输出:
Architecture: all
Architecture: aarch64_cortex-a53+crypto
可以看到,当前openwrt系统里只有两种不同的软件架构。一种是all,另一种是aarch64_cortex-a53+crypto。
提示:架构信息不同系统可能不一样。因此请在你自己的OpenWrt终端里亲手输入(or复制粘贴,whatever)以上命令,然后看清楚你自己的输出,根据实际的输出情况自行替换。请不要直接照抄我的结果。你我的结果很可能不一样,你直接照抄我的结果是很可能用不了的。
从上面的操作中,我们已经了解到以下事实:当前的openwrt里只有all和aarch64_cortex-a53+crypto两种架构的软件。而我们现在试图安装的ipk架构是aarch64_cortex-a72。那么,我们希望系统能够正确识别3种架构的软件:原来的all和aarch64_cortex-a53+crypto,以及将要安装的aarch64_cortex-a72。
因此,我们编辑/etc/opkg.conf,追加3行架构信息(以arch开头):
arch all 100
arch aarch64_cortex-a53+crypto 200
arch aarch64_cortex-a72 300
改好后的完整的/etc/opkg.conf可能是下面这样的:
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
arch all 100
arch aarch64_cortex-a53+crypto 200
arch aarch64_cortex-a72 300
保存文件,然后重新安装ipk,应该就可以正常安装IPK了。
同理,如果你的路由器存在很多种架构的软件,或者你打算安装很多种不同架构的软件,你应该把这些架构全部都按格式加入/etc/opkg.conf(每种架构只需要加入一次)。
提示:后面的数字(例如100)表示多种架构的软件同时存在时安装采用的优先级,数字越小优先级越高。如果你的路由器不只有2种架构的软件,请灵活变通,按格式通通加到/etc/opkg.conf里来。
解决了架构问题后,liblzo2安装时还是报错,提示:
Collected errors:
* check_data_file_clashes: Package wants to install file /usr/lib/liblzo2.so.2
But that file is already provided by package * liblzo2
* check_data_file_clashes: Package 17ce wants to install file /usr/lib/liblzo2.so.2.0.0
But that file is already provided by package * liblzo2
* opkg_install_cmd: Cannot install package liblzo2.
猜测应该是之前安装时,虽然安装失败,但是相关配置文件已经写入系统目录导致。并不是真正的依赖冲突。
上述并不是真正的依赖冲突,所以我们手动删除提示中的/usr/lib/liblzo2.so.2、/usr/lib/liblzo2.so.2.0.0,再进行安装,就可以成功!
参考链接:
修改opkg.conf解决incompatible with the architectures configured问题
解决Openwrt安装插件提示依赖冲突的方法