為什麼要理解檔案系統#

檔案系統是作業系統管理磁碟資料的方式。你在終端中執行的每一個讀寫操作,底層都經過檔案系統的轉譯。理解檔案系統的結構,能讓你解釋許多實務中的現象:為什麼磁碟空間不足卻有剩餘、為什麼刪除大檔案後空間沒有釋放、為什麼硬連結不能跨分割區。

檔案系統的核心概念:inode 與 block#

索引式(Indexed)配置#

Linux 的檔案系統(如 EXT2/3/4、XFS)採用索引式配置,這是理解一切的關鍵:

  • inode(索引節點):記錄檔案的屬性(權限、擁有者、大小、時間戳)以及指向 data block 的指標
  • data block:實際存放檔案內容的空間

每個檔案佔用一個 inode 和若干個 data block。檔案名稱不存在 inode 中——它存在目錄的 data block 裡(目錄其實就是一張「檔名 → inode 編號」的對照表)。

這個架構解釋了幾個重要現象:

  • 檔名不是檔案的一部分,它是目錄的內容。這就是為什麼「更名」是修改目錄、不是修改檔案
  • 同一個 inode 可以有多個檔名,這就是硬連結(hard link)
  • inode 數量有限,即使 block 空間還夠,inode 用完了也無法建立新檔案

EXT2 檔案系統的結構#

EXT2 將分割區劃分為多個 Block Group,每個 group 包含:

  1. Superblock:記錄整個檔案系統的全域資訊(block/inode 總量、使用量、檔案系統狀態等)
  2. Group Descriptor:描述該 group 的 block/inode bitmap 位置等
  3. Block Bitmap:標記哪些 block 已被使用
  4. Inode Bitmap:標記哪些 inode 已被使用
  5. Inode Table:存放所有 inode 的實際資料
  6. Data Blocks:存放檔案內容

Superblock 是檔案系統最關鍵的資料。如果 Superblock 損毀,整個檔案系統就無法掛載。因此 EXT 系列會在多個 Block Group 中保存 Superblock 的備份。

日誌式檔案系統(Journaling)#

EXT3/4 和 XFS 都是日誌式檔案系統。在寫入資料前,先將操作記錄到日誌區域(Journal),完成後再更新。如果寫入過程中發生斷電:

  • 非日誌系統:需要全面掃描檔案系統一致性(fsck),耗時長
  • 日誌系統:只需回放日誌,快速回復一致狀態

這就是為什麼現代 Linux 幾乎都使用日誌式檔案系統。對於需要高可靠性的伺服器環境,這是必要的保障。

XFS 檔案系統#

CentOS 7 將預設檔案系統從 EXT4 改為 XFS,主要特點:

  • 高效能:特別擅長處理大檔案與高並行 I/O
  • 三個區段:資料區段(data section)、日誌區段(log section)、即時運算區段(realtime section)
  • 只能擴張不能縮小:這是 XFS 的主要限制
  • 動態分配 inode:不像 EXT 系列在格式化時就固定 inode 數量

Linux VFS(虛擬檔案系統)#

Linux 支援數十種檔案系統(EXT4、XFS、Btrfs、NTFS、FAT32 等),但使用者和程式不需要關心底層用的是哪一種。**VFS(Virtual Filesystem Switch)**提供了統一的介面,所有的檔案操作都透過 VFS 轉譯到對應的檔案系統驅動程式。

VFS 的存在是 Linux「一切皆檔案」哲學的技術基礎。你的程式用同樣的 open()/read()/write() 系統呼叫,無論底層是本地磁碟、網路檔案系統(NFS)、還是虛擬的 /proc

硬連結與符號連結#

硬連結是讓多個檔名指向同一個 inode。因為指向同一個 inode,所以:

  • 修改任何一個檔名的內容,其他檔名也會看到變化
  • 刪除其中一個檔名,只要還有其他檔名指向該 inode,資料就不會消失
  • 不能跨檔案系統(因為不同檔案系統的 inode 編號是獨立的)
  • 不能對目錄建立硬連結(避免造成目錄迴圈)

符號連結是一個獨立的檔案,內容是另一個檔案的路徑。類似 Windows 的捷徑:

  • 有自己獨立的 inode
  • 可以跨檔案系統
  • 可以指向目錄
  • 如果原始檔案被刪除,符號連結就會變成斷鏈(dangling link)

在實務中,符號連結的使用遠多於硬連結。例如:/usr/bin/python 通常是一個指向特定版本 Python 的符號連結,方便版本切換。

磁碟的掛載與卸載#

將一個檔案系統連接到目錄樹的過程稱為掛載(mount)。掛載的要點:

  • 掛載點必須是一個已存在的目錄
  • 掛載後,該目錄原有的內容會被暫時隱藏
  • 同一個檔案系統不應掛載到多個掛載點
  • /etc/fstab 定義了開機時自動掛載的檔案系統

swap 空間#

Swap 是磁碟上的一塊空間,作為記憶體不足時的緩衝。當實體記憶體用完時,核心會將不常用的記憶體頁面換出到 swap,騰出空間給更需要的程式。

Swap 不是記憶體的替代品。磁碟的 I/O 速度比記憶體慢幾個數量級,頻繁使用 swap 代表系統效能已經嚴重下降。在記憶體充足的伺服器上,swap 主要是作為最後的安全網。