2019年2月9日 星期六

[經驗分享]讓 Proxmox VE 的 ZFS 儲存支援使用 QCOW2



Proxmox VE 的儲存種類非常廣泛,以本機的儲存來說,最常用的就是 ZFS。

在一般情況下,PVE 建立虛擬機時會使用 Block Level 的 ZFS subvol 來直接存放 VM 虛擬機器的 Virtual Disk 虛擬磁碟。

不過,我有一些特殊的應用需求還是會希望使用 File Level 的 QCOW2 虛擬磁碟檔案,我可以容許損失一點點的效能,換取其它更重要的特性,例如備份容易,取檔方便等等。

那麼,該如何讓 ZFS 儲存區也可以給 PVE 存放 QCOW2 格式的檔案呢?





設定方式

為了讓 PVE 建立好的 ZFS 也可以採用 File Level 方式存放虛擬磁碟檔,我們需要用點小技巧。

請進入 [Datacenter 資料中心] > [Storage 儲存] > [Add 增加] > [Directory]


進入 Directory 設定


接下來要設定 Directory 路徑對應到既有的 zfspool 位置,在設定之前可以先用 zfs list 指另查看確認。

查看 zfs list 資訊


在這個 PVE 節點裡,原本已經建立過一個 zfspool 名稱為 vmimage,並且在建立完成後 zfs 會自動把它掛載到根目錄下,也就是 /vmimage。

到這裡資訊已經足夠,請回到增加 Directory 的畫面,將資訊填入。

增加 Directory

最重要的兩個欄位說明如下:

  • ID:
    名稱可以自行定義,例如 zfspool 原名為 vmimage,我會取名為 vmimage-dir,一眼就可以看出這個儲存是 Directory 的類型,可供立即辨識。
     
  • Directory:
    請輸入上面取得的資訊,輸入 /vmimage。

對應 ZFS Directory 建立完成


到這裡,我們已經可以在 ZFS 儲存上建立 QCOW2 類型的虛擬磁碟檔了,若勾選的類型較多,還可以放 LXC 容器磁碟檔、VZDump 備份檔、ISO 映像檔...等。

ZFS Directory 存放更多類型檔案



再來回頭做個比較,使用 ZFS Block Level 與 File Level 存放時,PVE 介面上呈現的資訊。


虛擬磁碟類型修改前後差異







運作問題

在 WebUI 上開始建立虛擬磁碟相當順利,可是,開機的時候......

改用 ZFS 放 QCOW2 無法開機


糟糕,竟然無法開機,該怎麼辦呢?

我在 2017 年的 PVE 經驗分享簡報上分享過解決方法:請將 Cache 模式修改為 Write through 或 Write back 即可解決。



解決 ZFS 使用 QCOW2 無法開機問題









結論

話說回來,為什麼會有這個問題呢?原因出在 zfsonlinux 過去沒有支援「Direct IO」的機制,而使用 QCOW2 掛載為虛擬機磁碟會使用到這個機制,所以產生 no support O_DIRECT 錯誤訊息而開機失敗,改用 Write through 或 Write back 因為快取機制等關係,所以不需要這個機制。

不過,在 zfsonlinux 0.8.0-rc3 (2018/8/28) 版本已經加入 Direct IO 的支援,若 PVE 的 ZFS 更新到這個版本,理論上可以解決這個問題,但我沒有測試過尚無法給出結論,有興趣的朋友可以試試。

最後提醒,這個方法會讓 QCOW2 做 File Level CoW (Copy on Write),而 ZFS 本身就已經是 CoW 檔案系統的一種,經過這樣兩個層級的 CoW 後,對於寫入將會帶來較大的效能損耗,若想要最佳效能,仍建議選用 Block Level 的 ZFS subvol 模式存放虛擬磁碟。






參考資料