本章介绍有关从 VM 主机服务器的角度操作存储的高级主题。
锁定块设备和磁盘文件可以防止不同的 VM Guest 同时写入这些资源。它提供了防止两次启动相同的 VM Guest 或将相同的磁盘添加到两个不同虚拟机的保护。这降低了由于错误的配置导致虚拟机磁盘镜像损坏的风险。
锁定由一个名为 virtlockd 的守护程序控制。由于它独立于 libvirtd 守护程序运行,因此锁定可以承受崩溃或 libvirtd 的重启。即使在 virtlockd 本身更新期间,锁定仍然存在,因为它能够重新执行自身。这确保了 VM Guest 在 virtlockd 更新时 不需要 重启。 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 Guest 配置的所有磁盘。默认设置使用 “直接” lockspace,其中锁定针对与 VM Guest <disk> 设备关联的实际文件路径获取。例如,当 VM Guest 包含以下 <disk> 设备时,会在 /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>
可以通过编辑文件 /etc/libvirt/qemu-lockd.conf 来更改 virtlockd 配置。它还包含带有更多信息的详细注释。请务必通过重新加载 virtlockd 来激活配置更改
>sudosystemctl reload virtlockd
有时需要更改—扩展或缩小—来宾系统使用的块设备的大小。例如,当最初分配的磁盘空间不再足够时,就该增加其大小了。如果来宾磁盘位于 逻辑卷 上,可以在来宾系统运行时调整其大小。这是优于离线磁盘调整大小(请参阅 第 18.3 节,“Guestfs 工具” 包中的 virt-resize 命令)的优点,因为来宾提供的服务不会被调整大小过程中断。
在来宾系统中,检查磁盘的当前大小(例如 /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 相关的块设备。可以使用 virsh list 找到 DOMAIN_ID。
# virsh blockresize --path /dev/vg00/home --size 200G DOMAIN_ID
Block device '/dev/vg00/home' is resized检查来宾是否接受了新的磁盘大小。
# 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