目录
环境
芯片:V3S
软件:基于Openwrt 19.07.3的自编译版本
问题:在安装需要校验kernel版本的ipk时,无法安装,报错:satisfy_dependencies_for: Cannot satisfy the following dependencies for xxxx
原因:
当我们修改了kernel的config文件后,编译时,openwrt会根据kernel的.config文件( $(LINUX_DIR)/.config )计算md5的值,附加在kernel版本号后。同时编译出来的ipk包均会要求基于该版本。
解决方法:
因此需要修改三个地方:
- 在openwrt跟目录,编写文件 vermagic ,内容为
9801ec2dfc48e8fb2cc10a339283e7b0
该md5是官方编译的md5,不同版本的不同,可以根据安装时的提示获取到需要更改的md5
-
openwrt/include/kernel-defaults.mk 更改编译规则,不用mkhash md5生成,而直接拷贝根目录下的vermagic文件到linux_dir/.vermagic
diff --git a/include/kernel-defaults.mk b/include/kernel-defaults.mk
index cc1e236..97d7bb1 100644
--- a/include/kernel-defaults.mk
+++ b/include/kernel-defaults.mk
@@ -105,7 +105,9 @@ define Kernel/Configure/Default
cp $(LINUX_DIR)/.config.set $(LINUX_DIR)/.config.prev; \
}
$(_SINGLE) [ -d $(LINUX_DIR)/user_headers ] || $(KERNEL_MAKE) INSTALL_HDR_PATH=$(LINUX_DIR)/user_headers headers_install
- grep '=[ym]' $(LINUX_DIR)/.config.set | LC_ALL=C sort | mkhash md5 > $(LINUX_DIR)/.vermagic
+ # grep '=[ym]' $(LINUX_DIR)/.config.set | LC_ALL=C sort | mkhash md5 > $(LINUX_DIR)/.vermagic
+
+ cp $(TOPDIR)/vermagic $(LINUX_DIR)/.vermagic
endef
3. 修改自己编译出来的ipk依赖的md5,即修改package/kernel/linux/Makefile 如果不改这个,编译时生成ipk时,会报错,因为ipk还是依赖于kernel的config文件生成的md5。 这里我们直接读取linux_dir/.vermagic文件。
diff --git a/package/kernel/linux/Makefile b/package/kernel/linux/Makefile
index 39b9e82..51a44d2 100644
--- a/package/kernel/linux/Makefile
+++ b/package/kernel/linux/Makefile
@@ -24,7 +24,9 @@ export SHELL:=/bin/sh
include $(INCLUDE_DIR)/package.mk
ifeq ($(DUMP),)
- STAMP_BUILT:=$(STAMP_BUILT)_$(shell $(SCRIPT_DIR)/kconfig.pl $(LINUX_DIR)/.config | mkhash md5)
+# STAMP_BUILT:=$(STAMP_BUILT)_$(shell $(SCRIPT_DIR)/kconfig.pl $(LINUX_DIR)/.config | mkhash md5)
+ STAMP_BUILT:=$(STAMP_BUILT)_$(shell cat $(LINUX_DIR)/.vermagic)
+
-include $(LINUX_DIR)/.config
endif
修改完成后再编译即可,就可以指定使用官方的opkg源或者镜像源,使用涉及到验证kernel版本也不会无法安装了。
最后
本身验证kernel版本也是为了防止用户修改了config文件后,导致一些配置或者文件不匹配,从而导致安装的ipk和kernel无法对应上出错。因此我们在编译openwrt时,对于kernel的配置尽量少改动。必要的功能可以使用ipk进行模块导入。