首页 新闻 会员 周边 捐助

使用busybox制作的根文件无法挂载

0
悬赏园豆:100 [已解决问题] 解决于 2023-05-29 16:42

内核日志
[ 7.823322] PM: Magic number: 7:489:821
[ 7.854537] md: Waiting for all devices to be available before autodetect
[ 7.855653] md: If you don't use raid, use raid=noautodetect
[ 7.856490] md: Autodetecting RAID arrays.
[ 7.857089] md: autorun ...
[ 7.857935] md: ... autorun DONE.
[ 7.900566] /dev/root: Can't open blockdev
[ 7.902068] VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6
[ 7.903171] Please append a correct "root=" boot option; here are the available partitions:
[ 7.904674] 0b00 1048575 sr0
[ 7.904944] driver: sr
[ 7.906624] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

制作根文件命令
find . | cpio -R root:root -H newc -o | gzip > ../isofs/rootfs.gz

启动命令
qemu-system-x86_64 -nographic -kernel kernel.gz -initrd rootfs.gz -append "console=ttyS0"

Anyways的主页 Anyways | 初学一级 | 园豆:112
提问于:2023-05-29 13:55
< >
分享
最佳答案
0

从错误日志来看,似乎是文件系统格式的问题导致无法挂载根文件系统。请确认你使用的文件系统类型是否正确。

一般来说,busybox制作的根文件系统,可以使用ext2/ext3/ext4格式的文件系统。你可以使用mkfs命令来创建文件系统,例如:

mkfs.ext4 /dev/sda1
其中,/dev/sda1是你创建文件系统所使用的设备名称。

同时,你在启动qemu时,需要使用-hda选项来挂载根文件系统,例如:

qemu-system-x86_64 -nographic -kernel kernel.gz -hda /dev/sda1 -append "root=/dev/sda1 console=ttyS0"
注意,这里使用-hda选项来挂载根文件系统,而不是使用-initrd选项。

收获园豆:100
lanedm | 老鸟四级 |园豆:2396 | 2023-05-29 15:37

的确是根文件系统格式的问题
我是用isolinux引导iso启动,没有挂载硬盘,所以不能指定-hda
我参照https://www.cnblogs.com/aWxvdmVseXc0/p/15553891.html这篇文章操作的,我把这个博主编译好的iso下载下来,把其中的rootfs.gz拿过来执行,就没问题,他也是使用cpio制作的rootfs
我自己使用cpio制作的rootfs就启动不起来,可以判断制作的linux内核,-initrd参数都没问题,只是这个rootfs.gz制作的有问题,但却不知道是哪里出的问题
我使用本地系统的initrd启动也是报同样的错,qemu-system-x86_64 -nographic -kernel kernel.gz -initrd /boot/initrd.img-4.4.0-186-generic -append "console=ttyS0"

Anyways | 园豆:112 (初学一级) | 2023-05-29 16:12

@四叶草: 如果你使用isolinux引导iso启动,那么可以尝试使用 -append 选项设置Linux内核的启动参数,例如:

qemu-system-x86_64 -nographic -serial mon:stdio -cdrom your_iso_file.iso -append "root=/dev/ram0 init=/sbin/init console=ttyS0"
在上述参数中, root=/dev/ram0 设置根文件系统为内存, init=/sbin/init 设置init程序的路径, console=ttyS0 开启串口终端输出。

如果你的rootfs.gz可以正常引导,那么你可以尝试比较你的cpio制作的rootfs.gz和这个博主提供的rootfs.gz的区别,可能存在一些文件或目录的缺失。

你还可以在制作rootfs的过程中,使用 ls -l 查看生成的文件列表,确定其中是否缺少必要的文件和目录,或者文件、目录的权限问题等。

lanedm | 园豆:2396 (老鸟四级) | 2023-05-29 16:14

我怀疑可能是内核版本的问题,我使用的内核是5.19.17
[ 6.684876] md: Waiting for all devices to be available before autodetect
[ 6.687344] md: If you don't use raid, use raid=noautodetect
[ 6.688963] md: Autodetecting RAID arrays.
[ 6.690656] md: autorun ...
[ 6.691364] md: ... autorun DONE.
[ 6.773266] /dev/root: Can't open blockdev
[ 6.775829] VFS: Cannot open root device "ram0" or unknown-block(0,0): error -6
[ 6.777383] Please append a correct "root=" boot option; here are the available partitions:
[ 6.780251] 0b00 1048575 sr0
[ 6.780777] driver: sr
就在这个noautodetect这开始出现的问题
有时间我再重新编译个早期版本的内核试试,感谢解答

Anyways | 园豆:112 (初学一级) | 2023-05-29 16:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册