Qcow2原理與基於Qcow2的快照


一、說明:

    特別說明,本文是基於Qemu2.0的代碼分析,已經在私有雲中的使用實踐

二、基本概念:

    扇區:扇區也稱作為sector,磁盤驅動器從磁盤中讀取寫入數據的時候都是以sector為單位,一個扇區是512字節(所以如果你在用戶態寫1個字節,驅動會怎么樣呢?)。

    簇:簇也稱為cluster。一個簇由相鄰的多個扇區組成。文件在磁盤中存儲是以簇(塊)為單位,比如文件系統可以把4K字節作為一個簇(也就是8個扇區,所以文件在這樣的文件系統中最小的占用空間就是4K)。文件在磁盤上存儲的簇是不連續的,內核為了能索引到這些簇,於是就有了inode。

    inode:inode也是存放在磁盤上的(如果存放在內存中,那么系統重啟不久丟了嘛),但是為了提高訪問性能,內核一般會對inode進行緩存(https://www.cnblogs.com/whych/p/9315723.html)。

    操作系統對文件的讀寫: 在虛擬機操作系統中調用open函數打開文件時,host系統的內核會為這個vm對應的qemu進程記錄兩個個偏移(一個讀一個寫),在task_struct files數組中記錄file的信息。用戶態的進程在使用不指定偏移的接口調用read、write的時候都是從這個偏移開始讀寫。  道路內核層面,這個字節需要轉為為sector,因為磁盤需要以sector進行讀寫(否則效率太低)。 比如要讀5k字節處偏移的內容,那么就是要從inode[1]的值指向的地址開始讀取。

三、文件方式的存儲虛擬化:

不管是哪種形式的,qemu中都有對應的驅動,這個驅動其實就是“騙”虛擬機,模擬一個磁盤的行為。

額外多說一句,私有雲有用qcow2、raw、邏輯卷這些;而公有雲都是用邏輯卷(virtio-blk),因為它的IO路徑更短,所以性能更優。不過這並不是本次分析的內容。

RAW格式:Raw格式其實是一個空洞文件。空洞文件是怎么產生的呢?它是打開一個文件,然后設置一個很大的偏移,然后進行寫操作,這樣他占用的磁盤很大,但中間都是0,形成一個空洞文件。

Qcow2格式: 它是Q是qemu的意思吧,cow是寫時復制的意思,2是版本號。 一個10G大小的虛擬磁盤,它的實際大小就幾十兆,所以有些私有雲產品中把之稱為智能格式。 Qcow2的driver代碼中會告訴操作系統它是10G。 當創建快照的時候cluster並沒有復制出來一份,只有在往一個快找過的cluster中寫入數據的時候才會新建一個cluster,然后在新的cluster中寫入數據,然后把剩余部分從舊的數據區復制過去。比如一次寫入連續的1k個sector的數據,那么cluster還有3k個sector沒有寫入,那么就需要從舊的cluster中把3k個sector拷貝到新的cluster中了。

 

四、Qcow2文件格式:

 

 1、Qcow2文件頭:

  每一個qcow2文件都是以一個固定的格式開始的,其以大端模式存放,格式如下:

 

2、Qcow2的讀寫:

  首先看一個空白的Qcow2磁盤怎么寫入數據的(后面不寫文字了,直接圖片方式分享知識把):

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 最后提醒一句,最好不要使用Qcow2的內部快照,容易出問題,而且它把文件撐大后不好縮回去。 

在有backing file的時候,如果L2 entry是未分配的,那么它應該去backing file中尋找,而L2 entry應該是保存在qcow2 driver的緩存中。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM