编译内核

安装内核编译所需包:

1
sudo apt-get update && sudo apt-get install build-essential gcc g++ make libncurses5-dev libssl-dev bison flex bc libelf-dev

生成内核编译配置文件:

1
make localmodconfig

修改.config文件:

1
vim .config
  1. 删除系统吊销密钥

    查找CONFIG_PSI,将其对应行修改为:

    1
    CONFIG_SYSTEM_REVOCATION_KEYS=""

然后就可以进行内核编译:

1
make -j8 && sudo make modules_install && sudo make install

修改grub

打开grub配置文件:

1
sudo vim /etc/default/grub

进行以下修改:

  1. 注释GRUB_TIMEOUT_STYLE=hidden
  2. GRUB_CMDLINE_LINUX_DEFAULT设置为”text”
  3. GRUB_TIMEOUT修改成30

然后保存退出,更新grub:

1
sudo update-grub

进入内核

完成上述步骤后,重启虚拟机:

1
sudo reboot

在进入GRUB界面时选择Advanced Ubuntu,然后选择内核版本6.4.0+即可。

问题记录

  1. ALERT! root=UUIDxxx does not exist. Dropping to a shell!

    因缺少磁盘驱动挂载文件系统失败

  2. init进程启动失败,error code为-8

    1
    2
    Starting init: /sbin/init exists but couldn't execute it (error -8)
    然后init进程被杀死了,然后就进入BusyBox Shell

    最后发现是不知道为什么它将启动参数中的text误认为init进程的启动参数了,最后的解决方案是删掉启动参数里的text(具体方法可以看GRUB介绍部分,看完大概就懂了)

  3. cannot set terminal proccess group(-1): Inappropriate ioctl for device.

    不知道为啥重启下就好了。偶尔出现偶尔不出现,很奇怪

  4. initrd.img Unable to mount root fs on Unknown-block(0,0)

    最后发现好像是这个initrd.img损坏了,最后执行mkinitramfs -o /boot/initrd.img-xxx重新做了个initrd.img解决问题。

  5. Kernel panic - not syncing: No working init found. Try passing init= option to kernel.

    按它说的那样,在GRUB参数加个比方说init=/bin/bash就行了