Linux 檔案系統基本知識
檔案目錄結構
FHS 網路上一大堆,沒必要重複寫。
檔案類型
Linux 的特色是萬物皆文件,即使是硬碟也會在檔案系統中變成 /dev/hda
/dev/sda
等等。這樣的好處是可以用相同的指令控制硬體設備,簡化系統管理與操作。Linux 檔案系統中的檔案分為以下幾種類型:
- 普通檔案 (-): 包含數據,如文本、圖像或程式碼。
- 目錄 (d): 包含其他檔案和目錄的清單。
- 符號連結 (l): 指向其他檔案或目錄的捷徑。
- 設備檔案
- 塊設備 (b): 如硬碟,可以隨機訪問數據。
- 字符設備 (c): 如終端,數據按順序處理。
- 命名管道 (p): 進程間通訊的特殊檔案。
- 套接字 (s): 網路通訊的特殊檔案。
inode
inode 記錄檔案元資料,和檔案實際內容分開儲存,每個文件都有對應的 inode,我們可以用 df -i
查看 inode 總數已用數量,元資料包含
- 檔案大小(字節數)
- 文件位置在硬碟中的位置
- user ID (UID), group ID (GID), 權限
- modification time (mtime), create time (ctime), access time (atime)
- 連結數量,有多少文件名稱指向此 inode
這個特性讓我們在移動檔案時幾乎沒有延遲,因為只需要修改 inode 的元數據就等於移動檔案了,也因此在檔案刪不掉的時可以改為直接刪 inode。
軟連結和硬連結
軟連結可以理解為 Windows 的捷徑,訪問軟連結時會自動將操作指向軟連結的實際目標,硬連結則是多個檔案名稱指向同一個 inode,有很多入口,只要還有一個入口存在,檔案就不會被刪除。
硬連結比較少用,不過有一個很好的例子:在 uv 中所有套件都會被放在快取資料夾,在每個專案下載套件只是從快取資料夾 hard link 過去,這樣不只速度快不需重複下載,多個專案共用相同套件也會不浪費容量。除此之外,硬連結不能跨硬碟,不被 Git 辨識。
軟連結很好理解,但是提供一個小陷阱,不是所有程式都支援軟連結,例如 Nix 把他的設定檔放在 ~/.config
裡面,而 Nix 本身又使用軟連結,這時如果你的 ~/.config
是他就會追錯資料夾。
Logical Volume Manager
一般來說一個硬碟掛載就掛載了,設定完就不能再新增容量,但是 LVM 可以解決這問題。LVM 是把儲存空間虛擬化的技術,由實體硬碟 Physical Volume (PV),扮演中間人的 Volume Group (VG),和最後被掛載到系統上的 Logical Volume (LV) 三個組成,概念是透過 VG 作為中間人,只要更改 VG 映射就可以輕鬆修改掛載區空間。
這是簡化的架構,例如 PV 可以是磁碟分區,完整請見 How to create a physical volume in Linux using LVM。
以 macOS 為例打開 Disk Utility 看到的卷宗群組就是 VG,裡面有 Macintosh HD
和 Macintosh HD - Data
兩個卷宗,這個卷宗就是 PV。本文原本只是想搞懂 macOS 這兩個到底是什麼東西,不過既然功課都做了就寫成文章。macOS 的實現一定和 Linux 不一樣,這個段落是說他們概念相同。
資料保護觀念
附帶一提,現實上完全沒必要用 LVM,這個結論來自於數據保護的觀點,因為這東西沒有冗餘機制,硬碟又是一新一舊,哪天舊的壞了會讓你連新的都要處理,比手動搬移硬碟麻煩一百倍。檔案系統 btrfs 或 ZFS 都有 pool 和快照功能,資料救援廠商對 btrfs 也很熟悉,不要拿一個很少人用的方式挑戰廠商的技術,就算挑戰成功傷害的也是自己的錢包,更不要說資料救援本來就不保證資料救的回來。
那如果已經頭洗下去用 ext4 怎麼辦?加硬碟後直接掛載使用,把新硬碟當作資料碟,設定跑掉沒差,檔案沒了就是沒了。