如何查找Linux死機(jī)原因
Linux 內(nèi)核雖然號(hào)稱“不死族”,幾乎不會(huì)崩潰或者死機(jī),但是特殊情況下,還是有一定幾率會(huì)宕機(jī)的。因?yàn)?Linux 廣泛用于生產(chǎn)環(huán)境,所以每一次宕機(jī)都會(huì)引起相當(dāng)大的損失。它 Uptime 達(dá)到上百天也許你習(xí)以為常,但是只要 Down 十幾秒,就會(huì)立即急的滿頭大汗。真的很難以想象證交所宕機(jī)會(huì)怎么樣,也許全國股民會(huì)鬧翻天。所以我們需要一些小技巧來查找死機(jī)的原因,從而避免死機(jī)或者內(nèi)核崩潰。(話說 windows 天天藍(lán)屏也沒感覺呀 :-o 難道已經(jīng)麻木了 :oops: )
請(qǐng)注意:以下方法可能不適用于 Server,因?yàn)樽烂姝h(huán)境和 Server 還是有很大區(qū)別的。
X Crash
事實(shí)上 Linux 內(nèi)核很少出錯(cuò),平常我們所遇到的“死機(jī)”都是 X 無響應(yīng)造成的錯(cuò)覺。那 X 沒響應(yīng)了應(yīng)該怎么處理呢?
通常套路是 Ctrl + Alt +F7 (F8) 切換到某個(gè) tty,然后用 root 登陸,執(zhí)行 top 查看吃資源最多的程序,然后使用 pkill/kill/killall 等命令殺死該程序。或使用組合鍵 Ctrl + Alt + Backspace重啟 X (黑日白月注:這個(gè)快捷鍵組合在***的 Ubuntu 和 Fedora 中關(guān)閉)。
如果偶遇切換 tty 失敗或者沒響應(yīng),可以試著使用 SSH 登陸此電腦,然后再殺死程序。也許只是 X 不響應(yīng),而內(nèi)核和 SSH daemon 仍然工作,故此可以實(shí)施此法。
萬一 X 不給力,各種方法試了無效,又沒有辦法通過 SSH 登陸到此 pc,那怎么辦呢?別著急,我們還有***的 “reisub” 大法。不過在啟用前先要激活內(nèi)核 sysrq 功能 (via) 。系統(tǒng)啟動(dòng)時(shí)執(zhí)行:echo "1" > /proc/sys/Kernel/sysrq 或者修改 /etc/sysctl.conf 文件,設(shè)置 Kernel.sysrq = 1。系統(tǒng)異常時(shí)依次按下 Alt+sysrq+{reisub} ,然后系統(tǒng)會(huì)自動(dòng)重啟。(有關(guān) sysrq 請(qǐng)看:Linux 死機(jī)了怎么辦?)
不建議長按 Power 按鍵強(qiáng)制關(guān)機(jī),有可能損壞硬件或者丟失數(shù)據(jù),甚至導(dǎo)致磁盤壞道!
X 崩潰而內(nèi)核完好
常見的癥狀有:程序無響應(yīng),花屏,鼠標(biāo)移動(dòng)指針無動(dòng)作,鍵盤輸入沒有識(shí)別等。但后臺(tái)的音樂可以正常播放,或者鍵盤 Caps Lock/Num Lock/Scroll Lock 按鍵按后對(duì)應(yīng) LED 可以正常亮滅。遇到此種情況可以使用上述方法重啟 X 或者電腦即可恢復(fù)正常。
Application Crash
這個(gè)比較常見,但是也是相當(dāng)難解決的。因?yàn)?Linux 上的應(yīng)用軟件大部分都是開源的,所以可能沒有超高的穩(wěn)定性。也許由于庫的缺少或者版本錯(cuò)誤,或者代碼的 Bug,都有可能導(dǎo)致程序出現(xiàn)異常。
一般遇到這種問題,建議檢查配置文件是否正確,對(duì)配置文件的錯(cuò)誤修改可能導(dǎo)致程序的運(yùn)行失敗。如果您確信配置文件沒有錯(cuò)誤但是程序仍然異常,可以嘗試把配置文件刪除(注意備份?。?,然后再次打開軟件嘗試。通常程序的配置文件在:
- ~/.[APPNAME]
- ~/.config/[APPNAME]
- /etc/[APPNAME].conf
或者有可能是庫的錯(cuò)誤,您可以在終端輸入程序名或者程序路徑運(yùn)行程序,根據(jù)終端的提示信息除錯(cuò)。由于導(dǎo)致程序崩潰的可能性多種多樣,在此不能一一列舉,所以建議您根據(jù)出錯(cuò)信息去 google 搜索并找到解決方案。
Kernel Panic
X 的問題還好辦,可是如果 RPWT 碰到 Kernel Panic,那可真是上天無路入地?zé)o門,撞墻的心都有 :evil: 。
一般引起 Kernel Panic 的原因很多,但是都比較罕見。例如硬件問題 (irq confilct, bad block, high temperature),軟件問題(錯(cuò)誤的 mod,內(nèi)核的 Bug),或者文件系統(tǒng)不支持(沒有內(nèi)建 ext4 支持卻掛載 ext4 的 root 分區(qū)),硬件的變動(dòng)(如添加/更換內(nèi)存,不支持架構(gòu)的cpu),錯(cuò)誤的驅(qū)動(dòng)。
Kernel Panic 的表現(xiàn)形式也是多種多樣:啟動(dòng)失敗,不正常的長時(shí)間 io 操作,鍵盤燈的不正常頻閃,wireless 等指示燈錯(cuò)誤閃爍,無響應(yīng)(請(qǐng)區(qū)別 xorg crash 情況),徹底鎖死,黑屏,reisub 大法不靈 等等。
一般情況下,秉承 KISS 原則的 Linux 內(nèi)核,會(huì)盡力解決一切錯(cuò)誤并正常運(yùn)行,如果遇到極端情況發(fā)生 Panic,它會(huì)盡可能把所有相關(guān)信息顯示在屏幕上——至于多少,別奢求,Kernel 已經(jīng)盡力了。
因?yàn)?Kernel Panic 是一種很極端的情況,有的人可能自從使用 Linux 就沒有遇到過。所以我們要收集所有相關(guān)的信息來解決問題。發(fā)生錯(cuò)誤后的各種輸出是最直接的最有效的( Dump 在 tty。請(qǐng)關(guān)閉 x)。因?yàn)?Kernel 已經(jīng)崩潰,不一定能找到完整的 Log。您可以根據(jù)以下線索嘗試:
- /var/log/messages —— rp 爆發(fā)的時(shí)候,也許會(huì)記錄下很多相關(guān)信息。按照時(shí)間戳查找。
- 回溯操作 —— 回憶 Kernel Panic 之前所做的所有事,并回滾。(如安裝了某個(gè)程序,可以在 /var/log/pacman.log 找到安裝日志)
- Dump 信息 —— 屏幕輸出信息是系統(tǒng)***的“遺言”,請(qǐng)使用數(shù)碼相機(jī)或者筆紙記錄。(tty only)
接下來就應(yīng)該根據(jù)錯(cuò)誤發(fā)生的可能原因進(jìn)行排除。將內(nèi)核啟動(dòng)參數(shù)化為最簡形式,不應(yīng)附加任何不必要參數(shù),并 BIOS 中禁用掉所有無關(guān)硬件。相關(guān)日志文件:
- /var/log/boot
- /var/log/xorg 所有相關(guān)(僅參考)
- /var/log/messages
如果可以,您應(yīng)該記錄下所有屏幕輸出信息,并查看 /var/log/messages 。
可能遇到的問題,和解決方法:
- irq conflict (還好我沒碰到),可以嘗試從 bios 修改硬件irq,或者升級(jí) bios,都不生效就換電腦或者禁用沖突硬件;
- bad balock,嘗試修復(fù)壞道或者屏蔽壞道分區(qū),建議更換磁盤;
- io error,同上,也有可能是沒有內(nèi)建文件系統(tǒng)支持的原因,重新編譯內(nèi)核或者找***版的內(nèi)核安裝;
- mod,刪除可能導(dǎo)致錯(cuò)誤的內(nèi)核模塊(如 vboxdrv),涉及到的命令有:
- lsmod: 列出已載入的模塊
- modprobe: 載入模塊( 黑日白月注:在這里和其他命令對(duì)應(yīng)的為 insmod + depmod 比較好,modprobe 更類似于 XXXmod 系列命令的升級(jí)整合版本。)
- rmmod: 移除內(nèi)核中模塊,效果等同于 modprobe -r
- modinfo: 顯示模塊相關(guān)信息
- driver,a卡或者n卡驅(qū)動(dòng),也容易造成問題;
- 硬件本身的問題導(dǎo)致,建議檢測(cè)硬件可用性和兼容性(例如 memtest+);
- 內(nèi)核 bug,如果您有能力,建議使用 KDB (Kernel debugger) 排錯(cuò),或者重新編譯內(nèi)核;
- 不負(fù)責(zé)任的告訴您,***的方法是換 windows :mrgreen:
【編輯推薦】