本文以CentOS系統(tǒng)為例,但同樣適用于Linux的其他發(fā)行版。不需要糾結(jié)于具體的版本,了解設(shè)計意圖即可。
本文隨時更新。除勘誤外,不另做批注。
概覽

- 圓型節(jié)點代指目錄,方型節(jié)點代指文件。
- 圖中省去了很多不常用的目錄與文件。
- 稍后單獨講
/proc目錄與/var目錄。
Linux將整個文件系統(tǒng)看做一棵樹,這棵樹的樹根叫做根文件系統(tǒng),用"/"表示。
| 目錄 | 內(nèi)容 | 舉例 |
|---|---|---|
| /bin | 供所有用戶使用的完成基本維護任務(wù)的命令 | ls, cp |
| /etc | 系統(tǒng)和應(yīng)用軟件的配置文件 | bashrc, passwd |
| /home | 普通用戶的家目錄 | /home/msh |
| /lib | 系統(tǒng)最基本的共享鏈接庫和內(nèi)核模塊 | libc-2.17.so |
| /root | root用戶的家目錄 | .bashrc, .ssh |
| /sbin | 超級用戶使用的可執(zhí)行文件,里面多是系統(tǒng)管理命令 | ifconfig, iptables |
| /tmp | 存儲臨時文件 |
/usr目錄的目錄結(jié)構(gòu)與根目錄相似,但根目錄中的文件多是系統(tǒng)級的文件,而/usr目錄中是用戶級的文件,一般與具體的系統(tǒng)無關(guān)。
| 目錄 | 內(nèi)容 | 舉例 |
|---|---|---|
| /usr/bin | 多數(shù)日常應(yīng)用程序存放的位置 | yum, git |
| /usr/include | C/C++頭文件 | ctype.h |
| /usr/lib | 普通用戶使用的庫文件 | mysql的庫文件 |
| /usr/local | 個人安裝的軟件,通常需要手動指定;與"/usr"目錄的目錄結(jié)構(gòu)相似 | |
| /usr/sbin | 超級用戶不需要的系統(tǒng)管理程序 | useradd |
重中之重
/proc目錄
/proc目錄掛載了一個虛擬文件系統(tǒng),以虛擬文件的形式映射系統(tǒng)與進(jìn)程在內(nèi)存中的運行時信息。
系統(tǒng)信息
/proc下的直接子目錄通常存儲系統(tǒng)信息。猴子常用的只有兩個:
| 目錄 | 內(nèi)容 | 舉例 |
|---|---|---|
| /proc/cpuinfo | 處理器的相關(guān)信息 | physical id、cpu cores、siblings、processor |
| /proc/version | 系統(tǒng)的內(nèi)核版本號 | Linux version 3.10.0 |
/proc/version確定內(nèi)核版本號和CPU架構(gòu)(如i686);/etc/centos-release確定發(fā)行版本號(其他發(fā)行版類似)。
uname -a與cat /proc/version的作用類似。
進(jìn)程信息
重點是/proc/<pid>目錄映射的進(jìn)程信息。以rsyslogd進(jìn)程為例:
| 目錄 | 內(nèi)容 | 舉例 |
|---|---|---|
/proc/<pid>/cmdline |
啟動當(dāng)前進(jìn)程的完整命令 | /usr/sbin/rsyslogd-n |
/proc/<pid>/cwd |
當(dāng)前進(jìn)程工作目錄的軟鏈 | cwd -> / |
/proc/<pid>/environ |
當(dāng)前進(jìn)程的環(huán)境變量列表 | LANG=zh_CN.UTF-8 |
/proc/<pid>/exe |
啟動當(dāng)前進(jìn)程的可執(zhí)行文件的軟鏈 | exe -> /usr/sbin/rsyslogd |
/proc/<pid>/fd |
目錄,保存當(dāng)前進(jìn)程持有的文件描述符(以軟鏈形式存在,指向?qū)嶋H文件) | 2 -> /dev/null 6 -> /var/log/messages |
/proc/<pid>/limits |
當(dāng)前進(jìn)程使用資源的軟限制、硬限制(和單位) | open files(默認(rèn)軟限制1024) |
/proc/<pid>/task |
目錄,保存當(dāng)前進(jìn)程所運行的每一個線程的相關(guān)信息;以<tid>作為各線程的目錄名,目錄結(jié)構(gòu)與/proc/<pid>相似 |
1037、1050、1051 |
補充幾點:
- 通過ulimit來查看或修改當(dāng)前進(jìn)程的資源限制。
- 軟限制可以由進(jìn)程自己在任何時間修改;硬限制只能使用root權(quán)限修改。
- Linux上進(jìn)程與線程的關(guān)系參考淺談linux線程模型和線程切換。
/var目錄
/var目錄存放數(shù)據(jù)文件,如程序數(shù)據(jù)、日志等;但線上通常只將日志放在/var目錄。
系統(tǒng)日志/var/log/messages
通過rsyslog記錄系統(tǒng)級日志,配置文件為/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表示所有服務(wù)大于等于info優(yōu)先級的信息都會記錄到/var/log/messages中;
mail.none表示不記錄任何mail的信息到/var/log/messages中。
以上配置表示:除安全認(rèn)證、郵件、定時任務(wù)外,輸出到stdout、stderr的info及更高級別的日志記錄在/var/log/messages中。
OOM kill
猴子利用/var/log/messages定位過一次OOM kill問題。
一個用戶經(jīng)常抱怨自己的app提到Y(jié)arn后,container各種exit 137然后重試。假設(shè)框架不會自己exit 137玩,那么通常137代表container是因為kill -9退出,于是mentor提示猴子可能因為OOM kill。要驗證這個想法,必須找到“相關(guān)container被OOM kill的痕跡”。
Linux會監(jiān)控內(nèi)存使用情況,當(dāng)內(nèi)存不足的時候,OOM killer計算進(jìn)程的優(yōu)先級,殺死優(yōu)先級最高的進(jìn)程釋放內(nèi)存。而Yarn集群普遍會配置資源超發(fā)(Linux系統(tǒng)本身也存在內(nèi)存超發(fā)),當(dāng)集群資源緊張的時候,大container很容易被OOM kill。
OOM kill的三個步驟“發(fā)現(xiàn)內(nèi)存不足”、“計算優(yōu)先級”、“選擇進(jìn)程kill”,都會記錄在/var/log/messages中,猴子確實在用戶給定的時間點附近找到了對應(yīng)container的OOM kill日志,內(nèi)存也與container申請的資源相近。
得證。
判斷過程中存在一些小問題:
- 猴子根據(jù)container被OOM kill的時間點和內(nèi)存判斷是否是目標(biāo)進(jìn)程,未嚴(yán)格確定。
個人使用時的建議
對于本文的理解,讀者不必關(guān)心不同發(fā)行版本、內(nèi)核版本之間的區(qū)別。
對,是存在區(qū)別的。如:CentOS 6.5可驗證得本文即將講解的目錄結(jié)構(gòu);但CentOS 7.2中,
/bin等所謂“系統(tǒng)級目錄”都被軟鏈到了/usr/bin等所謂“用戶級目錄”。其他發(fā)行版如Debian可能差別更大。
如果非要追究的話,一般建議將所有用戶共享的軟件安裝到/usr/local目錄(結(jié)構(gòu)與/usr目錄相似)下,將用戶私有的軟件安裝到用戶自己的家目錄。
參考:
本文鏈接:Linux文件系統(tǒng)目錄結(jié)構(gòu)
作者:猴子007
出處:https://monkeysayhi.github.io
本文基于 知識共享署名-相同方式共享 4.0 國際許可協(xié)議發(fā)布,歡迎轉(zhuǎn)載,演繹或用于商業(yè)目的,但是必須保留本文的署名及鏈接。