本章では、 VM ホストサーバ の観点におけるストレージ関連の高度なトピックを説明しています。
virtlockd を利用したディスクファイルやブロックデバイスのロック (施錠) #Edit sourceブロックデバイスやディスクファイルをロック (施錠) することで、これらのリソースを他の VM ゲストから書き込まれることがないように保護することができます。これにより、同一の VM ゲスト が二重に起動されることを防ぐことができるほか、異なる仮想マシンに同じディスクが割り当てられたりすることがないようになります。これにより、仮想マシンのディスクイメージが、誤った設定によって破壊されてしまうのを防ぐことにもなります。
ロック処理は virtlockd と呼ばれるデーモンが取り扱います。 libvirtd デーモンとは個別に動作する仕組みであることから、 libvirtd がクラッシュしたり再起動したりしてしまったような場合でも、ロックを提供し続けることができます。さらに virtlockd 自身の更新にも対応していて、自分自身で再起動を実施できるようになっています。これにより、 virtlockd を更新しても、 VM ゲスト を再起動する必要がありません。なお、 virtlockd は KVM, QEMU, Xen にそれぞれ対応しています。
仮想ディスクのロックは openSUSE Leap の既定では有効化されていません。有効化してシステムの起動時に自動的に開始されるようにするには、下記の手順を実施します:
/etc/libvirt/qemu.conf ファイルを編集して、下記を設定します:
lock_manager = "lockd"
あとは過去のコマンドを実行して、 virtlockd デーモンを開始します:
>sudosystemctl start virtlockd
libvirtd デーモンを再起動します:
>sudosystemctl restart libvirtd
システムの起動時に virtlockd が自動的に開始されるように設定します:
>sudosystemctl enable virtlockd
既定では、 virtlockd は VM ゲスト に設定された全てのディスクを自動的にロックします。また、既定の設定では 「直接」 ロック領域を使用し、 VM ゲストの <disk> に書かれたデバイスに結びつけられたファイルに対して直接ロックを取得します。たとえば VM ゲスト 内に下記のような設定が存在した場合、 /var/lib/libvirt/images/my-server/disk0.raw ファイルに対して flock(2) を直接実行して、ロックを獲得します:
<disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/images/my-server/disk0.raw'/> <target dev='vda' bus='virtio'/> </disk>
virtlockd の設定は、設定ファイルである /etc/libvirt/qemu-lockd.conf を編集することで変更することができます。ここにはさらに詳しい情報の書かれたコメント (英語) が含まれています。なお、設定を変更した後は、それを反映させるために virtlockd を再読み込みさせる必要があります:
>sudosystemctl reload virtlockd
複数のホストで共有されている LVM や iSCSI ボリューム内に仮想ディスクが存在する場合、それらをロックするには、パス (既定で使用される方法) ではなく UUID で行う必要があります。それに加えてロック領域のディレクトリは、全てのホストからアクセスすることのできる共有の領域内に配置する必要があります。 virtlockd の LVM/iSCSI におけるロックの設定は、下記のようになります:
lvm_lockspace_dir = "ロック領域のディレクトリ" iscsi_lockspace_dir = "ロック領域のディレクトリ"
状況によっては、ゲストシステムで使用されるブロックデバイスのサイズを変更し、サイズを大きくするか小さくする必要に迫られることがあります。たとえば元々割り当てていたサイズでは不足しているような場合には、サイズを増やす必要があります。ゲストに割り当てていたディスクが 論理ボリューム 内に存在していれば、ゲストシステムを動作させた状態のままサイズを変更することができます。これはオフラインによるディスクサイズの変更 (20.3項 「guestfs ツール」 内で説明している virt-resize コマンドに関する説明をお読みください) とは異なり、サイズ変更時にもゲストを停止させる必要がありませんので、大きな利点になります。 VM ゲスト のディスクサイズを変更するには、下記の手順を実施します:
まずはゲストシステム内で、現在のサイズを確認します (下記では /dev/vda にディスクが配置されているものとします) 。
# fdisk -l /dev/vda
Disk /dev/sda: 160.0 GB, 160041885696 bytes, 312581808 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytesホスト側で、ゲストの /dev/vda を提供している論理ボリュームのサイズを変更します。ここではたとえば 200 GB に変更します。
# lvresize -L 200G /dev/mapper/vg00-home
Extending logical volume home to 200 GiB
Logical volume home successfully resizedホスト側で、ゲストの /dev/mapper/vg00-home ディスクに対応するブロックデバイスのサイズを変更します。なお、下記の ドメイン_ID の箇所には、 virsh list で表示されるドメイン名 (仮想マシン名) を入力します。
# virsh blockresize --path /dev/vg00/home --size 200G ドメイン_ID
ブロックデバイス '/dev/vg00/home' の容量が変更されましたゲスト側で、新しいディスクサイズが認識されていることを確認します。
# fdisk -l /dev/vda
Disk /dev/sda: 200.0 GB, 200052357120 bytes, 390727260 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 byteslibvirt を利用した RADOS ブロックデバイスの使用 #Edit sourceRADOS Block Devices (RBD) はデータを Ceph クラスタに保存します。このブロックデバイスでは、スナップショットやレプリケーション、データの一貫性維持などを行うことができます。お使いの libvirt 管理下の VM ゲスト から RBD を使用したい場合は、他のブロックデバイスと同様の手順を実施してください。