Linux文件系統(tǒng)目錄結(jié)構(gòu)

本文以CentOS系統(tǒng)為例,但同樣適用于Linux的其他發(fā)行版。不需要糾結(jié)于具體的版本,了解設(shè)計意圖即可。

本文隨時更新。除勘誤外,不另做批注。

概覽

image.png
  • 圓型節(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 -acat /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è)目的,但是必須保留本文的署名及鏈接。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容