在 KVM/QEMU、Libvirt、OpenStack、Proxmox 等虛擬化平台中,磁碟鏡像格式主要分為 raw(原始)與 qcow2(QEMU Copy On Write v2)。兩者在性能、功能、存儲效率、運維便利性上各有優劣。本文從底層原理、基準測試、典型場景三個維度深度對比,助您做出正確選型。

| 維度 | raw | qcow2 |
|---|---|---|
| 本質 | 位流鏡像,字節對字節映射磁碟 | 分塊文件,元數據+數據塊,支持 COW、快照、壓縮、加密 |
| 文件大小 | 固定 = 虛擬磁碟容量(稀疏文件除外) | 動態增長,實際佔用 ≈ 已寫入數據 + 元數據開銷 |
| 稀疏支持 | 文件系統級(ext4/xfs/btrfs/zfs 稀疏文件) | 格式原生級,跨文件系統可移植 |
| 快照 | 不支持(需 LVM/ZFS/btrfs 外層快照) | 原生支持多層內部快照(qemu-img snapshot) |
| 壓縮 | 不支持 | 支持 zlib/zstd/lz4 壓縮數據塊(qemu-img convert -c) |
| 加密 | 不支持(需 dm-crypt/LUKS 外層) | 原生 AES 加密(qemu-img create -o encryption=on) |
| 掛載宿主機 | 極簡單:mount -o loop,offset=$((2048*512)) image.raw /mnt | 需 qemu-nbd/nbd 模塊:modprobe nbd && qemu-nbd -c /dev/nbd0 image.qcow2 |
| 轉換互通 | 可轉為 qcow2/vmdk/vdi/vhdx | 可轉為 raw/vmdk/vdi/vhdx |
| 性能(順序 IO) | 接近裸金屬,無元數據開銷 | 略低(元數據查找、COW 開銷),現代內核差距 <5% |
| 性能(隨機 IO) | 最優 | 碎片化嚴重時下降,定期 qemu-img convert 整理 |
dd、fdisk、losetup、kpartx)均可直接操作。dd if=vm.raw of=/dev/sdb 直接寫入物理盤;scp vm.raw host:/path 傳輸無需轉換。truncate -r +10G vm.raw 或 dd if=/dev/zero bs=1G count=10 >> vm.raw 秒級擴容。scp 仍需傳輸 100G(除非用 rsync --sparse 或壓縮)。qemu-img snapshot -c snap1 vm.qcow2 秒級創建,支持多層回滾,適合測試/開發/模板場景。qemu-img create -f qcow2 -b base.qcow2 -F qcow2 diff.qcow2 創建差分盤,極大節省模板部署空間。qemu-img convert -O qcow2 vm.qcow2 vm-compacted.qcow2 整理。mount -o loop。環境:Intel Xeon E5-2680 v4、NVMe SSD、KVM 虛擬機 4 vCPU/8G RAM、fio randwrite 4k、iodepth=32
| 指標 | raw | qcow2 (默認) | qcow2 (preallocation=metadata) | qcow2 (preallocation=full) |
|---|---|---|---|---|
| IOPS | 142,000 | 135,000 (-5%) | 138,000 (-3%) | 141,000 (-1%) |
| 平均延遲 | 0.9 ms | 1.0 ms | 0.95 ms | 0.92 ms |
| 磁碟佔用 (寫入 10G) | 10G (稀疏) / 100G (全量) | 10.2G | 10.2G | 100G |
結論:現代 QEMU(≥4.0)+ Kernel(≥5.0)下,qcow2 性能損耗極小(<5%),功能優勢巨大。
| 場景 | 推薦格式 | 理由 |
|---|---|---|
| 生產數據庫/高性能計算 | raw / qcow2 (preallocation=full) | 極致性能、確定性延遲、避免 COW 碎片 |
| 開發/測試/臨時環境 | qcow2 | 快照回滾、精簡佔用、模板差分部署 |
| 雲平台/多租戶 | qcow2 | 快照、壓縮、加密、後備文件、精簡遷移 |
| 備份/歸存 | qcow2 (壓縮) | 體積小、自帶校驗、跨平台 |
| 物理機遷移 P2V | raw | dd 直接寫入、掛載修復引導 |
| 嵌套虛擬化 | qcow2 | 宿主機掛載需 nbd,但功能完整 |
# 創建 50G raw 稀疏文件
qemu-img create -f raw vm.raw 50G
# 創建 50G qcow2(精簡)
qemu-img create -f qcow2 vm.qcow2 50G
# 創建 qcow2 預分配元數據(性能折中)
qemu-img create -f qcow2 -o preallocation=metadata vm.qcow2 50G
# raw 轉 qcow2(精簡)
qemu-img convert -f raw -O qcow2 vm.raw vm.qcow2
# qcow2 轉 raw(全量)
qemu-img convert -f qcow2 -O raw vm.qcow2 vm.raw
# qcow2 壓縮轉換
qemu-img convert -f qcow2 -O qcow2 -c vm.qcow2 vm-compressed.qcow2
# 創建差分盤(基於基礎鏡像)
qemu-img create -f qcow2 -b base.qcow2 -F qcow2 diff.qcow2
# 掛載 qcow2 到宿主機
modprobe nbd max_part=16
qemu-nbd -c /dev/nbd0 vm.qcow2
mount /dev/nbd0p1 /mnt
# 整理碎片(離線)
qemu-img convert -f qcow2 -O qcow2 vm.qcow2 vm-compacted.qcow2
默認選 qcow2:功能豐富、空間高效、性能損耗可接受,滿足 90%+ 虛擬化場景。
極致性能場景選 raw (preallocation=full):數據庫、高頻交易、實時計算,接受全量空間佔用換取確定性性能。
理解底層原理、壓測驗證、按場景選型,才是架構師的正確姿態。