虚拟机磁盘镜像
2026/4/30 7:32:55 网站建设 项目流程

虚拟机磁盘镜像(Virtual Disk Image)是宿主机上的一个文件,对虚拟机来说等同于一块物理硬盘,包含操作系统、应用与数据,是虚拟化的核心存储载体。

核心原理

  • 本质:文件模拟块设备,虚拟机通过 Hypervisor 将磁盘 I/O 转换为对该文件的读写。
  • 两种模式:
    • 预分配(Fixed):创建时即占满设定容量(如 100GB),性能好但空间浪费。
    • 动态分配(Sparse):初始极小,随写入增长,节省空间但首次写略慢。
  • 写时复制(CoW):主流稀疏格式(如 qcow2)的核心,支持快照与增量,修改仅写新块、共享只读基础块。
  • 动态稀疏盘(默认推荐):初始体积很小,虚拟机写入数据才慢慢涨,省空间,日常建站、测试首选。
  • 固定预分配盘:一次性占满全部容量,IO 性能更稳定、碎片少,适合生产数据库、高 IO 负载。

主流格式对比

格式归属 / 平台核心特性性能快照 / 压缩 / 加密
RAW通用(QEMU/KVM/Xen)原始扇区、无元数据、可直接 dd/mount最高❌ 无
QCOW2QEMU/KVM(云原生)动态、多快照、压缩、AES 加密、CoW高(≈raw 的 75%)✅ 全支持
VMDKVMware(ESXi/Workstation)动态 / 固定、快照链、适配器类型多样✅ 高级快照
VDIVirtualBox动态 / 固定、快照、精简分配中高✅ 基础快照
VHD/VHDXMicrosoft(Hyper-V/Azure)动态 / 固定、快照、VHDX 支持大磁盘✅ 部分支持

关键能力与应用场景

  1. 快照(Snapshot):保存某一时间点状态,用于备份、回滚、测试环境快速重置(qcow2/VMDK 最强)。
  2. 克隆(Clone)
    • 完整克隆:独立副本,空间占用大。
    • 链接克隆:基于基础镜像的差异盘,秒级创建、省空间(依赖基础镜像)。
  3. 格式转换:跨平台迁移必备,如 VMware→KVM 需 VMDK→QCOW2。
  4. 压缩与加密:QCOW2 支持 ZLIB 压缩 + AES 加密,适合云环境安全与存储优化。

QCOW2

QCOW2(QEMU Copy-On-Write 2)是QEMU/KVM 标准磁盘镜像格式,Linux 虚拟化、OpenStack、Proxmox、云平台默认格式。

核心特性:

  1. 稀疏动态分配:初始体积极小,写入数据才占用空间
  2. COW 写时复制:支持快照、差分镜像、链接克隆
  3. 内置压缩、AES 加密、碎片整理、扩容缩容
  4. 支持超大磁盘、坏块记录、后端基础镜像(差分盘)

是带元数据管理、写时复制、稀疏存储、快照链、差分依赖的块镜像格式,

不是裸扇区,是结构化文件,用「映射表」管理虚拟磁盘地址 → 宿主机文件偏移。

QCOW2 用L1/L2 二级映射表管理虚拟磁盘地址,依靠按需稀疏分配节省空间,依靠簇级写时复制 COW实现快照、差分镜像与链接克隆,是虚拟化领域兼顾功能、空间、性能的结构化磁盘格式。

核心底层结构(文件布局)

整个 qcow2 文件由 5 部分组成:

  1. Header 头部(固定起始):版本、虚拟磁盘大小、簇大小、L1/L2 表地址、快照信息、加密标记等。
  2. L1 一级映射表:顶层索引,每一项指向一个 L2 表。
  3. L2 二级映射表:真正的地址映射表:虚拟块地址 → 宿主机文件簇偏移
  4. 数据簇(Cluster):实际存放磁盘数据的最小单位,默认64KB / 簇(可自定义)。
  5. 快照 / 元数据区、备份表、加密区

