本页描述了将virtlockd 服务用作 虚拟机磁盘互斥的锁定驱动程序插件。
virtlockd背景
virtlockd守护程序是一个单用途二进制文件,专门用于代表正在运行的虚拟机获取和持有锁的任务。它旨在提供低开销,便携式锁定方案可在虚拟化主机上以最小的配置开销立即使用。它利用POSIX fcntl咨询锁定功能来保持锁定,大多数常用的文件系统都支持该锁定。
virtlockd守护程序设置
在大多数操作系统中,virtlockd守护程序本身不需要任何前期配置工作。当存在libvirtd时,默认情况下会安装它,并注册一个systemd套接字单元,以便在首次需要时自动启动守护程序。但是,对于早于systemd的OS,有必要在启动libvirtd之前在引导时启动它。在RHEL / Fedora发行版上,可以通过以下方式实现
# chkconfig virtlockd on
# service virtlockd start
以上说明适用于以特权方式运行的virtlockd实例,并由以特权方式运行的libvirtd守护程序使用。如果以非特权用户身份运行libvirtd,它将始终自动也产生非特权virtlockd守护程序实例。这根本不需要任何设置。
libvirt锁定插件配置
一旦virtlockd守护程序运行或设置为自动启动,下一步就是配置libvirt lockd插件。每个使用virtlockd的libvirt驱动程序都有一个单独的配置文件。对于QEMU,我们将进行编辑 /etc/libvirt/qemu-lockd.conf
lockd插件的默认行为是直接在与guest虚拟机<disk>元素关联的虚拟磁盘映像上获取锁。这样可以确保它无需配置即可立即使用,从而为共享文件系统(例如NFS)上的磁盘映像提供锁定。它不为块设备支持的存储提供任何跨主机保护,因为在/ dev中的设备节点上获取的锁仅适用于主机。也可能是保存磁盘映像的文件系统不支持fcntl锁的情况。
为了解决这些问题,可以告诉lockd获取间接文件上的锁。本质上,锁定将计算完全限定路径的SHA256校验和,并在给定目录中创建一个长度为零的文件,其文件名为校验和。然后它将获得对该文件的锁定。假设分配给来宾的块设备正在使用稳定路径(例如/ dev / disk / by-path / XXXXXXX),则这将允许锁在主机之间应用。可以通过设置配置设置来启用此功能,该设置指定在其中创建锁定文件的目录。所引用的目录当然应该放置在共享文件系统(例如NFS)上,所有可以看到共享块设备的主机都可以访问该文件系统。
$ su - root
# augtool -s set \
/files/etc/libvirt/qemu-lockd.conf/file_lockspace_dir \
"/var/lib/libvirt/lockd/files"
如果客户机将LVM和SCSI块设备用于其虚拟磁盘,则每个设备都有一个唯一的标识符。可以告诉lockd使用此UUID作为获取锁的基础,而不是文件名的SHA256和。这样的好处是,即使每个主机上给定块设备的文件路径不同,锁定保护也将起作用。
$ su - root
# augtool -s set \
/files/etc/libvirt/qemu-lockd.conf/scsi_lockspace_dir \
"/var/lib/libvirt/lockd/scsi"
# augtool -s set \
/files/etc/libvirt/qemu-lockd.conf/lvm_lockspace_dir \
"/var/lib/libvirt/lockd/lvm"
重要的是要记住,在/etc/libvirt/qemu-lockd.conf虚拟机上启动任何虚拟机之前,必须将对文件所做的更改 传播到所有主机。这样可以确保所有主机都使用相同的锁定机制
QEMU / KVM驱动程序配置
从版本1.0.2开始,QEMU驱动程序可以使用virtlockd插件。但是,现成的配置当前使用nop锁管理器插件。为了获得磁盘保护,因此必须重新配置QEMU以激活锁定的 驱动程序。这可以通过编辑QEMU驱动程序配置文件(/etc/libvirt/qemu.conf)并更改lock_manager配置可调参数来实现。
$ su - root
# augtool -s set /files/etc/libvirt/qemu.conf/lock_manager lockd
# service libvirtd restart
每次启动guest虚拟机时,virtlockd守护程序都将直接获取磁盘文件上的锁,或者基于SHA256 sum在已配置的后备目录之一中获取锁。要检查是否已按预期获取锁,可以运行lslocks工具。
# lslocks
COMMAND PID TYPE SIZE MODE M START END PATH
dmeventd 444 POSIX 4B WRITE 0 0 0 /run/dmeventd.pid
(unknown) 675 FLOCK WRITE 0 0 0 /run/lock...
rpcbind 693 FLOCK WRITE 0 0 0 /run/rpcbind.lock
lxcfs 728 POSIX 4B WRITE 0 0 0 /run/lxcfs.pid
iscsid 908 POSIX 4B WRITE 0 0 0 /run/iscsid.pid
(unknown) 1269 FLOCK WRITE 0 0 0 /run...
(unknown) 1260 FLOCK WRITE 0 0 0 /run...
(unknown) 1261 FLOCK WRITE 0 0 0 /run...
(unknown) 1428 FLOCK WRITE 0 0 0 /run...
(unknown) 1433 FLOCK WRITE 0 0 0 /run...
gnome-shell 2673 FLOCK WRITE 0 0 0 /run/user/0/wayland-0.lock
virtlockd 3229 POSIX 4B WRITE 0 0 0 /run/virtlockd.pid
3 891 POSIX WRITE 0 0 0 /run/lxc/var/lib/lxc/monitor-fifo
libvirtd 917 POSIX 3B WRITE 0 0 0 /run/libvirtd.pid
(unknown) 953 FLOCK WRITE 0 0 0 /...
master 1253 FLOCK 33B WRITE 0 0 0 /var/spool/postfix/pid/master.pid
master 1253 FLOCK 33B WRITE 0 0 0 /var/lib/postfix/master.lock
cron 1263 FLOCK 5B WRITE 0 0 0 /run/crond.pid
(unknown) 1429 FLOCK WRITE 0 0 0 /run...
(unknown) 1438 FLOCK WRITE 0 0 0 /run...
tracker-store 2908 POSIX 3.6M READ 0 1073741826 1073742335 /root/.cache/tracker/meta.db
tracker-store 2908 POSIX 32K READ 0 128 128 /root/.cache/tracker/meta.db-shm
tracker-miner-f 2899 POSIX 3.6M READ 0 1073741826 1073742335 /root/.cache/tracker/meta.db
tracker-miner-f 2899 POSIX 32K READ 0 128 128 /root/.cache/tracker/meta.db-shm
tracker-miner-a 2902 POSIX 3.6M READ 0 1073741826 1073742335 /root/.cache/tracker/meta.db
tracker-miner-a 2902 POSIX 32K READ 0 128 128 /root/.cache/tracker/meta.db-shm
virtlogd 3207 POSIX 4B WRITE 0 0 0 /run/virtlogd.pid
virtlockd 3229 POSIX 40G WRITE 0 0 0 /var/lib/libvirt/images/win2k16.qcow2
# lslocks
COMMAND PID TYPE SIZE MODE M START END PATH
dmeventd 444 POSIX 4B WRITE 0 0 0 /run/dmeventd.pid
(unknown) 675 FLOCK WRITE 0 0 0 /run/lock...
rpcbind 693 FLOCK WRITE 0 0 0 /run/rpcbind.lock
lxcfs 728 POSIX 4B WRITE 0 0 0 /run/lxcfs.pid
iscsid 908 POSIX 4B WRITE 0 0 0 /run/iscsid.pid
(unknown) 1269 FLOCK WRITE 0 0 0 /run...
(unknown) 1260 FLOCK WRITE 0 0 0 /run...
(unknown) 1261 FLOCK WRITE 0 0 0 /run...
(unknown) 1428 FLOCK WRITE 0 0 0 /run...
(unknown) 1433 FLOCK WRITE 0 0 0 /run...
gnome-shell 2673 FLOCK WRITE 0 0 0 /run/user/0/wayland-0.lock
virtlockd 7588 POSIX WRITE 0 0 0 /var/lib/libvirt/lockd/files/826549533d536d3457793a12babdc6f792066d2edb7e7e6292e0d450b9ef1cbd
3 891 POSIX WRITE 0 0 0 /run/lxc/var/lib/lxc/monitor-fifo
(unknown) 953 FLOCK WRITE 0 0 0 /...
master 1253 FLOCK 33B WRITE 0 0 0 /var/spool/postfix/pid/master.pid
master 1253 FLOCK 33B WRITE 0 0 0 /var/lib/postfix/master.lock
cron 1263 FLOCK 5B WRITE 0 0 0 /run/crond.pid
(unknown) 1429 FLOCK WRITE 0 0 0 /run...
(unknown) 1438 FLOCK WRITE 0 0 0 /run...
tracker-store 2908 POSIX 3.6M READ 0 1073741826 1073742335 /root/.cache/tracker/meta.db
tracker-store 2908 POSIX 32K READ 0 128 128 /root/.cache/tracker/meta.db-shm
tracker-miner-f 2899 POSIX 3.6M READ 0 1073741826 1073742335 /root/.cache/tracker/meta.db
tracker-miner-f 2899 POSIX 32K READ 0 128 128 /root/.cache/tracker/meta.db-shm
tracker-miner-a 2902 POSIX 3.6M READ 0 1073741826 1073742335 /root/.cache/tracker/meta.db
tracker-miner-a 2902 POSIX 32K READ 0 128 128 /root/.cache/tracker/meta.db-shm
virtlogd 3207 POSIX 4B WRITE 0 0 0 /run/virtlogd.pid
virtlockd 7588 POSIX 4B WRITE 0 0 0 /run/virtlockd.pid
libvirtd 7645 POSIX 4B WRITE 0 0 0 /run/libvirtd.pid