批量檢查和修復(fù)Windows虛擬機(jī)的方法
01 - 系統(tǒng)概況
我們內(nèi)部有一個規(guī)模不大的私有云,承載內(nèi)部應(yīng)用和測試系統(tǒng),目前運(yùn)行了超過1000臺虛擬機(jī)。采用技術(shù)方案為KVM虛擬化+Sheepdog分布式塊存儲:
(1)運(yùn)行虛擬機(jī)的計算節(jié)點(diǎn)為CentOS 6.5,虛擬化技術(shù)采用KVM,虛擬機(jī)管理采用開源OpenNebula方案(選擇OpenNebula主要是歷史沿襲,日常管理需求簡單,基本夠用)
(2)虛擬機(jī)的鏡像,運(yùn)行在后端分布式塊存儲系統(tǒng)上,此系統(tǒng)是基于開源的Sheepdog架構(gòu)。
02 - 存在的問題與解決思路
2.1 - 存在問題
由于虛擬機(jī)鏡像都承載在分布式塊存儲系統(tǒng)中,虛擬機(jī)的所有存儲IO都會經(jīng)過分布式存儲系統(tǒng)。在此情況下,一旦分布式塊存儲系統(tǒng)異常(如承載網(wǎng)絡(luò)較大規(guī)模故障、存儲系統(tǒng)集群機(jī)制異常等),承載虛擬機(jī)的計算節(jié)點(diǎn)與存儲系統(tǒng)之間的存儲IO出現(xiàn)阻塞,進(jìn)而虛擬機(jī)的存儲IO也出現(xiàn)阻塞,虛擬機(jī)操作系統(tǒng)(特別是Windows操作系統(tǒng)的虛擬機(jī))會出現(xiàn)異常,如Windows系統(tǒng)藍(lán)屏、系統(tǒng)自檢、進(jìn)入檢查模式等各種情況。即便存儲系統(tǒng)后續(xù)恢復(fù)正常,這些虛擬機(jī)很可能依然處于異常狀態(tài)。
虛擬機(jī)異常,一般有很多常規(guī)辦法來發(fā)現(xiàn),如:
(1) ping檢查。但虛擬機(jī)所屬應(yīng)用維護(hù)人員可能會禁止ping,或在安全組上做限制。
(2)部署zabbix、nagios等監(jiān)控系統(tǒng)的agent進(jìn)行異常監(jiān)控。但虛擬機(jī)所屬應(yīng)用維護(hù)人員可能會關(guān)閉或卸載agent。
(3)通過計算節(jié)點(diǎn)的qemu-kvm的一些工具來判斷虛擬機(jī)文件系統(tǒng)是否可以寫入。但這個方式涉及“侵入”虛擬機(jī),屬于嚴(yán)厲禁止的操作。
可以看出上述方法有兩個問題:
(1)如果虛擬機(jī)歸屬不同使用人,每個使用人有不同運(yùn)維風(fēng)格,習(xí)慣或管理要求(如禁止ping或關(guān)閉agent客戶端),使用常規(guī)方法來判斷出問題的虛擬機(jī)會有疏漏)
(2)無法判斷虛擬機(jī)(特別是Windows虛擬機(jī))的具體異常情況,如藍(lán)屏、系統(tǒng)自測等。
因此,最穩(wěn)妥的方式是VNC工具連接到各個虛擬機(jī),檢查虛擬機(jī)屏幕信息判斷其狀態(tài),再根據(jù)狀態(tài)一個個修復(fù)(VNC雖然可以看到虛擬機(jī)屏幕,但是虛擬機(jī)都是有登陸賬號和登陸密碼的,檢查人員并沒有這些賬號密碼,因此不會“侵入”虛擬機(jī))。但是修復(fù)過程非常繁瑣,核查和修訂的步驟主要如下:
核查操作:
(1)登陸到某臺計算節(jié)點(diǎn),VNC某臺虛擬機(jī),通過VNC界面查看其狀態(tài)(藍(lán)屏、自檢等)。虛擬機(jī)數(shù)量多的情況下,需要多人分工進(jìn)行開展,通過表格進(jìn)行記錄。
(2)匯總各個檢查人員的檢查結(jié)果表格。
修復(fù)操作:
(3)按照表格進(jìn)行多人分工,各自負(fù)責(zé)部分虛擬機(jī)的修復(fù),如下述4-6步驟。
(4)嘗試人動重啟虛擬機(jī)。
(5)如果依舊藍(lán)屏或其他異常,則需要手動掛載Win PE系統(tǒng)嘗試修復(fù)。需要手動將Win PE的iso文件拷貝至計算節(jié)點(diǎn),手動修改虛擬機(jī)配置文件使其掛載Win PE的iso文件,重啟虛擬機(jī)進(jìn)行Win PE模式然后手動進(jìn)行修復(fù)。
(6)修復(fù)完畢重啟,如果系統(tǒng)依舊無法登錄,且虛擬機(jī)使用人建議重裝操作系統(tǒng),則需要將虛擬機(jī)重置重裝。
可以看出,整個過程都是手工對每臺虛擬機(jī)分別操作,耗時長,效率低。
2.2 - 解決思路
上述手工操作步驟中,VNC配置、虛擬機(jī)匯總信息表格、虛擬機(jī)配置、Win PE iso鏡像,都是文件形式,都可以通過腳本進(jìn)行批量生成、修改,具備自動化的基礎(chǔ)。
將上述手工操作步驟腳本化,形成如下批量核查和修復(fù)的腳本工具:
(1)能夠自動生成待核查的虛擬機(jī)信息excel表格
(2) 能夠批量VNC截圖虛擬機(jī)的屏幕狀態(tài),人工識別和判斷虛擬機(jī)屏幕的狀態(tài)。
(3)對于需要修復(fù),并能一鍵掛載Win PE鏡像到虛擬機(jī)上進(jìn)行引導(dǎo)修復(fù)或重裝操作。
03- 批量核查和修復(fù)虛擬機(jī)的具體方法
3.1 - 工具實(shí)現(xiàn)框架
在生產(chǎn)環(huán)境里,我們已經(jīng)用了Saltstack作為配置工具,基于Saltstack的批量操作與配置能力,我們在統(tǒng)一腳本服務(wù)器上,制作了對應(yīng)的shell腳本和python腳本來實(shí)現(xiàn)具體功能,并用Linux的Diaglog進(jìn)行簡單匯總展示。如下圖:
3.2 - 一鍵導(dǎo)出虛擬機(jī)
根據(jù)集群影響范圍及虛擬機(jī)數(shù)量,按照IP地址順序,導(dǎo)出所有可能存在問題的虛擬機(jī)到excel,導(dǎo)出來后可以進(jìn)行過濾與編輯,快速進(jìn)行多人分工核查。
在我們生成環(huán)境,同一網(wǎng)段對應(yīng)的是同一個業(yè)務(wù)系統(tǒng),因此我們一般根據(jù)虛擬機(jī)數(shù)量和業(yè)務(wù)系統(tǒng)(網(wǎng)段)進(jìn)行分工。
3.3 - 虛擬機(jī)批量VNC截屏按鍵檢查
根據(jù)3.2步驟過濾出的虛擬機(jī)IP地址信息,獲取虛擬機(jī)所在物理機(jī)及VNC端口號,使用VNCdotool工具調(diào)用虛擬機(jī)VNC接口進(jìn)行按鍵測試,并進(jìn)行虛擬機(jī)屏幕截圖。
根據(jù)虛擬機(jī)IP地址信息,生成一個已經(jīng)設(shè)定好模板的checklist表格(csv格式),便于記錄和匯總后面步驟中人工判斷的信息。表格主要字段為: IP、主機(jī)名、虛擬機(jī)ID、業(yè)務(wù)系統(tǒng)聯(lián)系人、***次檢查結(jié)果,引導(dǎo)修復(fù)后狀態(tài),重裝后狀態(tài)。
將截圖信息和表格一并打包下載到本地。
具體步驟如下:
(1)使用《8 虛擬機(jī)批量VNC截屏按鍵檢查》,上傳記錄了虛擬機(jī)主機(jī)名或者IP地址的vmlist.txt文件
(2)上傳vmlist.txt文件后,腳本會讀取文件里的主機(jī)名或者IP,自動進(jìn)行VNC登陸和截圖,并會壓縮成一個以時間日期為名稱的壓縮文件,可將截圖的壓縮文件保存到本地。
(3)解壓壓縮文件,進(jìn)入目錄查看虛擬機(jī)VNC截圖的目前的運(yùn)行情況,人工檢查虛擬機(jī)屏幕截圖,并在checklist表格里記錄檢查信息(重點(diǎn)是將藍(lán)屏、自檢、無法進(jìn)入系統(tǒng)的虛擬機(jī)過濾出來)。因?yàn)榻貓D已經(jīng)匹配做好,且做好命名,這個時候人工檢查工作量就相對小。
3.4 - 虛擬機(jī)一鍵修復(fù)引導(dǎo)
(1)如果虛擬機(jī)異常,則嘗試進(jìn)行虛擬機(jī)修復(fù)。
(2)執(zhí)行工具輸入需要修復(fù)IP或主機(jī)名,腳本將自動從鏡像庫將Win PE文件傳輸?shù)接嬎愎?jié)點(diǎn)對應(yīng)目錄下,修改虛擬機(jī)配置文件來掛載Win PE(Win PE已進(jìn)行修改,能夠自動進(jìn)入Win PE并打開NTboot修復(fù)工具),然后重啟虛擬機(jī)以使虛擬機(jī)配置生效。
(3)虛擬機(jī)啟動后,將自動調(diào)用NTboot工具進(jìn)行磁盤修復(fù)。此時需要手工進(jìn)行選擇操作和觀察修復(fù)結(jié)果。
3.5 一鍵重裝虛擬機(jī)系統(tǒng)
如果需要重裝虛擬機(jī),執(zhí)行工具輸入需要重裝IP或主機(jī)名。腳本將自動:
(1)進(jìn)入計算節(jié)點(diǎn)關(guān)閉虛擬機(jī)。
(2)進(jìn)入分布式塊存儲系統(tǒng)節(jié)點(diǎn)備份虛擬機(jī)鏡像,記錄鏡像ID,然后卸載鏡像。
(3)在分布式塊存儲系統(tǒng)節(jié)點(diǎn)中,通過基礎(chǔ)鏡像(Windows初始化后的狀態(tài))克隆出一個跟原有鏡像ID一樣的鏡像,作為新的虛擬機(jī)鏡像。
(4)重新掛載新的虛擬機(jī)鏡像,實(shí)現(xiàn)重裝。
04 -可探討和優(yōu)化的問題
上述的Windows虛擬機(jī)檢查和修復(fù)方法,是我們在一次實(shí)際故障后根據(jù)故障處理過程總結(jié)出來的操作方法和腳本工具,由于同類故障遇到的很少,且我們?nèi)粘V饕鯨inux維護(hù),對Windows了解不深,可能存在很多疏漏或可優(yōu)化的地方,大家如有問題或意見,可以留言討論。
(1)從根源上來說,還是要保證分布式塊存儲系統(tǒng)及對應(yīng)網(wǎng)絡(luò)的穩(wěn)定性,這個是此故障場景的根源問題。
(2)從我們遇到的故障現(xiàn)象看,分布式塊存儲系統(tǒng)異常時,Windows虛擬機(jī)容易異常,但Linux則相對較少,但我們不知具體原因是什么(例如Linux對磁盤IO讀寫、文件系統(tǒng)小讀寫有更好的優(yōu)化)。不知Windows是否有什么需要特別優(yōu)化的配置?如有經(jīng)驗(yàn)歡迎留言分享。
(3)在我們環(huán)境里,虛擬機(jī)歸屬其它團(tuán)隊,他們可能禁止ping或監(jiān)控agent運(yùn)行,這個時候如何更好判斷虛擬機(jī)的“死活”?如有經(jīng)驗(yàn)歡迎留言分享。
(4)目前還有一些環(huán)節(jié)是需要人工參與判斷,例如看虛擬機(jī)屏幕判斷是否有藍(lán)屏、是否進(jìn)入自檢。這部分可以結(jié)合簡單的圖像識別技術(shù)進(jìn)行實(shí)現(xiàn),自動化程度會更高。
(5)因?yàn)榇斯ぞ叩氖褂貌⒎歉哳l場景(如果高頻,老板鐵定要爆炒我們了),所以目前還停留在腳本階段,暫未納入到我們的運(yùn)維平臺中,后續(xù)我們也會進(jìn)一步優(yōu)化和改進(jìn)。