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 模式存放虛擬磁碟。
參考資料
- Proxmox VE 企業應用經驗分享 [2017/07/29] @台中資策會https://www.slideshare.net/jasoncheng7115/proxmox-ve-20170729
- Direct IO support · zfsonlinux/zfs@a584ef2
https://github.com/zfsonlinux/zfs/commit/a584ef26053065f486d46a7335bea222cb03eeea