OpenWrt之kmod内核不兼容分析
OpenWrt之kmod内核不兼容分析
Kmod内核模块MD5校验
include/kernel-defaults.mk
define Kernel/Configure/Default
# 省略N行
grep '=[ym]' $(LINUX_DIR)/.config.set | LC_ALL=C sort | $(MKHASH) md5 > $(LINUX_DIR)/.vermagic
endef
可以看到会生成一个.vermagic
在根目录下 , 里面包含着md5
的校验信息
include/kernel.mk
ifeq ($(TARGET_BUILD),1)
# 省略N行
LINUX_VERMAGIC:=$(strip $(shell cat $(LINUX_DIR)/.vermagic 2>/dev/null))
LINUX_VERMAGIC:=$(if $(LINUX_VERMAGIC),$(LINUX_VERMAGIC),unknown)
# 省略N行
endif
再通过cat $(LINUX_DIR)/.vermagic
存放到 LINUX_VERMAGIC
变量中
package/kernel/linux/makefile
define Package/kernel
SECTION:=sys
CATEGORY:=Kernel
DEFAULT:=y
TITLE:=Virtual kernel package
VERSION:=$(LINUX_VERSION)-$(LINUX_RELEASE)-$(LINUX_VERMAGIC)
URL:=http://www.kernel.org/
PKG_FLAGS:=nonshared
endef
于是就构建出了 komd这种 5.10.127-1-98140eff27c8328c5dc13f3f595ea43b
如果想自定义MD5 , 可以修改一下.vermagic
的生成逻辑
define Kernel/Configure/Default
# 省略N行
cp -f $(TOPDIR)/.vermagic $(LINUX_DIR)/.vermagic
endef
在根目录下创建.vermagic
文件 , 填入我们想要的MD5 , 即可.
Kmod内核信息
编译好的固件都会生成一份manifest
, 里面记录着模块的内核版本 , 发行版本 , 还有MD5
就像这样VERSION:=$(LINUX_VERSION)-$(LINUX_RELEASE)-$(LINUX_VERMAGIC)
下面是openwrt-x86-64.manifest的参考:
# 省略N行
kernel - 5.10.127-1-98140eff27c8328c5dc13f3f595ea43b
# 省略N行
我们最主要还是获取这个kernel - 5.10.127-1-98140eff27c8328c5dc13f3f595ea43b
中98140eff27c8328c5dc13f3f595ea43b
这一串MD5
用下面命令也能输出上面的效果
opkg list
OpenWrt的内核信息存放在/usr/lib/opkg/status
,
opkg info # opkg info kernel
也能查看已经安装软件包的信息, 也就是输出那个文件的内容
强制安装kmod - 解决kmod内核不兼容
- 直接上bash脚本
#!/bin/bash
# Author: NueXini
core=$(cat /etc/opkg/distfeeds.conf | grep 'core' | awk '{print $3}')
old_kernel_md5=$(opkg info kernel | grep 'Version' | cut -d '-' -f 3)
new_kernel_md5=$(curl -s "$core/Packages.manifest" | grep -oE -m 1 'kernel \(=.*\)' | awk -F\- '{print $3}' | sed 's,\),,g')
sed -i "s/$old_kernel_md5/$new_kernel_md5/g" /usr/lib/opkg/status
echo 'Finished'
这样就可以安装了, 效果跟opkg 的 force_depends
效果是一样的
查看CPU架构
- 第一种
opkg print-architecture | grep -vE 'all|noarch' | awk '{print $2}'
- 第二种
# cat /etc/openwrt_release | grep '_TARGET' | cut -d "'" -f 2
cat /etc/openwrt_release | grep '_ARCH' | cut -d "'" -f 2
- 第三种
opkg info | grep '^Architecture' | grep -vE 'all|noarch' -m 1 | awk -F': ' '{print $2}'
- 第四种
# cat /etc/opkg/distfeeds.conf | grep -oE 'targets/(.*)/packages' | cut -d '/' -f 2,3
cat /etc/opkg/distfeeds.conf | grep -oE 'packages/(.*)/base' | cut -d '/' -f 2
- 第五种
# cat /usr/lib/os-release | grep '_BOARD' | cut -d '"' -f 2
cat /usr/lib/os-release | grep '_ARCH' | cut -d '"' -f 2
- 如果有其他的方法欢迎留言
feeds源参考
腾讯: https://mirrors.cloud.tencent.com/openwrt/
阿里: https://mirrors.aliyun.com/openwrt
清华大学: https://mirrors.tuna.tsinghua.edu.cn/openwrt/
中国科技大学: https://mirrors.ustc.edu.cn/openwrt/
兰州大学: https://mirror.lzu.edu.cn/openwrt/
南阳理工学院: https://mirror.nyist.edu.cn/openwrt/
北京外国语大学: https://mirrors.bfsu.edu.cn/openwrt/
上海交通大学: https://mirror.sjtu.edu.cn/openwrt/
- 使用方法
sed -i 's,downloads.openwrt.org,mirrors.bfsu.edu.cn/openwrt,g' /etc/opkg/distfeeds.conf
分析到此结束 , Enjoy it ~