Linux系統(tǒng)中的硬件問(wèn)題如何排查?
譯文【51CTO精選譯文】這篇教程的誕生過(guò)程實(shí)在相當(dāng)糾結(jié)。很長(zhǎng)時(shí)間以來(lái)我一直在考慮要不要寫(xiě)這么一篇東西,最主要的原因在于對(duì)硬件相關(guān)問(wèn)題進(jìn)行故障排查可能是計(jì)算機(jī)管理領(lǐng)域最棘手的工作。即使是經(jīng)驗(yàn)相當(dāng)豐富的用戶有時(shí)也會(huì)遇上自己搞不定的狀況,并在試圖解決那些微妙、古怪、難以捉摸甚至無(wú)法確定的軟硬件沖突困境時(shí)碰上釘子。想在網(wǎng)絡(luò)上尋找答案?我們找到的很可能是上萬(wàn)個(gè)無(wú)關(guān)主題,最終在空蕩蕩的論壇上孤獨(dú)徘徊、耗盡余生。
不過(guò)就個(gè)人來(lái)說(shuō),我自認(rèn)為算是個(gè)自負(fù)的極客、對(duì)技術(shù)難題和寫(xiě)作手法都有相當(dāng)?shù)男判摹=裉煳掖蛩惚M量與大家分享一些實(shí)用的技巧與處理方法,希望有助于讀者朋友理解、查明并最終搞定硬件難題--無(wú)論您使用的是Linux設(shè)備還是其它什么平臺(tái)。這篇教程無(wú)法保證100%有效,其中的某些方法也可能不太容易掌握,但它還是能起到一些作用。請(qǐng)大家隨我一起探尋硬件故障中的奧秘吧。
硬件故障類(lèi)型
在開(kāi)始著手診斷硬件問(wèn)題之前,我們首先需要調(diào)整預(yù)期、充分了解工作中可能遇到的硬件故障類(lèi)型,這一點(diǎn)非常重要。最后,大家還必須掌握硬件故障的實(shí)際表現(xiàn)形式。
硬件無(wú)法工作
最常見(jiàn)的故障源自電子設(shè)備中的某一部分發(fā)生損壞,但例外情況同樣時(shí)有發(fā)生。如果大家的電源出了問(wèn)題,設(shè)備當(dāng)然沒(méi)辦法啟動(dòng),這個(gè)道理非常簡(jiǎn)單。除此之外,顯卡、聲卡甚至記憶棒都可能在關(guān)鍵時(shí)刻掛掉,并帶來(lái)各種各樣的奇怪表現(xiàn)。在這種情況下,系統(tǒng)也許仍能通過(guò)BIOS自檢并進(jìn)入操作系統(tǒng),甚至允許用戶進(jìn)行一定程度的正常操作。而在某些情況下,我們可能會(huì)直接感受到設(shè)備故障,例如屏幕分辨率突然變得非常低--這肯定是因?yàn)轱@卡驅(qū)動(dòng)程序無(wú)法正常工作;或者聽(tīng)音樂(lè)時(shí)沒(méi)有聲音,那就是聲卡的問(wèn)題。在某些情況下,操作系統(tǒng)還可能直接彈出錯(cuò)誤提示信息。
硬件的不穩(wěn)定性故障
不穩(wěn)定性是我們面臨的最困難、也最不容易確診的故障類(lèi)型之一。如果大家的硬件僅有某一部分發(fā)生損壞,那么整體設(shè)備也許仍能正常運(yùn)轉(zhuǎn),只在特定情況下偶爾出現(xiàn)問(wèn)題。這往往令用戶摸不著頭腦,無(wú)法把異常狀況與對(duì)應(yīng)設(shè)備聯(lián)系到一起,從而得出正確結(jié)論。另外,即使是同一故障也可能存在多種表現(xiàn)形式,它們彼此之間看似毫無(wú)關(guān)聯(lián),但足以把用戶折磨得死去活來(lái)。
某些類(lèi)型的錯(cuò)誤甚至不會(huì)影響設(shè)備的正常功能,但它們卻有可能偷偷導(dǎo)致數(shù)據(jù)損壞或設(shè)備整體性能下降。這類(lèi)問(wèn)題相當(dāng)陰險(xiǎn),因?yàn)槲覀兺?xí)慣于將其歸罪于操作系統(tǒng)損壞或軟件沖突。舉例來(lái)說(shuō),如果我們的記憶棒中存在少數(shù)損壞單元,使大家在訪問(wèn)并使用這些存儲(chǔ)空間時(shí)發(fā)生段錯(cuò)誤,各位打算怎么辦?再有,我們可能會(huì)把系統(tǒng)內(nèi)核崩潰與某些軟件掛上鉤,但其真正根源或許在于內(nèi)存故障或總線錯(cuò)誤,您想到了嗎?另一個(gè)很好的例子就是三年前我在自己老款T61設(shè)備上遭遇的無(wú)線/筆記本問(wèn)題。我專門(mén)用來(lái)玩游戲的發(fā)燒級(jí)臺(tái)式機(jī)還碰到過(guò)由地線引發(fā)的故障。
固件/驅(qū)動(dòng)程序故障
驅(qū)動(dòng)程序故障常常表現(xiàn)得像是硬件出了問(wèn)題,但不同之處在于其發(fā)作狀況比較穩(wěn)定、不像硬件那樣時(shí)好時(shí)壞。通常情況下,軟件問(wèn)題導(dǎo)致的狀況比較一致且能夠再現(xiàn)。在某些情況下,我們的驅(qū)動(dòng)程序甚至無(wú)法與硬件進(jìn)行通信;而在另一些情況下,存在bug的驅(qū)動(dòng)程序會(huì)令設(shè)備以意料之外的方式運(yùn)作。有時(shí)候這類(lèi)問(wèn)題還會(huì)轉(zhuǎn)化成全局功能缺失,例如內(nèi)核崩潰、黑屏、白屏以及其它各種奇怪的故障。
其它注意事項(xiàng)
大家還必須意識(shí)到,某些系統(tǒng)可能會(huì)鎖定BIOS以防止我們使用某些硬件組件或功能,或者是出于某種目的而禁用這些組件。在后面的文章中我們將進(jìn)一步討論BIOS的相關(guān)話題。
最后,大家可能會(huì)在無(wú)意中將那些設(shè)計(jì)上存在沖突的硬件組件放在一起工作。某些供應(yīng)商生產(chǎn)的硬件也許只針對(duì)某款特定操作系統(tǒng),因此我們無(wú)法從官方得到任何其它系統(tǒng)平臺(tái)上的驅(qū)動(dòng)程序支持。不過(guò)有些硬件能夠與其它產(chǎn)品使用同樣的公版驅(qū)動(dòng)程序,例如Lexmark打印機(jī)就能完美接納PCL驅(qū)動(dòng)程序。#p#
硬件分析
由于在追蹤硬件問(wèn)題、嘗試加以解決方面存在數(shù)以百計(jì)的處理方案,因此在實(shí)際操作中感到迷茫或是淹沒(méi)在互聯(lián)網(wǎng)那數(shù)不清的案例當(dāng)中都是極為正常的現(xiàn)象--人生最大的悲哀也莫過(guò)于此。我給大家的忠告是,盡管以有條理的方式對(duì)待每一次硬件故障,最大程度減少誤判與干擾因素。
好吧,我們先來(lái)假設(shè)大家已經(jīng)遇上了一起硬件故障。在現(xiàn)實(shí)中有些故障真實(shí)存在、有些則只是我們的誤判或者偶然現(xiàn)象,不過(guò)在這里我們暫時(shí)只討論那些真正存在的問(wèn)題。
備份與更新
首先也是最關(guān)鍵的一步,為自己的數(shù)據(jù)做好備份。一旦設(shè)備開(kāi)始搗亂,我們的底線就是千萬(wàn)不要失去任何寶貴的資料信息,這一步在修復(fù)計(jì)劃中可謂不可或缺。
第二個(gè)步驟是對(duì)設(shè)備進(jìn)行全面更新。在Linux領(lǐng)域,這意味著下載所有可用的系統(tǒng)更新,因?yàn)槠渲锌赡馨鴮?duì)解決硬件問(wèn)題至關(guān)重要的固件及驅(qū)動(dòng)程序修復(fù)補(bǔ)丁。就算沒(méi)有這些針對(duì)性內(nèi)容,新內(nèi)核也往往能更好地支持設(shè)備上的硬件。舉例來(lái)說(shuō),SSD TRIM命令只能在2.6.33內(nèi)核中生效。同樣,Sandy Bridge也僅支持最新的幾個(gè)系統(tǒng)發(fā)行版本。英偉達(dá)的290.XX驅(qū)動(dòng)程序中可能包含一些早先版本不具備的額外功能或重要修復(fù)代碼。
啟動(dòng)日志
如果我們的設(shè)備中存在已經(jīng)完全損壞、部分損壞或者發(fā)生嚴(yán)重問(wèn)題的硬件,那么首先想到的肯定是要看看啟動(dòng)過(guò)程有沒(méi)有對(duì)此進(jìn)行記錄及反饋。為此,大家需要查詢系統(tǒng)中的啟動(dòng)日志。在大多數(shù)情況下,Linux系統(tǒng)的啟動(dòng)日志被保存在/var/log路徑下,文件名通常為boot.log或者boot.msg等。如下圖所示:
不要看到錯(cuò)誤信息就關(guān)注!
從上圖中,大家可以看到幾條紅色的失敗提示信息與黃色警告信息。暫時(shí)把它們放在一邊,它們可能與故障有關(guān)也可能并無(wú)關(guān)系,事實(shí)上我們不要因?yàn)楦蓴_因素而影響到正常的檢查流程。再次強(qiáng)調(diào),大家現(xiàn)在要做的是確定硬件方面的某種問(wèn)題,就目前而言,我們只應(yīng)該關(guān)注那些與問(wèn)題硬件確切相關(guān)的內(nèi)容。如果沒(méi)什么關(guān)系,那么直接跳過(guò)就好。事實(shí)上,很多情況下我們都可以預(yù)估問(wèn)題的出現(xiàn)范圍并直接到對(duì)應(yīng)部分進(jìn)行檢查。#p#
Dmesg命令
另外一些頗具價(jià)值的信息被保存在內(nèi)核緩沖區(qū)日志當(dāng)中,我們通常可以利用dmesg命令來(lái)調(diào)用。當(dāng)然,有時(shí)候該日志也會(huì)被保存在/var/log路徑下的同名文件中。這條命令會(huì)顯示所有緩沖區(qū)內(nèi)的內(nèi)核信息,其中一些也同時(shí)存在于標(biāo)準(zhǔn)系統(tǒng)日志當(dāng)中--即由syslog生成的/var/log/messages。
除此之外,dmesg還會(huì)顯示大量硬件初始化信息,我們可以借此摸索可能出現(xiàn)的問(wèn)題或沖突。同樣,這部分信息中不正常的內(nèi)容也會(huì)很多,一一閱讀并理解會(huì)浪費(fèi)大量時(shí)間,所以請(qǐng)有針對(duì)性地進(jìn)行處理。大家最應(yīng)該關(guān)注的是模塊名稱與硬件地址,它們是由冒號(hào)隔開(kāi)的數(shù)字與字母構(gòu)成的字符串。
在下面的例子中,我們可以看到英偉達(dá)模塊的初始化情況。由于模塊不支持GPL,因此導(dǎo)致系統(tǒng)內(nèi)核受損--另外,聲卡的初始化信息也能在下圖中找到。
Lsmod命令
我們之前在許多場(chǎng)合都使用過(guò)lsmod命令,這條命令能夠被加載到系統(tǒng)內(nèi)核中的模塊名稱及其使用次數(shù)。在進(jìn)一步分析處理之前,大家應(yīng)該首先確定設(shè)備擁有基本驅(qū)動(dòng)程序支持。舉例來(lái)說(shuō),如果我們想了解為什么英偉達(dá)顯卡無(wú)法工作,那么首先得弄清驅(qū)動(dòng)程序是否被正確載入或者說(shuō)沒(méi)有出現(xiàn)沖突。雖然對(duì)于普通用戶來(lái)說(shuō),判斷驅(qū)動(dòng)程序未被載入的原因似乎有些困難,但至少我們已經(jīng)了解到導(dǎo)致問(wèn)題的根源,這也算是個(gè)了不起的成果。
/sys/devices
現(xiàn)在我們?cè)賮?lái)看看更實(shí)用的檢查方法。將啟動(dòng)信息與dmesg結(jié)合起來(lái)雖然能為我們提供一些基本信息,但這些信息卻并不十分可靠。在無(wú)法斷定信息真?zhèn)蔚那闆r下,大家需要直接審查內(nèi)核架構(gòu)并檢測(cè)載入的驅(qū)動(dòng)程序。
在Linux系統(tǒng)中,由于架構(gòu)的單一特性,組件會(huì)直接通過(guò)編譯進(jìn)入內(nèi)核或作為可動(dòng)態(tài)加載的模塊。與硬件之間相互通信的模塊就被稱為驅(qū)動(dòng)程序。無(wú)論是直接進(jìn)入內(nèi)核還是成為可加載模塊,組件最終都會(huì)出于某種目的而駐留在內(nèi)核中。這是一種抽象軟件層,用戶無(wú)法直接進(jìn)行控制。
然而,以間接方式進(jìn)行部分控制還是可以的,我們能夠利用偽文件系統(tǒng)/proc及/sys滲透到一部分內(nèi)核架構(gòu)中去。大家可以通過(guò)修改看似普通的文件來(lái)實(shí)時(shí)變更內(nèi)核架構(gòu),這將改變系統(tǒng)的運(yùn)作方式。/sys文件系統(tǒng)則允許用戶對(duì)硬件以及內(nèi)核模塊進(jìn)行修改。
現(xiàn)在,如果大家還記得之前圖片中列出的數(shù)字,我們已經(jīng)可以讓它們派上些大用場(chǎng)。瀏覽/sys/devices下的子目錄并檢查哪些硬件組件已經(jīng)連入注冊(cè)接口。
某些模塊擁有可寫(xiě)入?yún)?shù),我們能夠憑借root權(quán)限對(duì)其加以修改、進(jìn)而改變硬件的運(yùn)作方式。舉例來(lái)說(shuō),我的LG筆記本的PCI插槽上接有USB5設(shè)備,它正好擁有可寫(xiě)入?yún)?shù)。如果大家在這個(gè)文件中填寫(xiě)不同數(shù)值,就能夠啟動(dòng)或關(guān)閉對(duì)特定USB接口的訪問(wèn)。
在實(shí)踐中,大家會(huì)發(fā)現(xiàn)瀏覽/sys絕對(duì)是個(gè)對(duì)經(jīng)驗(yàn)與知識(shí)要求很高的細(xì)致活,這點(diǎn)在嘗試解決硬件問(wèn)題時(shí)尤為明顯。普通用戶對(duì)不同參數(shù)及值的理解更是有所欠缺,但這都不要緊,我想強(qiáng)調(diào)的只有一點(diǎn):/sys目錄能夠提供很多有用的信息。#p#
Lspci命令
要想對(duì)所有接入的硬件組件及其對(duì)應(yīng)驅(qū)動(dòng)程序進(jìn)行掃描,這里還有一種更簡(jiǎn)單的方法。系統(tǒng)命令lspci能列出所有接入PCI總線的設(shè)備,不過(guò)就連遺留硬件也會(huì)被顯示出來(lái)。
現(xiàn)在的問(wèn)題是,lspci到底是從哪獲得這些信息的?好吧,如果大家真想知道,那么我們一起把lspci與strace搭配起來(lái)看看。毫無(wú)疑問(wèn),lspci是對(duì)/sys目錄進(jìn)行掃描以獲取接入設(shè)備信息的,其中包括連接端口、供應(yīng)商ID、設(shè)備類(lèi)型以及配置等。
最后,lspci會(huì)參考/usr/share/hwdata/pci.ids文件中所包含的硬件供應(yīng)商靜態(tài)列表。該列表會(huì)將供應(yīng)商ID數(shù)字轉(zhuǎn)譯成自然語(yǔ)言名稱,方便我們直接讀取lspci所輸出的掃描結(jié)果。
某些Linux發(fā)行版還會(huì)為lspci命令配備圖形化前端,這樣我們就能像在Windows平臺(tái)上那樣從窗口中讀取系統(tǒng)信息了。但需要提醒大家的是,命令輸出查詢起來(lái)更方便,尤其是在進(jìn)行調(diào)試工作時(shí)。
/var/log/messages
最后但同樣重要的是,我們還可以通過(guò)查詢系統(tǒng)日志得到想要的答案。再次強(qiáng)調(diào),將注意力集中在出現(xiàn)問(wèn)題的硬件身上,別被無(wú)關(guān)緊要的錯(cuò)誤所引導(dǎo)。作為演示,我們向設(shè)備插入U(xiǎn)盤(pán)并查看系統(tǒng)會(huì)向我們反饋哪些信息。要實(shí)時(shí)進(jìn)行信息查詢,我們要用到tail命令。
要注意系統(tǒng)列出的內(nèi)容。在這個(gè)實(shí)例中,我們會(huì)看到系統(tǒng)正確識(shí)別到了新接入的驅(qū)動(dòng)器。但這并不意味著我們可以直接開(kāi)始使用,大家一定已經(jīng)發(fā)現(xiàn),系統(tǒng)沒(méi)有自動(dòng)為其安裝驅(qū)動(dòng)程序、我們目前也沒(méi)有足夠的使用權(quán)限等等。甚至U盤(pán)本身也可能存在故障。但無(wú)論如何,設(shè)備已經(jīng)被系統(tǒng)內(nèi)容正確識(shí)別了,所以我們可以排除這方面的可能性了。
#p#
實(shí)例匯總
有了前面提到的知識(shí)基礎(chǔ),現(xiàn)在我們?cè)撎幚硪恍?shí)例,在操作中學(xué)習(xí)并理解。當(dāng)前我懷疑自己的英偉達(dá)顯卡在Ubuntu中存在硬件/驅(qū)動(dòng)程序間的沖突,因?yàn)殡m然系統(tǒng)提示驅(qū)動(dòng)已激活但設(shè)備仍無(wú)法正常工作。
在某些情況下,我無(wú)法使用自己的硬件--無(wú)線網(wǎng)卡--更確切地說(shuō),相關(guān)固件由于許可及識(shí)別沖突等原因而不存在于內(nèi)核當(dāng)中。Debian與Trisquel兩套發(fā)行版都有這樣的問(wèn)題。
其它事項(xiàng)
如果,我的意思是只有用盡了上述所有方案都搞不定問(wèn)題時(shí),大家才應(yīng)該到互聯(lián)網(wǎng)上搜索并追尋自己想要的答案。雖然我已經(jīng)提到,本文所介紹的各類(lèi)工具不一定總能幫你找到問(wèn)題的根源,但它們一般來(lái)說(shuō)都很有效,所以推薦大家優(yōu)先從這里入手。
現(xiàn)在大家應(yīng)該從網(wǎng)上搜索資源并與眼前的問(wèn)題進(jìn)行比對(duì)。在大多數(shù)情況下,我們只走馬觀花看幾眼就能剔除掉很多沒(méi)用的信息。如果有人面臨與您相同的故障癥狀,但導(dǎo)致問(wèn)題的硬件卻完全不同,別猶豫--馬上離開(kāi)。如果有人面臨同樣的癥狀,但使用的操作系統(tǒng)不同--馬上離開(kāi)。雖然已經(jīng)說(shuō)過(guò)很多次,但我還是要強(qiáng)調(diào),別為沒(méi)意義的事情分神。有時(shí)候多種故障可能會(huì)歸結(jié)為同一個(gè)內(nèi)核錯(cuò)誤,畢竟內(nèi)核能夠輸出的信息是有限的。可以肯定的是,許許多多不同各類(lèi)的問(wèn)題都會(huì)引發(fā)相似的故障表現(xiàn)。
這里我向大家推薦一些尋找答案成功率較高的網(wǎng)絡(luò)資源:Phoronix,雖然只是個(gè)論壇,但經(jīng)常會(huì)組織檢查及基準(zhǔn)測(cè)試活動(dòng);Linux drivers 是個(gè)很實(shí)用的編譯類(lèi)門(mén)戶網(wǎng)站;再就是linuxquestions.org網(wǎng)站,這里的資源非常不錯(cuò),值得大家多逛逛。
#p#
最后,BIOS
檢測(cè)流程當(dāng)然由大家自己說(shuō)了算。不過(guò)如果所有嘗試都宣告失敗,那么更新BIOS恐怕是我們惟一的出路。一般情況下,整個(gè)更新過(guò)程應(yīng)該是很安全的,但一旦出現(xiàn)問(wèn)題,那就絕不會(huì)是小問(wèn)題--你的設(shè)備很可能直接變磚。這也正是我將BIOS更新作為最后一節(jié)內(nèi)容的主要原因。另外,在碰BIOS之前請(qǐng)務(wù)必確保大家已經(jīng)嘗試過(guò)前面提到的所有處理方法,例如利用其它系統(tǒng)發(fā)行版檢測(cè)硬件兼容性。
BIOS內(nèi)容的改動(dòng)可能啟動(dòng)或禁用某些功能,例如火線、藍(lán)牙、RAID控制器及其它組件,這將直接影響操作系統(tǒng)的運(yùn)作以及識(shí)別并調(diào)用某些硬件的能力。
總結(jié)
Linux硬件故障排查工作要求我們具備相當(dāng)?shù)闹R(shí)并熟悉命令行與系統(tǒng)信息。另外,靈活的處理方案與實(shí)用信息在某些特定操作系統(tǒng)中可能無(wú)法生效。修改內(nèi)核空間的能力可以幫助大家診斷并解決與硬件有關(guān)的技術(shù)問(wèn)題。
在今天的文章中,我們共同探討了如何有條不紊地利用各類(lèi)工具及實(shí)用程序解決Linux系統(tǒng)中的硬件故障。大家了解到故障的具體類(lèi)別、如何咨詢系統(tǒng)日志以及如何使用lspci及l(fā)smod等命令。最重要的是,我們還與BIOS、驅(qū)動(dòng)程序及系統(tǒng)調(diào)試進(jìn)行了一番淺層次但意義深遠(yuǎn)的接觸。希望這篇文章能幫助大家從容應(yīng)對(duì)未來(lái)道路上的問(wèn)題。不過(guò)請(qǐng)大家別忘記,有時(shí)候就算使盡渾身解數(shù)也無(wú)法搞定難題,這很正常、并不丟人。硬件本身發(fā)生了損壞,這就不是我們所能挽回的局面了--所以請(qǐng)保持輕松愉快的心情。
就寫(xiě)到這里,感謝收看。
原文鏈接:http://www.dedoimedo.com/computers/linux-hardware-troubleshooting.html