在U盘上安装LFS
2018-08-23 others不想在硬盘上额外分区,所以安装LFS的时候选择了把它安装在U盘上。
按照官方手册安装LFS并启动,在引导结束后遇到了问题:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
问题
使用 GRUB 引导时没有遇到问题,修改 BIOS 中引导方式为Legacy Support后可以进入引导界面并成功进行引导,但是在引导结束后遇到了错误。
引导结束后屏幕上显示满屏的调试信息,然后卡住,同时笔记本的CapsLk指示灯不停闪烁,调试信息中比较明显的错误提示是:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
解决
在网上搜索报错信息之后看到了几种可能的原因,尝试修改GRUB配置文件、更改配置重新编译内核均无效,最后直接搜索lfs on usb,看到Booting LFS from USB stick ?里提到了initrd,搜索其相关信息,发现它在系统从 USB 启动时是十分重要的。
根据搜索到的信息,Linux 启动时会先加载内核及驱动,然后加载文件系统。当内核准备从 USB 加载文件系统时,USB 设备尚未初始化完毕,从而引起了如上的错误。解决方法是使用 initrd 来加载 USB 驱动,等到 USB 设备准备就绪时再让内核来加载文件系统。
按照 BLFS 中的About initramfs部分安装了脚本,然后安装cpio运行依赖并用mkinitramfs 4.15.3命令构建了initramfs,在 grub.cfg 中加入initrd /boot/initrd.img-4.15.3后尝试启动,再次失败,怀疑是内核编译选项有问题,于是在网上搜索内核编译选项需要哪些。
最终找到了LFS 7.8 Setting up grub to boot from flash drive,发现是 grub.cfg 中缺少了rootdelay=5,再次编译内核,修改 grub.cfg 后终于成功启动。
因此,在U盘上安装LFS需要的额外操作:
- 编译 Linux 内核时除了按LFS教程进行修改外,还需要按照LFS 7.8 Setting up grub to boot from flash drive中的说明进行修改,此外我还加入了
XHCI HCD (USB3.0)的支持。 - 创建 grub.cfg 文件时要加入 initrd 部分。我并没有使用UUID标识符,U盘上根分区对应/dev/sdc1,grub.cfg 文件最终为:
# Begin /boot/grub/grub.cfg set default=0 set timeout=5 insmod ext2 set root=(hd0,msdos1) menuentry "GNU/Linux, Linux 4.15.3-lfs-8.2" { linux /boot/vmlinuz-4.15.3-lfs-8.2 root=/dev/sdc1 ro rootfstype=ext4 rootdelay=5 initrd /boot/initrd.img-4.15.3 }