在Yocto中扩展Linux内核版本的简便方法及测试方案
我来帮你梳理下这个需求的最简实现方式,以及不用烧录单板就能验证的方法,都是Yocto构建内核时常用的实用技巧:
一、正确修改内核版本的两种方法
你之前尝试的LINUX_KERNEL_EXTENSION其实不是用来调整内核版本字符串的正确变量,这可能是没生效的原因。下面两种方法都能实现你的需求,选一个最适合你的:
方法1:用Yocto原生变量LINUX_VERSION_EXTENSION(推荐)
这是Yocto为内核版本扩展提供的原生变量,用法很简单。不要直接修改Linux的.bb文件,建议创建对应的.bbappend文件(比如linux-imx_3.11.67.bbappend),在里面添加:
# 假设你已经把Git标签存入了MY_GIT_TAG变量 LINUX_VERSION_EXTENSION = "-${MY_GIT_TAG}"
重新构建内核后,这个后缀会自动追加到内核版本末尾,最终就能得到3.11.67-my-tag这样的格式。
方法2:直接传递内核LOCALVERSION参数
如果你的Yocto版本比较老,对LINUX_VERSION_EXTENSION支持有问题,可以用内核Makefile原生支持的LOCALVERSION参数。同样在.bbappend里添加:
EXTRA_OEMAKE += "LOCALVERSION=-${MY_GIT_TAG}"
内核编译时会直接把这个值加到版本字符串里,效果和方法1完全一致。
二、不用烧录单板的验证方法
不用把镜像刷到单板上,这三种方式就能快速验证效果:
查看构建后的版本文件:构建完成后,直接去构建目录找这个文件:
cat tmp/work/<你的机器名>/linux-<版本号>/<构建ID>/image/etc/kernel-version里面就是最终的内核版本字符串,一眼就能确认是否生效。
检查内核镜像的版本信息:用
strings命令提取内核镜像里的版本内容:strings tmp/work/<你的机器名>/linux-<版本号>/<构建ID>/image/boot/zImage | grep "Linux version"输出会显示完整的版本信息,比如
Linux version 3.11.67-my-tag (builduser@buildhost) ...。模拟根文件系统环境(可选):如果想测试
uname -r的输出,可以用chroot进入构建好的根文件系统:chroot tmp/work/<你的机器名>/linux-<版本号>/<构建ID>/image /bin/sh uname -r不过这种方式需要确保根文件系统完整,且可能需要提前挂载proc等虚拟文件系统,前两种方法其实已经足够验证了。
小提示:排查变量是否生效
如果还是没效果,先确认你的Git标签变量是否正确传递了:
bitbake -e linux-<你的内核版本> | grep MY_GIT_TAG
如果能看到正确的标签值,那就是配置没问题,重新构建内核即可;如果看不到,要先排查变量传递的问题。
内容的提问来源于stack exchange,提问作者belussi1988

