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

linux官网.webp

下载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

注释掉两个key.webp

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

再三聋.webp

编译

接下来这一步比较吃硬盘。编译完成后预计占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,禁用调试信息,再编译。

禁用调试.webp

在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