最後更新日期: 2025 年 4 月 18 日
Filesystem Hierarchy Standard (FHS) 是一套由 Filesystem Hierarchy Standard Group(現由 Linux Foundation 維護)定義的標準,旨在規範 Linux 和類 Unix 系統中的檔案系統目錄結構與用途。FHS 的目標是確保不同 Linux 發行版之間的檔案系統一致性,提高軟體的可移植性和系統管理的可預測性。最新版本為 FHS 3.0(2015 年發布),適用於大多數現代 Linux 發行版。
FHS 定義了檔案和目錄的標準位置、命名規則及其用途,涵蓋了從核心系統檔案到用戶資料的組織方式。它適用於所有 Linux 發行版(如 Arch Linux、Ubuntu、Fedora、Debian 等),也影響其他類 Unix 系統(如 BSD、Solaris)。以下深入介紹 FHS 的結構、原則、主要目錄及其用途。
FHS 的核心原則
FHS 的設計基於以下原則:
- 層次結構:檔案系統以樹狀結構組織,根目錄(
/
)是所有檔案的起點。 - 可共享性:
- 可共享 (Shareable):可透過網路共享給其他系統的檔案(如
/usr
)。 - 不可共享 (Unshareable):僅限本地系統的檔案(如
/etc
)。
- 可共享 (Shareable):可透過網路共享給其他系統的檔案(如
- 變動性:
- 靜態 (Static):內容不常變更的檔案(如二進位檔案
/bin
)。 - 動態 (Variable):內容經常變更的檔案(如日誌
/var/log
)。
- 靜態 (Static):內容不常變更的檔案(如二進位檔案
- 一致性:確保不同發行版遵循相同的目錄用途,便於軟體開發和系統管理。
- 模組化:將不同類型的檔案分隔到專用目錄,方便維護和備份。
FHS 定義的主要目錄
FHS 規範了根目錄(/
)下的主要子目錄,以下逐一介紹其用途、特性及常見內容:
1. /bin
(基本二進位檔案)
- 用途:儲存系統啟動和運行所需的基本命令二進位檔案,供所有用戶(包括 root 和普通用戶)使用。
- 特性:靜態、可共享,必須在單用戶模式下可用。
- 內容:
- 核心命令:
ls
、cp
、mv
、rm
、cat
、bash
等。 - 系統工具:
login
、mount
(部分發行版可能在/sbin
)。
- 核心命令:
- 注意:
/bin
必須位於根檔案系統,不能依賴其他分區。- 不包含子目錄,保持簡潔。
2. /sbin
(系統二進位檔案)
- 用途:儲存系統管理相關的二進位檔案,通常僅供 root 使用。
- 特性:靜態、可共享,與
/bin
類似但專注於系統管理。 - 內容:
- 管理工具:
fsck
、ifconfig
(舊版)、reboot
、init
。 - 網路工具:
ip
(部分發行版)。
- 管理工具:
- 注意:不應包含普通用戶日常使用的命令。
3. /etc
(配置檔案)
- 用途:儲存系統和應用程式的配置文件,定義系統行為。
- 特性:靜態、不可共享(特定於本地系統)。
- 內容:
- 系統配置:
/etc/fstab
(檔案系統掛載)、/etc/passwd
(用戶資訊)、/etc/hosts
。 - 應用配置:
/etc/apache2/
(Apache 伺服器)、/etc/ssh/sshd_config
。
- 系統配置:
- 注意:
- 通常包含子目錄(如
/etc/X11
用於 X Window 系統)。 - 配置檔案多為純文字,方便編輯。
- 通常包含子目錄(如
4. /home
(用戶家目錄)
- 用途:儲存普通用戶的個人檔案和配置。
- 特性:動態、可共享(可透過 NFS 共享)。
- 內容:
- 用戶子目錄:如
/home/alice
、/home/bob
。 - 用戶配置文件:
~/.bashrc
、~/.config/
。
- 用戶子目錄:如
- 注意:
- root 的家目錄通常在
/root
,不在/home
。 - 可選擇將
/home
掛載到獨立分區。
- root 的家目錄通常在
5. /root
(root 用戶家目錄)
- 用途:root 用戶的家目錄,儲存其個人檔案和配置。
- 特性:動態、不可共享。
- 內容:類似普通用戶家目錄,如
.bashrc
、臨時檔案。 - 注意:位於根檔案系統,確保單用戶模式下可用。
6. /lib
與 /lib64
(共享函式庫)
- 用途:儲存
/bin
和/sbin
中二進位檔案所需的共享函式庫,以及核心模組。 - 特性:靜態、可共享。
- 內容:
- 動態函式庫:
libc.so
、libpthread.so
。 - 核心模組:
/lib/modules/<kernel-version>/
(如/lib/modules/5.15.0/
)。
- 動態函式庫:
- 注意:
- 64 位系統可能包含
/lib64
用於 64 位函式庫。 - 必須位於根檔案系統。
- 64 位系統可能包含
7. /usr
(次要層次結構)
- 用途:儲存用戶安裝的軟體和非系統啟動必需的檔案,形成次要檔案系統層次。
- 特性:靜態、可共享,可掛載為唯讀。
- 子目錄:
/usr/bin
:非必需的用戶命令(如firefox
、vim
)。/usr/sbin
:非必需的系統管理命令(如cron
)。/usr/lib
:軟體函式庫(如 Python 模組)。/usr/include
:C/C++ 頭檔案。/usr/share
:與架構無關的資料(如文件/usr/share/doc
、圖示/usr/share/icons
)。/usr/local
:本地安裝的軟體(手動編譯或第三方軟體)。
- 注意:
/usr
可位於獨立分區,但需在啟動後掛載。
8. /var
(變動檔案)
- 用途:儲存運行時生成的動態檔案,如日誌、快取和臨時檔案。
- 特性:動態、不可共享。
- 子目錄:
/var/log
:系統和應用日誌(如/var/log/syslog
)。/var/cache
:應用快取(如pacman
的/var/cache/pacman
)。/var/tmp
:大型或長期保留的臨時檔案。/var/spool
:列印或郵件佇列。/var/run
:運行時資料(如 PID 檔案,FHS 3.0 建議連結至/run
)。
- 注意:通常需要較大儲存空間,建議獨立分區。
9. /tmp
(臨時檔案)
- 用途:儲存臨時檔案,可由任何用戶或程式寫入。
- 特性:動態、不可共享,內容可能在重啟後清除。
- 內容:臨時檔案、會話資料。
- 注意:
- 可使用 tmpfs(記憶體檔案系統)以提升性能。
- 不保證檔案持久性。
10. /boot
(啟動檔案)
- 用途:儲存系統啟動所需的檔案。
- 特性:靜態、不可共享。
- 內容:
- 核心映像:
vmlinuz-<version>
。 - 啟動載入器配置:
/boot/grub/grub.cfg
。 - 初始 RAM 磁碟:
initrd.img-<version>
。
- 核心映像:
- 注意:必須位於根檔案系統或獨立分區,確保啟動可用。
11. /dev
(設備檔案)
- 用途:儲存設備檔案,表示硬體設備或虛擬設備。
- 特性:動態、不可共享,通常由 udev 動態管理。
- 內容:
- 塊設備:
/dev/sda
(硬碟)。 - 字元設備:
/dev/tty
(終端)。 - 虛擬設備:
/dev/null
、/dev/random
。
- 塊設備:
- 注意:通常為 tmpfs,內容運行時生成。
12. /proc
(進程資訊)
- 用途:虛擬檔案系統,提供進程和系統資訊。
- 特性:動態、不可共享,由核心動態生成。
- 內容:
- 進程資訊:
/proc/<pid>/
(如/proc/1234/status
)。 - 系統資訊:
/proc/cpuinfo
、/proc/meminfo
。
- 進程資訊:
- 注意:為 procfs,內容僅存在於記憶體。
13. /sys
(系統資訊)
- 用途:虛擬檔案系統,暴露核心和設備的資訊。
- 特性:動態、不可共享,由 sysfs 提供。
- 內容:設備屬性、核心參數(如
/sys/class/
)。 - 注意:與
/proc
類似,但專注於硬體和驅動。
14. /mnt
(臨時掛載點)
- 用途:臨時掛載檔案系統(如 USB 磁碟)。
- 特性:動態、不可共享。
- 內容:掛載的外部設備或分區。
- 注意:不應長期使用,長期掛載應使用
/media
。
15. /media
(可移動媒體)
- 用途:自動掛載可移動設備(如 USB、CD-ROM)。
- 特性:動態、不可共享。
- 內容:子目錄如
/media/<user>/<label>
。 - 注意:通常由桌面環境或 udev 管理。
16. /run
(運行時資料)
- 用途:儲存系統運行時的臨時資料(FHS 2.3 引入)。
- 特性:動態、不可共享,通常為 tmpfs。
- 內容:
- PID 檔案:
/run/sshd.pid
。 - 套接字:
/run/dbus/system_bus_socket
。
- PID 檔案:
- 注意:取代
/var/run
,重啟後清除。
17. /opt
(可選軟體)
- 用途:儲存第三方或非標準軟體包。
- 特性:靜態、可共享。
- 內容:獨立軟體(如
/opt/google/chrome
)。 - 注意:軟體通常自成子目錄,與
/usr
區隔。
18. /srv
(服務資料)
- 用途:儲存服務(如 Web 伺服器、FTP)提供的資料。
- 特性:動態、可共享。
- 內容:如
/srv/http
(Web 內容)、/srv/ftp
。 - 注意:具體結構由管理員定義,FHS 不強制子目錄。
FHS 的版本變化和更新
- FHS 1.0 (1994):首次定義基本目錄結構,奠定標準基礎。
- FHS 2.0 (1997):引入
/media
、/srv
,完善可共享性概念。 - FHS 2.3 (2004):新增
/run
,規範/var/run
和/var/lock
的遷移。 - FHS 3.0 (2015):
- 支援 64 位系統(
/lib64
)。 - 允許
/bin
和/usr/bin
合併(符號連結)。 - 明確
/run
取代/var/run
,並規範 tmpfs 使用。 - 支援現代桌面環境(如
/usr/share/applications
)。
- 支援 64 位系統(
FHS 的重要性
- 軟體移植性:標準化的目錄結構讓軟體開發者在不同發行版間移植程式更容易。
- 系統管理:管理員可快速定位配置文件、日誌或二進位檔案。
- 一致性:減少發行版間的碎片化,提升用戶體驗。
- 教育價值:為新手提供清晰的檔案系統學習框架。
FHS 的局限性
- 靈活性不足:某些發行版(如 NixOS、Guix)採用非標準結構,FHS 限制其創新。
- 現代化挑戰:容器化(如 Docker)和扁平化軟體包(Flatpak、Snap)減少對 FHS 的依賴。
- 爭議目錄:
/usr
和/bin
的合併(usrmerge)在社群中引發爭議,部分認為違背 FHS 模組化原則。 - 不適用於非 Linux:BSD 或 macOS 雖受 FHS 影響,但未完全遵循。
總結
FHS 是 Linux 檔案系統的基石,透過標準化的目錄結構和用途,確保系統的可預測性、移植性和管理效率。從核心命令(/bin
)到日誌(/var/log
),FHS 涵蓋了系統運行的各個層面。儘管面臨現代技術的挑戰,FHS 仍是大多數 Linux 發行版的基礎,對於理解 Linux 檔案系統至關重要。