如何查找debootstrap构建的Ubuntu20.04 QEMU镜像的正确根设备名
VFS无法挂载根分区的根因与修复方法
根因定位
从你截取的早期内核启动日志可直接得到完整故障判断依据:
[ 0.302413] Please append a correct "root=" boot option; here are the available partitions:
[ 0.302824] fe00 4194304 vda
[ 0.302856] driver: virtio_blk
启动失败核心逻辑:当前QEMU给磁盘默认匹配了virtio-blk总线驱动,对应块设备命名规则为/dev/vd*系列,和启动参数中配置的/dev/sda1(传统SATA/IDE/SCSI总线的设备命名)完全不匹配,内核找不到指定的根设备,最终抛出unknown-block(0,0)无主设备恐慌。
正确根设备名查找方法
- 主机侧直接查询镜像分区结构
不需要进入虚拟机排查,在主机执行fdisk -l ubuntu2004.img查询镜像内分区表:- 若镜像为无分区表的整盘场景(debootstrap构建镜像时常见的未做分区配置的情况),对应内核枚举的
vda整盘,根设备直接写/dev/vda即可 - 若镜像内第一个分区为根文件系统,对应
vda整盘下的第一个分区,设备名为/dev/vda1,设备对应关系和sda/sda1的逻辑完全一致
- 若镜像为无分区表的整盘场景(debootstrap构建镜像时常见的未做分区配置的情况),对应内核枚举的
- 交叉校验内核枚举的可用分区
查看启动日志中内核列出的可用分区段:
若日志仅列出vda整盘、没有列出vda1类的分区条目,说明镜像未配置分区表,强行填写root=/dev/vda1会直接触发设备找不到的错误;若日志中明确列出了vda1的设备条目,直接使用该设备名即可。
修正后的启动参数示例
将原有启动命令中-append行替换为匹配的设备名即可,比如第一分区为根文件系统的场景:-append "root=/dev/vda1 console=ttyS0"
补充排坑说明
- 你当前的日志已显示内核成功加载virtio_blk驱动、识别到整盘
vda,说明自编译内核的驱动配置正常,不存在驱动缺失导致的设备枚举失败问题 - 若不想使用virtio-blk的设备命名规则,也可以在
-drive参数中显式指定磁盘为IDE接口:将原命令中的-drive id=root,media=disk,file=ubuntu2004.img改为-drive id=root,media=disk,file=ubuntu2004.img,if=ide,此时内核会将磁盘识别为传统IDE设备,原root=/dev/sda1的配置也可正常启动,但该方式会损失virtio的IO性能,不推荐生产场景使用。
内容的提问来源于stack exchange,提问作者xiaogw
相关产品推荐
相关产品推荐

