批量檢查和修復Windows虛擬機的方法
碼蟻雜談│02期
火爐山蟻群 ┃ 一群自研轉型的背鍋俠
作者簡介:
燕傑,雲計算系統運維負責人,負責主機、操作系統、承載網路、SDN、分散式存儲等系統的運維工作。
李京龍,雲計算系統運維資深專家,主要負責計算虛擬化、主機操作系統、分散式塊存儲系統的自動化運維。
蔡冠偉,雲計算系統運維核心骨幹,主要負責主機操作系統、分散式塊存儲系統的自動化運維。
01 - 系統概況
我們內部有一個規模不大的私有雲,承載內部應用和測試系統,目前運行了超過1000台虛擬機。採用技術方案為KVM虛擬化+Sheepdog分散式塊存儲:
(1)運行虛擬機的計算節點為CentOS 6.5,虛擬化技術採用KVM,虛擬機管理採用開源OpenNebula方案(選擇OpenNebula主要是歷史沿襲,日常管理需求簡單,基本夠用)。
(2)虛擬機的鏡像,運行在後端分散式塊存儲系統上,此系統是基於開源的Sheepdog架構。
02 - 存在的問題與解決思路
2.1 - 存在問題
由於虛擬機鏡像都承載在分散式塊存儲系統中,虛擬機的所有存儲IO都會經過分散式存儲系統。在此情況下,一旦分散式塊存儲系統異常(如承載網路較大規模故障、存儲系統集群機制異常等),承載虛擬機的計算節點與存儲系統之間的存儲IO出現阻塞,進而虛擬機的存儲IO也出現阻塞,虛擬機操作系統(特別是Windows操作系統的虛擬機)會出現異常,如Windows系統藍屏、系統自檢、進入檢查模式等各種情況。即便存儲系統後續恢復正常,這些虛擬機很可能依然處於異常狀態。
虛擬機異常,一般有很多常規辦法來發現,如:
(1) ping檢查。但虛擬機所屬應用維護人員可能會禁止ping,或在安全組上做限制。
(2)部署zabbix、nagios等監控系統的agent進行異常監控。但虛擬機所屬應用維護人員可能會關閉或卸載agent。
(3)通過計算節點的qemu-kvm的一些工具來判斷虛擬機文件系統是否可以寫入。但這個方式涉及「侵入」虛擬機,屬於嚴厲禁止的操作。
可以看出上述方法有兩個問題:
(1)如果虛擬機歸屬不同使用人,每個使用人有不同運維風格,習慣或管理要求(如禁止ping或關閉agent客戶端),使用常規方法來判斷出問題的虛擬機會有疏漏)
(2)無法判斷虛擬機(特別是Windows虛擬機)的具體異常情況,如藍屏、系統自測等。
因此,最穩妥的方式是VNC工具連接到各個虛擬機,檢查虛擬機屏幕信息判斷其狀態,再根據狀態一個個修復(VNC雖然可以看到虛擬機屏幕,但是虛擬機都是有登陸賬號和登陸密碼的,檢查人員並沒有這些賬號密碼,因此不會「侵入」虛擬機)。但是修復過程非常繁瑣,核查和修訂的步驟主要如下:
核查操作:
(1)登陸到某台計算節點,VNC某台虛擬機,通過VNC界面查看其狀態(藍屏、自檢等)。虛擬機數量多的情況下,需要多人分工進行開展,通過表格進行記錄。
(2)匯總各個檢查人員的檢查結果表格。
修復操作:
(3)按照表格進行多人分工,各自負責部分虛擬機的修復,如下述4-6步驟。
(4)嘗試人動重啟虛擬機。
(5)如果依舊藍屏或其他異常,則需要手動掛載Win PE系統嘗試修復。需要手動將Win PE的iso文件拷貝至計算節點,手動修改虛擬機配置文件使其掛載Win PE的iso文件,重啟虛擬機進行Win PE模式然後手動進行修復。
(6)修復完畢重啟,如果系統依舊無法登錄,且虛擬機使用人建議重裝操作系統,則需要將虛擬機重置重裝。
可以看出,整個過程都是手工對每台虛擬機分別操作,耗時長,效率低。
2.2 - 解決思路
上述手工操作步驟中,VNC配置、虛擬機匯總信息表格、虛擬機配置、Win PE iso鏡像,都是文件形式,都可以通過腳本進行批量生成、修改,具備自動化的基礎。
將上述手工操作步驟腳本化,形成如下批量核查和修復的腳本工具:
(1)能夠自動生成待核查的虛擬機信息excel表格
(2) 能夠批量VNC截圖虛擬機的屏幕狀態,人工識別和判斷虛擬機屏幕的狀態。
(3)對於需要修復,並能一鍵掛載Win PE鏡像到虛擬機上進行引導修復或重裝操作。
03- 批量核查和修復虛擬機的具體方法
3.1 - 工具實現框架
在生產環境里,我們已經用了Saltstack作為配置工具,基於Saltstack的批量操作與配置能力,我們在統一腳本伺服器上,製作了對應的shell腳本和python腳本來實現具體功能,並用Linux的Diaglog進行簡單匯總展示。如下圖:
3.2 - 一鍵導出虛擬機
根據集群影響範圍及虛擬機數量,按照IP地址順序,導出所有可能存在問題的虛擬機到excel,導出來後可以進行過濾與編輯,快速進行多人分工核查。
在我們生成環境,同一網段對應的是同一個業務系統,因此我們一般根據虛擬機數量和業務系統(網段)進行分工。
3.3 - 虛擬機批量VNC截屏按鍵檢查
根據3.2步驟過濾出的虛擬機IP地址信息,獲取虛擬機所在物理機及VNC埠號,使用VNCdotool工具調用虛擬機VNC介面進行按鍵測試,並進行虛擬機屏幕截圖。
根據虛擬機IP地址信息,生成一個已經設定好模板的checklist表格(csv格式),便於記錄和匯總後面步驟中人工判斷的信息。表格主要欄位為: IP、主機名、虛擬機ID、業務系統聯繫人、第一次檢查結果,引導修復後狀態,重裝後狀態。
將截圖信息和表格一併打包下載到本地。
具體步驟如下:
(1)使用《8 虛擬機批量VNC截屏按鍵檢查》,上傳記錄了虛擬機主機名或者IP地址的vmlist.txt文件
(2)上傳vmlist.txt文件後,腳本會讀取文件里的主機名或者IP,自動進行VNC登陸和截圖,並會壓縮成一個以時間日期為名稱的壓縮文件,可將截圖的壓縮文件保存到本地。
(3)解壓壓縮文件,進入目錄查看虛擬機VNC截圖的目前的運行情況,人工檢查虛擬機屏幕截圖,並在checklist表格里記錄檢查信息(重點是將藍屏、自檢、無法進入系統的虛擬機過濾出來)。因為截圖已經匹配做好,且做好命名,這個時候人工檢查工作量就相對小。
3.4 - 虛擬機一鍵修復引導
(1)如果虛擬機異常,則嘗試進行虛擬機修復。
(2)執行工具輸入需要修復IP或主機名,腳本將自動從鏡像庫將Win PE文件傳輸到計算節點對應目錄下,修改虛擬機配置文件來掛載Win PE(Win PE已進行修改,能夠自動進入Win PE並打開NTboot修復工具),然後重啟虛擬機以使虛擬機配置生效。
(3)虛擬機啟動後,將自動調用NTboot工具進行磁碟修復。此時需要手工進行選擇操作和觀察修復結果。
3.5 一鍵重裝虛擬機系統
如果需要重裝虛擬機,執行工具輸入需要重裝IP或主機名。腳本將自動:
(1)進入計算節點關閉虛擬機。
(2)進入分散式塊存儲系統節點備份虛擬機鏡像,記錄鏡像ID,然後卸載鏡像。
(3)在分散式塊存儲系統節點中,通過基礎鏡像(Windows初始化後的狀態)克隆出一個跟原有鏡像ID一樣的鏡像,作為新的虛擬機鏡像。
(4)重新掛載新的虛擬機鏡像,實現重裝。
04 -可探討和優化的問題
上述的Windows虛擬機檢查和修復方法,是我們在一次實際故障後根據故障處理過程總結出來的操作方法和腳本工具,由於同類故障遇到的很少,且我們日常主要做Linux維護,對Windows了解不深,可能存在很多疏漏或可優化的地方,大家如有問題或意見,可以留言討論。
(1)從根源上來說,還是要保證分散式塊存儲系統及對應網路的穩定性,這個是此故障場景的根源問題。
(2)從我們遇到的故障現象看,分散式塊存儲系統異常時,Windows虛擬機容易異常,但Linux則相對較少,但我們不知具體原因是什麼(例如Linux對磁碟IO讀寫、文件系統小讀寫有更好的優化)。不知Windows是否有什麼需要特別優化的配置?如有經驗歡迎留言分享。
(3)在我們環境里,虛擬機歸屬其它團隊,他們可能禁止ping或監控agent運行,這個時候如何更好判斷虛擬機的「死活」?如有經驗歡迎留言分享。
(4)目前還有一些環節是需要人工參與判斷,例如看虛擬機屏幕判斷是否有藍屏、是否進入自檢。這部分可以結合簡單的圖像識別技術進行實現,自動化程度會更高。
(5)因為此工具的使用並非高頻場景(如果高頻,老闆鐵定要爆炒我們了),所以目前還停留在腳本階段,暫未納入到我們的運維平台中,後續我們也會進一步優化和改進。
更 多 背 鍋 俠 的 自 研 轉 型 故 事 ,
盡 在 火 爐 山 蟻 群 !


TAG:火爐山蟻群 |