qemu-img check 是什么
qemu-img check 扫描 qcow2 镜像的内部一致性:引用计数、簇分配与元数据是否自相矛盾。它回答的是镜像本身有没有坏这个问题——典型线索包括虚机启动异常、快照删除后容量统计异常、上一次 qemu-img 操作被中断。加上 -r 参数可以尝试修复,但修复本身是写操作,必须先备份,而且要求镜像没有被任何 QEMU 进程占用。
基本信息
| 适用平台 | 任意安装了 qemu-img 的 Linux 发行版,支持 qcow2 与部分其他格式 |
|---|---|
| 只检不修 | qemu-img check disk.qcow2 |
| 修复泄漏 | qemu-img check -r leaks disk.qcow2 |
| 尽量修复 | qemu-img check -r all disk.qcow2(谨慎,改动更多) |
| 前提条件 | 镜像未被运行中的虚机或进程占用,需要写权限 |
| 退出码 | 0 表示无错误,非 0 表示存在损坏或修复未完全成功 |
| 配套命令 | qemu-img info 看元数据,qemu-img compare 比对两份镜像 |
典型使用场景
- 虚机启动报错或引导失败,怀疑磁盘镜像损坏
- 上一次镜像转换或备份被中断,需要确认产物是否完整
- 删除快照后容量没有按预期释放,检查元数据是否一致
- 迁移前对导出的镜像做体检,避免把损坏镜像带到新环境
- 扩容或压缩镜像后复核,确认操作没有破坏内部结构
- 日常巡检:对少量关键镜像做定期一致性抽查
安全执行的顺序
安全执行的顺序
sudo virsh destroy vm1 2>/dev/null || virsh shutdown vm1 # 先确保虚机不再占用镜像
virsh domblklist vm1 | grep qcow2 # 或先确认没有 qcow2 盘被该域使用
cp --sparse=always disk.qcow2 disk.qcow2.bak # 修复前必备份,保留稀疏属性省空间
qemu-img check disk.qcow2 # 先只检查,看清楚报错类型与计数
qemu-img check -r leaks disk.qcow2 # 泄漏类问题从最轻的修复级别开始
qemu-img check disk.qcow2 # 修复后复检,确认退出码为 0
qemu-img info disk.qcow2 | head -8 # 核对虚拟大小与实际占用是否合理输出项读法
| 输出项 | 含义 | 处理建议 |
|---|---|---|
| leaks | 存在未被引用的簇,空间被占用但没人用 | 可用 -r leaks 修复,修复前备份 |
| corruptions | 元数据损坏,如引用计数不一致 | 优先从备份恢复,修复会丢数据风险较高 |
| 检查的簇数量 | 扫描范围,用于估算耗时 | 镜像越大耗时越长,建议在维护窗口执行 |
| 退出码 | 0 为一致,非 0 表示有错误 | 非 0 时不要直接投入生产,先备选方案 |
| 占用与容量 | 实际分配与虚拟容量的比例 | 比例异常偏小可能意味着元数据异常 |
check 不是数据校验:它检查镜像结构而非文件系统内容,检查通过不代表里面的业务数据没坏,还需要在虚机内做文件系统与业务层校验。
对运行中的镜像执行 check 或修复:可能拿不到锁、读到变化中的数据,甚至加重损坏,务必先停掉虚机。