关键单位

  • 虚拟地址 VA:虚拟机内看到的硬盘 LBA 地址
  • Cluster 簇:qcow2 最小管理单元,IO 读写、分配、COW 都以簇为单位
  • L1+L2 两级页表式映射:类内存分页管理,高效稀疏分配

稀疏磁盘 原理(为什么初始只有几百 KB)

默认新建 qcow2:

qemu-img create -f qcow2 test.qcow2 50G
  • 虚拟容量:50GB
  • 实际文件大小:~128KB

机制:

  • 只写入Header + L1 表,不预先分配任何数据簇;
  • L2 表初始为空,未写入的虚拟簇 = 直接返回全 0,不占用宿主机空间
  • 只有虚拟机第一次写入某个簇时,才会:
    • 申请宿主机磁盘空间
    • 分配 L2 表项
    • 写入实际数据👉 即:按需分配、用多少占多少

两级映射表 核心工作流程

1. 地址解析流程

虚拟机发起读写某个扇区 →

  1. 根据虚拟地址,算出所属簇号
  2. 索引L1 表→ 找到对应 L2 表物理位置
  3. 索引L2 表
    • 表项有效:拿到宿主机文件偏移,直接读写数据簇
    • 表项无效:代表该簇从未写入,读返回 0,写触发分配

2. 映射关系简图

虚拟机虚拟磁盘地址 ↓ 簇 ↓ L1 Table 索引 → L2 Table ↓ L2 Table 表项 → 宿主机文件真实簇偏移

关键结构字段

  • Cluster 簇默认:64KB,QCOW2 最小分配 / COW / 映射单位。
  • L1 Table数组,每项 8Byte,记录 L2 表的文件偏移。
  • L2 Table数组,每项 8Byte,标记:
  • 有效位:是否已分配
  • 物理偏移:数据簇位置
  • 外部位:是否依赖后端 base 镜像

读取总流程

虚拟地址→ 拆分索引 → L1 查询 → L2 查询 → 本地簇 / 基盘穿透 / 返回 0

写入总流程

虚拟写请求→ L1/L2 查表

├─ 空簇 → 新建簇 + 写数据 + 更新映射

└─ 依赖基盘 → COW 拷贝簇 → 本地覆写 → 刷新 L2 映射

COW 写时复制 核心原理(快照 / 差分镜像根基)

1. 普通盘无 COW

所有写入直接覆盖当前镜像的数据簇。

2. 开启快照 / 差分盘后

  • 只读基盘(base):原始数据簇保持不变
  • 差分盘(子盘):只记录被修改过的簇
写入触发 COW 流程
  1. 虚拟机要修改某个簇
  2. 发现该簇数据来自基盘
  3. QCOW2 自动:
    • 把基盘对应簇复制到当前子盘新簇
    • 修改 L2 映射表,指向新复制的簇
    • 新数据写入本地新簇
  4. 未修改的簇,继续共享读取基盘

👉 核心:改哪块、复制哪块,大块数据全程共享这就是链接克隆秒开、极度省空间的本质。

差分镜像(后端 base)原理

qemu-img create -f qcow2 -b base.qcow2 vm1.qcow2
  • base.qcow2:只读基础镜像(系统、软件、环境)
  • vm1.qcow2:增量差异盘,仅记录改动

读取逻辑:

  1. 查本地子盘 L2 映射:有数据 → 读本地
  2. 无数据 → 穿透读取 base 基盘

快照实现原理

qcow2 内置多版本 L1/L2 映射表快照

  1. 打快照时:不复制全量数据,只保存当前 L1/L2 映射表快照
  2. 后续写入触发 COW,分离新旧簇
  3. 回滚快照:直接切换为旧的映射表,瞬间还原整机磁盘状态

读写性能损耗原因

  1. 每次 IO 需要L1+L2 两次查表,存在元数据开销
  2. 新簇首次写入需要「分配空间 + 更新元数据」,有轻微延迟
  3. 碎片化多、快照链过长时,映射查询开销上升

优化方案:预分配、关闭不必要快照、qcow2 压缩级别调低、使用 IO 缓存。

