1. 前言
前段时间参照 LFS 项目搭建自定义的 Linux 系统。4014-LFS 自定义 Linux(上)和 4015-LFS 自定义 Linux (中)。记得在很多年前也完成过搭建 https://blog.51cto.com/waringid/67355,但是项目版本和软硬件版本都和现在相差甚远。并且宿主机的操作系统和虚拟机软件也和之前的不一致。
一路参照 LFS 项目文档指示操作都很顺利,一直到完成系统内核编译到重启直接使用 LFS 系统启动时提示内核 Panic。针对内核故障的情况花了近一个星期的时间排错,之前一直认为是内核编译中没有把虚拟机相关的兼容驱动打进去导致。尝试了多种方法:
- 使用宿主机内核的编译参数(参考意义不大,因为 LFS 启用没有使用 initrd)
- 通过 make defconfig 的方式生成默认的编译文件
- 利用默认的编译文件增加关于虚拟机驱动的编译项
- 调整 Linux 内核的编译版本为更高版
- 在 grub 启动阶段手动调整启动参数
- 进入宿主机重新生成 grub 文件并重新设置启动参数
最后不经意的尝试发现问题的主要原因在于 grub 的配置。
grub2 默认的配置文件保存在 /boot/grub/grub.cfg 。可以使用 grub 来发现引导映像、内核和根文件系统。可以完全访问本地计算机上的所有文件系统,不会受权限和安全现在。
2. 日常维护操作
2.1. 进入维护模式
在系统出现启动提示时,按【光标键】防止自动进入启动项(默认等待5秒),然后按【e】进入启动菜单的编辑界面,接着按【F2】进入 grub2 的命令界面。随后可以在命令界面检查和查看相关信息了

- 先设置 pager 模式
- 查看当前的磁盘和磁盘文件
grub> set pager=1
grub> ls (hd0) (hd0,msdos2) (hd0,msdos1)
(hd0,msdos3)
grub> ls (hd0,3)/
lost+found/ bin/ boot/ cdrom/ dev/ etc/ home/ lib/
lib64/ media/ mnt/ opt/ proc/ root/ run/ sbin/
srv/ sys/ tmp/ usr/ var/
2.2. 设置启动项
如果找到了 boot 下对应的内核文件,就可以设置该启动分区和对应的内核文件
grub> set root=(hd0,msdos3)
grub> linux /boot/vmlinuz-6.13.4-lfs-12.3 root=/dev/sda3
grub> boot
2.3. 救援模式
上述2种都是正常的模式,如果是救援模式,需要加载 normal.mod 和linux.mod 参照下面的指令
grub rescue> set prefix=(hd0,1)/boot/grub
grub rescue> set root=(hd0,1)
grub rescue> insmod normal
grub rescue> normal
grub rescue> insmod linux
grub rescue> linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sda1
grub rescue> initrd /boot/initrd.img-3.13.0-29-generic
grub rescue> boot
3. 更新 grub
update-grub
grub-install /dev/sda
添加评论