解决OpenWrt下安装插件缺少依赖、架构不兼容、依赖冲突的问题

环境描述

我使用的路由器是小米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包。

安装主程序xxxxx-xxxxx时,出现依赖报错

看到dependencies,就要知道是缺少依赖,根据提示,是缺少liblzo2这个依赖,所以我下载了 liblzo2_2.10-4_aarch64_cortex-a72。

安装liblzo2时,出现架构报错

  • pkg_hash_fetch_best_installation_candidate: Packages for liblzo2 found, but incompatible with the architectures configured。
  • 这是由于opkg没有配置好对应的架构信息(配置文件路径/etc/opkg.conf),导致ipk无法安装的情况.
  • 如果机器硬件架构和ipk文件架构本来就不是一样的,那肯定就是安装不上的,即使强行安装上了也是运行不了的。例如,你在arm硬件架构的机器上,试图安装x86架构的ipk,那肯定是装不上的,也用不了的。
  • 一般来说,从.ipk文件的文件名就可以猜测ipk文件可能对应的硬件架构。例如liblzo2_2.10-4_aarch64_cortex-a72表明它是aarch64_cortex-a72架构的ipk包;
  • 如果无法从文件名判断架构信息,可以将ipk包解压,查看里面的control文件,即可看到对应的架构信息。具体方法:将xxx.ipk改后缀成xxx.tar,然后使用WinRAR(Windows)或者tar工具(Linux)即可解压。解压完之后,找到control.tar.gz文件,再解压control.tar.gz,即可找到control文件,control文件的内容可能如下:
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

  • 注意,如果使用WinRAR,那么第一次解压之后可能需要将得到的文件手动添加上.tar后缀才能继续解压

解决架构报错方法

查清路由器上所有已装软件的架构

错误的做法:很多人只是简单地将上述待安装的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时遇到输出大量的已安装软件的架构不匹配信息。
解决OpenWrt下安装插件缺少依赖、架构不兼容、依赖冲突的问题_第1张图片
此时你不应该试图补充安装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)以上命令,然后看清楚你自己的输出,根据实际的输出情况自行替换。请不要直接照抄我的结果。你我的结果很可能不一样,你直接照抄我的结果是很可能用不了的。

修改/etc/opkg.conf

从上面的操作中,我们已经了解到以下事实:当前的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安装插件提示依赖冲突的方法

你可能感兴趣的:(其他)