我正在編寫一個作業系統,並試圖讓它讀取 FAT12 檔案系統。因此,我需要一個 FAT12 磁碟映像,其中包含一些檔案以使其能夠讀取。
為了製作 FAT12 映像,我製作了一個空白的 .img 文件,然後用mkfs.fat -F12
它來建立文件系統。這似乎有效,因為使用環回設備安裝它會lsblk --fs
告訴我它是一個 FSVER=FAT12 的 vfat 檔案系統。我不知道為什麼它說它是 vfat,因為它不應該是,但我假設這正是 lsblk 關於 fat12 的說法,因為它確實正確地為我提供了 FAT12 作為其版本。
無論如何,據我所知,FAT12 檔案系統中的檔案名稱必須是8 個字元的名稱+ 3 個副檔名,因此我嘗試在掛載.img 後建立一個名為FILE.TXT 的文件,這符合預期。然後我嘗試創建一個名為 longfilename.longextension 的文件,令我驚訝的是,它讓我可以這樣做!
我打開 xxd 中的 .img 檔案來看看它如何儲存該檔案名,它確實儲存了整個長檔案名,儘管我認為這是不可能的。
這是所有 .img,不僅僅是零:
00000000: eb3c 906d 6b66 732e 6661 7400 0210 1000 .<.mkfs.fat.....
00000010: 0200 0200 80f8 1000 2000 4000 0000 0000 ........ .@.....
00000020: 0000 0000 8000 29d7 c938 d44e 4f20 4e41 ......)..8.NO NA
00000030: 4d45 2020 2020 4641 5431 3220 2020 0e1f ME FAT12 ..
00000040: be5b 7cac 22c0 740b 56b4 0ebb 0700 cd10 .[|.".t.V.......
00000050: 5eeb f032 e4cd 16cd 19eb fe54 6869 7320 ^..2.......This
00000060: 6973 206e 6f74 2061 2062 6f6f 7461 626c is not a bootabl
00000070: 6520 6469 736b 2e20 2050 6c65 6173 6520 e disk. Please
00000080: 696e 7365 7274 2061 2062 6f6f 7461 626c insert a bootabl
00000090: 6520 666c 6f70 7079 2061 6e64 0d0a 7072 e floppy and..pr
000000a0: 6573 7320 616e 7920 6b65 7920 746f 2074 ess any key to t
000000b0: 7279 2061 6761 696e 202e 2e2e 200d 0a00 ry again ... ...
000000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
000001f0: 0000 0000 0000 0000 0000 0000 0000 55aa ..............U.
00000200: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
00002000: f8ff ff00 f0ff ffff ffff ffff 0000 0000 ................
00002010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
00004000: f8ff ff00 f0ff ffff ffff ffff 0000 0000 ................
00004010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
00006000: 412e 0054 0072 0061 0073 000f 00e4 6800 A..T.r.a.s....h.
00006010: 2d00 3100 3000 3000 3000 0000 0000 ffff -.1.0.0.0.......
00006020: 5452 4153 482d 7e31 2020 2010 0011 8c7d TRASH-~1 ....}
00006030: 3952 3952 0000 8c7d 3952 0400 0000 0000 9R9R...}9R......
00006040: 4649 4c45 2020 2020 5458 5420 0071 aa7e FILE TXT .q.~
00006050: 3952 3952 0000 aa7e 3952 0300 0e00 0000 9R9R...~9R......
00006060: 426c 006f 006e 0067 0065 000f 00c8 7800 Bl.o.n.g.e....x.
00006070: 7400 6500 6e00 7300 6900 0000 6f00 6e00 t.e.n.s.i...o.n.
00006080: 016c 006f 006e 0067 0066 000f 00c8 6900 .l.o.n.g.f....i.
00006090: 6c00 6500 6e00 6100 6d00 0000 6500 2e00 l.e.n.a.m...e...
000060a0: 4c4f 4e47 4649 7e31 4c4f 4e20 0022 f47e LONGFI~1LON .".~
000060b0: 3952 3952 0000 f47e 3952 0700 1400 0000 9R9R...~9R......
000060c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
0000c000: 4865 6c6c 6f2c 2077 6f72 6c64 210a 0000 Hello, world!...
0000c010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
0000e000: 2e20 2020 2020 2020 2020 2010 0011 8c7d . ....}
0000e010: 3952 3952 0000 8c7d 3952 0400 0000 0000 9R9R...}9R......
0000e020: 2e2e 2020 2020 2020 2020 2010 0011 8c7d .. ....}
0000e030: 3952 3952 0000 8c7d 3952 0000 0000 0000 9R9R...}9R......
0000e040: 4169 006e 0066 006f 0000 000f 00fb ffff Ai.n.f.o........
0000e050: ffff ffff ffff ffff ffff 0000 ffff ffff ................
0000e060: 494e 464f 2020 2020 2020 2010 0011 8c7d INFO ....}
0000e070: 3952 3952 0000 8c7d 3952 0500 0000 0000 9R9R...}9R......
0000e080: 4166 0069 006c 0065 0073 000f 0079 0000 Af.i.l.e.s...y..
0000e090: ffff ffff ffff ffff ffff 0000 ffff ffff ................
0000e0a0: 4649 4c45 5320 2020 2020 2010 0011 8c7d FILES ....}
0000e0b0: 3952 3952 0000 8c7d 3952 0600 0000 0000 9R9R...}9R......
0000e0c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
00010000: 2e20 2020 2020 2020 2020 2010 0011 8c7d . ....}
00010010: 3952 3952 0000 8c7d 3952 0500 0000 0000 9R9R...}9R......
00010020: 2e2e 2020 2020 2020 2020 2010 0011 8c7d .. ....}
00010030: 3952 3952 0000 8c7d 3952 0400 0000 0000 9R9R...}9R......
00010040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
00012000: 2e20 2020 2020 2020 2020 2010 0011 8c7d . ....}
00012010: 3952 3952 0000 8c7d 3952 0600 0000 0000 9R9R...}9R......
00012020: 2e2e 2020 2020 2020 2020 2010 0011 8c7d .. ....}
00012030: 3952 3952 0000 8c7d 3952 0400 0000 0000 9R9R...}9R......
00012040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
00014000: 5468 6973 2069 7320 6120 6c6f 6e67 2066 This is a long f
00014010: 696c 650a 0000 0000 0000 0000 0000 0000 ile.............
00014020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
00fffff0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
因此,看起來它確實以與 vfat 檔案系統規格中的長檔案名稱類似的格式儲存檔案名稱。
知道為什麼嗎?
編輯:我運行了這個命令:
$ dosfsck test.img -l
fsck.fat 4.1 (2017-01-24)
Checking file /.Trash-1000 (TRASH-~1)
Checking file /FILE.TXT
Checking file /longfilename.longextension (LONGFI~1.LON)
Checking file /.Trash-1000/.
Checking file /.Trash-1000/..
Checking file /.Trash-1000/info (INFO)
Checking file /.Trash-1000/files (FILES)
Checking file /.Trash-1000/info/.
Checking file /.Trash-1000/info/..
Checking file /.Trash-1000/files/.
Checking file /.Trash-1000/files/..
test.img: 5 files, 5/2043 clusters
查看 longfilename 文件,它後面顯示它實際上名為 LONGFI~1.LON,這更符合我的預期。但是,它怎麼知道我實際上將其命名為 longfilename.longextension 呢?我也不確定所有這些垃圾檔案來自哪裡,這是儲存名稱的嗎?
答案1
FAT12、FAT16 和 FAT32 表示檔案分配表的大小,因此決定磁碟上分配區塊的最大數量,從而決定磁碟本身的大小。
實際上內容目錄結構的一部分由檔案系統驅動程式寫入,不儲存在 FAT 中。長檔名儲存在檔案系統目錄結構中已存在的「隱藏」結構中。目錄使用類似於實際文件的分配塊,它們本質上是一種特殊類型的文件,可以索引其他文件並具有特定的結構。
VFAT是FAT的擴充。理論上,長檔名不會成為問題,因為「純」DOS 程式根本看不到長檔名。
來自維基百科長檔名
Microsoft 透過使用卷標類型的隱藏目錄條目來儲存較長的名稱,從而在 FAT 檔案系統中實現了對 LFN 的支援;這個方案稱為 VFAT,選擇它是為了實現相容性,因為程式和作業系統 (OS) 元件通常會忽略卷標。在舊作業系統上執行的程式仍然可以存取檔案的短名稱,而較新的、支援 LFN 的作業系統和程式可以使用較長的檔案名稱。
您可以在維基百科上閱讀更多內容FAT檔案系統的設計:VFAT它顯示了在目錄結構中實現檔案名稱的長度。