qemu-img check 默认只检查不修复,需加 -r 参数才尝试修复部分逻辑错误;对数据块损坏或crc校验失败无效,必须依赖备份恢复或 qemu-img convert 抽取可用数据。

qemu-img check 能否修复损坏的磁盘
qemu-img check 本身**只做检查,不自动修复**。它会扫描 qcow2、qed、vdi 等格式镜像的元数据和结构一致性,但遇到错误时默认只报告,不会写入修正。只有加上 -r 参数(如 -r all 或 -r leak)才尝试修复——且仅限部分可恢复的逻辑错误(如丢失的引用、空闲簇标记异常),对实际数据块损坏或 CRC 校验失败无能为力。
执行 qemu-img check 的前置条件和典型命令
运行前必须确保:
• 虚拟机已完全关机(virsh shutdown 或 virsh destroy 后确认无残留进程)
• 镜像文件未被任何其他进程打开(包括 libvirtd 正在读取该磁盘的其他 VM)
• 你有该文件的读写权限(通常需 root 或 libvirt-qemu 组权限)
常用组合:
-
qemu-img check -f qcow2 /var/lib/libvirt/images/centos8.qcow2—— 基础检查,输出是否 OK 或报错位置 -
qemu-img check -f qcow2 -r all /var/lib/libvirt/images/centos8.qcow2—— 尝试修复所有可修复项(含泄漏簇、L1/L2 表不一致等) -
qemu-img check -f qcow2 -r leak /var/lib/libvirt/images/centos8.qcow2—— 仅修复“泄漏簇”(已分配但未被引用的数据块),较安全
check 输出结果怎么看,哪些错误无法靠 -r 解决
关键判断依据是最后几行输出:
- 出现
No errors were found on the image.→ 镜像结构完好,可放心启动 - 出现
ERROR cluster N is referenced multiple times或Leaked clusters→-r all通常能修复 - 出现
CRC mismatch in cluster N、Invalid offset in cluster N或Image is corrupt→ 数据块级损坏,-r无效,只能从备份恢复或尝试qemu-img convert抽出还能读的部分 - 若提示
Backing file not found→ 不是镜像本体损坏,而是后端链断裂,需单独处理backing_file路径或合并快照
检查后仍无法启动?别跳过这一步
即使 qemu-img check -r all 显示修复成功,也**不能直接启动虚拟机**。因为:
- 修复只作用于镜像元数据,Guest OS 文件系统层可能仍有脏状态(如 ext4 journal 未提交)
- 必须进 Guest 内部运行
fsck(如sudo fsck -y /dev/vda1),否则下次意外关机大概率再次报错 - 若镜像是
qcow2且带快照,check不验证快照链完整性;需额外用qemu-img snapshot -l查看,并考虑qemu-img commit合并
真正可靠的修复闭环是:关机 → check -r → 启动进 rescue 模式 → fsck → 重启。跳过最后一环,等于把问题留给下一次断电。











