虛擬機鏡像文件系統損壞的通用修復方法
一、背景
隨(sui)著(zhu)云(yun)場景下云(yun)主(zhu)(zhu)機(ji)(ji)(ji)大量的(de)有客(ke)戶(hu)(hu)使(shi)用,經(jing)常(chang)會(hui)(hui)出現客(ke)戶(hu)(hu)在(zai)有意無(wu)意的(de)使(shi)用過程(cheng)中,導致系(xi)統(tong)(tong)崩潰(kui),客(ke)戶(hu)(hu)最常(chang)見的(de)處(chu)理(li)方式就(jiu)是(shi)重啟云(yun)主(zhu)(zhu)機(ji)(ji)(ji),看(kan)看(kan)是(shi)否能(neng)恢復(fu)正常(chang)。這(zhe)時候(hou),經(jing)常(chang)會(hui)(hui)遇(yu)到系(xi)統(tong)(tong)相關文件、數據(ju)、配置等信息(xi)被篡改(gai)和損壞,導致系(xi)統(tong)(tong)開機(ji)(ji)(ji)失敗,無(wu)法登陸。針(zhen)對這(zhe)種常(chang)見情況(kuang),我們(men)梳理(li)總結通(tong)用的(de)方法流(liu)程(cheng),幫助客(ke)戶(hu)(hu)快(kuai)速的(de)恢復(fu)云(yun)主(zhu)(zhu)機(ji)(ji)(ji)系(xi)統(tong)(tong),最大可能(neng)不重新安裝(zhuang)云(yun)主(zhu)(zhu)機(ji)(ji)(ji),也可以(yi)避免客(ke)戶(hu)(hu)重新安裝(zhuang)系(xi)統(tong)(tong),部署應(ying)用。
二、技術實現
針(zhen)對云(yun)主(zhu)(zhu)機(ji)這(zhe)種特殊性,鏡像文件本(ben)身是(shi)存(cun)儲(chu)在后端存(cun)儲(chu)集(ji)群(qun)中,他(ta)是(shi)通過云(yun)主(zhu)(zhu)機(ji)所(suo)(suo)在的(de)(de)宿主(zhu)(zhu)機(ji),通過librbd塊存(cun)儲(chu)client端訪問存(cun)儲(chu)集(ji)群(qun)中云(yun)主(zhu)(zhu)機(ji)鏡像文件。所(suo)(suo)以云(yun)主(zhu)(zhu)機(ji)的(de)(de)磁盤信息是(shi)可以在宿主(zhu)(zhu)機(ji)上查到的(de)(de)。整個(ge)(ge)guest鏡像的(de)(de)掛載是(shi)通過libguestfs和libguestfs-tools兩個(ge)(ge)軟件實現(xian)的(de)(de)。所(suo)(suo)以首先(xian)需(xu)要安裝(zhuang)工具包:
yum -y install libguestfs libguestfs-tools
查(cha)找想要掛(gua)在虛(xu)擬(ni)機的本地(di)掛(gua)載點:
查(cha)看虛擬機(ji)uuid信息

guestmount -d instance-c289202c-7bf8-4f02-8321-865db49398a5 -m /dev/sda4 /mnt

通過輸出信息,確認本地映射的設備是/dev/sdb1
guestmount -d instance-c289202c-7bf8-4f02-8321-865db49398a5 -m /dev/sdb1 /mnt
此時,這臺云(yun)(yun)主(zhu)機的(de)鏡像文(wen)件就(jiu)掛載(zai)到了本地/mnt目(mu)錄下(xia)(xia),就(jiu)可(ke)以(yi)對該路徑下(xia)(xia)的(de)文(wen)件進行(xing)修改,替換。然后卸載(zai)/mnt目(mu)錄,重新(xin)啟動云(yun)(yun)主(zhu)機,就(jiu)可(ke)以(yi)恢復到正常(chang)的(de)云(yun)(yun)主(zhu)機狀態。
三、問題實例
- 兩臺centos6.8的guest系統啟動失敗。

通過guestmount工具把云(yun)主機(ji)(ji)鏡像掛(gua)在到宿(su)主機(ji)(ji)本地后查看,發現系(xi)統(tong)內(nei)/boot, /lib/modules目錄下(xia)文件(jian)都清空了(le),內(nei)核,驅(qu)動(dong)等文件(jian)都丟(diu)失。同一批機(ji)(ji)器(qi)(qi)里有兩臺同樣(yang)現象(系(xi)統(tong),部署完(wan)全一樣(yang))。分析后決(jue)定從正常機(ji)(ji)器(qi)(qi)拷貝內(nei)核,驅(qu)動(dong)目錄到問題機(ji)(ji)器(qi)(qi)上,然(ran)后重新啟動(dong)系(xi)統(tong),問題解決(jue)。
- 云主機重啟失敗,進入緊急模式

通過guestmount掛載工具,把云主機鏡像(xiang)掛在(zai)到宿(su)主機后(hou),排(pai)查系統的(de)/etc/fstab文件,發現系統自動掛載文件被(bei)修改,數據盤(pan)uuid錯誤,修改此文件,把正確的(de)uuid信(xin)息寫(xie)入文件,系統重啟后(hou)正常。
四、總結
通過guestmount工具可以很方便的包云主機鏡像文件(jian)掛(gua)在到本地,然后對系統內進行(xing)修復后,使系統恢復正常,大(da)大(da)節省了重新安裝和部(bu)署軟件(jian)的工作量。
