Linux ではなぜ FAT12 ファイルシステムに長い名前のファイルを作成できるのでしょうか

Linux ではなぜ FAT12 ファイルシステムに長い名前のファイルを作成できるのでしょうか

私はオペレーティング システムを作成しており、FAT12 ファイルシステムを読み取らせようとしています。そのため、読み取るためにいくつかのファイルが入った FAT12 ディスク イメージが必要です。

FAT12 イメージを作成するために、空の .img ファイルを作成し、mkfs.fat -F12それを使用してファイルシステムを作成しました。ループバック デバイスでマウントすると、lsblk --fsFSVER=FAT12 の vfat ファイルシステムであると表示されるので、これはうまくいったようです。なぜ vfat と表示されるのかはわかりません。そうであるはずがないのに、lsblk が fat12 について言っているのは、その通りだと想定しています。lsblk はバージョンとして 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 プログラムは長いファイル名を認識しないからです。

Wikipediaより長いファイル名

Microsoft は、長い名前を保存するためにボリューム ラベル タイプの隠しディレクトリ エントリを使用することで、FAT ファイルシステムに LFN のサポートを実装しました。このスキームは VFAT と呼ばれ、ボリューム ラベルは一般にプログラムやオペレーティング システム (OS) コンポーネントによって無視されるため、互換性のために選択されました。古い OS で実行されているプログラムは、ファイルの短い名前にアクセスできますが、LFN 対応の新しい OS とプログラムは、長い名前を使用できます。

詳細はWikipediaでご覧くださいFAT ファイルシステムの設計: VFATこれは、ディレクトリ構造内でファイル名がどのくらい長く実装されているかを示しています。

関連情報