天天看點

QCOW2/RAW/qemu-img 概念淺析目錄擴充閱讀RAWQCOW2 (QEMU-COW 2)qemu-img 的基本使用RAW 與 QCOW2 的差別

<a href="#%E7%9B%AE%E5%BD%95">目錄</a>

<a href="#%E6%89%A9%E5%B1%95%E9%98%85%E8%AF%BB">擴充閱讀</a>

<a href="#raw">RAW</a>

<a href="#qcow2-qemu-cow-2">QCOW2 QEMU-COW 2</a>

<a href="#qcow2-header">QCOW2 Header</a>

<a href="#qcow2-%E7%9A%84-cow-%E7%89%B9%E6%80%A7">QCOW2 的 COW 特性</a>

<a href="#qcow2-%E7%9A%84%E5%BF%AB%E7%85%A7">QCOW2 的快照</a>

<a href="#qemu-img-%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8">qemu-img 的基本使用</a>

<a href="#raw-%E4%B8%8E-qcow2-%E7%9A%84%E5%8C%BA%E5%88%AB">RAW 與 QCOW2 的差別</a>

<a href="https://people.gnome.org/~markmc/qcow-image-format.html">The QCOW2 Image Format</a>

<a href="http://www.cnblogs.com/coldplayerest/archive/2012/02/19/2358098.html">為什麼用ls和du顯示出來的檔案大小有差别?</a>

<a href="http://blog.chinaunix.net/xmlrpc.php?r=blog/article&amp;id=4326024&amp;uid=26299634">Qcow2鏡像格式解析</a>

<a href="http://blog.csdn.net/jmilk/article/details/65629391">ROW/COW 快照技術原了解析</a>

KVM 虛拟化中使用的鏡像格式通常為 RAW 和 QCOW2 兩種格式.

RAW 的原意是「未被加工的」, 是以 RAW 格式鏡像檔案又被稱為 原始鏡像 或 裸裝置鏡像, 從這些稱謂可以看出, RAW 格式鏡像檔案能夠直接當作一個塊裝置, 以供 GuestOS 使用. 也就是說 KVM 的 GuestOS 可以直接從 RAW 鏡像中啟動, 就如 HostOS 直接從硬碟中啟動一般.

塊裝置: IO 裝置中的一類, 将資訊存儲在固定大小的塊中, 并且每個塊都有自己的位址, 常用的塊裝置有硬碟.

因為 RAW 鏡像檔案赤裸裸的特性帶來了下列好處:

使用 dd 指令建立一個 File 就能夠模拟 RAW 鏡像檔案

性能較 QCOW2 要更高

支援裸裝置的原生特性, 例如: 直接挂載

能夠随意轉換格式, 甚至作為其他兩種格式轉換時的中間格式

能夠使用 dd 指令來追加 RAW 鏡像檔案的空間

相對的, RAW 鏡像檔案也具有一個非常大的缺陷, 就是不支援快照. 是以才有了後來 QCOW 和 QCOW2 的發展.

(摘自官方文檔)QEMU copy-on-write format with a range of special features, including the ability to take multiple snapshots, smaller images on filesystems that don’t support sparse files, optional AES encryption, and optional zlib compression

QEMU-COW 鏡像檔案具有一系列特性, 支援包括 多重快照(能夠建立基于之前鏡像的新鏡像, 速度更快), 占用更小的存儲空間(不支援稀疏特性, 不會預先配置設定指定 Size 的存儲空間), 可選的 AES 加密方式, 可選的 zlib 壓縮方式 等功能.

QCOW2 鏡像格式是 KVM-QEMU 支援的磁盤鏡像格式之一, 其表現形式為在一個系統檔案中模拟一個具有一定 Size 的塊裝置.

每個 QCOW2 鏡像檔案都會以一個格式固定的 Header 開始.

NOTE 1: 上述所有的偏移量數值, 都是為了幫助 QCOW2 鏡像檔案定位相應的 metadata table.

NOTE 2: QCOW2 鏡像檔案格式的塊裝置資料都被儲存在一個個 cluster 中, 而 QCOW2 Header 也是儲存在一個 cluster 中

NOTE 3: L1 和 L2 tables 結合使用能夠實作将磁盤鏡像位址映射到鏡像檔案偏移

NOTE 4: 每一個 cluster 都有一個引用計數值, 當引用計數值為 0 時, 該 cluster 能夠被删除

一個 QCOW2 鏡像能夠用于儲存其它 QCOW2 鏡像(模闆鏡像)的變化, 這樣是為了能夠保證原有鏡像的内容不被修改, 這就是所謂的增量鏡像. 增量鏡像看着就像是一個獨立的鏡像檔案, 其所有資料都是從模闆鏡像擷取的. 僅當增量鏡像中 clusters 的内容與模闆鏡像對應的 clusters 不一樣時, 這些 clusters 才會被儲存到增量鏡像中.

