Ubuntu编译安装内核
大约 3 分钟
下载目标内核代码
略
安装依赖
sudo apt install gdb bison m4 autoconf automake libtool libncurses5-dev build-essential fakeroot debhelper libelf-dev
设置
scripts/config --disable SYSTEM_TRUSTED_KEYS
scripts/config --disable SYSTEM_REVOCATION_KEYS
scripts/config --set-str CONFIG_SYSTEM_TRUSTED_KEYS ""
scripts/config --set-str CONFIG_SYSTEM_REVOCATION_KEYS ""
编译打包
暂时省略 ccache 的配置
fakeroot make -j 72 deb-pkg CC="ccache gcc"
完成会在根目录的上级目录看到一系列 *.deb
文件,形如 linux-image-6.6.0_6.6.0-15_amd64.deb
的就是我们需要的
安装内核
把 deb 包拷贝到目标机器
sudo dpkg -i *.deb
# 查看当前kernel
uname -a
卸载内核
查看当前所有 kernel:
$ dpkg --get-selections |grep linux-image
# 移除想要删除的kernel:
$ sudo apt-get remove \
<kernel_list_by_above_command>
$ dpkg --get-selections |grep linux-image
linux-image-5.10.100-sriov-fix install
linux-image-5.10.82-cvhb install
linux-image-5.15.74-cvhb install
linux-image-5.4.130-cvhb install
linux-image-unsigned-5.10.9-051009-generic install
$ sudo apt-get remove \
linux-image-5.10.100-sriov-fix
状态为 deinstall 即已经卸载,如果觉得看着不舒服的话可以使用 purge 连配置文件里一起彻底删除,清理内核列表
$ sudo apt-get purge \
linux-image-5.10.100-sriov-fix
然后更新 grub
sudo update-grub
更换默认 Kernel
Case1
相关信息
大部分应该都是 Case2 的模式,至少 ubuntu-23.10-live-server-amd64
经测试是 Case2,而且网上绝大多数都是只有 Case2 的
- 如果你的启动项在开机界面第一页(就是第一个菜单界面),那么就很简单了,如果是第一项,那么 GRUB_DEFAULT=0(选项默认从 0 开始计数)
- 如果是第二项,那么 GRUB_DEFAULT=1,以此类推。
Case2
- 多内核,内核选择界面在第二页(就是第二个菜单界面),比如要启动 5.4.0 的内核(在第二个菜单界面的第一项),那么
GRUB_DEFAULT="1>0"
1 表示第一个菜单界面开机时选择第二项,0 表示第二个菜单界面开机时选择第一项,
在系统中查找自己想切换的默认 kernel 在内核选择的第二个页面的第几项:
查看有哪些内核可切换:
cat /boot/grub/grub.cfg | grep menuentry
想要查看更具体,可以查询 /boot/grub/grub.cfg 中的内容
- 我们想以 submenu 中 哪个 kernel 作为默认启动,只需要数这个 kernel 排在"Advanced options for ubuntu"后面的第几个(从 0 开始数),然后把 /etc/default/grub 中 GRUB_DEFAULT="1> 对应 kernel 的序号"。
例子
$ cat /boot/grub/grub.cfg | grep menuentry
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
menuentry_id_option=""
export menuentry_id_option
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-dbceaf9c-37a8-4269-b300-d7e7f6794f10' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-dbceaf9c-37a8-4269-b300-d7e7f6794f10' {
menuentry 'Ubuntu, with Linux 6.5.0-10-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.5.0-10-generic-advanced-dbceaf9c-37a8-4269-b300-d7e7f6794f10' {
menuentry 'Ubuntu, with Linux 6.5.0-10-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.5.0-10-generic-recovery-dbceaf9c-37a8-4269-b300-d7e7f6794f10' {
menuentry 'Ubuntu, with Linux 6.6.0' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.6.0-advanced-dbceaf9c-37a8-4269-b300-d7e7f6794f10' {
menuentry 'Ubuntu, with Linux 6.6.0 (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.6.0-recovery-dbceaf9c-37a8-4269-b300-d7e7f6794f10' {
menuentry 'UEFI Firmware Settings' $menuentry_id_option 'uefi-firmware' {
假如我们想把 Ubuntu, with Linux 6.6.0 作为默认 kernel,那么他的编号为 2(从 0 开始),只需要如下编辑/etc/default/grub 然后 update-grub 即可:
$sudo vim /etc/default/grub
...
GRUB_DEFAULT="1>2"
...
$ sudo update-grub
$ sudo reboot
$ cat /proc/cmdline #查看启动项是否正确