Linux系统启动报错No bootable device解决步骤

本文详细介绍了如何在虚拟机中备份和修复MBR表,包括操作步骤如备份、破坏、从光盘救援、恢复MBR,适用于技术人员遇到此类问题的解决方案。

磁盘的 MBR 表损坏

实验环境准备工作

查看分区类型及磁盘位置信息点击此篇

#首先备份虚拟机A上的 MBR 表
dd if=/dev/vda of=MBR bs=512 count=1

#将 MBR 表拷贝到虚拟机B上
scp MBR root@172.25.254.250:/root

#破坏虚拟机A的 MBR 表
dd if=/dev/zero of=/dev/vda bs=512 count=1

系统启动报错截图

修复步骤如下

从光盘启动进入救援模式

  • 重启显示logo时 按 Esc,选择从光驱启动 或者 关机再选择打开电源时进入固件

  • 移动至CD-ROM Drive,按住shift-+调至上面,按住F10保存即可

  • 选择第三个

  • 选择第二个

  • 选择 1)continue并在下步直接回车

设置好 ip 地址和网关

ifconfig enp1s0 172.25.250.10/24
route add default gw 172.25.250.254

通过 scp 将 MBR 传到系统里面来

scp root@172.25.254.250:/root/MBR /root

还原 MBR 表

dd if=/root/MBR of=/dev/vda bs=512 count=1

退出启动即可

🔗博客园地址点击此处🔗

