Wie erstelle ich eine formatierte Partitionsimagedatei von Grund auf neu?

16

Ich muss ein Dateisystem mit nur einer Partition aus dem Nichts erstellen ( /dev/zero). Ich habe diese Befehlsfolge ausprobiert:

dd if=/dev/zero of=mountedImage.img bs=512 count=131072
fdisk mountedImage.img
    n
    p 
    2048
    131072

Grundsätzlich muss ich eine 64 MB große Bilddatei mit Nullen erstellen. Dann benutze ich fdisk, um eine neue Partition für ein neues Dateisystem hinzuzufügen (das endlich FAT32 sein sollte), beginnend bei Sektor 2048und unter Verwendung aller verbleibenden Sektoren.

losetup /dev/loop1 mountedImage.img
mkfs -t vfat /dev/loop1

Aber hier habe ich Probleme. Wenn ich ein loopGerät einrichte und es mit formatiere mkfs -t vfat, wird die Partitionstabelle überschrieben und das Dateisystem (FAT32) auf der Festplatte abgelegt. Ich muss nicht mit FAT32 formatiert sein, sondern nur meine primäre Partition.

Weiß jemand, wie ich nur eine Partition des Raw-Image formatieren kann, nicht das ganze Image?

user35443
quelle
Bitte klären Sie, was Sie meinen, indem Sie ein Loop-Gerät einrichten und Ihren gesamten mkfsAnruf posten . Ich musste deinen Beitrag 3 Mal lesen, um dein Problem zu verstehen. Obwohl ich Ihnen nicht helfen kann, bin ich daran interessiert, warum Sie eine Bilddatei (!) Erstellen, aber trotzdem die ersten n "Sektoren" ungenutzt lassen möchten.
Bananguin
Ok, bearbeitet es. Ich möchte zunächst n Sektoren (was ist los mit Sektoren?) Unbenutzt lassen, da ich meine Bootloader irgendwo platzieren muss.
user35443
Crossposted
Michael Mrozek
@MichaelMrozek Es gibt Überlegungen, die für einige Linux-Distributionen gelten, aber nicht für Ubuntu (es loopspielt eine Rolle, ob es sich um ein Modul handelt oder ob es in den Kernel integriert ist). Ich denke, es ist nützlich, dass jede Site ihre Version der Frage hat, und ich habe dafür gestimmt, sie erneut zu öffnen.
Gilles 'SO- hör auf böse zu sein'
@MichaelMrozek Ich persönlich bin der Meinung, dass AskUbuntu spezifischer ist als Unix und Linux. Wenn also eine Frage an beide Server weitergeleitet wird, es sei denn, es gibt bestimmte Gründe, hier zu schließen, ist dies die Frage auf AskUbuntu, die als weitergeleitet geschlossen werden sollte, wenn dies der Fall wäre pünktlich zueinander gepostet, unabhängig davon, wo es "zuerst" gepostet wurde (möglicherweise mit einer Erwähnung von Ubuntu / Nicht-Ubuntu-Antworten hier). Hier hat es eine akzeptierte Antwort, die die auf AskUbuntu nicht hat, was es nachdrücklich befürwortet, diese IMO offen zu halten. Ich habe nicht den Repräsentanten, der für AskUbuntu stimmen muss, aber ich stimme ab, um die Frage hier erneut zu eröffnen.
Lebenslauf vom

Antworten:

20

Stellen Sie unter Linux beim Laden des loopModuls sicher, dass Sie eine max_partOption an das Modul übergeben, damit die Loop-Geräte partitionierbar sind.

Überprüfen Sie den aktuellen Wert:

cat /sys/module/loop/parameters/max_part

Wenn es 0 ist:

modprobe -r loop # unload the module
modprobe loop max_part=31

Fügen Sie die folgende Zeile zu /etc/modprobe.confoder zu einer Datei hinzu, /etc/modprobe.dwenn dieses Verzeichnis auf Ihrem System vorhanden ist, um diese Einstellung dauerhaft zu erhalten:

options loop max_part=31

