本文以CentOS系統爲例,但一樣適用於Linux的其餘發行版。不須要糾結於具體的版本,瞭解設計意圖便可。html
本文隨時更新。除勘誤外,不另作批註。mysql
- 圓型節點代指目錄,方型節點代指文件。
- 圖中省去了不少不經常使用的目錄與文件。
- 稍後單獨講
/proc
目錄與/var
目錄。
Linux將整個文件系統看作一棵樹,這棵樹的樹根叫作根文件系統,用"/"表示。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
目錄中是用戶級的文件,通常與具體的系統無關。git
目錄 | 內容 | 舉例 |
---|---|---|
/usr/bin | 多很多天常應用程序存放的位置 | yum, git |
/usr/include | C/C++頭文件 | ctype.h |
/usr/lib | 普通用戶使用的庫文件 | mysql的庫文件 |
/usr/local | 我的安裝的軟件,一般須要手動指定;與"/usr"目錄的目錄結構類似 | |
/usr/sbin | 超級用戶不須要的系統管理程序 | useradd |
/proc
目錄掛載了一個虛擬文件系統
,以虛擬文件
的形式映射系統與進程在內存中的運行時信息。github
/proc
下的直接子目錄一般存儲系統信息。猴子經常使用的只有兩個:sql
目錄 | 內容 | 舉例 |
---|---|---|
/proc/cpuinfo | 處理器的相關信息 | physical id、cpu cores、siblings、processor |
/proc/version | 系統的內核版本號 | Linux version 3.10.0 |
/proc/version
肯定內核版本號和CPU架構(如i686);/etc/centos-release
肯定發行版本號(其餘發行版相似)。centos
uname -a
與cat /proc/version
的做用相似。安全
重點是/proc/<pid>
目錄映射的進程信息。以rsyslogd進程爲例:bash
目錄 | 內容 | 舉例 |
---|---|---|
/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> 類似 |
103七、1050、1051 |
補充幾點:架構
/var
目錄存放數據文件,如程序數據、日誌等;但線上一般只將日誌放在/var
目錄。
經過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
中。
猴子利用/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 國際許可協議發佈,歡迎轉載,演繹或用於商業目的,可是必須保留本文的署名及連接。