本文以CentOS系統為例,但同樣適用於Linux的其他發行版。不需要糾結於具體的版本,瞭解設計意圖即可。
本文隨時更新。除勘誤外,不另做批註。
概覽
- 圓型節點代指目錄,方型節點代指檔案。
- 圖中省去了很多不常用的目錄與檔案。
- 稍後單獨講
/proc
目錄與/var
目錄。
Linux將整個檔案系統看做一棵樹,這棵樹的樹根叫做根檔案系統,用"/"表示。
目錄 | 內容 | 舉例 |
---|---|---|
/bin | 供所有使用者使用的完成基本維護任務的命令 | ls, cp |
/etc | 系統和應用軟體的配置檔案 | bashrc, passwd |
/home | 普通使用者的家目錄 | /home/msh |
/lib | 系統最基本的共享連結庫和核心模組 | libc-2.17.so |
/root | root使用者的家目錄 | .bashrc, .ssh |
/sbin | 超級使用者使用的可執行檔案,裡面多是系統管理命令 | ifconfig, iptables |
/tmp | 儲存臨時檔案 |
/usr
目錄的目錄結構與根目錄相似,但根目錄中的檔案多是系統級的檔案,而/usr
目錄中是使用者級的檔案,一般與具體的系統無關。
目錄 | 內容 | 舉例 |
---|---|---|
/usr/bin | 多數日常應用程式存放的位置 | yum, git |
/usr/include | C/C++標頭檔案 | ctype.h |
/usr/lib | 普通使用者使用的庫檔案 | mysql的庫檔案 |
/usr/local | 個人安裝的軟體,通常需要手動指定;與"/usr"目錄的目錄結構相似 | |
/usr/sbin | 超級使用者不需要的系統管理程式 | useradd |
重中之重
/proc目錄
/proc
目錄掛載了一個虛擬檔案系統
,以虛擬檔案
的形式對映系統與程式在記憶體中的執行時資訊。
系統資訊
/proc
下的直接子目錄通常儲存系統資訊。猴子常用的只有兩個:
目錄 | 內容 | 舉例 |
---|---|---|
/proc/cpuinfo | 處理器的相關資訊 | physical id、cpu cores、siblings、processor |
/proc/version | 系統的核心版本號 | Linux version 3.10.0 |
/proc/version
確定核心版本號和CPU架構(如i686);/etc/centos-release
確定發行版本號(其他發行版類似)。
uname -a
與cat /proc/version
的作用類似。
程式資訊
重點是/proc/<pid>
目錄對映的程式資訊。以rsyslogd程式為例:
目錄 | 內容 | 舉例 |
---|---|---|
/proc/<pid>/cmdline |
啟動當前程式的完整命令 | /usr/sbin/rsyslogd-n |
/proc/<pid>/cwd |
當前程式工作目錄的軟鏈 | cwd -> / |
/proc/<pid>/environ |
當前程式的環境變數列表 | LANG=zh_CN.UTF-8 |
/proc/<pid>/exe |
啟動當前程式的可執行檔案的軟鏈 | exe -> /usr/sbin/rsyslogd |
/proc/<pid>/fd |
目錄,儲存當前程式持有的檔案描述符(以軟鍊形式存在,指向實際檔案) | 2 -> /dev/null 6 -> /var/log/messages |
/proc/<pid>/limits |
當前程式使用資源的軟限制、硬限制(和單位) | open files(預設軟限制1024) |
/proc/<pid>/task |
目錄,儲存當前程式所執行的每一個執行緒的相關資訊;以<tid> 作為各執行緒的目錄名,目錄結構與/proc/<pid> 相似 |
1037、1050、1051 |
補充幾點:
- 通過ulimit來檢視或修改當前程式的資源限制。
- 軟限制可以由程式自己在任何時間修改;硬限制只能使用root許可權修改。
- Linux上程式與執行緒的關係參考淺談linux執行緒模型和執行緒切換。
/var目錄
/var
目錄存放資料檔案,如程式資料、日誌等;但線上通常只將日誌放在/var
目錄。
系統日誌/var/log/messages
通過rsyslog記錄系統級日誌,配置檔案為/etc/rsyslog.conf
。重點看/var/log/messages
的配置:
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
複製程式碼
*.info
表示所有服務大於等於info優先順序的資訊都會記錄到/var/log/messages
中;mail.none
表示不記錄任何mail的資訊到/var/log/messages
中。
以上配置表示:除安全認證、郵件、定時任務外,輸出到stdout、stderr的info及更高階別的日誌記錄在/var/log/messages
中。
OOM kill
猴子利用/var/log/messages
定位過一次OOM kill問題。
一個使用者經常抱怨自己的app提到Yarn後,container各種exit 137然後重試。假設框架不會自己exit 137玩,那麼通常137代表container是因為kill -9退出,於是mentor提示猴子可能因為OOM kill。要驗證這個想法,必須找到“相關container被OOM kill的痕跡”。
Linux會監控記憶體使用情況,當記憶體不足的時候,OOM killer計算程式的優先順序,殺死優先順序最高的程式釋放記憶體。而Yarn叢集普遍會配置資源超發(Linux系統本身也存在記憶體超發),當叢集資源緊張的時候,大container很容易被OOM kill。
OOM kill的三個步驟“發現記憶體不足”、“計算優先順序”、“選擇程式kill”,都會記錄在/var/log/messages
中,猴子確實在使用者給定的時間點附近找到了對應container的OOM kill日誌,記憶體也與container申請的資源相近。
得證。
判斷過程中存在一些小問題:
- 猴子根據container被OOM kill的時間點和記憶體判斷是否是目標程式,未嚴格確定。
個人使用時的建議
對於本文的理解,讀者不必關心不同發行版本、核心版本之間的區別。
對,是存在區別的。如:CentOS 6.5可驗證得本文即將講解的目錄結構;但CentOS 7.2中,
/bin
等所謂“系統級目錄”都被軟鏈到了/usr/bin
等所謂“使用者級目錄”。其他發行版如Debian可能差別更大。
如果非要追究的話,一般建議將_所有使用者共享的軟體安裝到/usr/local
目錄_(結構與/usr
目錄相似)下,將使用者私有的軟體安裝到使用者自己的家目錄。
參考:
本文連結:Linux檔案系統目錄結構
作者:猴子007
出處:monkeysayhi.github.io
本文基於 知識共享署名-相同方式共享 4.0 國際許可協議釋出,歡迎轉載,演繹或用於商業目的,但是必須保留本文的署名及連結。