上一篇介紹了 NTFS 的四個核心:
$MFT
$Boot
$Bitmap
$LogFile
其中最重要的就是 $MFT。
NTFS 會把與 File 有關的資訊拆成不同的 Attribute。
例如:
| Attribute | 用途 |
|---|---|
$STANDARD_INFORMATION |
File 時間、屬性等資訊 |
$FILE_NAME |
File Name |
$DATA |
File Content |
$ATTRIBUTE_LIST |
記錄其他 Attribute 的位置 |
Resident Attribute 是資料直接放在 MFT Record 裡。
例如:
MFT Record
┌────────────────────────────┐
│ Header │
├────────────────────────────┤
│ $STANDARD_INFORMATION │
├────────────────────────────┤
│ $FILE_NAME │
├────────────────────────────┤
│ $DATA │
│ │
│ Hello World │
│ │
└────────────────────────────┘
資料本身就在 MFT Record 裡。
所以不需要再去其他 Cluster 找 File Content。
資料夠小,就有可能直接放進 MFT Record。
但不是小於某個固定大小就一定 Resident。
因為 MFT Record 還需要放:
Header
File Name
Standard Information
其他 Attribute
所以實際可用空間會受到整個 MFT Record 結構影響。
如果資料太大,MFT Record 放不下怎麼辦?
這時候就會使用Non-Resident Attribute。
資料不放在 MFT Record 裡,而是放到其他 Cluster。
例如:
MFT Record
┌──────────────────────────┐
│ Header │
├──────────────────────────┤
│ $STANDARD_INFORMATION │
├──────────────────────────┤
│ $FILE_NAME │
├──────────────────────────┤
│ $DATA │
│ │
│ 「資料放在哪裡?」 ───────┼──────┐
└──────────────────────────┘ │
↓
Disk Clusters
┌───┬───┬───┬───┐
│ │ │ │ │
└───┴───┴───┴───┘
MFT Record 裡不放完整的 File Content,而是記錄這些資料要去哪裡找。
假設:
secret.jpg
是一個很大的檔案。
它的資料可能分散在:
Cluster 100
Cluster 101
Cluster 102
...
Cluster 500
Cluster 501
那 NTFS 怎麼知道這些 Cluster 是 secret.jpg 的資料?
這時就需要 VCN 和 LCN。
VCN (Virtual Cluster Number)
↓
File 裡面的 Cluster 位置
LCN (Logical Cluster Number)
↓
Volume 上的 Cluster 位置
VCN 是從檔案本身的角度來看,表示資料位於檔案中的第幾個 Cluster。
LCN 則是從整個 NTFS Volume 的角度來看,表示這些資料位於 Volume 中的哪一個 Logical Cluster。
例如一個檔案需要 4 個 Cluster,可能會是:
檔案
VCN 0 → LCN 100
VCN 1 → LCN 101
VCN 2 → LCN 500
VCN 3 → LCN 501
這代表檔案的前兩個 Cluster 放在 Volume 的 LCN 100、101,但後兩個 Cluster 跑到了 LCN 500、501。
也就是說,檔案在邏輯上是連續的,但實際配置的位置可以是不連續的。
NTFS 會透過對應資訊記錄 VCN 與 LCN 的關係,而這些連續配置的 Cluster 會形成一個 Extent(Run)。例如 VCN 0~1 對應 LCN 100~101,可以視為一個連續區段;VCN 2~3 則對應到另一個區段。
Run List / Mapping Pairs 的功能是 描述 File 的 VCN 如何對應到 Volume 上的 LCN。
假設:
secret.txt
總共有 6 個 Cluster。
實際配置:
VCN 0 → LCN 100
VCN 1 → LCN 101
VCN 2 → LCN 102
VCN 3 → LCN 500
VCN 4 → LCN 501
VCN 5 → LCN 502
可以發現:
VCN 0~2
↓
LCN 100~102
VCN 3~5
↓
LCN 500~502
所以不用一個一個記:
0 → 100
1 → 101
2 → 102
3 → 500
4 → 501
5 → 502
而可以表示成兩個 Run:
Run 1
VCN 0~2 → LCN 100~102
Run 2
VCN 3~5 → LCN 500~502
這就是 Run List 的概念。
MFT Record
│
↓
$DATA
│
┌────────┴────────┐
↓ ↓
Resident Non-Resident
│ │
↓ ↓
Data 在 MFT 裡 Data 在其他 Cluster
│
↓
Run List
│
┌──────┴──────┐
↓ ↓
VCN LCN
│ │
↓ ↓
File 裡的位置 Volume 上的位置