Windows Server崩潰的三大常見(jiàn)誘因與避免方式
Windows Server崩潰的方式有很多種,但絕大多數(shù)都屬于三大類(lèi):舊版殺毒軟件、不兼容的存儲(chǔ)驅(qū)動(dòng)程序和過(guò)多的過(guò)濾驅(qū)動(dòng)。在分析了來(lái)自世界各地近十年差不多1000次的系統(tǒng)崩潰后,我可以確認(rèn)這些都是你想要避免的隱患。
下面讓我們來(lái)詳細(xì)看一下這三種服務(wù)器系統(tǒng)崩潰的細(xì)節(jié),并分別介紹一下避免它們的最佳方法。
殺毒軟件
到目前為止,最常見(jiàn)的Windows Server崩潰是由舊版殺毒軟件所致。所有的殺毒軟件都是使用設(shè)備驅(qū)動(dòng)程序,更具體地說(shuō)是“過(guò)濾驅(qū)動(dòng)”來(lái)攔截I / O(讀/寫(xiě))請(qǐng)求并執(zhí)行額外的檢查。殺毒軟件驅(qū)動(dòng)程序?qū)z查的內(nèi)容與已知的病毒定義文件進(jìn)行對(duì)比,以確保沒(méi)有感染病毒。
過(guò)濾驅(qū)動(dòng)包含內(nèi)核模式的代碼,它們會(huì)與操作系統(tǒng)底層的內(nèi)核函數(shù)和數(shù)據(jù)結(jié)構(gòu)相互作用這些函數(shù)和數(shù)據(jù)結(jié)構(gòu)包括那些預(yù)期會(huì)在相應(yīng)設(shè)備驅(qū)動(dòng)調(diào)用時(shí)呈現(xiàn)的預(yù)定義參數(shù)和數(shù)據(jù)類(lèi)型。如果函數(shù)傳遞的數(shù)據(jù)類(lèi)型錯(cuò)誤或參數(shù)數(shù)目不對(duì),就會(huì)發(fā)生導(dǎo)致內(nèi)核模式中系統(tǒng)崩潰的錯(cuò)誤。
當(dāng)開(kāi)發(fā)人員在不同版本的操作系統(tǒng)之間(如服務(wù)包更新或新版本操作系統(tǒng)發(fā)布)修改這些內(nèi)核函數(shù)或數(shù)據(jù)結(jié)構(gòu)時(shí),問(wèn)題就出現(xiàn)了。雖然微軟在測(cè)試設(shè)備驅(qū)動(dòng)程序?qū)λ胁僮飨到y(tǒng)改變的兼容性方面做得很好,但它顯然沒(méi)有測(cè)試第三方設(shè)備驅(qū)動(dòng)程序來(lái)確保它們可兼容。因此,當(dāng)舊版殺毒驅(qū)動(dòng)程序偶然遭遇了這些更改,最終就會(huì)導(dǎo)致系統(tǒng)崩潰。其它過(guò)濾驅(qū)動(dòng)也容易受到這種問(wèn)題影響,但是殺毒軟件驅(qū)動(dòng)程序是最容易受影響的一個(gè)。
讓我們來(lái)看一個(gè)例子:
下面是一個(gè)Stop 0x8E bugcheck -KERNEL_MODE_EXCEPTION_NOT_HANDLED的系統(tǒng)崩潰。在Windows debugger中用命令!analyze –v顯示了它的堆棧模式。從下往上讀,我們就看到一個(gè)NtCreateFile的函數(shù)調(diào)用,最終引入了buggydrv,從而導(dǎo)致bugcheck。使用命令!lmi buggydrv可以顯示出驅(qū)動(dòng)程序的日期是2006年,而操作系統(tǒng)Windows Server 2003 SP2是2007年發(fā)布的。現(xiàn)在我們就知道,舊版的殺毒驅(qū)動(dòng)程序并沒(méi)有對(duì)新版的操作系統(tǒng)進(jìn)行測(cè)試。
nt!KeBugCheckEx+0x1b nt!KiDispatchException+0x3a2 nt!CommonDispatchException+0x4a nt!Kei386EoiHelper+0x186 buggydrv+0x13059 <--導(dǎo)致系統(tǒng)崩潰的過(guò)濾驅(qū)動(dòng) buggydrv+0x8390 buggydrv+0x8809 buggydrv+0x2940 nt!IofCallDriver+0x45 nt!IopParseDevice+0xa35 nt!ObpLookupObjectName+0x5b0 nt!ObOpenObjectByName+0xea nt!IopCreateFile+0x447 nt!IoCreateFile+0xa3 nt!NtCreateFile+0x30 <--操作系統(tǒng)調(diào)用CreateFile nt!KiFastCallEntry+0xfc
在這個(gè)例子中,此種系統(tǒng)崩潰已經(jīng)被廠(chǎng)商標(biāo)識(shí)為已知問(wèn)題并文檔化,新版殺毒軟件已經(jīng)可以用來(lái)避免系統(tǒng)崩潰。事實(shí)上,絕大多數(shù)你遇到的Windows Server崩潰,都曾在別人身上發(fā)生過(guò),它們的解決方法通常已經(jīng)記錄在互聯(lián)網(wǎng)上的某個(gè)地方。因此,很重要的一點(diǎn)是,一定要記住即使只是一個(gè)服務(wù)包更新。在更新操作系統(tǒng)時(shí)也該第一時(shí)間與第三方廠(chǎng)商確認(rèn)是否有相應(yīng)的軟件更新。
存儲(chǔ)驅(qū)動(dòng)程序不兼容
另一種最常見(jiàn)的系統(tǒng)崩潰是由不兼容的存儲(chǔ)驅(qū)動(dòng)程序所致。如你所知,第三方存儲(chǔ)廠(chǎng)商提供設(shè)備驅(qū)動(dòng)程序來(lái)控制它們的主機(jī)總線(xiàn)適配器(HBA)并用于訪(fǎng)問(wèn)存儲(chǔ)設(shè)備。像Qlogic、Emulex和惠普(HP)等廠(chǎng)商都有不同的設(shè)備驅(qū)動(dòng)程序,但它們都依賴(lài)于微軟的Storport驅(qū)動(dòng)程序。Storport驅(qū)動(dòng)程序提供一套通用程序,這些特定的廠(chǎng)商驅(qū)動(dòng)程序在執(zhí)行I / O操作時(shí)使用它們。
這種問(wèn)題的出現(xiàn)方式與殺毒軟件驅(qū)動(dòng)程序的不兼容性很相似。當(dāng)廠(chǎng)商修改其專(zhuān)用的驅(qū)動(dòng)程序時(shí),它們必須重新與當(dāng)前版本的Storport進(jìn)行測(cè)試,以確保仍然兼容。同樣的道理,當(dāng)更新Storport版本時(shí),所有的HBA驅(qū)動(dòng)程序也必須重新測(cè)試,以保證它們?nèi)匀慌c新版的Storport驅(qū)動(dòng)程序兼容。在Windows Server 2003中當(dāng)你需要考慮Storport的50多個(gè)修補(bǔ)程序時(shí),這才是一個(gè)真正的挑戰(zhàn)。
經(jīng)驗(yàn)法則是,在更新Storport驅(qū)動(dòng)之前與你的第三方廠(chǎng)商確認(rèn)HBA驅(qū)動(dòng)程序是否有相應(yīng)的更新,反之亦然。如何才能知道哪個(gè)存儲(chǔ)驅(qū)動(dòng)程序依賴(lài)于Storport?幸運(yùn)的是,有一個(gè)叫Dependency Walker(depends.exe)的免費(fèi)工具,可以揭示驅(qū)動(dòng)程序間的依賴(lài)關(guān)系。
下載并解壓縮后,運(yùn)行depends.exe,使用文件下拉菜單選擇你所關(guān)注的驅(qū)動(dòng)程序。在這個(gè)例子中,我選擇了驅(qū)動(dòng)程序Hpcisss2.sys,它應(yīng)用于HP的磁盤(pán)陣列。正如你下面可以看到的,該工具顯示,驅(qū)動(dòng)程序Hpcisss2依賴(lài)于STORPORT.SYS和Ntoskrnl.exe。

