一、前言
什么是Linux的内核编译呢?简单来说,Linux内核编译是一个将内核源代码转换成可在特定的硬件架构上运行的二进制文件的过程。通过编译内核,我们可以根据自己的需求和兴趣对内核进行定制和优化,以满足特定的应用场景。下文则是Linux内核编译的详细流程:
注:
在ubuntu20.04.3 LTS中以kernel 6.11.6为编译版本
二、 内核编译流程
2.1 准备工作
-
1.安装必要的编译工具
安装gcc编译器、make工具、ncurses库(用于make menuconfig)等编译工具sudo apt install make gcc git libncurses5-dev sudo apt install fakeroot build-essential xz-utils libssl-dev bc flex libelf-dev bison ccache zstd dwarves(解决btf生成问题)
-
2.获取内核源代码
可以从官方网站或源代码仓库中获取Linux内核的源代码,我们可以选择下载最新版本的源代码,或者根据我们的需求选择特定版本的源代码,可以通过git clone
或者直接下载来获取内核源代码。
官网地址:
https://kernel.org/ -
3.解压内核源代码
如果下载的是压缩包,需要使用相应的命令将压缩包解压到你需要的目录。
2.2 配置内核
-
4.复制默认配置
将默认的内核配置文件复制到我们下载好的内核源代码的目录中,并重命名为.config文件。cp /boot/config-$(uname -r) .config
-
5.修改默认配置
打开config
修改 CONFIG_SYSTEM_TRUSTED_KEYS,将其赋空值。vim .config CONFIG_SYSTEM_TRUSTED_KEYS=""
-
6.打开内核配置界面
通过make menuconfig命令在终端中打开内核配置界面。在配置界面中,可以选择启用或禁用特定的功能、模块和设备驱动程序。还可以调整内核的参数和选项,以满足我们特定的需求。make menuconfig
-
7.保持配置
配置完成后,保存并退出菜单。这将生成一个包含所选配置信息的.config文件。
2.3 编译内核
-
8.开始编译
在内核源码目录中运行make命令开始编译内核。这个过程需要一段时间,具体取决于系统配置和计算机性能。make -j8 //-j代表CPU的个数 //查看CPU的个数 screenfetch
-
9.安装内核模块
编译完成后,将编译生成的内核模块安装到系统中。sudo make modules_install //可能有问题,如果有问题,则执行下面的语句 sudo make INSTALL_MOD_STRIP=1 modules_install -j8 (INSTALL_MOD_STRIP=1一定要加上,否则会有initrd.img-xxx文件太大的问题,导致开机一直卡在加载映像到磁盘,无法开机)
-
10.安装内核镜像
运行make install
命令将编译生成的内核镜像(如vmlinuz)和initramfs或initrd 镜像(如果需要的话)复制到/boot目录下。sudo make install
检查一下/boot/initrd.img-xxx大小是否太大,正常一般不超过100M,如果太大就执行(make INSTALL_MOD_STRIP=1 modules_install -j8)的命令,然后再执行:
mkinitramfs /lib/modules/6.11.xxxx/ -o /boot/initrd.img-6.11xxx
注意: 当我们编译并安装了新的内核后,通常需要为新的内核创建一个匹配的initrd映像文件。这是因为新的内核可能需要不同的驱动程序和配置来访问存储介质和挂载根文件系统。在这种情况下,我们就可以使用mkinitramfs命令来创建新的initrd映像文件,并确保它与新的内核版本相匹配。
2.4 验证和测试
- 11.重新启动计算机
选择新编译的内核启动。 - 12.验证内核编译是否成功
使用uname-a命令查看当前系统的信息,确认内核名称、版本号和发布日期是否正确。uname-a
三、注意事项
- 备份
在进行内核编译之前,建议将备份当前的系统和内核配置,以防万一编译失败或出现其他问题的时候我们可以及时回退。 - 依赖关系
确保系统配置和硬件支持所选择的内核选项,在编译过程中,如果遇到依赖关系错误,可以检查并安装缺失的依赖包。这个一般我们将编译错误复制在浏览器中查询一般就可以找到缺失的依赖包了。
四、具体内核编译问题
4.1 编译内核报错:No rule to make target ‘debian/canonical-certs.pem‘
-
报错描述
make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop. make: *** [Makefile:1053: certs] Error 2
-
问题原因
缺少证书
-
问题解决
方法一: 打开.config文件注释掉这一行或将其赋空值
CONFIG_SYSTEM_TRUSTED_KEYS="debian/certs/benh@debian.org.cert.pem"
方法二: 执行完下面的语句后
make clean
,然后重新编译scripts/config --disable SYSTEM_TRUSTED_KEYS
后续遇到的一些实际错误也会在下面接着进行补充,大家感兴趣和以关注加收藏。