Wie kann ich ein Volume ohne Schleife in eine reguläre Datei partitionieren?

Wie kann ich ein Volume ohne Schleife in eine reguläre Datei partitionieren?

Ich versuche, mit der Betriebssystementwicklung herumzuspielen, und habe mit einem Bootloader begonnen, bei dem Phase 0 Phase 1 aus einer Datei (angegeben durch Inode) auf einer ext4-Partition (angegeben durch erstes LBA) lädt. Natürlich brauche ich etwas zum Booten, also habe ich mir QEMU geschnappt. Und jetzt?

Folgendes hat bisher gut funktioniert:

truncate -s64M /tmp/SomeVolume
/sbin/mke2fs -t ext4 -F /tmp/SomeVolume
yasm phase0.asm
dd if=phase0 of=/tmp/SomeVolume conv=notrunc

Ich erstelle ein Volume von etwa 64 MB, formatiere es als ext4 und überschreibe die ersten 1024 Oktette mit phase0 (das immer 1024 Byte groß ist). Das funktioniert gut.

Aber jetzt möchte ich eine richtig partitionierte Datei erstellen, um sie in realistischeren Szenarien zu testen. Ich weiß, dass ich /sbin/cfdiskmeine Volume-Datei erstellen könnte, aber mke2fses gibt keinen Parameter, mit dem ich einen Bereich innerhalb der Datei auswählen kann.

Jetzt bin ich mir bewusstLösungen mit Loop, aber leider scheint es bei mir nicht zu funktionieren (es scheint, als ob ich es max_partin Debian Jessie nicht ändern kann). Es scheintein weiteres Modul namensnbd, aber ich habe weder den Server noch den Client für dieses Modul installiert. Und es wird langsam ein bisschen lächerlich, dass ich Root-Rechte für etwas brauche, was man ganz klar auch im Userland erledigen könnte.

Wie kann ich das als Benutzer tun? Oder sollte ich das MBR/GPT-partitionierte Volume einfach um die von mir erstellte ext4-formatierte Datei herum erstellen?

Antwort1

Der lange Weg. Aber nur zum Spaß:

1.Erstellen Sie ein temporäres Image:

    $ truncate -s64MiB tmp.img

2.Erstellen Sie zwei Partitionen mit fdisk:

Ziemlich ausführlich, aber ok.

$ fdisk tmp.img

Erste Partition:

: n <Enter>
: <Enter> (p)
: <Enter> (1)
: <Enter> (2048)
: +40M <Enter>

Zweite Partition:

: n <Enter>
: <Enter> (p)
: <Enter> (2)
: <Enter> (83968)
: <Enter> (131071)

Drucken Sie aus, was wir gleich schreiben:

: x
: p
Nr AF  Hd Sec  Cyl  Hd Sec  Cyl     Start      Size ID
 1 00  32  33    0  57  52    5       2048      81920 83
 2 00  57  53    5  40  32    8      83968      47104 83

Schreiben und beenden:

:w (Dont! forget ;-) )

Wir haben zwei Partitionen von 40 und 23 MiB:

81920 * 512 / 1024 / 1024 = 40MiB
47104 * 512 / 1024 / 1024 = 23MiB

3.Erstellen Sie zwei Dateisysteme:

truncate -s40MiB ext4.img
truncate -s23MiB ext3.img
mke2fs -t ext4 -F -L part_ext4 ext4.img
mke2fs -t ext3 -F -L part_ext3 ext3.img

4.Alles zusammennähen:

Extrahieren Sie die ersten 2048*512Bytes aus dem temporären Bild:

dd if=tmp.img of=disk.img bs=512 count=2048

Kombinieren Sie sie:

cat ext4.img ext3.img >> disk.img

Bußgeld.

Antwort2

Ich bin mir nicht ganz sicher, ob ich Ihre Frage richtig verstehe. Wenn Sie versuchen, ein VM-Image zu partitionieren, haben Sie mehrere Möglichkeiten:

  1. Verwenden Sie für jede Partition Loops oder Device Mapper im linearen Modus. Sie müssen diese für die Formatierung nicht parallel einrichten.

  2. Teilx/Abonnierenum dem Kernel mitzuteilen, welche Partitionen er bei einem Loop/Device-Mapper-Gerät oder sogar einer normalen Datei berücksichtigen soll:

    kpartx -av /path/to/file
    

    oder

    losetup /dev/loopX /path/to/file
    kpartx -av /dev/loopX
    

    /dev/mapperBei den Geräten handelt es sich um Device-Mapper-Geräte (d. h. sie sind standardmäßig mit „von“ verknüpft ).

  3. mitpartprobe

    losetup /dev/loopX /path/to/file
    partprobe /dev/loopX
    

    Dadurch wird der Kernel angewiesen, die Partitionierung zu überprüfen und zu erstellen /dev/loopXpY.

  4. Booten Sie ein Live-CD/USB-Image (kann ein Installer sein) in der VM und führen Sie die Partitionierung von dort aus durch. Dies hat den offensichtlichen Vorteil, dass das virtuelle Laufwerk auch für VM-Images partitioniert werden kann, die in speziellen Formaten gespeichert sind (wie z. B. QEMUs qcow2).

Antwort3

http://blog.lifebloodnetworks.com/?p=934

Es scheint einige Informationen dazu zu geben. Es sieht so aus, als ob Sie die Raw-Disk als Loopback-Gerät mounten können:

Mounten Sie Ihr Raw-Disk-Image als Loopback-Gerät:losetup /dev/loop0 [path to image]

Führen Sie kpartx aus und:kpartx -va /dev/loop0

Dadurch werden Ihre Partitionen zu /dev/mapper/loop0pX hinzugefügt, wobei jedes X eine andere Partition ist

Sie können jetzt jede Partition mounten:mount /dev/mapper/loop0pX /media/partition

Wenn Sie sicherstellen möchten, dass nichts in Ihr Backup geschrieben wird, mounten Sie es einfach als schreibgeschützt:mount -o ro /dev/mapper/loop0pX /media/partition

Wenn Sie fertig sind, müssen Sie aufräumen.

Aushängen: umount /media/partition Entfernen Sie die Mapper-Geräte: kpartx -d /dev/loop0 Entfernen Sie das Loopback-Gerät:losetup -d /dev/loop0

Diese Befehle müssen möglicherweise alle als Root ausgeführt werden. Wenn loop0 meldet, dass es beschäftigt ist, wählen Sie einfach ein anderes Loop-Gerät (/dev/loop1 usw.).

-Bearbeiten: Ich sehe, dass Sie dies ohne Rootberechtigung tun möchten, daher ist das oben Gesagte für Sie möglicherweise nicht hilfreich.

Antwort4

Sie müssen sich nicht mit max_part herumschlagen. Verwenden Sie es, partedum die Partitionen auf dem Loop-Gerät zu erstellen oder partprobeum sie zu aktivieren, wenn sie bereits vorhanden sind. Möglicherweise müssen Sie auf die Version von parted in Testing/Unstable aktualisieren.

verwandte Informationen