云计算国产化之路 vnc登录 文件系统直通(virtio-9p) 扩展qemu接口 gpg WARNING 珍藏博客 虚拟内存情况dommemstat分析 免密码自动登录脚本 Linux网桥 测试网段IP占用情况 Linux 进程状态 systemc强制依赖 调试openstack ut uefi p2v 重做ubuntu内核 virsh创建虚拟机简介 virtio IO路径 虚拟化层升级后磁盘无法卸载卷 vmtouch使用 Taint flags 主机和虚拟机文件共享处理的几种方法 kvm分析工具 kvm中对磁盘的io cache 虚拟化不同导致的guestos中软件安装差异(未解决) 设备直通(PCI Assignment)到底是咋整的 virtio到底是咋整的 内核启动参数 虚拟化实时性提升(零)之配置步骤 中断虚拟化(pic)到底是咋整的 中断虚拟化(apic)到底是咋整的 Raid卡配置丢失导致服务器无法启动 tainted kernels cpu stuck for 23s问题分析 虚拟化实时性提升(一)之hostOS切换为强实时系统 内存虚拟化到底是咋整的 qemu-kvm中vcpu虚拟化到底是咋整的 风河虚拟化技术点分析 使用qga的好处 qemu迁移代码分析 虚拟机串口配置及其导出到主机pts和console.log System-based I/O vs. Raw I/O 虚拟机使用Hugepage(大页) 硬件辅助分页(hardware assisted paging) 修改centos7默认启动项目 virtio的工作流程——kernel中virtio-pci初始化(2) virtio的工作流程——qemu中virtio-backend初始化(1) qmp ceilometer取不到memory.usage指标 Virtio-Balloon超详细分析 slabtop输出 虚拟机磁盘cache导致的host os kernel崩溃 虚拟机cpu和memory性能优化测评 PCI配置空间(PCI Configuration Space) centos下网卡设备直通(VT-dpci passthrough)遇到的问题及其解决思路 libguestfs详解 yum卸载软件包及其依赖 通过原始Centos ISO来定制自己的ISO centos下网卡设备直通(VT-d,pci passthrough) (占位符)window虚拟机中拔盘如何通知到libvirt和qemu后端的 cirrus漏洞分析CVE-2017-2615 XSA-208 qcow2随笔 控制寄存器概览 ceilometer对接postgresql 解压initrd和vmlinuz qemu guest agent验证 QEMU升级指南(待续) ubuntu中kdump的配置 qemu(2.3)接口梳理 热迁移导致的FC存储场景下的multipath卷残留问题分析 virsh命令(4)secret,snapshot,pool,volume部分 virsh命令(3)之interface,filter,network virsh命令(2)monitor,host,nodedev部分 virsh命令(1)之domain部分 QEMU内存管理之FlatView模型(QEMU2.0.0) ovirt基于sanock的高可用(主机粒度HA) Sanlock防脑裂场景功能测试用例 gnocchi配置及与ceilometer对接指南 make patch for libvirt in centos centos使用sanlock指导 高可用nfs资料 ubuntu14中使用sanlock指导 LVM操作指南 sanlock相关功能验证流程汇总 make patch for libvirt in ubuntu libvirt.so.0-version `LIBVIRT_PRIVATE_1.2.7' not found gdb debug libvirt 基于ubuntu社区源码包编译libvirt compile libvirt(centos) No PCI buses available nfs lead to Linux halt nfs install and config anti-virus for cloud platform nova fetch image from glance(something about _base) token auth process ovs入门指南 virt software anti-virus something about ceilometer disk sample context interview questions openstack vm injection openstack Restful and RPC murano 概览 创建虚拟机流程(compute节点)之网络创建 创建虚拟机流程之compute_api之虚拟机实例填充之配额检测 创建虚拟机流程之compute_api之基本参数生成 创建虚拟机流程之compute_api 创建虚拟机流程(主) 创建虚拟机之image 创建虚拟机流程之准备网桥 创建虚拟机流程之virt 创建虚拟机流程之compute节点 CI/CD研发流程之工程创建 CI/CD研发流程之代码合入 CI/CD研发流程之UT(单元测试) 向openstack社区合入代码记 openstack/ceilometer/gnocchi杂谈 影子页表原理 mem_add(exec.c) qemu编译安装调试 openstack/ceilometer/gnocchi之Grafana简介 openstack wiki etcd openstack计量ceilometer openstack计费cloudKitty enventlet backdoor USB 安装VMWARE ESX pycharm设置指南 无法执行modprobe -a kvm-intel解决办法 QEMU配置项 网络不通小记 libvirt之XML(虚拟机定义文件) openstack-horizon 证书认证 ceilometer与ceph对接 openstack定时任务剖析(TODO) 服务器重启后mongodb进程无法启动 ubuntu14下新增openstack服务到service的导引 ERROR 1045(28000)-数据库连不上 Python两个内置函数—locals和globals unknown exit, hardware reason 31

sanlock相关功能验证流程汇总

2016年07月28日

一句话介绍

sanlock是一个锁管理器,可以使用它锁磁盘,然后防止虚拟机脑裂。
libvirt基于sanlock包装做出了一个插件:libvirt-sanlock
(默认情况下cenotos有安装包,ubuntu下没有包,需要手动编译libvirt包,下面以centos7为例,ubuntu中参考本人这篇博文)

安装配置

先安装libvirt-sanlock的包,然后进行一系列配置。

su - root
# yum install libvirt-lock-sanlock

启动狗

 $ su - root
 # chkconfig wdmd on
 # service wdmd start

启动sanlock

sanlock本身是一个守卫进程,利用paxos协议实现锁功能
libvirt-sanlock在sanlock是一个上层应用,负责相关环境的准备,并且调用sanlock的服务。
换句话说,libvirt-sanlock对sanlock进行了封装,进而使得libvirt可以使用sanlock的功能。

# chkconfig sanlock on
# service sanlock start

配置qemu-sanlock.conf

配置libvirt-sanlock配置文件
host_id需要时1-2000之间的值,需要计算节点各不相同
host_id作为不同主机直接相互区别的标志

 $ su - root
 # augtool -s set /files/etc/libvirt/qemu-sanlock.conf/host_id 1

需要配置这两项(把这两项放开)

libvirt使用sanlock有两种方式:

1. 自动加锁
在qemu-sanlock.conf中设置auto_disk_lease=1是自动加锁
会在libvirt启动的时候自动初始化__LIBVIRT__DISKS__作为sanlock的LOCKSPACE,并将当期主机自动加入到sanlock中,创建虚拟机的时候也会自动创建sanlock的RESOURCE文件,为磁盘加锁
这种方式需要锁当期主机的所有虚拟机

2. 手动加锁

qemu-sanlock.conf中设置auto_disk_lease=0关闭自动加锁
需手动创建LOCKSPACE文件和RESOURCE文件

sanlock client add_lockspace -s  LOCKSPACE:1:/var/lib/libvirt/sanlock/LOCKSPACE:0

将当期主机加到sanlock中
接下来,如下图所示,在虚拟机的配置文件中,磁盘信息中加入如下内容

下面的验证,为了简单使用auto_disk_lease

配置存储

sanlock需要创建租约文件,租约文件存储需要计算节点都可以访问的共享存储
可以是NFS或者是GFS2,这里使用nfs
上面我们配置了disk_lease_dir为/var/lib/libvirt/sanlock
那么更新节点上的/etc/fstab来mount一个共享存储到上述路径

# echo "some.nfs.server:/export/sanlock /var/lib/libvirt/sanlock nfs hard,nointr,bg 0 0" >> /etc/fstab
# mount /var/lib/libvirt/sanlock

some.nfs.server:/export/sanlock是提前搭建好的nfs服务器
注意:这里官网给出的参考文档没有bg参数,可能会存在系统启动卡死情况,见本人博文《nfs lead to Linux halt》
执行完,df -h可以看挂载结果

配置qemu.conf

如果进程启动不是root而是sanlock需要更新/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

设置lock_manager为sanlock

augtool -s  set /files/etc/libvirt/qemu.conf/lock_manager sanlock
# service libvirtd restart

配置完毕,可通过如下方式简单验证

 # ls /var/lib/libvirt/sanlock/
 __LIBVIRT__DISKS__

当遇到此目录下没有__LIBVIRT__DISKS__就需要定位了
可以通过本文后面的方法开启libvirtd的日志,或者通过/va r/log/messages
本人遇到如下错误:

通过如下方式解决: 重要 需要关闭selinux
否则sanlock会没有权限读取lockspace,会导致Lunix系统重启
创建虚拟机报错如下:

在/var/log/messages中报错如下:

通过阅读sanlock的代码发现是open方法调用lockspace的时候没有权限导致的

关闭selinux的方法如下:

vi /etc/sysconfig/selinux

将SELINUX项目修改为disabled
(此方法需要重启才能生效)

或者直接执行命令setenforce 0
(此方法重启会失效)

验证方法getenforce

sanlock功能验证

1.创建一个虚拟机磁盘

# qemu-img create  /home/disk.img 100M

2.创建虚拟机xml

<domain type='qemu'>
  <name>demo1</name>
  <memory>219200</memory>
  <vcpu>1</vcpu>
  <os>
    <type arch='x86_64'>hvm</type>
    <boot dev='cdrom'/>
  </os>
  <devices>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/home/disk.img'/>
      <target dev='vda' bus='virtio'/>
    </disk>
  </devices>
</domain> 

3.创建虚拟机

virsh create vm.xml

4.查看虚拟机

virsh list  

验证生效

查看租约文件,可以看到在目录下增加了租约文件

然后把虚拟机的xml名字修改为demo2,再次创建虚拟机

由于虚拟机demo1已经占有磁盘锁,导致虚拟机demo2创建失败
也就是说sanlock锁生效

ceph与sanlock(1)

之前验证,sanlock的租约文件放置到nfs中
由于版本中我们使用ceph作为后端存储,且nfs本身的高可用也需要处理
因此这里使用cephfs
将ceph 挂载到本地,命令如下
sudo mount -t ceph 10.10.200.208:6789/ /mnt/mycephfs -o name=neutron_cinder,secret=AQB4CB5XKK2nCRAAAXsP/0IF7x3+9v3OTvYG5w==


报错mount error 5 = Input/output error

原因是没有安装mds,安装后如下

mount后结果如下

但是我们没有用ceph的filesystem,我们用的是ceph的块设备

ceph与sanlock(2)

当虚拟机的后端存储为ceph的时候,发现libvirt-sanlock的磁盘锁不生效
通过阅读libvirt-sanlock的代码
发现针对ceph类型的磁盘,也就是disk type为network的这种情况 代码直接没有生成租约
问题代码在这里

修改代码
重编libvirt的包,问题解决

libvirt日志开启

在运行libvirtd的时候,我们需要获得lbivirtd的运行信息。
所以我们需要找到他的日志文件。
一般情况下,它是在/var/log/libvirt/libvirtd.log路径下。
可能在这个目录下没有发现这个的日志文件.那么就要配置一些libvitd的参数了

#将日志级别设置为 1(调试)
log_level = 1
#指定日志输出文件名称
log_outputs="1:file:/var/log/libvirt/libvirtd.log"

storage pool

针对存储池也做了相关验证
因为与本题不符,不做展开
详细可以参考这篇这篇

ubuntu

默认情况下没有开启sanlock选项,故需要重新编译
编译前修改如下:

(1)/debian/rules文件

vim rules
添加“–with-sanlock /” 至DEB_CONFIGURE_EXTRA_FLAGS变量下并保存文件

(2)然后 修改control文件
vim control
添加“libsanlock-dev,” 至Build-Depends列表下. (在“# For make check”前添加即可.)

添加“libsanlock-client1,”至package libvirt-bin下的Depends列表下,保存

ubuntu下编译libvirt包,参考本人这篇博文

参考文献

http://manpages.ubuntu.com/manpages/trusty/man8/sanlock.8.html
http://www.th7.cn/system/lin/201603/157030.shtml
http://www.ibm.com/developerworks/cn/linux/l-cn-libvirt-lvm/
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization_Administration_Guide/create-lvm-storage-pool-virsh.html
https://fedorahosted.org/sanlock/