映射表布局

整体文件排布(从上到下)

┌─────────────────────────────┐ │ QCOW2 Header 头部(固定) │ 版本、簇大小、L1地址、虚拟盘容量、加密标记 ├─────────────────────────────┤ │ L1 Table 一级映射表 │ 数组,每一项 = 对应L2表的物理偏移 ├─────────────────────────────┤ │ L2 Table 二级映射表(多块) │ 数组,每一项 = 数据簇物理偏移/状态标记 ├─────────────────────────────┤ │ Data Cluster 真实数据簇区 │ 64KB/簇 默认,实际磁盘内容 ├─────────────────────────────┤ │ 快照元数据 / 备份L1L2 / 加密区 │ └─────────────────────────────┘

二级映射寻址结构(核心)

虚拟机虚拟LBA地址(虚拟硬盘偏移) │ ▼ 【地址拆分】 ┌──────────┬──────────┬──────────┐ │ L1 索引位 │ L2 索引位 │ 簇内偏移 │ └──────────┴──────────┴──────────┘ │ ▼ L1 索引 → 查询 L1 Table │ ▼ 拿到 L2表 物理地址 → 查询 L2 Table │ ▼ L2表项 三种状态: 1. 已映射 → 直接拿到【数据簇物理偏移】 2. 未分配 → 读返回0 / 写触发簇分配+COW 3. 指向Base基盘 → 穿透读上游镜像

QCOW2 读操作时序图(纯读、无修改)

场景 1:空白未写入区域

1. 虚拟机发起读请求(某虚拟扇区) 2. QEMU 计算:虚拟地址 → 所属簇号、L1索引、L2索引 3. 查找 L1表 → 找到对应L2表 4. 查找 L2表 → 表项为空(未分配) 5. 判定:空簇 6. 直接返回 全0 数据,不读写宿主机物理磁盘

场景 2:已写入正常数据

1. 虚拟机读IO 2. 地址拆分 → L1索引 3. L1 → 定位L2表物理位置 4. L2表查询 → 拿到【数据簇物理偏移】 5. 读取宿主机qcow2文件对应簇数据 6. 回填至虚拟机缓冲区

场景 3:差分镜像 / 基盘穿透读取

子盘L2表无映射项 │ ▼ 穿透查询 Base.qcow2 基盘映射链 │ ▼ 基盘L1/L2寻址 → 读取基盘数据返回

QCOW2 写操作时序图(含 COW 写时复制)

场景 1:普通独立镜像、首次写入空簇

1. 虚拟机下发写请求 2. 地址解析 → L1/L2查表 3. L2表项为空 → 该簇无物理空间 4. 宿主机分配新物理Cluster 5. 写入本次业务数据 6. 更新 L2 表项:绑定「虚拟簇→物理簇」映射 7. 写入元数据、落盘完成

场景 2:快照 / 差分盘 触发 COW(核心时序)

1. 虚拟机要修改某一簇 2. 查表发现:当前簇数据 依赖 只读Base基盘 3. 触发 QCOW2 COW 机制 4. ① 从基盘读取原始簇完整数据 ② 在当前子镜像中新分配一块物理簇 ③ 把原始数据复制进新簇 ④ 将新业务数据覆盖写入新簇 ⑤ 修改本地L2映射表:虚拟簇指向新分配的物理簇 5. 后续读写该簇,完全走本地子盘,不再依赖基盘

原理总结

特性底层原理
稀疏精简空簇不分配物理块,L2 空项代表零填充
快照保存映射表版本 + COW 分离修改块
差分 / 链接克隆多镜像映射穿透 + 共享只读基簇
压缩数据簇压缩存储,读取实时解压
加密簇级 AES 加密,header 记录加密参数

优点

  • 节省存储空间(精简置备)
  • 原生多快照、差分镜像,适合测试 / 云模板
  • 支持加密 + 压缩,安全性高
  • 跨 Linux 虚拟化生态通用

