QEMU/KVMをZVOLで使う その1 ZVOLとは
はじめに
ZFSを導入したUbuntuでQEMU/KVMをZVOLで使う方法を解説します。少し大掛かりになるので、3部構成にします。
その1 ZVOLとは ←今回
その2 QEMU/KVMについて
その3 実践編
ZVOLは聞き慣れないかもしれませんが、仮想環境で使うとても効率の良いストレージ技術です。
事前準備:ZFSの導入
ZVOLを使うには、まずZFSの導入が必要です。以下の記事を参考にしてください。
インストーラーでZFSを選択してZFSルートで使う場合
データディスクをZFSにして運用する場合
参考ドキュメント
ZFS公式ドキュメント
参考サイト
ZVOL関連
https://docs.oracle.com/cd/E23824_01/html/821-1448/gaypf.html
https://docs.freebsd.org/en/books/handbook/zfs/index.html#zfs-zfs-volume
`zfs-utils` をインストールした環境では `zfs-create(8)` のmanページも参照できます
$ man zfs-create
ZVOLとは
ZVOLとは、ブロックデバイス(生のストレージ)を仮想化したものです。ファイルシステム上に置かれた仮想イメージとは根本的に異なります。
仮想イメージとZVOLの違い
仮想イメージは、ファイルシステム上に置かれた普通のファイルです。VirtualBoxやQEMUといった専用ツールで作成し、その中身をゲストOSがディスクとして解釈します。
アクセス経路:
ゲストのファイルシステム
↓
イメージファイル(ホストのファイルシステム上の1ファイル)
↓
ホストのブロックデバイス
ZVOLは、ブロックデバイスを直接参照します。ZFSのプールから直接切り出されたブロックデバイスであり、ファイルシステムの中の1ファイルとして存在するわけではありません。ZVOL上には `newfs` や `mkfs` といったOS標準コマンドで、通常のディスクと同じやり方で任意のファイルシステムを作成できます。
アクセス経路:
ファイルシステム
↓
ブロックデバイス
仮想イメージがホスト側のファイルシステムをもう一段挟むのに対し、ZVOLはその一段を経由しません。層が少ないぶん、ZVOLの方が効率的です。
LinuxのLVMを知っている人であれば、ボリュームグループから論理ボリューム(LV)を直接切り出す感覚に近い、と言えばイメージしやすいかもしれません。仮想イメージファイルが「既存のファイルシステムの中に住む1ファイル」であるのに対し、ZVOLは「ストレージプールから直接切り出されたブロックデバイス」である、という点でLVMのLVと同じ発想です。
ZVOLの利点・欠点
✅ 利点
1. I/O効率が良い
中間層が少ないため、ディスクアクセスが効率的です。
ただし、もともとZFS自体のパフォーマンスが非常に良いため、ZFS上の仮想イメージとZVOLを比較しても、必ずしもZVOLの方が速いとは限らないようです。
参考:Practical ZFS Forumの記事
2. OSの標準コマンドで操作できる
通常のブロックデバイスとして扱えるため、`mkfs` などのOSコマンドがそのまま使えます。
3. ZFSの利点を最大限に活用できる
スナップショットが簡単・高速・少容量
キャッシュ性能が高い
管理が容易でわかりやすい
データ消失のリスクが少ない
❌ 欠点
1. ZFSの知識が必要
導入・運用にはZFSの基本的な知識が求められます。
2. cp/mv/scp/rsyncなどによる移動ができない
移動には `zfs send/receive` が必要です。仮想イメージであればZFSでないext4などのシステムへもコピーできますが、ZVOLはZFSのシステム間でしか移動できません。
つまり、VirtualBoxなどで気軽にOSを試すような使い方には仮想イメージが向いていますが、本格的な仮想環境の構築にはZVOLが向いているということになります。(仮想環境でLVMの論理ボリュームが使われるのも同じ理由です。)
ZVOL の作り方
ZVOL は、zfs create で作成する データセットです。-V オプションで容量を指定することで、データセットをZVOLとして作成するようになります。これだけで、/dev/zvol/<データセット名> というブロックデバイスでアクセスできるようになります。
zvol の作成
zdata という pool に 「zdisk」という 40G の ZVOL を作成
$ sudo zfs create zdata/kvm
$ sudo zfs create -V 40G zdata/kvm/zdisk
補足
-b で blocksize を指定することもできますが、とりあえずはデフォルトの16kBで大丈夫なので省略します。
-s オプションをつけることで、必要な分だけ容量を確保するようになり、容量を節約できますが、残り容量以上の値を指定できてしまうので注意が必要です。もし、-s をつける場合は、空き容量が十分にあることを確認しましょう。
$ sudo zfs create -V 40G -s zroot/kvm/zdisk
-s 付きで作成された ZVOL は作られたときは容量ゼロでメタデータだけになります。
作成されたデバイスノードの確認
ブロックデバイスは、/dev/zvol/<dataset名> です。
$ ls -l /dev/zvol/zdata/kvm/zdisk
lrwxrwxrwx 1 root root Jun 21 09:39 /dev/zvol/zdata/kvm/zdisk -> ../../../zd0
/dev/zd0 でもアクセスできますが、'0' の部分が変わる場合があるので、安全のため、/dev/zvol/xx の方でアクセスしましょう。
まとめ
ZFS には ZVOL という、仮想ストレージを作るしくみが備わっている。
ZVOL は 本格的に仮想環境を作るのに向いている。
ZFS は QEMU/KVM や bhyve との相性が抜群である。
次回は QEMU/KVMについて 解説します。
