QEMU與塊設備詳解


Ceph 塊設備最常見的用法之一是作為虛擬機的塊設備映像。

例如,用戶可創建一個安裝、配置好了操作系統和相關軟件的“黃金標准”映像,然后對此映像做快照,最后再克隆此快照(通常很多次)。

能夠實現快照的寫時復制克隆意味着 Ceph 可以快速地為虛擬機提供塊設備映像,因為客戶端每次啟動一個新虛擬機時不必下載整個映像。即:

基礎鏡像 ---> 快照 ---> 克隆(多次)

用法說明

QEMU 命令行要求你指定存儲池名和映像名,還可以指定快照名。

QEMU 會假設 Ceph 配置文件位於默認位置(如 /etc/ceph/$cluster.conf ),並且你是以默認的 client.admin 用戶執行命令,除非你另外指定了其它 Ceph 配置文件路徑或用戶。

例如,應該這樣指定 id 和 conf 選項:

qemu-img {command} [options] rbd:glance-pool/maipo:id=glance:conf=/etc/ceph/ceph.conf

Tip:配置中的值如果包含這些字符: : 、 @ 、 = ,可在此符號前加反斜線 \ 轉義。

用 QEMU 創建映像

你可以用 QEMU 創建塊設備映像。必須指定 rbd 、存儲池名、要創建的映像名以及映像尺寸。

qemu-img create -f raw rbd:{pool-name}/{image-name} {size}

例如:

qemu-img create -f raw rbd:data/foo 10G

Important:raw 數據格式是使用 RBD 時的唯一可用 format 選項。從技術上講,你可以使用 QEMU 支持的其他格式(例如 qcow2 或 vmdk),但是這樣做可能會帶來額外開銷,而且在開啟緩存(見下)模式下進行虛擬機的熱遷移時會導致卷的不安全性。

用 QEMU 更改映像尺寸

你可以通過 QEMU 調整塊設備大小。必須指定 rbd 、存儲池名、要調整的映像名,還有映像尺寸。

qemu-img resize rbd:{pool-name}/{image-name} {size}

例如:

qemu-img resize rbd:data/foo 20G

虛擬機磁盤擴容注意事項:

  • 在host主機中添加了磁盤空間后,需要在虛擬管理器中手動添加刷新才能檢測到添加的空間;
  • kvm中qcow2格式的鏡像只支持加空間不支持減少;
  • 一定要先關閉虛擬機再擴容,否則虛擬機容易崩潰或者會導致擴容失敗;
  • 創建好分區后要重啟,才能識別到新分區;
  • 在創建主分區的時候,如果使用默認的起始扇區,有可能分配到很小的一塊,這是磁盤剩余空間的不連續造成的。可以先fdisk -l查看磁盤分區情況,根據每個分區使用的扇區和磁盤所有的扇區號,可以推算出剩余空閑連續扇區的區號;
  • 在虛擬機開機狀態下,在宿主機上為虛擬機磁盤鏡像添加容量容易導致虛擬機崩潰,或者不能繼續擴容,刪除虛擬機之后,要檢查虛擬機掛載的磁盤目錄下鏡像是否刪除,沒有的話手動刪除。

用 QEMU 檢索映像信息

你可以用 QEMU 檢索塊設備映像信息。必須指定 rbd 、存儲池名和映像名。

qemu-img info rbd:{pool-name}/{image-name}

例如:

qemu-img info rbd:data/foo

通過 RBD 運行 QEMU

QEMU 能把一主機上的塊設備傳遞給客戶機,但從 QEMU 0.15 起,不需要在主機上把映像映射為塊設備了。 QEMU 現在能通過 librbd 直接把映像作為虛擬塊設備訪問。這樣性能更好,因為它避免了額外的上下文切換,而且能利用開啟 RBD 緩存帶來的好處。

你可以用 qemu-img 把已有的虛擬機映像轉換為 Ceph 塊設備映像。比如你有一個 qcow2 映像,可以這樣轉換:

qemu-img convert -f qcow2 -O raw debian_squeeze.qcow2 rbd:data/squeeze

要從那個映像啟動虛擬機,執行:

qemu -m 1024 -drive format=raw,file=rbd:data/squeeze

啟用 RBD 緩存可顯著提升性能。從 QEMU 1.2 起, QEMU 的緩存選項可控制 librbd 緩存:

qemu -m 1024 -drive format=rbd,file=rbd:data/squeeze,cache=writeback

如果你的 QEMU 版本較老,你可以用 ‘file’ 參數更改 librbd 緩存配置(就像其它 Ceph 配置選項一樣):

qemu -m 1024 -drive format=raw,file=rbd:data/squeeze:rbd_cache=true,cache=writeback

Important:如果你設置了 rbd_cache=true ,那就必須設置 cache=writeback, 否則有可能丟失數據。不設置 cache=writeback , QEMU 就不會向 librbd 發送回寫請求。如果 QEMU 退出時未清理干凈, rbd 之上的文件系統就有可能崩潰。

QEMU 緩存選項

QEMU 的緩存選項對應下列的 Ceph RBD 緩存選項。

  • 回寫:librbd 默認不會進行任何緩存。寫和讀都直接到達存儲集群,而且只有當數據的所有副本都寫入磁盤后寫操作才會返回。啟用緩存后,寫操作會立即返回,除非未刷寫的字節數大於 rbd cache max dirty 。這種情況下,寫動作會觸發回寫機制並一直阻塞,直到足夠多的字節數被刷寫。
rbd_cache = true
  • 透寫:只有當數據的所有副本都寫入磁盤后寫操作才會返回,但可能會直接從緩存中讀取數據。緩存信息保存在客戶端的內存中,每個 RBD 映像有其自己的緩存。對客戶端來說緩存位於本地,所以如果有其他用戶訪問某個映像,不會存在緩存一致性的問題。打開緩存時,在 RBD 之上不能運行 GFS 或 OCFS 。
rbd_cache = true
rbd_cache_max_dirty = 0
  • 無緩存:
rbd_cache = false

注意:QEMU 的緩存選項會覆蓋 Ceph 的默認選項(就是那些 Ceph 配置文件里沒有的選項)。如果你在 Ceph 配置文件內設置了 RBD 緩存選項,那么它們會覆蓋 QEMU 緩存選項。如果你在 QEMU 命令行中設置了緩存選項,它們則會覆蓋 Ceph 配置文件里的選項。即優先級為:QEMU命令行緩存選項 > Ceph配置選項 > QEMU緩存選項 > Ceph默認選項。

  • rbd cache writethrough until flush
描述:開始進入透寫模式,並且在收到首個 flush 請求后切換到回寫模式。啟用該項保守但安全,以防 rbd 之上的虛擬機內核太老而不能發送 flush ,例如 Linux 2.6.32 之前的 virtio 驅動。
類型:Boolean
是否必需:No
默認值:true


免責聲明!

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



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