系統管理員排除故障的五種武器
當你不知道從哪里開始時,這五個工具可以幫助你找到用戶的 IT 問題的源頭。
作為系統管理員,我每天都面臨著需要快速解決的問題,用戶和管理人員期望事情能夠順利地進行。在我管理的這樣的一個大型環境中,幾乎不可能從頭到尾了解所有的系統和產品,所以我必須使用創造性的技術來找到問題的根源,并(希望可以)提出解決方案。
這是我 20 多年來的日常經驗!每天上班時,我從不知道會發生什么。因此,我有一些快速而簡陋的技巧,當一個問題落在我的身上,而我又不知道從哪里開始時,我一般就會采用這些技巧。
但等一下!在你直接打開命令行之前,請花一些時間與你的用戶交談。是的,這可能很乏味,但他們可能會有一些好的信息給你。請記住,用戶可能沒有你那么多的經驗,你需要對他們說的東西進行一些解釋。試著清楚地了解正在發生什么和應該發生什么,然后用技術語言自己描述故障。請注意,大多數用戶并不閱讀他們面前的屏幕上的內容;這很可悲,但卻是事實。確保你和用戶都閱讀了所有的文字,以收集盡可能多的信息。一旦你收集到了這些信息,就打開命令行,使用這五個工具。
Telnet
讓我從一個經典開始。??Telnet?? 是
SSH 的前身,在過去,它在 Unix 系統上用來連接到遠程終端,就像 SSH 一樣,但它沒有加密。Telnet
在診斷網絡連接問題方面有一個非常巧妙和寶貴的技巧:你可以 Telnet 到不是專屬于它 TCP
端口(23/TCP)。要做到這一點,可以像平時一樣使用 Telnet,但在末尾加上 TCP 端口(例如 ??telnet localhost 80?
?),以連接到一個網絡服務器。這可以讓你能夠檢查一個服務器,看看服務是否正在運行,或者防火墻是否阻擋了它。因此,在沒有應用程序客戶端,甚至沒有登錄應用程序的情況下,你可以檢查
TCP 端口是否有反應。如果你知道怎么做,有時你可以通過在 Telnet
提示符手動輸入并獲得響應以檢查。網絡服務器和郵件服務器是你可以這樣做的兩個例子。
用 Telnet 獲得網絡服務器的響應
Tcpdump
??tcpdump?? 工具可以讓你檢查網絡上正在傳輸的數據。大多數網絡協議都相當簡單,如果你把 ??tcpdump?
? 和一個像 ??Wireshark?? 這樣的工具結合起來,你會得到一個簡單而好用的方法來瀏覽你所捕獲的流量。在如下的例子中,我在下面的窗口中檢查數據包,在上面的窗口連接到 TCP 3260 端口。
用 tcpdump 實時檢查數據包
這張截圖顯示了在現實世界中使用 Wireshark 查看 iSCSI 協議的情況;在這種情況下,我能夠確定我們的 QNAP 網絡附加存儲的配置方式有問題。
使用 Wireshark 檢查 TCP 會話
find
如果你不知道從哪里開始,??find?? 命令就是最好的工具。在其最簡單的形式中,你可以用它來“尋找”文件。例如,如果我想在所有的目錄中進行遞歸搜索,得到一個 conf 文件的列表,我可以輸入:
find . -name '*.conf'.
find 命令輸出
但是,??find?
? 的一個隱藏的寶藏是,你可以用它對它找到的每個項目執行一個命令。例如,如果我想得到每個文件的長列表,我可以輸入;
find . -name '*.conf' -exec ls -las {}\;
查找命令輸出
一旦你掌握了這種技術,你就可以用各種創造性的方法來尋找、搜索和以特定方式執行程序。
strace
我是在 Solaris 上認識 ??strace?? 這個概念的,在那里它被稱為 ??truss?
?。今天,它仍然像多年前一樣有用。??strace?
? 允許你在進程實時運行時檢查它在做什么。使用它很簡單,只要使用命令 ??ps -ef?
?,找到你感興趣的進程 ID。用 ??strace -p <進程 ID>?
? 啟動 ??strace?
?,它會開始打印出一大堆東西,一開始看起來像垃圾信息。但如果你仔細觀察,你會看到你認識的文字,如 ??OPEN?
? 和 ??CLOSE?
? 這樣的詞和文件名。如果你想弄清楚一個程序為什么不工作,這可以引導你走向正確的方向。
grep
把最好的留到最后:??grep??。這個工具是如此有用和強大,以至于我很難想出一個簡潔的方法來描述它。簡單地說,它是一個搜索工具,但它的搜索方式使它如此強大。在問題分析中,我通常會用 ??grep?
? 搜索一堆日志來尋找一些東西。一個叫 ??zgrep?
? 的配套命令可以對壓縮文件做同樣的事情。在下面的例子中,我使用 ??zgrep bancroft /var/log/*?
? 在所有的日志文件中進行 grep,以查看我在系統中的工作情況。我使用 ??zgrep?
? 是因為該目錄中有壓縮文件。
grep 命令輸出
使用 ??grep?
? 的另一個好方法是將其他工具的輸出通過管道輸送到它里面;這樣,它就可以作為一種過濾器來使用。在下面的例子中,我列出了 auth 文件,并通過使用 ??cat auth.log |grep bancroft?
? 來搜索我的登錄信息,看看我都做了什么。這也可以寫成 ??grep bancroft auth.log?
?,但我這里用管道(??|?
?)來證明這一點。
grep 命令輸出
其他需要考慮的工具
你可以用這些工具做更多的事情,但我希望這個簡單的介紹能給你一個窗口,讓你了解如何用它們來解決你遇到的討厭的問題。另一個值得你注意的工具是 ??Nmap??,我沒有包括它,因為它是如此全面,需要一整篇文章(或更多)來解釋它。最后,我建議學習一些白帽和黑客技術;在試圖找出問題的根源時,它們可能非常有益,因為它們可以幫助你收集對決策至關重要的信息。