GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man mkfs auf Datei-Image-Partitionen ohne Mounten ausführen?

Um ein Image mit mehreren Partitionen zu erstellen, besteht eine Lösung, die keine ausgefallenen Tools oder Root-Zugriff erfordert, darin, zuerst die Dateisysteme zu erstellen und sie dann zu verketten.

truncate -s $IMAGE_ROOTFS_ALIGNMENT disk
truncate -s $BOOT_SPACE_ALIGNED part1
mkfs.fat part1
cat part1 >>disk
truncate -s $ROOTFS_SIZE part2
mkfs.ext4 part2
cat part2 >>disk

Führen Sie dann parted aus oder fdisk um die Partitionen zu erstellen.

Dieser Ansatz hat den Nachteil, dass das resultierende Bild nicht spärlich ist.


Um die Antwort von @gilles zu erweitern, hier ist eine Möglichkeit, ein Disk-Image zu erstellen, das ein formatiertes Dateisystem enthält, indem zuerst ein Dateisystem (in diesem Beispiel vom Typ ESP) in einer Datei erstellt und dieses dann zu einem gültigen Disk-Image zusammengesetzt wird; kein Root, Mounts oder Loop-Geräte erforderlich:

diskimg=diskimg    # filename of resulting disk image
size=$((260*(1<<20))) # desired size in bytes, 260MB in this case
alignment=1048576  # align to next MB (https://www.thomas-krenn.com/en/wiki/Partition_Alignment)
size=$(( (size + alignment - 1)/alignment * alignment ))  # ceil(size, 1MB)

# mkfs.fat requires size as an (undefined) block-count; seem to be units of 1k
mkfs.fat -C -F32 -n "volname" "${diskimg}".fat $((size >> 10))

# insert the filesystem to a new file at offset 1MB
dd if="${diskimg}".fat of="${diskimg}" conv=sparse obs=512 seek=$((alignment/512))
# extend the file by 1MB
truncate -s "+${alignment}" "${diskimg}"

# apply partitioning
parted --align optimal "${diskimg}" mklabel gpt mkpart ESP "${offset}B" '100%' set 1 boot on

Der obige Ansatz hat den Nebeneffekt, dass er spärlich ist, wenn er auf einem Dateisystem verwendet wird, das Dateien mit geringer Dichte unterstützt. die resultierende "262 MB"-Datei belegt weniger als 200 KB auf der Festplatte:

du -h --apparent diskimg; du -h diskimg
262M    diskimg
196K    diskimg

Für FAT-Dateisysteme unterstützen die Mtools-Dienstprogramme das Arbeiten mit einem Offset in eine Datei (ext2/4/etc tun dies wahrscheinlich auch?). Das macht es einfacher, Sie erstellen einfach das partitionierte Image und arbeiten direkt daran:

diskimg=diskimg
size=$((260*(1<<20))) # desired size in bytes, 260MB in this case
# align to next MB (https://www.thomas-krenn.com/en/wiki/Partition_Alignment)
alignment=1048576

size=$(( (size + alignment - 1)/alignment * alignment ))

# image size is gpt + filesystem size + gpt backup
truncate -s $((size + 2*alignment)) "${diskimg}"

parted --machine --script --align optimal "${diskimg}" mklabel gpt mkpart ESP "${alignment}B" '100%' set 1 boot on

mformat -i "${diskimg}"@@"${alignment}" -t $((size>>20)) -h 64 -s 32 -v "volname"

Hier ist ein Diagramm der resultierenden Bilddatei:


Sie möchten eine Partition in einer Disk-Image-Datei statt der gesamten Image-Datei formatieren. In diesem Fall müssen Sie losetup verwenden um Linux anzuweisen, die Bilddatei als Loopback-Gerät zu verwenden.

HINWEIS:losetup erfordert root-Rechte, muss also als root oder mit sudo ausgeführt werden. Die /dev/loop* Geräte, die es verwendet/erstellt, erfordern auch Root-Privilegien, um darauf zuzugreifen und sie zu verwenden.

z.B. (als root)

# losetup /dev/loop0 ./sdcard.img

# fdisk -l /dev/loop0
Disk /dev/loop0: 1 MiB, 1048576 bytes, 2048 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x54c246ab

Device       Boot Start   End Sectors   Size Id Type
/dev/loop0p1          1  1023    1023 511.5K  c W95 FAT32 (LBA)
/dev/loop0p2       1024  2047    1024   512K 83 Linux

# file -s /dev/loop0p1
/dev/loop0p1: data

# mkfs.vfat /dev/loop0p1 
mkfs.fat 3.0.28 (2015-05-16)
Loop device does not match a floppy size, using default hd params

# file -s /dev/loop0p1
/dev/loop0p1: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "mkfs.fat", sectors/cluster 4, root entries 512, sectors 1023 (volumes <=32 MB) , Media descriptor 0xf8, sectors/FAT 1, sectors/track 32, heads 64, serial number 0xfa9e3726, unlabeled, FAT (12 bit)

und schließlich das Image vom Loopback-Gerät trennen:

# losetup -d /dev/loop0

Siehe man losetup für weitere Details.


Linux
  1. Wie führe ich einen Befehl ohne Root-Eigenschaften aus?

  2. So erhalten Sie die Größe von tar.gz in (MB) Datei in Python

  3. Wie entferne ich X Bytes vom Ende einer großen Datei, ohne die gesamte Datei zu lesen?

  4. So führen Sie eine Datei ohne die Erweiterung .sh in der Shell aus

  5. Wie erhalte ich die physische Größe einer Datei unter Linux?

So führen Sie den Sudo-Befehl ohne Passwort aus

Wie man Image-Steganographie unter Linux durchführt

So führen Sie Sudo-Befehle ohne Passwort aus

So öffnen Sie ein ISO-Image, ohne es unter Linux auf Disc zu brennen

So komprimieren Sie eine PNG-Bilddatei unter Linux

So führen Sie sudo-Befehle ohne Passwort aus