Wenn dies modprobe -r loopfehlschlägt, weil die Modulschleife erstellt wurde, müssen Sie loop.max_part=31die Kernel-Befehlszeile erweitern und einen Neustart durchführen. Wenn Ihr Bootloader Grub2 ist, fügen Sie diesen zum Wert von GRUB_CMDLINE_LINUXin hinzu etc/default/grub.

Jetzt können Sie ein partitionierbares Loop-Gerät erstellen:

truncate -s64M file # no need to fill it with zeros, just make it sparse
fdisk file # create partitions
losetup /dev/loop0 file
mkfs.vfat /dev/loop0p1 # for the first partition.
mount /dev/loop0p1 /mnt/

(Beachten Sie, dass Sie eine relativ aktuelle Version von Linux benötigen).

Stéphane Chazelas
quelle
FATAL: Modulschleife ist eingebaut, kann dies gelöst werden, indem die neueste Version von Ubuntu installiert wird (ich habe 12.04)?
user35443
Wenn dies nicht nötig ist, leiten Sie es loop.max_part=31an die Kernel-Kommandozeile weiter
Alex
1
Ah, ich verstehe, wenn Sie einen neuen Kernel haben und Sie den Wert max_part übergeben, werden der Offset und das Größenlimit überhaupt nicht benötigt
Alex,
Hmm, Kernel-Kommandozeile, zu schwierig für mich. Trotzdem danke, akzeptiere.
user35443
Ist es loop.maxpart=31oder loop.max_part=31in der Kernel-Befehlszeile?
Cristian Ciupitu
4

losetup /dev/loop0 file -o 1048576 --sizelimit limit

Der angegebene Offset sollte in Bytes angegeben werden (1048576 = 2048 Sektoren * 512 Bytes pro Sektor).

mount -o loop,offset=1048576,sizelimit=limit

Weitere Informationen finden Sie unter losetup und mount .

Alex
quelle
Hmm, Offset, das sollte funktionieren. Und wenn ich mehr Partitionen hätte?
user35443
Ich denke, eine Schleife = eine Partition = ein Versatz.
Alex
ähm, und gibt es eine option um auch die größe anzugeben, damit ich sie einschränken und dort mehr partitionieren könnte?
user35443
Entschuldigung, mein Fehler, eine neue Antwort mit einer Teillösung zu erstellen, die richtige Antwort ist von @ "Stephane Chazelas", er kann nur die Offset- und Größenbegrenzungsoptionen hinzufügen (dann werde ich meine löschen)
Alex
Nein, lass es hier sein, oder meine +1 gehen nirgendwo hin.
user35443
2

Mit den folgenden Verfahren können Sie die Partitionen des Images bereitstellen, um sie zu ändern.

Option losetup 2.21 -P

losetup -P -f --show my.img

Erstellt eine /dev/loopXpYpro Partition.

Vorteil: ausführbare Datei in vielen Distributionen vorinstalliert (Paket util-linux).

Nachteil: ziemlich neue Option, in Ubuntu 14.04 nicht vorhanden.

losetup -P Automatisierung

Verwendung:

$ los my.img
/dev/loop0
/mnt/loop0p1
/mnt/loop0p2

$ ls /mnt/loop0p1
/whatever
/files
/youhave
/there

$ sudo losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                                                      DIO
/dev/loop1         0      0         0  0 /full/path/to/my.img

$ # Cleanup.
$ losd 0
$ ls /mnt/loop0p1
$ ls /dev | grep loop0
loop0

Quelle:

los() (
  img="$1"
  dev="$(sudo losetup --show -f -P "$img")"
  echo "$dev"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    echo "$dst"
    sudo mkdir -p "$dst"
    sudo mount "$part" "$dst"
  done
)
losd() (
  dev="/dev/loop$1"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    sudo umount "$dst"
  done
  sudo losetup -d "$dev"
)

kpartx

sudo apt-get install kpartx
losetup -fs my.raw
sudo kpartx -a my.img
ls /dev/mapper

Ausgabe:

/dev/mapper/loop0
/dev/mapper/loop0p1

Wo loop0p1ist die erste Partition?

mkdir -p d
sudo mount /dev/mapper/loop0p1 d

Vorteil dieser Methode: Funktioniert auf Ubuntu 14.04 ohne Neustart.

Ciro Santilli ist ein Schauspieler
quelle