Linux文件系統目錄結構

本文以CentOS系統爲例,但一樣適用於Linux的其餘發行版。不須要糾結於具體的版本,瞭解設計意圖便可。html

本文隨時更新。除勘誤外,不另作批註。mysql

概覽

image.png

  • 圓型節點代指目錄,方型節點代指文件。
  • 圖中省去了不少不經常使用的目錄與文件。
  • 稍後單獨講/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目錄

/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 -acat /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

補充幾點:架構

  • 經過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 國際許可協議發佈,歡迎轉載,演繹或用於商業目的,可是必須保留本文的署名及連接。

相關文章
相關標籤/搜索