qemu-img怎么创建带写时复制COW特性的qcow2差异镜像盘

落芳大大_6810

落芳大大_6810

2026-10-28

492人浏览

原创

使用qemu-img create -b 创建差分盘时必须指定存在且只读的后端镜像绝对路径,-f 仅指定新镜像格式,创建后须立即用 qemu-img info --backing-chain 验证链完整性。

qemu-img怎么创建带写时复制cow特性的qcow2差异镜像盘

qemu-img create -b 创建差分盘时必须指定后端镜像路径

直接用 qemu-img create -f qcow2 -b 创建差异镜像,本质就是启用写时复制(COW)——新镜像不存原始数据,只记录变更。关键前提是:后端镜像(backing file)必须存在、可读、且**不能被其他进程写入**。

常见错误现象:qemu-img info 显示 backing file: (null) 或启动虚拟机时报 Could not open backing file,基本是路径写错、权限不足,或后端镜像被 qemu 进程独占锁定(比如正在运行中)。

  • 后端镜像建议设为只读:chmod 444 base.qcow2,避免误写
  • 路径必须是绝对路径或相对于当前工作目录的准确路径;相对路径在虚拟机启动时容易失效
  • 不要对正在运行的虚拟机磁盘做 -b 操作——哪怕只是 qemu-img info,也可能触发元数据刷新导致冲突

为什么不用 -f qcow2 两次?格式参数只需写一次

qemu-img create 的 -f 指定的是**新建镜像的格式**,不是后端格式。后端镜像的格式由其自身决定,qemu-img 会自动识别并写入到新镜像头里(通过 backing_fmt 字段)。重复写 -f qcow2 不报错但冗余,还可能掩盖真实问题。

示例命令正确写法:

qemu-img create -f qcow2 -b /var/lib/libvirt/images/ubuntu-base.qcow2 ubuntu-dev.qcow2

错误写法(多此一举且易混淆):

qemu-img create -f qcow2 -b ubuntu-base.qcow2 -f qcow2 ubuntu-dev.qcow2

如果后端是 raw,命令一样成立,qemu-img 会自动把 backing_fmt=raw 写进新镜像头——你不需要、也不应该手动指定。

创建后立刻验证 backing chain 是否完整

差分盘一旦损坏或断链,就无法启动。创建完必须立刻用 qemu-img info --backing-chain 检查整条依赖链是否可访问、格式是否匹配。

微知写作
微知写作

一款AI数据处理工具,主要用于基于大数据的AI写作分析与热点洞察平台,适合需要提升相关任务效率的用户。

下载

输出应类似:

image: ubuntu-dev.qcow2
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 196K
cluster_size: 65536
backing file: /var/lib/libvirt/images/ubuntu-base.qcow2
backing file format: qcow2
...
image: /var/lib/libvirt/images/ubuntu-base.qcow2
file format: qcow2
virtual size: 20G
disk size: 1.2G
...
  • 若中间某一级显示 backing file: (null),说明该层没正确继承或已被破坏
  • 若某级提示 Could not open 'xxx': No such file or directory,就是路径或权限问题
  • 注意 virtual size 必须一致——差分盘不能比后端更大,否则启动时会报 Image is corrupted

预分配策略(preallocation)对 COW 镜像几乎无意义

COW 差分盘的核心价值在于“极小初始体积 + 按需增长”。无论你加不加 -o preallocation=metadata 或 full,它都只记录变化块,不会预占后端镜像的空间。

唯一影响是元数据初始化速度和首次写入延迟:

  • preallocation=off(默认):最快创建,首次写入略慢(要动态分配簇)
  • preallocation=metadata:提前分配元数据区,首次写入更快,文件仍极小
  • preallocation=full:强制分配全部 20G 空间并置零——完全违背 COW 设计初衷,纯属浪费 I/O 和磁盘

除非你明确需要规避首次写入抖动(比如自动化测试环境),否则一律用默认 off。别被“预分配听起来更稳”误导——COW 的稳定性来自链路完整性,不是磁盘碎片控制。

差分盘最脆弱的环节永远是后端镜像的可用性。哪怕前端只有 192KB,只要后端文件被删、移动或 chmod 改错,整个链就立即失效。操作前备份后端,操作后立刻 qemu-img info --backing-chain,比任何预分配设置都重要。

相关专题

更多
Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

120

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

60

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

60

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

40

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

60

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

20

15

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

2026.10.22

40

15

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

2026.10.22

320

12

剧云人物设定与关系管理教程
剧云人物设定与关系管理教程

本专题介绍剧云人物设定与关系管理,讲解角色小传、性格职业、人物目标、背景资料和关系网络的创建及维护方法。

2026.10.22

40

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习