<think>好的,我现在遇到了一个问题:使用转换后的qcow2文件启动KVM虚拟机时,提示“no bootable device”。我需要仔细分析可能的原因,并逐步解决这个问题。首先,我应该理清楚整个流程中可能出错的环节。 首先,用户提到的是“转换后的qcow2文件”,这可能意味着这个镜像文件是从其他格式(比如VMDK、RAW等)转换而来的。转换过程中可能出现问题,导致镜像损坏或配置不正确,从而无法启动。接下来,我需要考虑几个可能的原因: 1. **镜像转换过程中的错误**:转换工具(如qemu-img)是否正确使用?转换后的qcow2文件是否完整?是否在转换过程中丢失了分区表或引导信息? 2. **虚拟机引导配置问题**:虚拟机的BIOS或UEFI设置是否正确?是否设置了正确的启动顺序,比如从硬盘启动? 3. **镜像本身的问题**:原镜像是否本身就没有可引导的分区?比如,某些镜像可能没有安装引导加载程序(如GRUB),或者分区表损坏。 4. **KVM虚拟机的配置问题**:虚拟机的XML定义文件中是否正确定义了磁盘设备,特别是总线类型(如virtio、ide、sata等)是否兼容? 5. **文件权限或路径问题**:转换后的qcow2文件路径是否正确?KVM进程是否有权限访问该文件? 接下来,我需要按照这些可能性逐一排查。 首先,检查镜像转换是否正确。用户可能使用命令如`qemu-img convert -f vmdk -O qcow2 source.vmdk target.qcow2`进行转换。这时候需要确认转换过程是否顺利完成,没有报错。同时,可以检查转换后的qcow2文件是否完整,比如使用`qemu-img check target.qcow2`来验证镜像的完整性。如果发现错误,可能需要重新转换或修复源文件。 其次,确认虚拟机配置中的引导顺序是否正确。在virt-manager中,或者在虚拟机的XML配置文件中,需要确保引导设备包含硬盘,并且硬盘位于启动顺序的首位。例如,检查`<os>`部分是否有`<boot dev='hd'/>`,并且没有其他设备(如网络启动)优先于硬盘。 第三,检查镜像本身是否可引导。可以使用`guestfish`工具来检查镜像的分区表和引导记录。例如,运行`guestfish -a target.qcow2 -i`,然后使用`part-list`查看分区情况,或者检查`/boot`目录是否存在。如果镜像没有正确的引导加载程序,可能需要使用virt-customize等工具重新安装GRUB。 第四,检查虚拟机的磁盘总线类型。例如,如果原镜像是为IDE接口配置的,而虚拟机配置中使用了virtio总线,可能导致无法识别磁盘。这时需要调整虚拟机的磁盘配置,比如将总线类型改为IDE,或者在镜像中安装virtio驱动(适用于Linux系统)。可以通过编辑虚拟机的XML,将`<target dev='vda' bus='virtio'/>`改为`<target dev='hda' bus='ide'/>`试试。 第五,确认qcow2文件的路径和权限。确保libvirt用户(通常是qemu或libvirt-qemu)有权限读取该文件。可以使用`ls -l target.qcow2`查看权限,必要时用`chmod`或`chown`调整。 另外,还可以尝试直接使用qemu命令启动虚拟机,绕过libvirt,以确定是否是libvirt配置的问题。例如: ```bash qemu-system-x86_64 -m 2048 -hda target.qcow2 ``` 如果这样能启动,说明问题可能出在libvirt的配置上,需要进一步检查XML定义。 如果上述步骤都检查过仍然有问题,可能需要更深入地分析镜像内部结构。例如,使用`qemu-nbd`挂载qcow2文件,检查分区和引导扇区: ```bash sudo modprobe nbd sudo qemu-nbd -c /dev/nbd0 target.qcow2 sudo fdisk -l /dev/nbd0 ``` 查看分区表是否存在,是否有激活的引导分区。如果没有激活的分区,可能需要使用`parted`或`fdisk`工具进行修复。 总结来说,解决这个问题的步骤大致如下: 1. **验证镜像完整性**:确保转换后的qcow2文件没有损坏。 2. **检查虚拟机引导设置**:确认引导顺序正确,硬盘为首选。 3. **检查磁盘总线兼容性**:调整总线类型为镜像支持的接口。 4. **检查镜像内部结构**:确认分区表和引导加载程序正常。 5. **权限和路径检查**:确保KVM有权限访问镜像文件。 如果用户在这些步骤中遇到具体的问题,比如转换命令报错、guestfish检查发现问题等,可以进一步针对性地解决。例如,如果发现镜像没有引导扇区,可能需要重新安装引导程序;如果分区表损坏,可能需要修复分区表或使用备份恢复。</think>在遇到使用转换后的qcow2文件启动KVM虚拟机提示“no bootable device”时,可以按以下步骤排查和解决: --- ### **1. 检查镜像完整性** - **验证转换过程** 确保使用`qemu-img convert`命令转换时无报错,例如: ```bash qemu-img convert -f [原格式] -O qcow2 原文件路径 目标文件.qcow2 ``` 运行后检查目标文件是否生成且大小合理。 - **检查qcow2文件完整性** 使用以下命令检测镜像是否损坏: ```bash qemu-img check 目标文件.qcow2 ``` 若有错误,需重新转换或修复源文件。 --- ### **2. 验证虚拟机引导配置** - **检查启动顺序** 在virt-manager中,进入虚拟机配置的 **Boot Options**,确保勾选硬盘(如`hda`或`vda`)且位于第一启动项。 - **XML配置检查(适用于手动编辑)** 在虚拟机的XML文件中,确认`<os>`部分包含硬盘引导: ```xml <os> <type arch="x86_64" machine="pc-i440fx-...">hvm</type> <boot dev="hd"/> <!-- 确保硬盘是启动设备 --> </os> ``` --- ### **3. 调整磁盘总线类型** 部分镜像可能依赖特定总线类型(如IDE、SATA、VirtIO)。若原镜像是为IDE设计,而虚拟机配置为VirtIO,会导致无法识别磁盘。 - **修改总线类型** 在virt-manager中,将磁盘的 **Disk bus** 改为 **IDE** 或 **SATA**(例如:IDE对应`hda`,VirtIO对应`vda`)。 或手动编辑XML: ```xml <disk type="file" device="disk"> <driver name="qemu" type="qcow2"/> <source file="/path/to/目标文件.qcow2"/> <target dev="hda" bus="ide"/> <!-- 改为IDE总线 --> </disk> ``` --- ### **4. 检查镜像内部引导结构** - **使用guestfish工具分析镜像** 安装`libguestfs-tools`后执行: ```bash guestfish -a 目标文件.qcow2 -i ><fs> part-list /dev/sda # 查看分区表 ><fs> ls /boot # 检查引导文件是否存在 ><fs> cat /etc/fstab # 验证文件系统配置 ``` 若分区表损坏或无引导文件(如`/boot/grub`),需修复镜像。 - **手动挂载qcow2文件** 使用`qemu-nbd`挂载并检查: ```bash sudo modprobe nbd sudo qemu-nbd -c /dev/nbd0 目标文件.qcow2 sudo fdisk -l /dev/nbd0 # 查看分区信息 sudo mount /dev/nbd0p1 /mnt # 挂载第一个分区(根据实际分区调整) ``` 若无法挂载,可能是分区表损坏,需重建。 --- ### **5. 修复引导加载程序** 若镜像内缺少引导程序(如GRUB),需重新安装: - **使用virt-customize** ```bash virt-customize -a 目标文件.qcow2 --run-command "grub-install /dev/sda && update-grub" ``` 注意:需根据实际分区调整设备名(如`/dev/vda`)。 --- ### **6. 验证权限和路径** - **检查文件权限** 确保libvirt(通常用户为`qemu`或`libvirt-qemu`)有权访问镜像文件: ```bash chmod 644 目标文件.qcow2 chown root:libvirt 目标文件.qcow2 # 根据实际组名调整 ``` - **确认路径正确** 检查XML中`<source file>`的路径是否存在拼写错误。 --- ### **7. 直接使用QEMU命令测试** 绕过libvirt,直接启动镜像以隔离问题: ```bash qemu-system-x86_64 -m 2048 -drive file=目标文件.qcow2,format=qcow2 ``` 若成功启动,表明问题出在libvirt配置;若失败,需进一步修复镜像。 --- ### **总结解决方案** | 可能原因 | 解决方法 | |-------------------------|------------------------------------------| | 镜像转换错误 | 重新转换或修复源文件 | | 引导顺序配置错误 | 调整虚拟机启动顺序为硬盘优先 | | 磁盘总线类型不兼容 | 修改总线为IDE/SATA | | 镜像内引导文件缺失 | 使用virt-customize重装GRUB | | 分区表或文件系统损坏 | 挂载镜像后修复分区表或文件系统 | | 权限不足 | 调整镜像文件权限为libvirt用户可读 | 按上述步骤逐一排查,通常可解决no bootable device”问题。如仍无法解决,建议提供具体错误日志(通过`dmesg`或`/var/log/libvirt/qemu/虚拟机名.log`)进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值