Warum kann ich unter Linux eine Datei mit einem langen Namen in einem FAT12-Dateisystem erstellen?

Warum kann ich unter Linux eine Datei mit einem langen Namen in einem FAT12-Dateisystem erstellen?

Ich schreibe ein Betriebssystem und versuche, es dazu zu bringen, FAT12-Dateisysteme zu lesen. Daher möchte ich ein FAT12-Disk-Image mit einigen darauf befindlichen Dateien, um es lesen zu können.

Um mein FAT12-Image zu erstellen, habe ich eine leere IMG-Datei erstellt und mkfs.fat -F12diese dann zum Erstellen des Dateisystems verwendet. Das scheint funktioniert zu haben, denn wenn ich es mit einem Loopback-Gerät mounte, wird lsblk --fsmir angezeigt, dass es sich um ein VFAT-Dateisystem mit FSVER=FAT12 handelt. Ich bin mir nicht sicher, warum es VFAT anzeigt, denn das sollte es nicht sein, aber ich gehe davon aus, dass lsblk genau das über FAT12 anzeigt, da es mir korrekt FAT12 als Version anzeigt.

Wie dem auch sei, meines Wissens muss ein Dateiname in einem FAT12-Dateisystem 8 Zeichen für den Namen + 3 Zeichen für die Erweiterung haben, also habe ich versucht, nach dem Mounten der IMG-Datei eine Datei mit dem Namen FILE.TXT zu erstellen, und das funktioniert wie erwartet. Dann habe ich versucht, eine Datei mit dem Namen longfilename.longextension zu erstellen, und zu meiner Überraschung war das möglich!

Ich habe die IMG-Datei in xxd geöffnet, um mir anzusehen, wie dieser Dateiname gespeichert wird. Tatsächlich wird der gesamte lange Dateiname gespeichert, obwohl ich nicht glaube, dass das möglich sein sollte.

Hier sind die gesamten IMG-Dateien, die nicht nur aus Nullen bestehen:

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  ................

Es scheint also tatsächlich so, als würde der Dateiname in einem ähnlichen Format gespeichert wie die langen Dateinamen in der VFAT-Dateisystemspezifikation.

Irgendeine Idee, warum?

BEARBEITEN: Ich habe diesen Befehl ausgeführt:

 $ 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

und wenn ich mir die Datei mit dem langen Dateinamen anschaue, steht dahinter, dass sie eigentlich LONGFI~1.LON heißt, was eher meinen Erwartungen entspricht. Aber woher kann sie dann wissen, dass ich sie eigentlich longfilename.longextension genannt habe? Ich bin mir auch nicht sicher, woher all diese Mülldateien kamen. Ist das das, was den Namen speichert?

Antwort1

FAT12, FAT16 und FAT32 geben die Größe der Dateizuordnungstabelle an und bestimmen daher die maximale Anzahl von Zuordnungsblöcken auf der Festplatte und somit die Größe der Festplatte selbst.

Die eigentlicheInhaltder Verzeichnisstruktur werden vom Dateisystemtreiber geschrieben und nicht in der FAT gespeichert. Lange Dateinamen werden in „versteckten“ Strukturen gespeichert, die bereits in der Verzeichnisstruktur des Dateisystems vorhanden sind. Verzeichnisse verwenden Zuordnungsblöcke ähnlich wie echte Dateien. Sie sind im Wesentlichen eine spezielle Art von Datei, die andere Dateien indiziert und eine bestimmte Struktur hat.

VFAT ist die Erweiterung von FAT. Theoretisch sind lange Dateinamen kein Problem, da „reine“ DOS-Programme lange Dateinamen einfach nicht sehen sollten.

Aus WikipediaLanger Dateiname

Microsoft hat die Unterstützung für LFNs im FAT-Dateisystem implementiert, indem es versteckte Verzeichniseinträge vom Typ „Datenträgerbezeichnung“ verwendet, um die längeren Namen zu speichern. Dieses Schema ist als VFAT bekannt und wurde aus Kompatibilitätsgründen gewählt, da Datenträgerbezeichnungen im Allgemeinen von Programmen und Betriebssystemkomponenten (OS) ignoriert werden. Programme, die auf älteren Betriebssystemen laufen, können weiterhin auf die Kurznamen der Dateien zugreifen, während neuere, LFN-fähige Betriebssysteme und Programme die längeren verwenden können.

Mehr dazu erfahren Sie bei WikipediaAufbau des FAT-Dateisystems: VFATwelches zeigt, wie lange Dateinamen in den Verzeichnisstrukturen implementiert sind.

verwandte Informationen