圖一:Dependency Walker
過(guò)多的過(guò)濾驅(qū)動(dòng)
第三種最常見(jiàn)的Windows Server崩潰類(lèi)型與安裝了太多的過(guò)慮驅(qū)動(dòng)時(shí)的堆棧溢出條件相關(guān)。任何可以攔截I / O請(qǐng)求并執(zhí)行額外功能的驅(qū)動(dòng)程序都被認(rèn)為是一個(gè)過(guò)濾驅(qū)動(dòng)。我們已經(jīng)知道,殺毒驅(qū)動(dòng)程序就是一個(gè)過(guò)濾驅(qū)動(dòng)。其它過(guò)慮驅(qū)動(dòng)包括磁盤(pán)配額管理、磁盤(pán)鏡像和備份代理等,在這里我只列舉了幾個(gè)。
雖然安裝多個(gè)過(guò)濾驅(qū)動(dòng)本身不會(huì)有問(wèn)題,但是在當(dāng)這些驅(qū)動(dòng)程序以遞歸的方式相互調(diào)用并因此耗盡了有限的內(nèi)核堆棧空間時(shí),情況就會(huì)發(fā)生改變。根據(jù)計(jì)算機(jī)體系結(jié)構(gòu)((x86=12 KB,x64=24 KB),所有設(shè)備驅(qū)動(dòng)程序使用的內(nèi)核堆棧空間是有限的。當(dāng)內(nèi)核堆棧空間耗盡時(shí),就會(huì)出現(xiàn)一個(gè)Stop 0x7F bugcheck導(dǎo)致系統(tǒng)崩潰,就像微軟數(shù)百篇文檔的描述一樣。
根本沒(méi)有辦法提供額外的內(nèi)核堆棧空間來(lái)容納更多的過(guò)慮驅(qū)動(dòng)。唯一的選擇是識(shí)別這些過(guò)濾驅(qū)動(dòng),禁用或卸載其中不需要的那些。有一個(gè)內(nèi)置在Windows Server操作系統(tǒng)中的工具叫FLTMC(過(guò)濾器管理器控制程序),它可以讓你識(shí)別出安裝的過(guò)濾驅(qū)動(dòng)。

圖二:FLTMC工具
正如你看到的,有很多原因會(huì)導(dǎo)致Windows Server崩潰。但是絕大多數(shù)服務(wù)器停機(jī)都是由上述的原因造成的。你完全可以通過(guò)兩種方式解決這些問(wèn)題,它們是在升級(jí)Windows操作系統(tǒng)或更新相關(guān)的熱修補(bǔ)程序的同時(shí)更新第三方驅(qū)動(dòng)程序和限制未使用的過(guò)濾驅(qū)動(dòng)的數(shù)量。
原文:http://www.searchsv.com.cn/showcontent_44896.htm
【編輯推薦】




















