修改opkg.conf解决incompatible with the architectures configured问题 - dafeiyoung/sguclient GitHub Wiki

在安装ipk文件的时候,有时OpenWrt会提示* pkg_hash_fetch_best_installation_candidate: Packages for xxx found, but incompatible with the architectures configured。这是由于架构不匹配。

本文教你怎么编辑OpenWrt上的/etc/opkg.conf文件,从而正确地解决这个问题。

请耐心阅读,请认真理解这个极其简单的逻辑,尤其请不要照抄我的输出结果。

一.适用范围

1.本文仅仅适用于由于opkg没有配置好对应的架构信息(配置文件路径/etc/opkg.conf),导致ipk无法安装的情况。

如果机器硬件架构和ipk文件架构本来就不是一样的,那肯定就是安装不上的,即使强行安装上了也是运行不了的。例如,你在ar71xx硬件架构的机器上,试图安装ramips_24kec架构的ipk,那肯定是装不上的,也用不了的。

2.理论上,本文适用于所有版本的openwrt固件。

二. 查清待安装的ipk文件对应的架构

一般来说,从.ipk文件的文件名就可以猜测ipk文件可能对应的硬件架构。例如libpcap_1.5.3-1_ar71xx.ipk表明它可能是ar71xx架构的ipk包;再例如,libpcap_1.5.3-1_ramips_24kec.ipk表明它可能是ramips_24kec架构的ipk包。

如果无法从文件名判断架构信息,可以将ipk包解压,查看里面的control文件,即可看到对应的架构信息。

具体方法:将xxx.ipk改后缀成xxx.tar,然后使用WinRAR(Windows)或者tar工具(Linux)即可解压。解压完之后,找到control.tar.gz文件,再解压control.tar.gz,即可找到control文件,control文件的内容可能如下:

Package: libpcap
Version: 1.5.3-1
Depends: libc
Source: package/libs/libpcap
Section: libs
Maintainer: Felix Fietkau <[email protected]>
Architecture: ramips_24kec
Installed-Size: 82361
Description:  This package contains...

其中,Architecture后的字符串即是该ipk对应的架构,例如ramips_24kec

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

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

错误的做法:很多人只是简单地将上述待安装的ipk的架构(例如ramips_24kec)添加进opkg.conf(如下所示),那么可能在试图安装该ipk时遇到输出大量的已安装软件的架构不匹配信息。

dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay


arch ramips_24kec 100

大量的已安装软件的架构不匹配信息如下:

...
Package luci-i18n-upnp-zh-cn version git-17.256.19431-3dbc6fa-1 has no valid architecture, ignoring.
Package kmod-usb-storage-extras version 3.14.79-1 has no valid architecture, ignoring.
Package kmod-ifb version 3.14.79-1 has no valid architecture, ignoring.
Package kmod-mppe version 3.14.79-1 has no valid architecture, ignoring.
Package kmod-nls-base version 3.14.79-1 has no valid architecture, ignoring.
Package uhttpd-mod-ubus version 2016-10-25-1628fa4b-1 has no valid architecture, ignoring.
Package libpopt version 1.16-1 has no valid architecture, ignoring.
Package fwtool version 1 has no valid architecture, ignoring.
Package iptables-mod-account version 2.3-1 has no valid architecture, ignoring.
Package libipset version 6.32-2 has no valid architecture, ignoring.
Package jsonfilter version 2014-06-19-cdc760c58077f44fc40adbbe41e1556a67c1b9a9 has no valid architecture, ignoring.
Package wireless-tools version 29-5 has no valid architecture, ignoring.
Package kmod-crypto-arc4 version 3.14.79-1 has no valid architecture, ignoring.
Package kmod-usb-net-cdc-ether version 3.14.79-1 has no valid architecture, ignoring.
Package kmod-crypto-sha1 version 3.14.79-1 has no valid architecture, ignoring.
Package pbfw-fwcheck version 1 has no valid architecture, ignoring.
Package vsftpd version 3.0.3-5 has no valid architecture, ignoring.
Package kmod-pppol2tp version 3.14.79-1 has no valid architecture, ignoring.
Package libopenssl version 1.0.2h-1 has no valid architecture, ignoring.
Package kmod-scsi-core version 3.14.79-1 has no valid architecture, ignoring.
Package kmod-slhc version 3.14.79-1 has no valid architecture, ignoring.
Package luci-i18n-firewall-zh-cn version git-17.256.19431-3dbc6fa-1 has no valid architecture, ignoring.
Package ppp-mod-pppoa version 2.4.7-8 has no valid architecture, ignoring.
Package rpcd-mod-rrdns version 20170710 has no valid architecture, ignoring.
Package ppp-mod-pppoe version 2.4.7-8 has no valid architecture, ignoring.
Package kmod-lib-crc-itu-t version 3.14.79-1 has no valid architecture, ignoring.
Package kmod-sched-core version 3.14.79-1 has no valid architecture, ignoring.
Package kmod-ipt-nat version 3.14.79-1 has no valid architecture, ignoring.
Package kmod-ledtrig-netdev version 3.14.79-1 has no valid architecture, ignoring.
Package dnsmasq-full version 2.77-6 has no valid architecture, ignoring.
Installing libpcap (1.5.3-1) to root...
Collected errors:
 * satisfy_dependencies_for: Cannot satisfy the following dependencies for libpcap:
 *      libc *
 * opkg_install_cmd: Cannot install package libpcap.

