
虚拟机磁盘镜像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%✅ 全支持VMDKVMwareESXi/Workstation动态 / 固定、快照链、适配器类型多样高✅ 高级快照VDIVirtualBox动态 / 固定、快照、精简分配中高✅ 基础快照VHD/VHDXMicrosoftHyper-V/Azure动态 / 固定、快照、VHDX 支持大磁盘中✅ 部分支持关键能力与应用场景快照Snapshot保存某一时间点状态用于备份、回滚、测试环境快速重置qcow2/VMDK 最强。克隆Clone完整克隆独立副本空间占用大。链接克隆基于基础镜像的差异盘秒级创建、省空间依赖基础镜像。格式转换跨平台迁移必备如 VMware→KVM 需 VMDK→QCOW2。压缩与加密QCOW2 支持 ZLIB 压缩 AES 加密适合云环境安全与存储优化。QCOW2QCOW2QEMU Copy-On-Write 2是QEMU/KVM 标准磁盘镜像格式Linux 虚拟化、OpenStack、Proxmox、云平台默认格式。核心特性稀疏动态分配初始体积极小写入数据才占用空间COW 写时复制支持快照、差分镜像、链接克隆内置压缩、AES 加密、碎片整理、扩容缩容支持超大磁盘、坏块记录、后端基础镜像差分盘是带元数据管理、写时复制、稀疏存储、快照链、差分依赖的块镜像格式不是裸扇区是结构化文件用「映射表」管理虚拟磁盘地址 → 宿主机文件偏移。QCOW2 用L1/L2 二级映射表管理虚拟磁盘地址依靠按需稀疏分配节省空间依靠簇级写时复制 COW实现快照、差分镜像与链接克隆是虚拟化领域兼顾功能、空间、性能的结构化磁盘格式。核心底层结构文件布局整个 qcow2 文件由 5 部分组成Header 头部固定起始版本、虚拟磁盘大小、簇大小、L1/L2 表地址、快照信息、加密标记等。L1 一级映射表顶层索引每一项指向一个 L2 表。L2 二级映射表真正的地址映射表虚拟块地址 → 宿主机文件簇偏移。数据簇Cluster实际存放磁盘数据的最小单位默认64KB / 簇可自定义。快照 / 元数据区、备份表、加密区关键单位虚拟地址 VA虚拟机内看到的硬盘 LBA 地址Cluster 簇qcow2 最小管理单元IO 读写、分配、COW 都以簇为单位L1L2 两级页表式映射类内存分页管理高效稀疏分配稀疏磁盘 原理为什么初始只有几百 KB默认新建 qcow2qemu-img create -f qcow2 test.qcow2 50G虚拟容量50GB实际文件大小~128KB机制只写入Header L1 表不预先分配任何数据簇L2 表初始为空未写入的虚拟簇 直接返回全 0不占用宿主机空间只有虚拟机第一次写入某个簇时才会申请宿主机磁盘空间分配 L2 表项写入实际数据 即按需分配、用多少占多少。两级映射表 核心工作流程1. 地址解析流程虚拟机发起读写某个扇区 →根据虚拟地址算出所属簇号索引L1 表→ 找到对应 L2 表物理位置索引L2 表→表项有效拿到宿主机文件偏移直接读写数据簇表项无效代表该簇从未写入读返回 0写触发分配2. 映射关系简图虚拟机虚拟磁盘地址 ↓ 簇 ↓ L1 Table 索引 → L2 Table ↓ L2 Table 表项 → 宿主机文件真实簇偏移关键结构字段Cluster 簇默认64KBQCOW2 最小分配 / COW / 映射单位。L1 Table数组每项 8Byte记录 L2 表的文件偏移。L2 Table数组每项 8Byte标记有效位是否已分配物理偏移数据簇位置外部位是否依赖后端 base 镜像读取总流程虚拟地址→ 拆分索引 → L1 查询 → L2 查询 → 本地簇 / 基盘穿透 / 返回 0写入总流程虚拟写请求→ L1/L2 查表├─ 空簇 → 新建簇 写数据 更新映射└─ 依赖基盘 → COW 拷贝簇 → 本地覆写 → 刷新 L2 映射COW 写时复制 核心原理快照 / 差分镜像根基1. 普通盘无 COW所有写入直接覆盖当前镜像的数据簇。2. 开启快照 / 差分盘后只读基盘base原始数据簇保持不变差分盘子盘只记录被修改过的簇写入触发 COW 流程虚拟机要修改某个簇发现该簇数据来自基盘QCOW2 自动把基盘对应簇复制到当前子盘新簇修改 L2 映射表指向新复制的簇新数据写入本地新簇未修改的簇继续共享读取基盘 核心改哪块、复制哪块大块数据全程共享这就是链接克隆秒开、极度省空间的本质。差分镜像后端 base原理qemu-img create -f qcow2 -b base.qcow2 vm1.qcow2base.qcow2只读基础镜像系统、软件、环境vm1.qcow2增量差异盘仅记录改动读取逻辑查本地子盘 L2 映射有数据 → 读本地无数据 → 穿透读取 base 基盘快照实现原理qcow2 内置多版本 L1/L2 映射表快照打快照时不复制全量数据只保存当前 L1/L2 映射表快照后续写入触发 COW分离新旧簇回滚快照直接切换为旧的映射表瞬间还原整机磁盘状态读写性能损耗原因每次 IO 需要L1L2 两次查表存在元数据开销新簇首次写入需要「分配空间 更新元数据」有轻微延迟碎片化多、快照链过长时映射查询开销上升优化方案预分配、关闭不必要快照、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 preallocationfull 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 转 QCOW2VMware迁移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 encrypton secure.qcow2 20G # 修复损坏镜像 qemu-img check -r all disk.qcow2 # 基于基础系统镜像创建轻量子镜像秒级新建虚拟机极度省空间 # 母盘只读所有修改写入子盘 # 适合批量部署、测试环境快速克隆 # 以 base.qcow2 为只读母盘创建差分镜像 qemu-img create -f qcow2 -b base.qcow2 vm01.qcow2QCOW2 运行挂载# 挂载qcow2到本地 modprobe nbd max_part8 qemu-nbd --connect/dev/nbd0 disk.qcow2 mount /dev/nbd0p1 /mnt # 卸载 umount /mnt qemu-nbd --disconnect /dev/nbd0常用工具QEMU-img 为主# 创建qcow2100G动态 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. QCOW2KVM 首选动态、快照、精简# 创建 10G 空白动态磁盘 qemu-img create -f qcow2 vm-disk.qcow2 10G # 20G 固定全量盘高性能 qemu-img create -f qcow2 -o preallocationfull vm-disk.qcow2 20G2. RAW 裸盘极致性能qemu-img create -f raw vm-disk.raw 10G创建【完整系统镜像】方式 1全新安装制作镜像新建虚拟机 → 绑定上面创建的空白磁盘挂载 Windows/Linux ISO 镜像正常分区、安装系统、装驱动、优化配置关机该磁盘文件就是成品虚拟机镜像例centos7.qcow2、win10.vmdk可直接复制给其他虚拟机导入使用方式 2从现有虚拟机打包制作克隆镜像# 完整克隆生成独立纯净镜像 qemu-img convert -O qcow2 原镜像.qcow2 新成品镜像.qcow2 # 压缩精简减小镜像体积 qemu-img convert -c -O qcow2 原镜像.qcow2 压缩版镜像.qcow2