截至2026年4月10日,进入Linux的官网,最新的6.x稳定版是6.19.11,就决定拿它下手了。

下载linux源码
点最大的按钮,下载就行。https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.19.11.tar.xz
安装依赖
执行指令的用户均为普通用户,故本文所列指令都用sudo执行。如果读者大人使用的是root,请参考和执行时忽略每个指令中的sudo
参考文献1中指出,编译前要安装libncurses5-dev build-essential kernel-package flex bison libelf-dev libssl-dev这些依赖,但在Ubnutu24中实测,没有 libncurses5-dev, kernel-package这两个包。故我只安装了如下的包
sudo apt update
sudo apt install libncurses-dev build-essential flex bison libelf-dev libssl-dev事实上编译前要装什么依赖包是不确定的,实际编译时可能还会遇到缺包的情况,这是事先无法预料的,只能见招拆招。我在安装完上述包后,在编译过程中还出现了缺包的报错。因此我在后续还陆续安装了gawk, bc等包
sudo apt install libdw-dev gawk bc配置
解压linux源码,进入到源码文件夹中,初始化执行下述内容。根据参考文献1,用途为清理内核
sudo make clean
sudo make mrproper拷贝本机当前已启动的内核的config文件,至Linux源码目录中,一般在/boot下。当前版本的Ubuntu,官方仓库中最新的内核版本为6.17.0-20,故复制/boot/config-6.17.0-20-generic文件
cp /boot/config-6.17.0-20-generic .config编译前配置内核的特性。如果不需要改的话,用默认配置即可。选择Exit退出配置和保存就行
sudo make menuconfig需要注意的是,默认配置编译出来的内核非常非常大,会是操作系统官方提供的发行版内核的约10倍。这一点在后面我会描述如何处理。
在.config配置文件中,找到这两行,删除或者注释掉。在上一步menuconfig中,我找不到在哪里配置,故只能直接改.config

至此,配置已成,恭喜爹 可以编译了。

编译
接下来这一步比较吃硬盘。编译完成后预计占40多个G的硬盘空间,总写入量有100G以上,比较伤固态盘,故建议在机械盘上面进行编译。
sudo make -j$(nproc)$(nproc)是输出当前设备的CPU逻辑核心数,-j这个参数是为了充分利用所有核心,最高效地编译。如果你已经知道你的CPU逻辑核心数,可以直接写上去,不用nproc指代。比如我的R7-4800H 8核16线程,就可以直接执行sudo make -j16
编译的过程十分漫长,占用内存大概5G。
中间可能会出现类似[Makefile:248: __sub-make] Error 2 这样让人摸不着头脑的错误,又没有输出提示。不要慌,再执行一次上面的make指令,就能看到错误信息了,缺某某头文件或者指令,根据提示安装,或者上网搜索缺的内容即可。
上一步完成后继续执行,这一步很快
sudo make modules -j16完毕后,内核就编译好了,但还没安装到系统中用于启动。
打包安装or直接安装
根据参考文献2 3, 安装内核的方式我尝试了两种。既可以将内核打包成deb包,用dpkg包管理器的方式安装,也可以用make指令直接安装
直接安装
sudo make modules_install
sudo make install这两个指令会把内核的模块和镜像安装到/lib/modules与/boot。需要注意,默认配置编译出的initrd镜像非常大,请在/boot留足空间
最后更新一下grub,让它识别到新构建的内核,开机时可以用新内核启动。
sudo update-grub2最后重启,用grub选择新内核。如果启动失败,也可以回滚到原内核正常启动。
打包deb
用deb包的方式也有好处,即可以用dpkg这样的包管理器管理内核。
先安装一个依赖包,用于构建deb包的
sudo apt install debhelper开始打包
sudo make -j16 bindeb-pkg构建好的deb包默认会放在内核源码目录的上一级目录。安装headers, image, libc-dev三个包就行。
缩减内核大小
注意到/boot中,menuconfig时用默认配置构建出的内核非常大,initrd镜像大小是官方仓库中的10倍左右,/lib/modules目录下新内核的模块大小也接近10G。据参考文献4, 是内核中有大量的调试信息与符号,才使得其如此巨大。
在编译前,配置.config时,需将CONFIG_DEBUG_INFO这个属性由y变为n,禁用调试信息,再编译。

在menuconfig的图形化选项中,我也找不到这个配置在何处,故直接编辑.config文件。
参考文献5中提到另一种方法,在安装时添加一个参数INSTALL_MOD_STRIP。但我没有实际尝试过,仅供参考
sudo make INSTALL_MOD_STRIP=1 modules_install
#或者
sudo make INSTALL_MOD_STRIP=1 bindeb-pkg删除内核
首先回滚到旧内核正常启动,确保新内核没有在使用中。如果是用deb包安装的内核,直接用dpkg卸载安装的三个包。
如果是用make指令安装的,根据参考文献6,去下面这些目录,把名字里带新内核版本号的文件都屠屠干净
/lib/modules
/usr/src
/boot
最后更新一下grub,把新内核的信息从启动引导中删除掉
sudo update-grub2参考文献
1.编译内核 https://www.cnblogs.com/yangrourou/p/17778873.html
2.将内核打包成deb https://www.cnblogs.com/smlile-you-me/p/18248433
3.将内核打包成deb https://blog.glumi.cn/article/Linux-kernel-build.html
4.缩减内核大小 https://cloud.tencent.com/developer/article/2449977
5.缩减内核大小的另一个方法,未尝试 https://blog.csdn.net/qq_39819990/article/details/113788313
6.删除安装的内核 https://blog.csdn.net/qq_42606750/article/details/88616331