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-98140eff27c8328c5dc13f3f595ea43b98140eff27c8328c5dc13f3f595ea43b这一串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 ~

posted @ 2022-08-01 10:40  虐心i  阅读(2587)  评论(0编辑  收藏  举报