今天在加载 Linux 内核到 QEMU 虚拟机的过程中,遇到了这个错误:“Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)”。
发生这个错误的原因是:在启动时,我没有指定 root 文件系统,也没有提供任何镜像系统,所以导致内核无法找到启动的根文件系统,造成 panic。
今天记录一下这个问题的解决方法。
解决方案
使用 BusyBox 生成一个最小根文件系统 initramfs
一、准备目录结构
mkdir -p initramfs/{bin,sbin,etc,proc,sys,usr/bin,usr/sbin,dev}
cd initramfs
二、准备 init 脚本
创建 init 脚本,这是 initramfs 启动时的第一个程序
cat > init << 'EOF'
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
echo "==== Initramfs Booted Successfully ===="
exec /bin/sh
EOF
chmod +x init
三、下载并复制静态 BusyBox
sudo apt install busybox-static
cp /bin/busybox bin/busybox
cd bin
for cmd in sh mount echo ls cat dmesg; do
ln -s busybox $cmd
done
四、创建设备节点
cd ../..
sudo mknod -m 622 initramfs/dev/console c 5 1
sudo mknod -m 666 initramfs/dev/null c 1 3
五、打包 initramfs
cd initramfs
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.cpio.gz
其中 initramfs.cpio.gz
就是配合 Linux 内核一起加载的启动盘了。
六、使用 QEMU 启动测试
cd ..
hxc@studyubuntu:~/share$ qemu-system-x86_64 \
> -kernel ./linux-5.10/arch/x86/boot/bzImage \
> -initrd initramfs.cpio.gz \
> -nographic \
> -append "console=ttyS0"
最终看到以下结果,则表示启动成功了。
后续可以根据需求继续拓展 initramfs。
希望这篇文章能帮你解决相同的问题。
如果你觉得有收获,欢迎点赞、转发或留言交流,谢谢!