Linux檔案系統目錄結構

monkeysayhi發表於2018-03-19

本文以CentOS系統為例,但同樣適用於Linux的其他發行版。不需要糾結於具體的版本,瞭解設計意圖即可。

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

概覽

image.png

  • 圓型節點代指目錄,方型節點代指檔案。
  • 圖中省去了很多不常用的目錄與檔案。
  • 稍後單獨講/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 -acat /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 國際許可協議釋出,歡迎轉載,演繹或用於商業目的,但是必須保留本文的署名及連結。

相關文章