可以从网上 The Linux Kernel Archives下载Linux内核源码,虚拟机使用Ubuntu版本为6.8.0-49-generic 我选择的Linux内核源码版本为6.8.1:
但由于官网下载速度过慢,因此选择镜像网站Index of /pub/linux/kernel/v6.x/找到对应版本下载。
下载一些编译需要的工具如下:
sudo apt-get install vim git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison
解压下载的源代码。
xz -d linux-6.8.1.tar.xz
tar -xavf <linux-6.8.1.tar>
得到linux-6.8.1 目录。
切换到linux-6.8.1目录下,
编辑Makefile
,可以定义自己的内核版本号。vim Makefile
,修改“EXTRAVERSION =<YOUR_EXTRAVERSION>”,这里我设定的是`EXTRAVERSION =OSPRACTICE。
接着设定使用当前系统的内核配置文件为新内核的配置文件:
cp /boot/config-6.8.0-49-generic .config
如果需要更详细的配置,可以运行以下命令打开图形化配置界面。
make menuconfig
由于Debian 及其衍生版(即包括了Ubuntu)为内核模块使用一个签名证书。默认情况下,计算机并不包含这个证书。
因此需要关闭启用模块签名的选项,否则在接下来的内核编译中会报错。
我是结合了技术|Linux 内核动手编译实用指南 及GPT提示:
./scripts/config --file .config --set-str SYSTEM_TRUSTED_KEYS ''
./scripts/config --file .config --set-str SYSTEM_REVOCATION_KEYS ''
scripts/config --disable SYSTEM_TRUSTED_KEYRING
scripts/config --disable MODULE_SIG
scripts/config --disable MODULE_SIG_ALL
scripts/config --disable MODULE_SIG_SHA256
scripts/config --disable MODULE_SIG_SHA512
scripts/config --disable MODULE_SIG_RSA
scripts/config --disable MODULE_SIG_ECDSA
scripts/config --disable X509_CERTIFICATE_PARSER
scripts/config --disable CERTS
接下来使用多线程加速编译, j$(nproc)表示使用所有 CPU 核心并行编译。2>&1
会将 STDOUT 和 STDIN 重定向到相同的文件描述符,并通过管道传输给 tee
命令,这会将输出存储在一个名为 log
的文件,即将终端打印出的内容存储到日志中便于查看。
由于使用了多线程加速,编译的速度很快,大概用了一个半小时完成编译:
make -j$(nproc) 2>&1 | tee log
然后安装编译好的内核模块:
sudo make modules_install
最后安装新编译的内核:
sudo make install
如下图所示6.8.1-OSPRACTICE为新编译的内核。
为了使用编译的内核,需要编辑grub2选项。输入以下命令打开grub选项,并设置改为
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5
。这是在开机的时候打开一个选用内核的菜单界面并且设置选择时间为5秒。
sudo vim /etc/default/grub
更新grub并且重启选择新内核。
sudo update-grub
reboot
选择新编译的内核6.8.1-OSPRACTICE
启动后在终端界面查看内核,终于成功了!