用系統(tǒng)日志了解你的Linux系統(tǒng)
本文摘自為 Linux 小白(或者非資深桌面用戶(hù))傳授技巧的系列文章。該系列文章旨在為 LinuxMagazine 發(fā)布的第 30 期特別版 “Linux 入門(mén)” (基于 openSUSE Leap )提供補(bǔ)充說(shuō)明。
本文作者是 Romeo S.,她是一名基于 PDX 的企業(yè) Linux 專(zhuān)家,專(zhuān)注于為創(chuàng)新企業(yè)提供富有伸縮性的解決方案。
Linux 系統(tǒng)日志非常重要。后臺(tái)運(yùn)行的程序(通常被稱(chēng)為守護(hù)進(jìn)程或者服務(wù)進(jìn)程)處理了你 Linux 系統(tǒng)中的大部分任務(wù)。當(dāng)這些守護(hù)進(jìn)程工作時(shí),它們將任務(wù)的詳細(xì)信息記錄進(jìn)日志文件中,作為它們做過(guò)什么的“歷史”信息。這些守護(hù)進(jìn)程的工作內(nèi)容涵蓋從使用原子鐘同步時(shí)鐘到管理網(wǎng)絡(luò)連接。所有這些都被記錄進(jìn)日志文件,這樣當(dāng)有錯(cuò)誤發(fā)生時(shí),你可以通過(guò)查閱特定的日志文件來(lái)看出發(fā)生了什么。
Photo by Markus Spiske on Unsplash
在你的 Linux 計(jì)算機(jī)上有很多不同的日志。歷史上,它們一般以純文本的格式存儲(chǔ)到 /var/log
目錄中?,F(xiàn)在依然有很多日志這樣做,你可以很方便的使用 less
來(lái)查看它們。
在新裝的 openSUSE Leap 42.3 以及大多數(shù)現(xiàn)代操作系統(tǒng)上,重要的日志由 systemd
初始化系統(tǒng)存儲(chǔ)。 systemd
這套系統(tǒng)負(fù)責(zé)啟動(dòng)守護(hù)進(jìn)程,并在系統(tǒng)啟動(dòng)時(shí)讓計(jì)算機(jī)做好被使用的準(zhǔn)備。由 systemd
記錄的日志以二進(jìn)制格式存儲(chǔ),這使得它們消耗的空間更小,更容易被瀏覽,也更容易被導(dǎo)出成其他各種格式,不過(guò)壞處就是你必須使用特定的工具才能查看。好在這個(gè)工具已經(jīng)預(yù)安裝在你的系統(tǒng)上了:它的名字叫 journalctl
,而且默認(rèn)情況下,它會(huì)將每個(gè)守護(hù)進(jìn)程的所有日志都記錄到一個(gè)地方。
只需要運(yùn)行 journalctl
命令就能查看你的 systemd
日志了。它會(huì)用 less
分頁(yè)器顯示各種日志。為了讓你有個(gè)直觀的感受, 下面是 journalctl
中摘錄的一條日志記錄:
Jul 06 11:53:47 aaathats3as pulseaudio[2216]: [pulseaudio] alsa-util.c: Disabling timer-based scheduling because running inside a VM.
這條獨(dú)立的日志記錄以此包含了記錄的日期和時(shí)間、計(jì)算機(jī)名、記錄日志的進(jìn)程名、記錄日志的進(jìn)程 PID,以及日志內(nèi)容本身。
若系統(tǒng)中某個(gè)程序運(yùn)行出問(wèn)題了,則可以查看日志文件并搜索(使用 /
加上要搜索的關(guān)鍵字)程序名稱(chēng)。有可能導(dǎo)致該程序出問(wèn)題的錯(cuò)誤會(huì)記錄到系統(tǒng)日志中。 有時(shí),錯(cuò)誤信息會(huì)足夠詳細(xì)到讓你能夠修復(fù)該問(wèn)題。其他時(shí)候,你需要在 Web 上搜索解決方案。 Google 就很適合來(lái)搜索奇怪的 Linux 問(wèn)題。不過(guò)搜索時(shí)請(qǐng)注意你只輸入了日志的實(shí)際內(nèi)容,行首的那些信息(日期、主機(jī)名、進(jìn)程 ID) 對(duì)搜索來(lái)說(shuō)是無(wú)意義的,會(huì)干擾搜索結(jié)果。
解決方法一般在搜索結(jié)果的前幾個(gè)連接中就會(huì)有了。當(dāng)然,你不能只是無(wú)腦得運(yùn)行從互聯(lián)網(wǎng)上找到的那些命令:請(qǐng)一定先搞清楚你要做的事情是什么,它的效果會(huì)是什么。據(jù)說(shuō),搜索系統(tǒng)日志中的特定條目要比直接描述該故障通用關(guān)鍵字要有用的多。因?yàn)槌绦虺鲥e(cuò)有很多原因,而且同樣的故障表現(xiàn)也可能由多種問(wèn)題引發(fā)的。
比如,系統(tǒng)無(wú)法發(fā)聲的原因有很多,可能是播放器沒(méi)有插好,也可能是聲音系統(tǒng)出故障了,還可能是缺少合適的驅(qū)動(dòng)程序。如果你只是泛泛的描述故障表現(xiàn),你會(huì)找到很多無(wú)關(guān)的解決方法,而你也會(huì)浪費(fèi)大量的時(shí)間。而專(zhuān)門(mén)搜索日志文件中的實(shí)際內(nèi)容,你也許會(huì)查詢(xún)出其它人也有相同日志內(nèi)容的結(jié)果。
你可以對(duì)比一下圖 1 和圖 2。
圖 1 搜索系統(tǒng)的故障表現(xiàn)只會(huì)顯示泛泛的,不精確的結(jié)果。這種搜索通常沒(méi)什么用。
圖 2 搜索特定的日志行會(huì)顯示出精確的,有用的結(jié)果。這種搜索通常很有用。
也有一些系統(tǒng)不用 journalctl
來(lái)記錄日志。在桌面系統(tǒng)中最常見(jiàn)的這類(lèi)日志包括用于記錄 openSUSE 包管理器的行為的 /var/log/zypper.log
; 記錄系統(tǒng)啟動(dòng)時(shí)消息的 /var/log/boot.log
,開(kāi)機(jī)時(shí)這類(lèi)消息往往滾動(dòng)的特別快,根本看不過(guò)來(lái);/var/log/ntp
用來(lái)記錄 Network Time Protocol (NTP)守護(hù)進(jìn)程同步時(shí)間時(shí)發(fā)生的錯(cuò)誤。 另一個(gè)存放硬件故障信息的地方是 “Kernel Ring Buffer”(內(nèi)核環(huán)狀緩沖區(qū)),你可以輸入 demesg -H
命令來(lái)查看(這條命令也會(huì)調(diào)用 less
分頁(yè)器來(lái)查看)。“Kernel Ring Buffer” 存儲(chǔ)在內(nèi)存中,因此會(huì)在重啟電腦后丟失。不過(guò)它包含了 Linux 內(nèi)核中的重要事件,比如新增了硬件、加載了模塊,以及奇怪的網(wǎng)絡(luò)錯(cuò)誤.
希望你已經(jīng)準(zhǔn)備好深入了解你的 Linux 系統(tǒng)了! 祝你玩的開(kāi)心!