4.9版本之后的Linux内核构建第三方模块有哪些变化?
我之前也长期用kernel-package里的make-kpkg在Ubuntu上编译自定义内核,碰到过类似的跨版本兼容性问题,结合你的操作流程和遇到的问题,整理几个可能的原因和解决思路:
先梳理你的操作流程
- 用
make-kpkg构建带Con Kolivas补丁的自定义内核 - 安装生成的
linux-image和linux-headers包后,手动修改/lib/modules/4.x.y/source和/build符号链接,指向/usr/src/linux-headers-4.x.y(因为要删除体积庞大的源码树) - 4.9.30版本该流程完全正常,但4.15.7和4.14.23版本下第三方模块无法工作
可能的原因及对应解决方法
1. 新版内核头文件包缺少关键依赖文件
从4.14版本开始,Ubuntu的linux-headers包结构有了变化,不再像4.9版本那样包含第三方模块编译所需的全部文件——比如Module.symvers、.config或者include/generated下的动态生成头文件,这些都是模块编译时必须的依赖。
解决办法:
- 构建内核时,确保
make-kpkg生成的headers包包含这些文件。可以尝试在构建命令中添加--with-headers参数,或者手动把源码树中的Module.symvers、.config复制到/usr/src/linux-headers-4.x.y目录下,再重新建立软链接。 - 也可以在删除源码树前,先把源码树里的
include/generated目录复制到/usr/src/linux-headers-4.x.y/include/下。
2. 符号链接的权限或系统上下文异常
较新的内核版本对模块目录的权限、SELinux上下文(如果你的系统启用了SELinux)有更严格的校验,手动修改软链接可能导致权限不匹配。
解决办法:
- 用
ls -l /lib/modules/4.x.y/查看source和build链接的权限,对比4.9.30版本的对应目录,确保权限是root:root且权限值为755。 - 如果是SELinux问题,用
chcon --reference=/lib/modules/4.9.30/source /lib/modules/4.x.y/source命令,把正常版本的上下文复制过来。
3. Con Kolivas补丁的版本兼容性问题
你使用的Con Kolivas补丁可能没有适配4.14/4.15版本的内核,导致内核的模块接口发生了非预期的变化,第三方模块无法适配这些修改。
解决办法:
- 先尝试不打补丁构建4.15.7/4.14.23内核,测试第三方模块是否能正常工作。如果正常,说明是补丁的问题,需要找适配新版内核的补丁版本。
- 可以查看Con Kolivas补丁的官方更新日志,确认是否有针对4.14+内核的分支。
4. make-kpkg工具的兼容性失效
Ubuntu从18.04版本开始,官方已经不再推荐使用kernel-package包和make-kpkg工具,转而使用dpkg-buildpackage来构建内核。make-kpkg对4.14+版本的内核支持可能存在bug,导致生成的headers包不完整。
解决办法:
改用官方推荐的dpkg-buildpackage方法构建内核,步骤如下:
- 解压内核源码,应用你的补丁
- 复制当前系统的内核配置:
cp /boot/config-$(uname -r) .config,然后运行make olddefconfig更新配置 - 安装构建依赖:
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev - 运行
dpkg-buildpackage -b -uc -us生成deb包 - 安装生成的
linux-image和linux-headers包,此时系统会自动正确设置source和build链接,无需手动修改
快速验证步骤
先在4.15.7/4.14.23内核下,不删除源码树,保持source和build链接指向源码树,测试第三方模块是否能正常工作。如果正常,说明问题出在headers包缺失文件;如果还是失效,那大概率是补丁或工具兼容性的问题。
内容的提问来源于stack exchange,提问作者RJVB




