前段时间参照 LFS 项目搭建自定义的 Linux 系统。4014-LFS 自定义 Linux(上)和 4015-LFS 自定义 Linux (中)。记得在很多年前也完成过搭建 https://blog.51cto.com/waringid/67355,但是项目版本和软硬件版本都和现在相差甚远。并且宿主机的操作系统和虚拟机软件也和之前的不一致。
一路参照 LFS 项目文档指示操作都很顺利,一直到完成系统内核编译到重启直接使用 LFS 系统启动时提示内核 Panic。针对内核故障的情况花了近一个星期的时间排错,之前一直认为是内核编译中没有把虚拟机相关的兼容驱动打进去导致。尝试了多种方法:
最后不经意的尝试发现问题的主要原因在于 grub 的配置。
需要说明的是 LFS 项目中默认的磁盘使用 GPT,我这里的环境中使用宿主机的 fdisk 格式化分区出来后的磁盘是 dos ,它在 grub 中识别到的格式为 msdos |
grub2 默认的配置文件保存在 /boot/grub/grub.cfg 。可以使用 grub 来发现引导映像、内核和根文件系统。可以完全访问本地计算机上的所有文件系统,不会受权限和安全现在。
在系统出现启动提示时,按【光标键】防止自动进入启动项(默认等待5秒),然后按【e】进入启动菜单的编辑界面,接着按【F2】进入 grub2 的命令界面。随后可以在命令界面检查和查看相关信息了
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/
如果找到了 boot 下对应的内核文件,就可以设置该启动分区和对应的内核文件
grub> set root=(hd0,msdos3)
grub> linux /boot/vmlinuz-6.13.4-lfs-12.3 root=/dev/sda3
grub> boot
上述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
update-grub grub-install /dev/sda |