此时你不应该试图补充安装libc,也不应该试图补充其他报架构不匹配的任何软件。

因为此时你的openwrt并不是真的缺失支持库,而是你修改配置文件(/etc/opkg.conf)之后并没有把以前已安装的软件架构信息补上,导致openwrt不认识已安装的软件了。

为了正确地解决此问题,请继续往下操作。

四.查看openwrt已安装的软件架构

先编辑/etc/opkg.conf,删除刚刚添加的所有架构信息,即删除所有以arch开头的行。并且保存文件。

然后使用putty等虚拟终端软件连接openwrt终端,然后输入:

opkg info | grep Architecture | sort | uniq

你会看到类似下面的输出(这只是一个例子,能理解吗):

Architecture: all
Architecture: mipsel_24kec_dsp

可以看到,当前openwrt系统里只有两种不同的软件架构。一种是all,另一种是mipsel_24kec_dsp

提示:架构信息不同系统可能不一样。因此请在你自己的OpenWrt终端里亲手输入(or复制粘贴,whatever)以上命令,然后看清楚你自己的输出,根据实际的输出情况自行替换。请不要直接照抄我的结果。你我的结果很可能不一样,你直接照抄我的结果是很可能用不了的。

五.修改/etc/opkg.conf

从上面的操作中,我们已经了解到以下事实:当前的openwrt里只有allmipsel_24kec_dsp两种架构的软件。而我们现在试图安装的ipk架构是ramips_24kec。那么,我们希望系统能够正确识别3种架构的软件:原来的allmipsel_24kec_dsp,以及将要安装的ramips_24kec

因此,我们使用WinSCP等工具编辑/etc/opkg.conf,追加3行架构信息(以arch开头):

arch all 100
arch mipsel_24kec_dsp 200
arch ramips_24kec 300

改好后的完整的/etc/opkg.conf可能是下面这样的:

dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay

arch all 100
arch mipsel_24kec_dsp 200
arch ramips_24kec 300

保存文件,然后重新安装ipk,应该就可以正常安装IPK了。

同理,如果你的路由器存在很多种架构的软件,或者你打算安装很多种不同架构的软件,你应该把这些架构全部都按格式加入/etc/opkg.conf(每种架构只需要加入一次)。

提示:后面的数字(例如100)表示多种架构的软件同时存在时安装采用的优先级,数字越小优先级越高。如果你的路由器不只有2种架构的软件,请灵活变通,按格式通通加到/etc/opkg.conf里来。

六. 附录

附上常用的/etc/opkg.conf内容(仅追加的内容,不是完整文件内容),有需要的小伙伴可以参考。

提示:以下内容仅供老司机参考。如果你根本就没弄懂以上教程的含义,请不要直接照抄这个附录。你我的软硬件可能不一样,因此你照抄我的结果是大概率用不了的。

你应该做的是:请再读以上教程文字若干遍,认真理解上面教程的含义,并且按教程的指示亲自在你的路由器上输入指令,查到属于你自己的架构信息并正确操作添加架构信息。请不要直接照抄下面的附录。

  1. mt762x处理器(例如斐讯K2),Pandorabox固件(2017版):
arch all 100
arch noarch 200
arch ralink 300
arch ramips 400
arch mipsel_24kec_dsp 500
arch ramips_24kec 600