為什麼要理解檔案系統#
檔案系統是作業系統管理磁碟資料的方式。你在終端中執行的每一個讀寫操作,底層都經過檔案系統的轉譯。理解檔案系統的結構,能讓你解釋許多實務中的現象:為什麼磁碟空間不足卻有剩餘、為什麼刪除大檔案後空間沒有釋放、為什麼硬連結不能跨分割區。
檔案系統的核心概念: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 包含:
- Superblock:記錄整個檔案系統的全域資訊(block/inode 總量、使用量、檔案系統狀態等)
- Group Descriptor:描述該 group 的 block/inode bitmap 位置等
- Block Bitmap:標記哪些 block 已被使用
- Inode Bitmap:標記哪些 inode 已被使用
- Inode Table:存放所有 inode 的實際資料
- 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。
硬連結與符號連結#
硬連結(Hard Link)#
硬連結是讓多個檔名指向同一個 inode。因為指向同一個 inode,所以:
- 修改任何一個檔名的內容,其他檔名也會看到變化
- 刪除其中一個檔名,只要還有其他檔名指向該 inode,資料就不會消失
- 不能跨檔案系統(因為不同檔案系統的 inode 編號是獨立的)
- 不能對目錄建立硬連結(避免造成目錄迴圈)
符號連結(Symbolic Link)#
符號連結是一個獨立的檔案,內容是另一個檔案的路徑。類似 Windows 的捷徑:
- 有自己獨立的 inode
- 可以跨檔案系統
- 可以指向目錄
- 如果原始檔案被刪除,符號連結就會變成斷鏈(dangling link)
在實務中,符號連結的使用遠多於硬連結。例如:
/usr/bin/python通常是一個指向特定版本 Python 的符號連結,方便版本切換。
磁碟的掛載與卸載#
將一個檔案系統連接到目錄樹的過程稱為掛載(mount)。掛載的要點:
- 掛載點必須是一個已存在的目錄
- 掛載後,該目錄原有的內容會被暫時隱藏
- 同一個檔案系統不應掛載到多個掛載點
/etc/fstab定義了開機時自動掛載的檔案系統
swap 空間#
Swap 是磁碟上的一塊空間,作為記憶體不足時的緩衝。當實體記憶體用完時,核心會將不常用的記憶體頁面換出到 swap,騰出空間給更需要的程式。
Swap 不是記憶體的替代品。磁碟的 I/O 速度比記憶體慢幾個數量級,頻繁使用 swap 代表系統效能已經嚴重下降。在記憶體充足的伺服器上,swap 主要是作為最後的安全網。