Learning Objectives
- 說明檔案、目錄、路徑與中繼資料,以及檔案系統把磁碟區塊組織成檔案的角色
- 比較連續配置、鏈結配置與索引配置(i-node)在讀取、加大檔案與空間利用上的取捨
- 解釋外部碎片、內部碎片與磁碟重組
- 說明刪除檔案時實際發生的事,判斷檔案在什麼情況下還救得回來
- 認識常見的檔案系統(FAT32、exFAT、NTFS、ext4、APFS)與它們的使用場合
這一課要回答的問題
你可能遇過這些情況:
- 隨身碟還有 20 GB 空間,複製一個 5 GB 的影片卻出現「檔案太大」
- 不小心刪掉報告,朋友說「先不要再存任何東西,還救得回來」
- 一個只有幾個字的文字檔,內容寫「大小 12 位元組」,卻「佔用磁碟空間 4 KB」
- 舊電腦跑很慢,有人建議你做「磁碟重組」
這些都和檔案系統(file system)有關。硬碟、SSD、隨身碟對作業系統來說,只是一大排編了號、大小固定的區塊(block)。 檔案系統負責把這些區塊組織成你看得到的檔案與資料夾,並且記住每個檔案放在哪些區塊。
這一課要回答:檔案系統怎麼記錄一個檔案放在哪裡?刪除檔案時,資料真的不見了嗎?
檔案、目錄與中繼資料
檔案(file)是一筆有名字的資料:一份報告、一張照片、一個程式。 目錄(directory,也就是資料夾)用來分類檔案,目錄裡還可以有目錄,整個結構像一棵倒過來的樹,最上層叫根目錄。
路徑(path)是從某個目錄走到檔案的路線:
| 寫法 | 例子 | 說明 |
|---|---|---|
| 絕對路徑 | /home/mei/文件/報告.docx(Linux、macOS)、C:\Users\Mei\Documents\報告.docx(Windows) |
從根目錄(或磁碟機代號)開始寫,在哪裡用都指向同一個檔案 |
| 相對路徑 | 文件/報告.docx、../照片/貓.png |
從「目前所在的目錄」開始算;.. 表示上一層 |
除了內容,檔案系統還替每個檔案記錄中繼資料(metadata):大小、建立與修改時間、擁有者、權限,以及最重要的:資料放在哪些區塊。
區塊是配置空間的最小單位。假設一個區塊是 4 KB(常見的大小,示意),一個 12 位元組的文字檔也要佔用一整個區塊, 剩下沒用到的空間別的檔案不能用,這叫內部碎片(internal fragmentation)。這就是「大小」和「佔用磁碟空間」不一樣的原因。
三種配置方式:檔案放在哪些區塊
檔案可能需要很多個區塊。檔案系統要決定用哪些區塊,還要記住它們。教科書常見三種做法:
| 配置方式 | 怎麼記錄 | 讀第 k 塊 | 加大檔案 | 缺點 |
|---|---|---|---|---|
| 連續配置(contiguous) | 目錄只記「起點+長度」 | 直接算出位置:起點+(k−1) | 後面被占用時要整個搬家 | 刪除後留下零碎的空洞,大檔案放不進去(外部碎片) |
| 鏈結配置(linked) | 目錄記第一塊;每一塊裡記著下一塊在哪 | 要從第一塊一路走過去 | 任何空區塊都能接上去 | 讀後面的區塊很慢;一個指標壞掉,後面全斷 |
| 索引配置(indexed) | 用一份清單列出全部區塊(Unix 類系統的 i-node 就是這種概念) | 查清單一次就知道位置 | 在清單後面加一項 | 每個檔案都要多一份清單的空間 |
真實的檔案系統常混合使用:例如 FAT 系列用一張「檔案配置表」記錄每個區塊的下一塊(鏈結的變形); ext4 等檔案系統用 i-node 記錄區塊,並盡量把同一個檔案放在連續的區塊(一段一段記錄),兼顧讀取速度。
外部碎片與磁碟重組
剛剛看到的現象:檔案不斷建立、刪除、加大,可用空間被切成很多小段。
- 外部碎片:空間總量夠,但沒有一段夠大的連續空間。連續配置最怕這個。
- 檔案被切成好幾段:鏈結與索引配置雖然放得下,但同一個檔案的區塊散在各處。 傳統硬碟(HDD)讀取時要移動磁頭、等碟片轉到位置,讀分散的區塊比讀連續的區塊慢很多(第 13 課)。
磁碟重組(defragmentation)就是把每個檔案搬成連續的、把可用空間集中在一起。代價是要搬動大量資料、花時間。
固態硬碟(SSD)沒有磁頭要移動,讀分散的區塊不會像傳統硬碟那樣慢,一般不需要做重組; 作業系統對 SSD 做的「最佳化」主要是通知它哪些區塊已經不用了(TRIM),方便它在背景清理。
想一想:區塊與配置方式
區塊大小是 4 KB。一個 10 KB 的檔案實際佔用多少磁碟空間?
影片播放器常常要「跳到第 45 分鐘」,也就是直接讀檔案中間的某一塊。哪一種配置方式最不適合?
連續配置下,一個檔案後面的區塊已經被別的檔案占用,現在要把它加大,會發生什麼事?
刪除檔案時發生了什麼
在 Unix 類系統(Linux、macOS)裡,檔案的中繼資料放在 i-node,每個 i-node 有一個編號;
目錄其實也是一個檔案,內容是一張「名稱 → i-node 編號」的對照表。打開 /照片/貓.png 的過程是:
讀根目錄 → 找到「照片」的 i-node → 讀照片目錄 → 找到「貓.png」的 i-node → 從 i-node 得知資料在哪些區塊。
那麼刪除檔案時呢?為了速度,檔案系統通常不會把資料一格一格清掉,只做這幾件事:
- 從目錄裡拿掉這個名稱
- 把 i-node 標成「未使用」
- 在可用空間點陣圖(bitmap)裡,把它的區塊標成「可用」(0)
資料本身還留在區塊裡,直到有新檔案剛好用到那些區塊、把它覆寫掉。所以:
| 情況 | 能不能救回 |
|---|---|
| 剛刪除、還沒寫入新資料 | 救援工具常常能找回來 |
| 刪除後又存了很多新檔案 | 部分或全部區塊被覆寫,救回來的檔案可能是壞的 |
| 用「徹底抹除」工具先把區塊寫成 0 再刪除 | 救不回來 |
| SSD 已經對那些區塊執行 TRIM | 通常救不回來 |
誤刪檔案時的第一件事:停止在那顆磁碟上寫入任何東西。反過來說,要把舊電腦或隨身碟送人之前, 只按「刪除」並不安全,應該用作業系統的重設或清除功能。
平常按刪除,多半先進到資源回收筒(Windows)或垃圾桶(macOS),其實只是把檔案搬到一個特別的資料夾,還沒有真的刪除;清空之後才是上面說的情況。
常見的檔案系統
格式化(format)一顆磁碟,就是在上面建立一個新的、空的檔案系統。不同作業系統與裝置用的檔案系統不同:
| 檔案系統 | 常見用途 | 特點 |
|---|---|---|
| FAT32 | 隨身碟、記憶卡、相機 | 幾乎所有裝置都能讀寫;單一檔案最大約 4 GB(記錄檔案大小的欄位只有 32 位元) |
| exFAT | 大容量隨身碟、記憶卡 | 一樣容易跨平台使用,沒有 4 GB 的單檔限制 |
| NTFS | Windows 的系統磁碟 | 支援權限、日誌、壓縮與加密等功能 |
| ext4 | 許多 Linux 發行版的預設 | 使用 i-node、支援日誌 |
| APFS | Apple 的電腦與行動裝置 | 為 SSD 設計,支援快照與加密 |
開頭那個「隨身碟有空間卻放不下 5 GB 影片」的情況,原因就是隨身碟格式化成 FAT32;改成 exFAT 就能放(格式化會清除隨身碟上的資料,先備份)。
日誌(journaling)是什麼?寫入檔案要改好幾個地方(資料區塊、i-node、點陣圖、目錄),如果寫到一半停電,檔案系統可能前後不一致。 有日誌的檔案系統會先把「我要做哪些修改」記下來,再真正去改;重開機時照著日誌補完或取消,就不必花很長時間檢查整顆磁碟。
想一想:刪除、救回與檔案系統
清空資源回收筒之後,檔案的資料區塊通常變成什麼狀態?
你誤刪了隨身碟裡的作業,下面哪一個做法最可能讓它救不回來?
一支 64 GB 的隨身碟還有 30 GB 可用,複製一個 6 GB 的影片時出現「檔案太大」。最可能的原因是?
重點整理
- 檔案系統把磁碟上編了號的區塊組織成檔案與目錄,並記錄每個檔案的中繼資料:大小、時間、權限,以及資料在哪些區塊。
- 區塊是配置的最小單位;最後一塊用不滿的空間是內部碎片,所以「佔用磁碟空間」常比「大小」大。
- 連續配置讀取最快、但怕外部碎片與加大;鏈結配置不怕碎片、但讀中間的區塊要一路走過去;索引配置(i-node)用一份清單記錄全部區塊,兼顧兩者。
- 磁碟重組把檔案搬成連續的,對傳統硬碟有幫助;SSD 一般不需要。
- 目錄是「名稱 → i-node」的對照表。刪除檔案只是拿掉名稱、把 i-node 與區塊標成可用;資料被覆寫之前常常救得回來,徹底抹除或 SSD 的 TRIM 之後通常救不回來。
- 常見檔案系統:FAT32(相容性最好,單檔約 4 GB 上限)、exFAT、NTFS、ext4、APFS;有日誌的檔案系統在停電後比較容易恢復一致。
想親手用指令操作檔案與目錄,可以接著上 Linux 軌。
下一課:電腦裡的檔案大多是別人寫好的軟體。安裝程式做了什麼?為什麼要一直更新?授權條款又在說什麼?