libvirt sanlock虚拟机锁管理器插件
此页面描述了将 sanlock 服务用作 虚拟机磁盘互斥的锁定驱动程序插件。
Sanlock守护程序设置
在许多操作系统上,sanlock插件分发在一个子包中,该子包需要与主libvirt RPM分开安装。在Fedora / RHEL主机上,可以使用以下yum命令 完成此操作
$ su - root
# yum install libvirt-lock-sanlock
下一步是启动sanlock守护程序。为了获得最大的安全性,sanlock希望与看门狗守护程序建立连接。如果sanlock崩溃/异常终止,这将导致整个主机重新启动。要在Fedora / RHEL主机上启动看门狗守护程序,可以运行以下命令:
$ su-根
$ su - root
# chkconfig wdmd on
# service wdmd start
看门狗运行后,可以按以下方式启动sanlock
# chkconfig sanlock on
# service sanlock start
注意:如果您希望避免使用看门狗,请/etc/sysconfig/sanlock 在开始之前 添加以下行
SANLOCKOPTS="-w 0"
必须在将要运行虚拟机的每个主机上启动sanlock守护程序。因此,如有必要,请重复这些步骤。
libvirt sanlock插件配置
一旦运行了sanlock守护程序,下一步就是配置libvirt sanlock插件。每个使用sanlock的libvirt驱动程序都有一个单独的配置文件。对于QEMU,我们将编辑/etc/libvirt/qemu-sanlock.conf 有一个必填参数,需要设置host_id。这是1到2000之间的整数,在 运行虚拟机的每个主机上必须将其设置为唯一值。
$ su - root
# augtool -s set /files/etc/libvirt/qemu-sanlock.conf/host_id 1
在每个主机上重复此操作,将1更改为主机的唯一值。
libvirt sanlock存储配置
sanlock插件需要在所有运行虚拟机的主机之间共享的文件系统上的目录中创建租约。显而易见的选择包括NFS或GFS2。libvirt sanlock插件希望其租约目录位于此位置,/var/lib/libvirt/sanlock 因此请更新主机的主机,/etc/fstab以在该位置安装合适的共享/群集文件系统
$ su - root
# echo "some.nfs.server:/export/sanlock /var/lib/libvirt/sanlock nfs hard,nointr 0 0" >> /etc/fstab
# mount /var/lib/libvirt/sanlock
如果您的sanlock守护程序恰好在非root用户特权下运行,则需要将此命令告知libvirt,以便它正确处理创建的文件。这可以通过 在配置文件中设置user和/或group变量来完成。说明中对中的相同变量指定了可接受的值范围/etc/libvirt/qemu.conf。例如:
augtool -s set /files/etc/libvirt/qemu-sanlock.conf/user sanlock
augtool -s set /files/etc/libvirt/qemu-sanlock.conf/group sanlock
但是请记住,如果这是NFS共享,则需要使用no_root_squash-ed才能使chown(可能还有chmod)成功。
就存储要求而言,如果文件系统使用512字节的扇区,则需要1MB 为每个来宾磁盘提供存储空间。因此,如果您的网络具有20个虚拟化主机,每个虚拟机运行50个虚拟机,每个来宾平均要有2个磁盘,则需要20*50*2 == 2000 MB存储用于sanlock。
在网络上的一台主机上,设置cron作业以virt-sanlock-cleanup 定期运行脚本是明智的。该脚本删除正在运行的虚拟机当前未使用的所有租用文件,从而释放共享文件系统上的磁盘空间。除非非常频繁地创建和删除VM磁盘,否则足以每周运行一次清理。
QEMU / KVM驱动程序配置
从0.9.3版开始,QEMU / KVM驱动程序已与锁管理器框架完全集成。但是,现成的配置当前使用nop锁管理器插件。为了获得磁盘保护,因此必须重新配置QEMU以激活sanlock 驱动程序。这可以通过编辑QEMU驱动程序配置文件(/etc/libvirt/qemu.conf)并更改lock_manager配置可调参数来实现。
$ su - root
# augtool -s set /files/etc/libvirt/qemu.conf/lock_manager sanlock
# service libvirtd restart
如果一切顺利,libvirtd将与sanlock交谈并创建基本的锁空间。可以通过查找以下文件的存在来检查
# ls /var/lib/libvirt/sanlock/
__LIBVIRT__DISKS__
每次启动guest虚拟机时,其他租约文件都会出现在此目录中,每个虚拟磁盘一个。租用文件是根据虚拟磁盘支持文件的标准路径的MD5校验和命名的。因此,如果为来宾提供了磁盘作为后盾,则该/var/lib/libvirt/images/demo.img 租户将看到租约/var/lib/libvirt/sanlock/bfa0240911bc17753e0b473688822159
显而易见,为了使锁定正常工作,每个运行虚拟机的主机都应以相同的方式配置存储。最简单的方法是使用libvirt存储池功能来配置用于来宾存储的任何NFS卷,iSCSI目标或SCSI HBA。只需在每个主机上复制相同的存储池XML。重要的是,任何暴露块设备的存储池都必须配置为在其下创建卷路径,/dev/disks/by-path以确保跨主机的稳定路径。确保这一点的示例iSCSI配置为:
<pool type='iscsi'>
<name>myiscsipool</name>
<source>
<host name='192.168.254.8'/>
<device path='your-iscsi-target-iqn'/>
</source>
<target>
<path>/dev/disk/by-path</path>
</target>
</pool>
域配置
万一sanlock由于某种原因无法访问磁盘锁,它将杀死所有丢失其锁的域。可以使用域XML中的on_lockfailure元素更改此默认行为 。存在此元素时,sanlock将sanlock_helper使用指定的动作进行调用(由libvirt提供)。该帮助程序二进制文件将连接到libvirtd,因此如果libvirtd配置为在读写UNIX套接字上要求,则可能需要进行身份验证。为了向sanlock_helper提供适当的凭据, 客户端身份验证文件需要包含以下内容:
[auth-libvirt-localhost]
credentials=sanlock
[credentials-sanlock]
authname=login
password=password