當要從增量鏡像中讀取一個 cluster 時, QEMU 會先檢查這個 cluster 在增量鏡像中有沒有被配置設定新的資料(被改變了). 如果沒有, 則會去讀模闆鏡像中的對應位置.

從原理的層面上來說, 一個增量鏡像可以近似的當作一個快照, 因為增量鏡像相對于模闆鏡像而言, 就是模闆鏡像的一個快照. 可以通過建立多個增量鏡像來實作建立多個模闆鏡像的快照, 每一個快照(增量鏡像)都引用同一個模闆鏡像. 需要注意的是, 因為模闆鏡像不能夠修改, 是以必須保持為 read only, 而增量鏡像則為可讀寫. 但需要注意的是增量鏡像并不是真正的 QCOW2 鏡像快照, 因為「真快照」是存在于一個鏡像檔案裡的.

列舉一些常用的 qemu-img 指令.

建立 QCOW2 鏡像檔案: <code>qemu-img create</code>

檢視 QCOW2 鏡像檔案資訊: <code>qemu-img info</code>

建立 QCOW2 的快照: <code>qemu-img snapshot</code>

再次建立 QCOW2 的快照2:

删除 QCOW2 鏡像檔案的快照:

恢複 QCOW2 鏡像檔案的快照:

建立基于 QCOW2 鏡像檔案的鏡像

建立一個基于鏡像 1(test.qcow2) 的鏡像 2(test_1.qcow2), test.qcow2 成為了 test_1.qcow2 的 backing file. 對 test_1.qcow2 所作的 I/O 操作都不會影響到 test.qcow2. test.qcow2 仍能夠作為其他鏡像的 backing file. 前提是 test.qcow2 不被修改.

NOTE: 如果作為 backing file 的鏡像檔案被修改了, 那麼會影響到所有基于它的鏡像檔案.

* 讓 QCOW2 鏡像檔案脫離 backing file*: <code>qemu-img convert</code>

convert 用于轉換鏡像檔案的格式, 當源鏡像和目的鏡像的格式均為 qcow2 時, 就相當于将源鏡像的目前狀态複制到目标鏡像.

同時也因為被轉換出來的目的鏡像不會包含任何源鏡像的快照, 是以目的鏡像能夠擺脫 backing file.

更改 QCOW2 鏡像檔案的 backing file

QCOW2 鏡像檔案轉換成 RAW 格式:

兩者的差別之一就是是否具有稀疏(Sparse File)特性. (關于 Sparse File 和 holes 的詳細介紹, 請查閱擴充閱讀.)

RAW 支援 Sparse File, 其内部塊中含有若幹的 holes. 這些 holes 會被 HostOS Filesystems 管理. 如果我們建立了一個 RAW(20G) 鏡像檔案, 使用 ls 指令檢視該檔案大小為 20G, 但如果使用 du 指令來檢視其大小時就會變得很小, 這是因為 RAW(20G) 檔案中存在若幹的 holes.

EXAMPLE:

相對的, 如果建立一個同為 20G 的 QCOW2 鏡像檔案, 無論是使用 ls 還是 du 指令檢視到的檔案 Size 都應該是一緻的. 這說明 QCOW2 鏡像檔案除了含有作為一個塊裝置所需要的資料資訊之外, 其自身還包含了内部塊配置設定資訊的記錄.

需要注意的是: 雖然 Sparse File 特性會導緻鏡像檔案的内部塊中存在 holes, 但實際上 holes 是不會占用存儲空間的, 無論是 RAW(Support Sparse File) 還是 QCOW2(Don’t Support Sparse Files), 兩者的磁盤使用率相等, 因為實體硬碟的塊數量是固定的, 不會受到 holes 的影響. 雖說 holes 不會影響最終的磁盤使用率, 不過 holes 能夠引起某些應用程序的「誤解」. 例如: 上面已經舉例的 ls 指令, 除此之外, 在 scp RAW 鏡像檔案時, 會消耗更大的網絡 I/O. 同樣的, tar RAW 鏡像檔案時也會消耗更長的時間和 CPU. 這也算是 RAW 的一大缺點了, 一般的解決方法就是将 RAW 轉換為 QCOW2 之後再進行壓縮或傳輸.

當然, Sparse File 也是具有其優勢的:

「The advantage of sparse files is that storage is only allocated when actually needed: disk space is saved, and large files can be created even if there is insufficient free space on the file system.」

Sparse FIle 的優勢在于: 存儲隻有在實際需要時, 空間才會被配置設定. 存儲的實際空間被保留了起來, 是以即使在檔案系統上顯示以及沒有足夠的可用空間時, 仍然可以建立大檔案.

除了 Sparse File 特性的差別之外, 使用 RAW 啟動的虛拟機會比 QCOW2 啟動的虛拟機 I/O 效率更高一些(25%), 是以如果追求性能的話建議選用 RAW 格式.

繼續閱讀