缺点

  • 比 RAW 裸盘性能略低(生产可通过缓存 / 硬件虚拟化弥补)
  • 有少量元数据开销

基础命令

# 创建 10GB 动态精简 qcow2 qemu-img create -f qcow2 disk.qcow2 10G # 创建 20GB 预分配高性能 qcow2 qemu-img create -f qcow2 -o preallocation=full disk.qcow2 20G # 查看镜像信息 qemu-img info disk.qcow2 # 扩容到 30G qemu-img resize disk.qcow2 30G # RAW 转 QCOW2 qemu-img convert -f raw -O qcow2 disk.raw disk.qcow2 # VMDK 转 QCOW2(VMware迁移KVM) qemu-img convert -f vmdk -O qcow2 win.vmdk win.qcow2 # 压缩转换(减小体积) qemu-img convert -c -O qcow2 源.qcow2 压缩后.qcow2 # 创建快照 qemu-img snapshot -c snap1 disk.qcow2 # 列出所有快照 qemu-img snapshot -l disk.qcow2 # 回滚快照 qemu-img snapshot -a snap1 disk.qcow2 # 删除快照 qemu-img snapshot -d snap1 disk.qcow2 # 加密 QCOW2 qemu-img create -f qcow2 -o encrypt=on secure.qcow2 20G # 修复损坏镜像 qemu-img check -r all disk.qcow2 # 基于基础系统镜像创建轻量子镜像,秒级新建虚拟机,极度省空间: # 母盘只读,所有修改写入子盘 # 适合批量部署、测试环境快速克隆 # 以 base.qcow2 为只读母盘,创建差分镜像 qemu-img create -f qcow2 -b base.qcow2 vm01.qcow2

QCOW2 运行挂载

# 挂载qcow2到本地 modprobe nbd max_part=8 qemu-nbd --connect=/dev/nbd0 disk.qcow2 mount /dev/nbd0p1 /mnt # 卸载 umount /mnt qemu-nbd --disconnect /dev/nbd0

常用工具(QEMU-img 为主)

# 创建qcow2(100G动态) qemu-img create -f qcow2 disk.qcow2 100G # 格式转换(raw→qcow2) qemu-img convert -f raw -O qcow2 disk.raw disk.qcow2 # 查看镜像信息 qemu-img info disk.qcow2 # 快照管理 qemu-img snapshot -c snap1 disk.qcow2 # 创建 qemu-img snapshot -a snap1 disk.qcow2 # 应用 qemu-img snapshot -d snap1 disk.qcow2 # 删除

选型建议

  • KVM / 云环境:优先QCOW2(功能全、生态好)。
  • VMware:用VMDK(兼容性最佳)。
  • VirtualBox:默认VDI
  • 极致性能:临时场景用RAW(无快照需求)。

创建虚拟机镜像

创建【空白磁盘镜像】

以 Linux/KVM 最通用的qemu-img为例,极简常用命令

1. QCOW2(KVM 首选,动态、快照、精简)

# 创建 10G 空白动态磁盘 qemu-img create -f qcow2 vm-disk.qcow2 10G # 20G 固定全量盘(高性能) qemu-img create -f qcow2 -o preallocation=full vm-disk.qcow2 20G

2. RAW 裸盘(极致性能)

qemu-img create -f raw vm-disk.raw 10G

创建【完整系统镜像】

方式 1:全新安装制作镜像

  1. 新建虚拟机 → 绑定上面创建的空白磁盘
  2. 挂载 Windows/Linux ISO 镜像
  3. 正常分区、安装系统、装驱动、优化配置
  4. 关机,该磁盘文件就是成品虚拟机镜像

例:centos7.qcow2win10.vmdk,可直接复制给其他虚拟机导入使用

方式 2:从现有虚拟机打包制作(克隆镜像)

# 完整克隆,生成独立纯净镜像 qemu-img convert -O qcow2 原镜像.qcow2 新成品镜像.qcow2 # 压缩精简,减小镜像体积 qemu-img convert -c -O qcow2 原镜像.qcow2 压缩版镜像.qcow2

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询