本章では、 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
デーモンを開始します:
>
sudo
systemctl start virtlockd
libvirtd
デーモンを再起動します:
>
sudo
systemctl restart libvirtd
システムの起動時に virtlockd
が自動的に開始されるように設定します:
>
sudo
systemctl 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
を再読み込みさせる必要があります:
>
sudo
systemctl 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 bytes
libvirt
を利用した RADOS ブロックデバイスの使用 #Edit sourceRADOS Block Devices (RBD) はデータを Ceph クラスタに保存します。このブロックデバイスでは、スナップショットやレプリケーション、データの一貫性維持などを行うことができます。お使いの libvirt
管理下の VM ゲスト から RBD を使用したい場合は、他のブロックデバイスと同様の手順を実施してください。