Wie gehe ich mit dem Hinzufügen neuer Dateien und Verzeichnisse zum FAT12-Disketten-Image von Ubuntu 16.04 um?

518
Yos

Ich muss ein Programm schreiben, das ein Floppy-Image von FAT12 erstellt. Die Anweisungen umfassen das Erstellen eines Bootsektors, das Sicherstellen, dass ich Platz für zwei FAT-Tabellen reserviert habe, und den Speicherplatz für das Stammverzeichnis und schließlich für die Daten einrichten. Die Anweisungen erwähnen jedoch nichts über den Umgang mit neuen Dateien / Verzeichnissen.

Angenommen, ich habe ein fertiges Floopy-Image namens "Floppy". Dann kann ich die Diskette in Ubuntu-Terminal einbinden:

sudo mount -o loop,uid=user, gid=user floppy mntpoint/  mkdir mntpoint/test  echo "Hello World" > mntpoint/test/foo 

Erkennt mount automatisch die im Bootsektor enthaltenen Informationen und erkennt, dass es sich um FAT12 handelt? Wenn ja, woher weiß man mount, wo die fooDatei im Disketten-Image abgelegt werden soll? Ich gehe davon aus, dass ich irgendwie damit umgehen muss. Aber wie kann ich zum Beispiel mit dieser Zeile umgehen, welche Art von Funktionen müsste ich haben?

echo "Hello World" > mntpoint/test/foo 

Ich schreibe in C. Ich füge den Code nicht hinzu, weil meine Frage nicht codespezifisch ist, sondern eher konzeptuell. Nur für den Fall, dass ich den Code für die Bootsektorstruktur hinzufüge:

typedef struct { uint8_t bootjmp[3]; /* 0 Jump to boot code */ uint8_t oem_id[8]; /* 3 OEM name & version */ uint16_t sector_size; /* 11 Bytes per sector hopefully 512 */ uint8_t sectors_per_cluster; /* 13 Cluster size in sectors */ uint16_t reserved_sector_count; /* 14 Number of reserved (boot) sectors */ uint8_t number_of_fats; /* 16 Number of FAT tables hopefully 2 */ uint16_t number_of_dirents; /* 17 Number of directory slots */  /* * If 0, look in sector_count_large */ uint16_t sector_count; /* 19 Total sectors on disk */ uint8_t media_type; /* 21 Media descriptor=first byte of FAT */  /* * Set for FAT12/16 only. * * The number of blocks occupied by one copy of the File Allocation Table. */ uint16_t fat_size_sectors; /* 22 Sectors in FAT */ uint16_t sectors_per_track; /* 24 Sectors/track */ uint16_t nheads; /* 26 Heads */ uint32_t sectors_hidden; /* 28 number of hidden sectors */ uint32_t sector_count_large; /* 32 big total sectors */   } __attribute__ ((packed)) boot_record_t; 
0
Müssen Sie nur das Dateisystem erstellen oder Dateien einfügen? Ein Dateisystem ist dumm und weiß in den meisten Fällen nicht, wie Dateien hinzugefügt werden sollen, da diese Logik im Betriebssystem und im Dateisystemtreiber implementiert wird. Seth vor 6 Jahren 1
@Seth Ich muss das System erstellen, aber sie müssen das Hinzufügen von Dateien unterstützen, wie im Echo-Beispiel. Yos vor 6 Jahren 0
Wäre dies für StackOverflow besser geeignet, da es im Wesentlichen programmierbezogen ist? Ein User (sogar ein "Superuser" ;-) würde einfach ein Echo montieren. Und haben Sie den Quellcode des dicken Treibers noch durchgesehen, sollten alle "wie" Antworten irgendwo drin sein. Xen2050 vor 6 Jahren 0
@ Xen2050 Ich habe diese Frage am Anfang an StackOverflow geschrieben, aber sie sagten, sie gehöre nicht zu SO und schlug vor, sie hier zu posten. Auf jeden Fall wurde meine grundlegende Frage jetzt beantwortet. Yos vor 6 Jahren 0

1 Antwort auf die Frage

3
grawity

mountverwendet nur den gleichen Dateisystemtreiber wie beim Mounten von echten Festplatten und USB-Sticks. Ja, es erkennt FAT12.

Sie können es explizit anweisen, den FAT-Treiber mithilfe von -t vfat(oder -t msdos) zu verwenden. Wenn Sie dies nicht tun, versucht es automatisch zu erkennen, welches Dateisystem sich darin befindet (mit libblkid, wenn ich mich recht erinnere) und ruft trotzdem vfat auf.

Anstatt das Image zu mounten, können Sie alternativ das "mtools" -Paket (mcopy, mdir usw.) verwenden, um es direkt zu aktualisieren.

ja, aber was ist mit dem Hinzufügen von Dateien zu diesem System? Weiß das übergeordnete Betriebssystem (Linux), wann in meinem Beispiel die 'foo'-Datei zugewiesen wird? Oder muss diese Logik in einem Diskettenbild sein? Yos vor 6 Jahren 0
Diese Logik befindet sich innerhalb des Dateisystemtreibers, der vom Betriebssystem verwendet wird. Der Treiber versteht die Verzeichniseinträge und kann eine neue hinzufügen. grawity vor 6 Jahren 0
Wenn ich also FAT12 schreiben muss, muss ich auch diese Logik schreiben? Yos vor 6 Jahren 0
Wenn Ihr Programm das gesamte Dateisystem "von Hand" erstellen möchte, muss es ja genau das tun, was Dateisystemtreiber normalerweise tun. (Aber Sie können dafür wahrscheinlich eine Bibliothek finden.) grawity vor 6 Jahren 1
Was ich nicht verstehe, ist die Kommunikation zwischen dem Betriebssystem und FAT12. Wenn der Benutzer in Linux die Zeile `echo" Hellow World "> mntpoint / test / foo` eingibt, wie erhält der FAT12-Treiber zuerst die` foo'-Datei und entscheidet dann, wo er in FAT12 platziert werden soll. Yos vor 6 Jahren 0
Sie müssten sich mit den Besonderheiten dieses Treibers und dem Standard befassen, wie dies zu tun ist. Bei Ihrer obigen Operation sind bereits einige Operationen beteiligt. Für Ihre Anwendung ist es ein einfaches Schreiben, aber der FS muss gemountet sein, es muss ein gemounteter Speicherort erkannt werden, die FDs müssen entsprechend geöffnet werden und die Daten müssen an den / durch den FS-Treiber übergeben werden. Seth vor 6 Jahren 1