在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 }