Warum funktioniert mkfs.vfat für eine Datei, auf die dd folgt, in ein Festplatten-Image nicht?

685
deitch

Ich erstelle eine 100M-Platte img und partitioniere sie sgdisk, um einen BIOS-Start und eine ESP-Partition zu erstellen.

dd if=/dev/zero of=file.img bs=1M count=100 sgdisk --clear -n 1:2048:4095 -t 1:ef02 -c 1:'BIOS Boot' -n 2:4096:17983 -t 2:ef00 -c 2:'EFI System Partition' 

Dann erstelle ich eine Partition und formatiere sie für FAT:

losetup -f file.img -P mkfs.vfat /dev/loop0p2 
  1. Wenn ich das montiere /dev/loop0p2, kein Problem.
  2. Wenn ich die Partition img kopiere und mounte, kein Problem:

    dd if = file.img von = part2.img bs = 512 count = 13888 überspringen = 4095

Jetzt part2.imgist es direkt montierbar. Wenn ich ddes wieder in das Image stecke, bleibt es montierbar

dd if=part2.img of=file.img bs=512 count=13888 seek=4095 conv=notrunc 

Berg der /dev/loop0p2Arbeiten gut.

Wenn ich jedoch eine gleich große Partition img erstelle:

mkfs.vfat -C directpart.img 13888 dd if=directpart.img of=file.img bs=512 count=13888 seek=4095 conv=notrunc 

Die Datei directpart.imgkann genauso wie part2.img(die aus dem Disk-Image extrahiert wurde) gemountet werden . Die Montage /dev/loop0p2funktioniert jedoch nicht mehr.

Was ist mkfs.vfatanders bei einer Partition in einer img-Datei (oder einem realen Blockgerät) einer eigenständigen Datei?

Interessanterweise, wenn ich losetupdas Volldatenträger-Image verwende, dd if=<new_file> of=/dev/loop0p2funktioniert das sowohl mit der direkt mkfs.vfat -C <new_file> erstellten Datei als auch mit der von ddder Festplatte erstellten Datei .

0
Was genau meinen Sie / haben Sie mit "dd in die exakte Partition im ursprünglichen Disk-Image" getan? Tom Yan vor 6 Jahren 0
Und wie wird diese file.img im ersten Absatz erwähnt? Ihr Beitrag ist ziemlich verwirrend, um ehrlich zu sein ... Tom Yan vor 6 Jahren 0
OK, ich kann es aktualisieren. deitch vor 6 Jahren 0
Ist das klarer? deitch vor 6 Jahren 0
Sie sollten = 4096 suchen, da der Partitionsbeginn bei LBA 4096 beginnt, d. H. 4096 Blöcke davor (LBA 0 - LBA 4095). Tom Yan vor 6 Jahren 0
So einfach? Ein Tippfehler, weil ich auf Sektorende vs. Start gesucht habe? Ich werde schauen... deitch vor 6 Jahren 0
Ich glaube es nicht Es ist wirklich so einfach. @TomYan poste es als Antwort. Ich habe die Ausgabe hier aus einem Skriptlauf eingefügt und hatte einen Tippfehler im Skript. Seufz ... Danke! deitch vor 6 Jahren 0
Eines der Off-Topic-Typen "ef02" sollte in der Realität nicht für ein ESP verwendet werden. ef00 ist der zu verwendende Typ. Die BIOS-Bootpartition wird von grub nur zum Einbetten von core.img verwendet und sollte daher nicht formatiert werden. Die empfohlene Größe beträgt 1 ~ 2MiB. Tom Yan vor 6 Jahren 0
Tom ja, das war nur ein Tippfehler. `ef00` ist der Partitionstyp, den ich für ESP verwende. `ef02` ist für den BIOS-Boot-Sektor (eigentlich verwende ich hier überhaupt kein Bios, nur von einer früheren Multi-Bios-Bootdiskette geändert). deitch vor 6 Jahren 0
Ah, ich habe den Befehl sgdisk falsch gelesen. Mein Fehler. Tom Yan vor 6 Jahren 0

1 Antwort auf die Frage

1
Tom Yan

Sie sollten 4096 für seek = und überspringen = verwenden, da die zweite Partition mit LBA 4096 beginnt, d. H., Es gibt 4096 Blöcke davor, nämlich LBA 0 - 4095.

Auch bekannt als, PEBKAC aka "Benutzer machte einen dummen Fehler beim Kopieren und wusste nicht, was er getan hat." Danke an TomYan für die Suche. deitch vor 6 Jahren 0