Provided by: manpages-zh_1.6.3.2-1_all bug

NAME

       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
           應該持久保存的系統日誌。 系統組件可以在該目錄中放置專屬的日誌。 不過,推薦的方式是通過
           syslog(3) 與 sd_journal_print(3) 接口記錄日誌。

       /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         │ 軟件包的持久緩存。清空該目錄必須 │
       │                         │ 不影響軟件包的正常工作(但軟件包  │
       │                         │ 可以花費額外的時間重建這些緩     │
       │                         │ 存)。軟件包必須有權限在此目錄中  │
       │                         │ 創建子目錄及文件。               │
       └─────────────────────────┴──────────────────────────────────┘

參見

       systemd(1), hier(7), systemd-path(1), systemd-gpt-auto-generator(8), sysctl.d(5),
       tmpfiles.d(5), pkg-config(1), systemd.unit(5)

NOTES

        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