QCOW2/RAW/qemu-img 概念浅析
目錄
- 目錄
- 擴展閱讀
- RAW
- QCOW2 QEMU-COW 2
- QCOW2 Header
- QCOW2 的 COW 特性
- QCOW2 的快照
- qemu-img 的基本使用
- RAW 與 QCOW2 的區別
擴展閱讀
The QCOW2 Image Format
為什么用ls和du顯示出來的文件大小有差別?
Qcow2鏡像格式解析
ROW/COW 快照技術原理解析
RAW
KVM 虛擬化中使用的鏡像格式通常為 RAW 和 QCOW2 兩種格式.
RAW 的原意是「未被加工的」, 所以 RAW 格式鏡像文件又被稱為 原始鏡像 或 裸設備鏡像, 從這些稱謂可以看出, RAW 格式鏡像文件能夠直接當作一個塊設備, 以供 GuestOS 使用. 也就是說 KVM 的 GuestOS 可以直接從 RAW 鏡像中啟動, 就如 HostOS 直接從硬盤中啟動一般.
塊設備: IO 設備中的一類, 將信息存儲在固定大小的塊中, 并且每個塊都有自己的地址, 常用的塊設備有硬盤.
因為 RAW 鏡像文件赤裸裸的特性帶來了下列好處:
- 使用 dd 指令創建一個 File 就能夠模擬 RAW 鏡像文件
- 性能較 QCOW2 要更高
- 支持裸設備的原生特性, 例如: 直接掛載
- 能夠隨意轉換格式, 甚至作為其他兩種格式轉換時的中間格式
- 能夠使用 dd 指令來追加 RAW 鏡像文件的空間
相對的, RAW 鏡像文件也具有一個非常大的缺陷, 就是不支持快照. 所以才有了后來 QCOW 和 QCOW2 的發展.
QCOW2 (QEMU-COW 2)
(摘自官方文檔)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
每個 QCOW2 鏡像文件都會以一個格式固定的 Header 開始.
typedef struct QCowHeader {uint32_t magic;uint32_t version;# Version number 版本號 (valid values are 2 and 3)uint64_t backing_file_offset;# backing_file_offset: 表示 backing file 文件絕對路徑的字符串相對于 QCOW2 鏡像文件起始位置的偏移量 uint32_t backing_file_size;# 因為上述的 backing file 文件絕對路徑的字符串不是以'\0'結束的# 所以需要通過 backing_file_size 來指出該字符串的長度# 如果當前 Header 的鏡像是一個 COW 鏡像, 則存在 backing file 文件, 否則沒有uint32_t cluster_bits;# cluster_bits: cluster 的位數, 表示 cluster 的大小# 1 << cluster_bits (1 向左移 cluster_bits 位得到的就是 cluster 的大小)# 一般是 512 byte <= cluster_bits <= 2 MBuint64_t size; /* in bytes */# size: 鏡像文件以塊設備呈現時的 Size(byte)uint32_t crypt_method;# crypt_method: 1 表示開啟采用了 AES 加密;0 表示沒有加密uint32_t l1_size;# L1 table(1 級索引) 可用的 8 字節項個數uint64_t l1_table_offset;# L1 table 相對于鏡像文件在存儲中起始位置的偏移量, 需要與 cluster 對齊uint64_t refcount_table_offset;# refcount table(引用計數表) 相對于鏡像文件在存儲中起始位置的偏移量, 需要與 cluster 對齊uint32_t refcount_table_clusters;# refcount table 占用多少個 clusteruint32_t nb_snapshots;# 鏡像文件中所包含的快照數量uint64_t snapshots_offset;# snapshot table 相對于鏡像文件在存儲中起始位置的偏移量, 需要與 cluster 對齊} QCowHeader;NOTE 1: 上述所有的偏移量數值, 都是為了幫助 QCOW2 鏡像文件定位相應的 metadata table.
NOTE 2: QCOW2 鏡像文件格式的塊設備數據都被儲存在一個個 cluster 中, 而 QCOW2 Header 也是保存在一個 cluster 中
NOTE 3: L1 和 L2 tables 結合使用能夠實現將磁盤鏡像地址映射到鏡像文件偏移
NOTE 4: 每一個 cluster 都有一個引用計數值, 當引用計數值為 0 時, 該 cluster 能夠被刪除
QCOW2 的 COW 特性
一個 QCOW2 鏡像能夠用于保存其它 QCOW2 鏡像(模板鏡像)的變化, 這樣是為了能夠保證原有鏡像的內容不被修改, 這就是所謂的增量鏡像. 增量鏡像看著就像是一個獨立的鏡像文件, 其所有數據都是從模板鏡像獲取的. 僅當增量鏡像中 clusters 的內容與模板鏡像對應的 clusters 不一樣時, 這些 clusters 才會被保存到增量鏡像中.
當要從增量鏡像中讀取一個 cluster 時, QEMU 會先檢查這個 cluster 在增量鏡像中有沒有被分配新的數據(被改變了). 如果沒有, 則會去讀模板鏡像中的對應位置.
QCOW2 的快照
從原理的層面上來說, 一個增量鏡像可以近似的當作一個快照, 因為增量鏡像相對于模板鏡像而言, 就是模板鏡像的一個快照. 可以通過創建多個增量鏡像來實現創建多個模板鏡像的快照, 每一個快照(增量鏡像)都引用同一個模板鏡像. 需要注意的是, 因為模板鏡像不能夠修改, 所以必須保持為 read only, 而增量鏡像則為可讀寫. 但需要注意的是增量鏡像并不是真正的 QCOW2 鏡像快照, 因為「真快照」是存在于一個鏡像文件里的.
qemu-img 的基本使用
列舉一些常用的 qemu-img 指令.
- 創建 QCOW2 鏡像文件: qemu-img create
- 查看 QCOW2 鏡像文件信息: qemu-img info
- 創建 QCOW2 的快照: qemu-img snapshot
- 再次創建 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*: qemu-img convert
convert 用于轉換鏡像文件的格式, 當源鏡像和目的鏡像的格式均為 qcow2 時, 就相當于將源鏡像的當前狀態復制到目標鏡像.
同時也因為被轉換出來的目的鏡像不會包含任何源鏡像的快照, 所以目的鏡像能夠擺脫 backing file.
- 更改 QCOW2 鏡像文件的 backing file
- QCOW2 鏡像文件轉換成 RAW 格式:
RAW 與 QCOW2 的區別
兩者的區別之一就是是否具有稀疏(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 鏡像文件除了含有作為一個塊設備所需要的數據信息之外, 其自身還包含了內部塊分配信息的記錄.
EXAMPLE:
需要注意的是: 雖然 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 格式.
轉載于:https://www.cnblogs.com/jmilkfan-fanguiju/p/7532232.html
總結
以上是生活随笔為你收集整理的QCOW2/RAW/qemu-img 概念浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二维数组最大关联子数组
- 下一篇: 大学生如何转专业(自学/培训)到互联网行