rbd鎖引起kvm虛擬機無法啟動的故障


前言

環境因為一些問題(網絡,或者磁盤,或者其它各種異常),引起了集群的狀態的一些變化,變化之后,集群的某些虛擬機正常某些虛擬機出現異常,異常現象就是無法啟動
特別是win server2008 ,會一直卡在滾動條這里

這個問題很久前碰到過一個哥們出現過,他問我是否遇到過,這個之前遇到過一次無法啟動的,通過導出導入的方式解決了,當時一直也沒找到原因
這個哥們告訴我,通過關閉rbd的屬性后,就可以正常啟動了,當時就記了下,也沒分析更深層次的原因
最近有一個環境因為時間過快,往回調整了十幾分鍾,集群出現mon選舉,osd出現閃斷以后,部分虛擬機出現無法啟動的情況

問題分析

導入導出或者克隆基本可以判斷數據是沒有問題的,那么應該就是其它問題
通過關閉屬性可以解決,那么大概能夠定位到這幾個屬性相關的

features: layering, exclusive-lock, object-map, fast-diff, deep-flatten

而鎖文件是最大的懷疑,之前處理ctdb的時候,就有過鎖沒有加上超時時間,然后ctdb掛掉以后,鎖不會自動釋放的問題,懷疑這個地方類似

我們的rbd的鏡像如下

[root@lab101 vm]# rbd info rbd/windows-server-8-base-clone
rbd image 'windows-server-8-base-clone':
	size 50GiB in 12800 objects
	order 22 (4MiB objects)
	block_name_prefix: rbd_data.102376b8b4567
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
	flags: 
	create_timestamp: Fri Dec 18 11:56:27 2020
	parent: rbd/windows-server-8-base@for-clone
	overlap: 50GiB

這個地方會有兩個對象被上鎖

[root@lab101 ceph]# rbd lock ls rbd/windows-server-8-base-clone
There is 1 exclusive lock on this image.
Locker       ID                  Address                    
client.96545 auto 94013702760192 192.168.19.101:0/915896787 

object_map的rbd_lock

[root@lab101 ceph]# rados -p rbd lock info rbd_object_map.102376b8b4567 rbd_lock
{"name":"rbd_lock","type":"exclusive","tag":"","lockers":[{"name":"client.96943","cookie":"","description":"","expiration":"0.000000","addr":"192.168.19.101:0/2231653745"}]}

header的rbd_lock,這個跟上面通過rbd lock查到的鎖命令是同一個

[root@lab101 ceph]# rados -p rbd lock info rbd_header.102376b8b4567 rbd_lock
{"name":"rbd_lock","type":"exclusive","tag":"internal","lockers":[{"name":"client.96943","cookie":"auto 94009656832384","description":"","expiration":"0.000000","addr":"192.168.19.101:0/2231653745"}]}

復現問題

啟動一個rbd的kvm,並且裝上win server2008

/usr/libexec/qemu-kvm  -drive format=raw,file=rbd:rbd/windows-server-8-base-clone  -cdrom /home/vm/win2008.iso -m 8192 -vnc :0

這個啟動后直接用vnc連接訪問即可,然后使用一個循環測試寫入工具在虛擬機里面進行循環讀寫,模擬正常的寫入,我使用的是SANergy這個工具,使用循環寫模式,可以做成iso,然后上面的-cdrom參數把文件穿透進去

准備一個至少兩個物理節點的集群
節點一為mon,節點二的時間同步指向節點一,然后調整一的物理時間往后調整20分鍾(也可以往前),這個集群會出現osd閃斷的情況
正常情況下,這個時候windows會卡死的,如果沒卡死,多操作幾遍往后調整時間,目的就是把虛擬機卡死

我的環境通過資源管理器看到沒有讀寫io了,強制停止kvm進程,無法停止就kill -9

我們恢復集群的狀態,然后再次檢查鎖狀態

[root@lab101 ceph]# cat /home/vm/checklock.sh 
rados -p rbd lock info rbd_object_map.102376b8b4567 rbd_lock
rados -p rbd lock info rbd_header.102376b8b4567 rbd_lock

[root@lab101 ceph]# sh /home/vm/checklock.sh 
{"name":"rbd_lock","type":"exclusive","tag":"","lockers":[{"name":"client.96943","cookie":"","description":"","expiration":"0.000000","addr":"192.168.19.101:0/2231653745"}]}{"name":"rbd_lock","type":"exclusive","tag":"internal","lockers":[{"name":"client.96943","cookie":"auto 94009656832384","description":"","expiration":"0.000000","addr":"192.168.19.101:0/2231653745"}]}

可以看到居然還在

我們嘗試啟動虛擬機出現無法啟動的情況

我們嘗試刪除鎖
處理objectmap的鎖

[root@lab101 ceph]# rados -p rbd lock break rbd_object_map.102376b8b4567 rbd_lock client.96943

處理header的鎖

[root@lab101 ceph]# rados -p rbd lock break rbd_header.102376b8b4567 rbd_lock client.96943
ERROR: failed breaking lock: (2) No such file or directory
error 2: (2) No such file or directory

提示沒有,比較奇怪,那嘗試拿鎖

[root@lab101 ceph]# rados -p rbd lock get rbd_header.102376b8b4567 rbd_lock client.96943
ERROR: failed locking: (16) Device or resource busy
error 16: (16) Device or resource busy

可以看到Device or resource busy 這個一般就是資源占用,無法釋放的情況

我們用rbd的命令試下

[root@lab101 ceph]# rbd lock ls rbd/windows-server-8-base-clone
There is 1 exclusive lock on this image.
Locker       ID                  Address                     
client.96943 auto 94009656832384 192.168.19.101:0/2231653745 
[root@lab101 ceph]# rbd lock rm rbd/windows-server-8-base-clone "auto 94009656832384" client.96943 
[root@lab101 ceph]# rbd lock ls rbd/windows-server-8-base-clone

可以看到這個是可以刪除的

再次檢查

[root@lab101 ceph]# sh /home/vm/checklock.sh 
{"name":"rbd_lock","type":"exclusive","tag":"","lockers":[]}{"name":"rbd_lock","type":"exclusive","tag":"internal","lockers":[]}[root@lab101 ceph]#

可以看到沒有鎖了

我們再次嘗試啟動

產生了新的鎖文件了

{"name":"rbd_lock","type":"exclusive","tag":"","lockers":[]}{"name":"rbd_lock","type":"exclusive","tag":"internal","lockers":[]}[root@lab101 ceph]# 
[root@lab101 ceph]# sh /home/vm/checklock.sh 
{"name":"rbd_lock","type":"exclusive","tag":"","lockers":[{"name":"client.97312","cookie":"","description":"","expiration":"0.000000","addr":"192.168.19.101:0/1322200836"}]}{"name":"rbd_lock","type":"exclusive","tag":"internal","lockers":[{"name":"client.97312","cookie":"auto 94532169500416","description":"","expiration":"0.000000","addr":"192.168.19.101:0/1322200836"}]}

從vnc里面可以看到桌面了

上面的是處理的方法之一,另外的一個方法是

rbd feature disable  rbd/windows-server-8-base-clone  exclusive-lock, object-map, fast-diff
rbd feature enable  rbd/windows-server-8-base-clone  exclusive-lock, object-map, fast-diff

建議是通過方法一進行處理,理論上方法二也沒什么問題,其它幾個屬性如果正好需要用到的話,那么關閉后,開啟下就行

總結

出問題總會是有原因的,如果我們提前抓到了問題,那么下次再遇到的時候就會從容的多,所以不要放棄解決問題,能夠解決的問題都會成為你的經驗


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM