前言
不知什么原因,KVM内核日志提示IO error,大部分命令执行无响应,关机之后无法启动
内核日志报错:
关机后无法启动报错:
排查过程
根据启动时的报错,进入PVE查看内核日志,发现RBD映射解锁失败?
于是找了相关资料,初步判断是否ceph镜像的锁没有释放?
查看镜像锁和相关的rbd特性
rbd lock ls xds_kvm_dev_data/vm-516-disk-cloudinit
rbd info xds_kvm_dev_data/vm-516-disk-0
发现rbd并没有锁
然后找了此4个特性的资料
ceph rbd的新特性
ceph支持 layering,striping exclusive lock, object map,fast diff ,deep-flatten 等新的new features
-
layering
image的克隆操作。可以对image创建快照并保护,然后从快照克隆出新的image出来,父子image之间采用COW技术,共享对象数据。 -
striping v2
条带化对象数据,类似raid 0,可改善顺序读写场景较多情况下的性能。 -
exclusive lock
保护image数据一致性,对image做修改时,需要持有此锁。这个可以看做是一个分布式锁,在开启的时候,确保只有一个客户端在访问image,否则锁的竞争会导致io急剧下降。 主要应用场景是qemu live-migration。 -
object map
此特性依赖于exclusive lock。因为image的对象分配是thin-provisioning,此特性开启的时候,会记录image所有对象的一个位图,用以标记对象是否真的存在,在一些场景下可以加速io。 -
fast diff
此特性依赖于object map和exlcusive lock。快速比较image的snapshot之间的差异。 -
deep-flatten
layering特性使得克隆image的时候,父子image之间采用COW,他们之间的对象文件存在依赖关系,flatten操作的目的是解除父子image的依赖关系,但是子image的快照并没有解除依赖,deep-flatten特性使得快照的依赖也解除。 -
journaling
依赖于exclusive lock。将image的所有修改操作进行日志化,并且复制到另外一个集群(mirror),可以做到块存储的异地灾备。这个特性在部署的时候需要新部署一个daemon进程,目前还在试验阶段,不过这个特性很重要,可以做跨集群/机房容灾。
创建image的时候,jewel默认开启的特性包括: layering/exlcusive lock/object map/fast diff/deep flatten
Exclusive Lock
从上面可以看出,很多特性都依赖于exclusive lock,重点介绍一下。
exclusive lock 是分布式锁,实现的时候默认是客户端在第一次写的时候获取锁,并且在收到其他客户端的锁请求时自动释放锁。这个特性在jewel默认开启后,本身没什么问题, 客户端可以自动获取和释放锁,在客户端crash后也能够正确处理。
通过上面RBD特性资料可以知道,很有可能是因为PVE内核不支持这几种特性,导致锁没有及时释放或者没有加超时时间?导致rbd镜像实际上不存在锁了,而PVE内核层面却还在不停解锁?解锁失败就无法映射RBD,从而导致KVM的开机失败?
再次重试开机多次失败,并查看是否还有镜像锁,然后尝试禁用此4种特性,看最终是否能开机?
rbd lock ls xds_kvm_dev_data/vm-516-disk-0
#禁用特性,KVM相关的所有盘都要操作
rbd feature disable xds_kvm_dev_data/vm-516-disk-0 exclusive-lock object-map fast-diff deep-flatten
rbd info xds_kvm_dev_data/vm-516-disk-0
查看了锁并不存在,查看了镜像特性,已经全部关闭了。那么可以判定的是ceph-rbd镜像没有损坏,要么就是新特性的锁导致的问题,要么就是PVE内核映射rbd时出现了问题?
禁用了4种特性,然后再次尝试多次开机,发现还是无法开机,但换了另一种报错,提示需开启这3种特性? fast-diff,object-map,exclusive-lock
那么可以判断出,PVE是支持这3种特性的,不支持deep-flatten特性?也就是说没有把快照的依赖也解除?
尝试开启3种特性,开启失败只能让PVE自身去启动。
rbd feature enable xds_kvm_dev_data/vm-516-disk-1 layering exclusive-lock object-map fast-diff
再次启动发现成功了,然后查看镜像锁是否也加了上去就能判断问题是PVE内核问题还是Ceph-RBD问题。
最终发现ceph-rbd加锁了,问题显然是出现在PVE的内核,此次问题是实际上ceph的镜像锁已经没了,PVE内核执行开机会映射rbd,然后提示解锁失败,所以无法开机。
这是PVE内核的缺陷还是BUG,也就没有深究下去,审计源码是漫长耗时耗力的过程。
最后查看集群默认开启的特性,61的含义如下:
61的意思是上面图中的bit码相加得到的值
解决方案
如再次复现此情况,需要重新禁用4种特性,并且尝试多次开机。如果报错提示需开启3种特性,那么需要开启此特性,再次开机
另外需要将配置文件分发到各个节点,在ceph.conf中增加rbd_default_features,写明你创建的卷需要哪几种属性。
[global]
rbd_default_features = "layering, exclusive-lock, object-map, fast-diff"