file-hierarchy -
文件系統層次結構概覽
描述
對於使用 systemd(1)
的操作系統來說,
其文件系統層次結構遵守
File System Hierarchy[1] 與 hier(7)
規範。
本手冊僅描述一個符合上述規範的子集,
該子集較小也較現代,
並且更加嚴格的遵守上述規範。
許多本文所描述的路徑都可以通過
systemd-path(1) 工具來查詢。
總體結構
/
文件系統的根。
通常是可寫的(也可以是隻讀的),
並且可以是一個 "tmpfs"
文件系統。
除非是隻讀的,否則不與其他主機共享。
/boot
啓動分區。
在UEFI系統上通常是"EFI System
Partition", 參見
systemd-gpt-auto-generator(8)
手冊。
該目錄通常嚴格位於本機的內置存儲上,
並且應該是隻讀的(除非需要安裝內核或引導管理器)。
僅當操作系統運行在物理機或者虛擬硬件上時才需要此目錄,
因爲這種情況下必須使用引導管理器。
/etc
特定於該操作系統的配置。
該目錄可以是隻讀的(也可以是可讀寫的)。
通常用於存儲操作系統發行商預設的配置文件,
但是應用程序不應該假設該目錄中必然存在某個配置文件,
而是應該在期望的配置文件不存在的情況下,
回退到默認設置。
/home
存儲普通用戶的家目錄。
可以與其他操作系統共享,
並且必須是可讀寫的(不能是隻讀的)。
該目錄必須僅用於普通用戶,
切勿用於系統用戶(系統用戶不只有"root")。
該目錄及其子目錄可以在啓動過程的末尾才變得可用,
甚至可以在完成用戶身份認證之後才變得可用。
該目錄可以位於功能受限的網絡文件系統上,
因此,應用程序不應該假定所有文件系統API在此目錄上都可用。
應用程序不應該直接引用該目錄及其子目錄,
而是應該通過針對每個用戶設置的
$HOME 環境變量來引用,
或者根據用戶數據庫中的"家目錄"字段的值來引用。
/root
"root"用戶的家目錄。
將根用戶的家目錄放到
/home
之外是爲了確保即使在
/home
目錄不可用的情況下,
"root"用戶依然可以正常登錄。
/srv
存儲常規服務器數據(載荷)的目錄,由服務器管理員管理。
其中的子目錄如何組織,沒有明確的規範。
該目錄通常是可寫的,並且可以與其他操作系統共享。
該目錄可以在啓動過程的末尾才變得可用。
/tmp
存放小臨時文件的目錄。
通常掛載爲一個 "tmpfs"
文件系統。
切勿在此目錄中存放體積較大的臨時文件(應該使用
/var/tmp 目錄)。
因爲系統上的所有用戶都可以訪問該目錄,
所以必須確保該目錄僅對
mkstemp(3),
mkdtemp(3)
相關係統調用可寫。
該目錄在系統啓動過程中會被清空。
並且,如果其中的某些文件持續長時間不被訪問,通常也會被自動刪除。
如果應用程序發現
$TMPDIR
環境變量已經被設置,
那麼應該使用
$TMPDIR
環境變量的設置,
而不應該直接使用 /tmp
目錄(參見
environ(7) 與
IEEE Std
1003.1[2] )。
運行時數據
/run
一個用於存放系統軟件運行時數據的
"tmpfs" 文件系統。
該目錄在系統啓動過程中會被清空。
該目錄必須總是可寫的,
但是通常又應該僅賦予特權應用寫入權限。
/run/log
運行時系統日誌。
系統組件可以在這個目錄中存放私有日誌。
該目錄必須總是可寫的(即使
/var/log
目錄尚不能訪問)。
/run/user
針對每個用戶的運行時目錄。
通常針對每個用戶單獨掛載一個
"tmpfs" 文件系統實例。
該目錄必須總是可寫的,
並且在系統啓動過程中以及對應的用戶登出後會被自動清空。
應用程序不應該直接引用該目錄,而是應該通過針對每個用戶設置的
$XDG_RUNTIME_DIR
環境變量來引用。
詳見 XDG Base Directory Specification[3]
發行商提供的操作系統資源
/usr
發行商提供的操作系統資源。
通常應該是隻讀的(但非必須是隻讀)。可以與其他主機共享。
系統管理員不應該修改此目錄中的內容,
除非需要安裝或卸載發行商提供的軟件包。
/usr/bin
存放應當出現在
$PATH
搜索路徑中的用戶命令(可執行文件)。
建議僅將命令行工具放到此目錄中,
而例如守護進程之類的非命令行工具,
則應該放到 /usr/lib
下的子目錄中。
/usr/include
系統庫的 C 與 C++ API
頭文件目錄。
/usr/lib
存放通用於所有體系結構的、靜態的發行商專屬數據。
這包括軟件包內部使用的可執行文件、
以及例如守護進程之類的非命令行工具。
這些二進制文件可用於該操作系統支持的所有體系結構。
不要在此目錄中放置公共庫,
而應該將它們放到
$libdir
目錄中(參見下文)。
/usr/lib/arch-id
存放動態鏈接庫,
又被稱爲
$libdir 目錄。
arch-id 的具體名稱遵守
Multiarch Architecture Specifiers (Tuples)[4]
列表的規範。
傳統上,
$libdir 通常是
/usr/lib 與 /usr/lib64 目錄。
該目錄不應該用於存放特定於某個軟件的專屬數據,
除非這些數據是專屬於特定體系結構的。
可以使用下面的命令查詢用於該系統的首選體系結構的
$libdir 的值:
# systemd-path system-library-arch
/usr/share
在多個軟件包之間共享的資源,
例如文檔、手冊、時區數據、字體等資源。
此目錄下的子目錄結構及文件格式,
取決於確保軟件之間正常相互操作的各種規範。
/usr/share/doc
操作系統以及各種軟件包的文檔。
/usr/share/factory/etc
發行商提供的默認配置文件倉庫。
該目錄中應該放置發行商提供的、
所有可能放入 /etc
目錄的配置文件的原始默認文件。
這個目錄主要是爲了方便恢復默認設置
以及對比當前配置與默認配置的不同。
/usr/share/factory/var
與 /usr/share/factory/etc 類似,
用於存放發行商提供的
/var
目錄內容的原始默認文件。
應該持久保存的易變系統數據
/var
應該持久保存的易變系統數據。
該目錄必須可寫。
該目錄可以預先填充發行商預設的數據,
但是應用程序可以自行創建所需的文件和目錄。
強烈推薦(但非必須)持久保存該目錄中的數據,
系統必須在該目錄爲空時依然能夠正常啓動,
以支持臨時運行的系統。
該目錄可以在啓動過程的末尾才變得可用,
因此那些在系統啓動早期運行的組件不應該依賴於此目錄的存在。
/var/cache
應該持久保存的系統緩存。
系統組件可以在該目錄中放置非關鍵的緩存。
清空該目錄必須不影響應用的正常工作
(但應用可以花費額外的時間重建這些緩存)。
/var/lib
應該持久保存的系統數據。
系統組件可以在該目錄中放置專屬的數據。
/var/log
/var/spool
應該持久保存的系統隊列。
例如郵件隊列或打印隊列。
/var/tmp
應該持久保存的臨時文件(通常體積也比較大)。
此目錄通常位於持久存儲設備上,並且可以存儲較大的臨時文件。
相比較而言,/tmp
一般位於內存中,
並且僅用於存儲較小的臨時文件。
該目錄在系統啓動過程中一般不會被清空,
但是,如果其中的某些文件持續長時間不被訪問,通常也會被自動刪除。
因爲系統上的所有用戶都可以訪問該目錄,
所以必須確保該目錄僅對
mkstemp(3),
mkdtemp(3)
相關係統調用可寫。
如果應用程序發現
$TMPDIR
環境變量已經被設置,
那麼應該使用
$TMPDIR
環境變量的設置,
而不應該直接使用 /var/tmp
目錄(參見
environ(7))。
虛擬文件系統
/dev
設備節點的根目錄。
通常被掛載爲一個
"devtmpfs" 文件系統實例
(但在沙盒或容器中可能是其他類型)。
該目錄中的內容由內核與
systemd-udevd.service(8)
共同管理,其他任何組件都不應該修改此目錄中的內容。
可以在該目錄的子目錄中再掛載其他特定用途的虛擬文件系統。
/dev/shm
通過
shm_open(3)
創建的POSIX共享內存。
因爲它其實是一個
"tmpfs" 文件系統,
所以在系統啓動過程中會被清空。
因爲系統上的所有用戶都可以讀寫該目錄,
所以必須注意避免文件名衝突以及安全漏洞(也就是注意權限設置)。
對於普通用戶,當其退出登錄時,其在該目錄下創建的文件也會被刪除。
通常,在 /run
目錄(針對系統進程) 或
$XDG_RUNTIME_DIR
目錄(針對用戶進程)中使用內存映射文件,
是比使用POSIX共享內存更好的解決方案。
因爲這些目錄不是全局可寫的,
所以不存在文件名衝突以及安全漏洞的問題。
/proc
顯示進程信息以及其他功能的虛擬文件系統。
此文件系統主要用作內核與用戶交互的界面。
詳見
proc(5) 手冊。
可以在該目錄的子目錄中再掛載其他特定用途的虛擬文件系統。
/proc/sys
調整內核各項參數的一個界面。
主要通過
sysctl.d(5)
中的配置文件進行設置。
但在沙盒或容器中該目錄通常以只讀方式掛載(也就是禁止修改內核參數)。
/sys
顯示所有已發現設備以及其他功能的虛擬文件系統。
此文件系統主要用作內核與用戶交互的界面。
在沙盒或容器中該目錄通常以只讀方式掛載。
可以在該目錄的子目錄中
再掛載其他特定用途的虛擬文件系統。
兼容性軟連接
/bin, /sbin, /usr/sbin
這三個軟連接都指向
/usr/bin
以確保對傳統路徑的兼容。
/lib
這個軟連接指向
/usr/lib
以確保對傳統路徑的兼容。
/lib64
在64位系統上,
這個軟連接指向 $libdir
以確保對傳統路徑的兼容。
此軟連接僅存在於動態加載器位於此路徑的系統架構上。
/var/run
這個軟連接指向
/run
以確保對傳統路徑的兼容。
家目錄
用戶應用如果想要在用戶的家目錄中保存文件或目錄,那麼應該遵守下面的規範。
注意,下面的某些目錄雖然比較脆弱,
但是已經被 XDG Base Directory
Specification[3] 標準化了。
其他爲高層次用戶資源定義的位置參見
xdg-user-dirs[5] 文檔。
~/.cache
應該持久保存的用戶緩存。
應用可以在該目錄中放置非關鍵的用戶緩存。
清空該目錄中的緩存必須不影響應用的正常工作
(但應用可以花費額外的時間重建這些緩存)。
如果應用程序發現
$XDG_CACHE_HOME
環境變量已經被設置,
那麼應該使用 $XDG_CACHE_HOME
環境變量的設置,
而不應該直接使用 ~/.cache
目錄。
~/.config
應該持久保存的用戶配置與狀態。
當新用戶剛被創建時,該目錄應該初始爲空或根本不存在。
如果期望的配置文件不存在於該目錄中,
那麼應用程序應該回退到默認設置,而不應該罷工。
如果應用程序發現
$XDG_CONFIG_HOME
環境變量已經被設置,
那麼應該使用 $XDG_CONFIG_HOME
環境變量的設置,
而不應該直接使用 ~/.config
目錄。
~/.local/bin
存放應當出現在用戶專屬的
$PATH
搜索路徑中的用戶命令(可執行文件)。
建議僅將命令行工具放到此目錄中,
而例如守護進程之類的非命令行工具,
則應該放到 ~/.local/lib
下的子目錄中。
注意,當在此目錄中存放特定於體系結構的可執行文件時,
可能會因爲與其他不同體系結構的系統共享家目錄而出現故障。
~/.local/lib
存放通用於所有體系結構的、靜態的用戶專屬數據。這包括軟件包內部使用的可執行文件、以及例如守護進程之類的非命令行工具。這些二進制文件可用於該操作系統支持的所有體系結構。
不要在此目錄中放置公共庫,而應該將它們放到
~/.local/lib/arch-id
目錄中(參見下文)。
~/.local/lib/arch-id
存放專屬於特定體系結構的動態鏈接庫。
arch-id 的具體名稱遵守
Multiarch Architecture Specifiers (Tuples)[4]
列表的規範。
~/.local/share
在多個軟件包之間共享的資源,例如圖標、字體等資源。
此目錄下的子目錄結構及文件格式,
取決於確保軟件之間正常相互操作的各種規範。
如果應用程序發現
$XDG_DATA_HOME
環境變量已經被設置,
那麼應該使用 $XDG_DATA_HOME
環境變量的設置,
而不應該直接使用
~/.local/share 目錄。
非特權進程的寫權限
非特權進程通常對大多數目錄都沒有寫權限。
但對於普通用戶的非特權進程來說,可以寫入
/tmp, /var/tmp, /dev/shm, $HOME (通常位於
/home 下), $XDG_RUNTIME_DIR (通常位於
/run/user 下) 目錄。
而對於系統的非特權進程來說,則僅可以寫入
/tmp, /var/tmp, /dev/shm 目錄。
如果系統的非特權進程需要在
/var 或 /run
目錄中創建一個專屬的、可寫入的目錄,
那麼可以在守護進程丟棄特權之前先創建該目錄,或者通過
tmpfiles.d(5)
在系統啓動時先創建該目錄,
或者通過服務單元文件中的
RuntimeDirectory= 指令(詳見
systemd.unit(5)
手冊)創建該目錄。
文件類型
Unix文件系統支持不同的文件節點類型:
普通文件、目錄、軟連接、字符設備、塊設備、
套接字(socket)、管道(FIFO)。
強烈建議僅將設備文件放置在
/dev 目錄中、
僅將套接字(socket)與管道(FIFO)文件放置在
/run 目錄中。
而普通文件、目錄、軟連接則可以放置在所有目錄中。
系統軟件包
系統軟件包的開發者應該嚴格遵守下面的文件佈局規範。
下面列出了發行商提供的系統軟件包中各類文件的推薦位置:
Table 1. 系統軟件包中靜態文件的推薦位置
目錄 |
用途 |
/usr/bin |
應該出現在 $PATH
搜索路徑中且與體系結構無關的可執行文件。不要將軟件包內部使用的可執行文件或非命令行工具(例如守護進程之類)放到此目錄中。因爲衆多的軟件包都使用此目錄,所以必須選擇獨一無二的可執行文件名稱,以避免衝突。 |
/usr/lib/arch-id |
全局通用的體系結構相關的共享庫。因爲衆多的軟件包都使用此目錄,所以必須選擇獨一無二的共享庫名稱,以避免衝突。 |
/usr/lib/package |
發行商提供的該軟件包專屬的體系結構無關的靜態資源(可執行文件、庫文件、只讀數據)。 |
/usr/lib/arch-id/package |
發行商提供的體系結構相關的該軟件包專屬的資源(通常不包括軟件包內部使用的可執行文件)。 |
/usr/include/package |
該軟件包提供的共享庫的
C/C++ 頭文件。 |
發行商提供的其他靜態資源應該存放在
/usr/share 目錄下,
具體的存放位置應該遵守其他的相關規範。
存放軟件包運行時數據以及配置文件的相關目錄如下:
Table 2. 系統軟件包的運行時數據以及配置文件的推薦位置
目錄 |
用途 |
/etc/package |
特定於該系統的配置文件。如果該目錄不存在,那麼軟件包應該儘可能回退到安全的默認設置,而不應該罷工。可選地,可以設置一個
tmpfiles.d(5)
配置文件,以實現在系統啓動過程中,從
/usr/share/factory
目錄中複製("C"指令)或軟連接("L"指令)所需的文件到該目錄中。 |
/run/package |
軟件包的運行時數據。因爲該目錄會在系統啓動過程中被清空,所以軟件包必須有權限在此目錄中創建子目錄及文件。可選的,可以設置一個
tmpfiles.d(5)
配置文件,以實現在系統啓動過程中自動在此目錄中創建所需的子目錄及文件。或者可選的,在服務單元文件中使用
RuntimeDirectory= 指令(詳見
systemd.unit(5)
手冊)以達到上述目的。 |
/run/log/package |
軟件包的運行時日誌。因爲該目錄會在系統啓動過程中被清空,所以軟件包必須有權限在此目錄中創建子目錄及文件。 |
/var/cache/package |
軟件包的持久緩存。清空該目錄必須不影響軟件包的正常工作(但軟件包可以花費額外的時間重建這些緩存)。軟件包必須有權限在此目錄中創建子目錄及文件。 |
/var/lib/package |
軟件包的持久專屬數據。存放無法明確分類的持久數據。軟件包必須有權限在此目錄中創建子目錄及文件,因爲在系統啓動時該目錄可能爲空。可選的,可以設置一個
tmpfiles.d(5)
配置文件,以實現在系統啓動過程中自動在此目錄中創建所需的子目錄及文件。 |
/var/log/package |
軟件包的持久日誌數據。軟件包必須有權限在此目錄中創建子目錄及文件,因爲在系統啓動時該目錄可能爲空。 |
/var/spool/package |
軟件包的持久隊列數據。軟件包必須有權限在此目錄中創建子目錄及文件,因爲在系統啓動時該目錄可能爲空。 |
用戶軟件包
對於專屬於特定用戶的軟件包,
其存貯在用戶家目錄中的文件必須嚴格遵守下面的文件佈局規範。
注意,當安裝屬於系統範圍的軟件包時,
應該遵守前面"系統軟件包"小節的佈局規範。
下面列出了當用戶在其家目錄中安裝專屬軟件包時,
由發行商提供的各種類型的文件在用戶家目錄中應該存放的位置:
Table 3. 用戶軟件包中靜態文件的推薦位置
目錄 |
用途 |
~/.local/bin |
應該出現在 $PATH
搜索路徑中且與體系結構無關的可執行文件。不要將軟件包內部使用的可執行文件或非命令行工具(例如守護進程之類)放到此目錄中。因爲衆多的軟件包都使用此目錄,所以必須選擇獨一無二的可執行文件名稱,以避免衝突。 |
~/.local/lib/arch-id |
全局通用的體系結構相關的共享庫。因爲衆多的軟件包都使用此目錄,所以必須選擇獨一無二的共享庫名稱,以避免衝突。 |
~/.local/lib/package |
發行商提供的該軟件包專屬的體系結構無關的靜態資源(可執行文件、庫文件、只讀數據)。 |
~/.local/lib/arch-id/package |
發行商提供的體系結構相關的該軟件包專屬的資源(通常不包括軟件包內部使用的可執行文件)。 |
發行商提供的其他靜態資源應該存放在
~/.local/share 目錄下,
具體的存放位置應該遵守其他的相關規範。
存放軟件包運行時數據以及配置文件的相關目錄如下:
Table 4. 用戶軟件包的運行時數據以及配置文件的推薦位置
目錄 |
用途 |
~/.config/package |
特定於該用戶的配置文件。如果該目錄不存在,那麼軟件包必須能夠安全的回退到默認設置,而不能罷工。 |
$XDG_RUNTIME_DIR/package |
特定於該用戶的運行時數據。 |
~/.cache/package |
軟件包的持久緩存。清空該目錄必須不影響軟件包的正常工作(但軟件包可以花費額外的時間重建這些緩存)。軟件包必須有權限在此目錄中創建子目錄及文件。 |
- 1.
- File System Hierarchy
http://refspecs.linuxfoundation.org/FHS_2.3/fhs-2.3.html
- 2.
- IEEE Std 1003.1
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03
- 3.
- XDG Base Directory Specification
http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
- 4.
- Multiarch Architecture Specifiers (Tuples)
https://wiki.debian.org/Multiarch/Tuples
- 5.
- xdg-user-dirs
http://www.freedesktop.org/wiki/Software/xdg-user-dirs/
跋
本頁面中文版由中文
man 手冊頁計劃提供。
翻譯人員:金步國
金步國作品集:http://www.jinbuguo.com
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh