Wie formatiere ich eine Partition in einer IMG-Datei?


12

Ich habe eine imgDatei mit dem folgenden Befehl erstellt:

dd if=/dev/zero bs=2M count=200 > binary.img

Es ist nur eine Datei mit Nullen, aber ich kann sie verwenden fdiskund eine Partitionstabelle erstellen:

# fdisk binary.img

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x51707f21.

Command (m for help): p
Disk binary.img: 400 MiB, 419430400 bytes, 819200 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: 0x51707f21

und sagen wir eine Partition:

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 
First sector (2048-819199, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-819199, default 819199): 

Created a new partition 1 of type 'Linux' and of size 399 MiB.

Command (m for help): w
The partition table has been altered.
Syncing disks.

Wenn ich die Partitionstabelle überprüfe, erhalte ich das folgende Ergebnis:

Command (m for help): p
Disk binary.img: 400 MiB, 419430400 bytes, 819200 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: 0x7f3a8a6a

Device      Boot Start    End Sectors  Size Id Type
binary.img1       2048 819199  817152  399M 83 Linux

Die Partition existiert also. Wenn ich versuche, diese Partition über gparted zu formatieren, wird folgende Fehlermeldung angezeigt:

Geben Sie hier die Bildbeschreibung ein

Ich weiß nicht, warum es sucht binary.img1, und ich habe keine Ahnung, wie die Partition vom Befehl live formatiert werden soll.

Weiß jemand, wie man es mit ext4-Dateisystem formatiert?


2
Eine Möglichkeit besteht darin, den Losetup-Trick aus dieser Antwort auszuführen und dann mkfs.ext4 für das Loopback-Gerät auszuführen.
Miikka

Ich habe diesen Link unix.stackexchange.com/a/87189/52763 gefunden . Und genau das wollte ich. Das Problem ist, wenn ich das Gerät in gparted überprüfe, bekomme ich Couldn't find valid filesystem superblock.. Hier ist das Bild: i.imgur.com/dl7XAC4.png .Ist das eine Art Fehler?
Mikhail Morfikov

Antworten:


13

Sie können über die Loopback-Funktion auf das Disk-Image und seine einzelnen Partitionen zugreifen. Sie haben bereits festgestellt, dass einige Festplatten-Dienstprogramme (angemessen) problemlos mit Festplatten-Images arbeiten. Ist mkfsjedoch keiner von ihnen (aber seltsamerweise mountist).

Hier wird ausgegeben von fdisk -lu binary.img:

Disk binary.img: 400 MiB, 419430400 bytes, 819200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
...

Device           Boot Start    End Sectors  Size Id Type
binary.img1            2048 819199  817152  399M 83 Linux

Um auf die von Ihnen erstellte Partition zuzugreifen, haben Sie mehrere Möglichkeiten

  1. Die explizite Route

    losetup --offset $((512*2048)) --sizelimit $((512*817152)) --show --find binary.img
    /dev/loop0
    

    Die Ausgabe /dev/loop0ist der Name des zugewiesenen Schleifengeräts. Der --offsetParameter ist nur der Offset ( Start) der Partition multipliziert mit der Sektorgröße ( 512). Die --sizelimitGröße der Partition ist und Sie können sie folgendermaßen berechnen: End-Start + 1, also 819199-2048 + 1 = 817152, und diese Zahl muss auch mit der Sektorgröße multipliziert werden.

    Sie können dann /dev/loop0als Referenz auf die Partition verwenden:

    mkfs -t ext4 -L img1 /dev/loop0
    mkdir -p /mnt/img1
    mount /dev/loop0 /mnt/img1
    ...
    umount /mnt/img1
    losetup -d /dev/loop0
    
  2. Die implizite Route

    losetup --partscan --show --find binary.img
    /dev/loop0
    

    Die Ausgabe /dev/loop0ist der Name des primären Schleifengeräts, das zugewiesen wurde. Darüber hinaus weist die --partscanOption den Kernel an, das Gerät nach einer Partitionstabelle zu durchsuchen und Nebenschleifengeräte automatisch zuzuweisen. In Ihrem Fall mit der einen Partition erhalten Sie auch /dev/loop0p1, die Sie dann als Referenz auf die Partition verwenden können:

    mkfs -t ext4 -L img1 /dev/loop0p1
    mkdir -p /mnt/img1
    mount /dev/loop0p1 /mnt/img1
    ...
    umount /mnt/img1
    losetup -d /dev/loop0
    

@Mikhail neugierig zu sehen, dass Sie die Partitionsgröße berechnet haben, als sie bereits als Teil der fdiskAusgabe angegeben wurde.
Roaima

2
Was ist los mit etwas Mathe? Außerdem ist es gut zu wissen, dass Sie auf diese Weise leicht die richtige Sektornummer erhalten können, nur für den Fall ...
Mikhail Morfikov

Nur eine kurze Bemerkung: "Das mkfs-Frontend wird zugunsten dateisystemspezifischer mkfs. <Type> -Untils abgelehnt", zitiert aus den mkfs-Manpages.
Gmagno

@gmagno das stimmt jetzt sicher. Aber soweit ich feststellen kann, ohne zu lange oder zu hart zu graben, wurde dieser Hinweis erst mit util-linux 2.25-rc1 veröffentlicht und kam erst einige Zeit nach Juni 2015 in den Debian-Stall. Fühlen Sie sich frei um die Antwort mit aktuellen Informationen zu aktualisieren.
Roaima

11

Es gibt eine andere Möglichkeit, dies im Allgemeinen zu tun: Verwenden Sie kpartx( nicht kde-bezogen)

sudo kpartx -a binary.img

und jetzt sollten Sie alle Partitions Geräte definiert unter /dev/mapperals loop0p1 , loop0p2 , ...

und dann

sudo mkfs.ext4 /dev/mapper/loop0p1

Wenn Sie fertig sind, können Sie optional auch ausführen

sudo kpartx -d binary.img

die loop0p loswerden? täuschen


2
Ich bin mir nicht sicher, warum dies nicht mehr Stimmen hat. IMO ist es die beste Antwort ...!
Jeremy Davis

Funktioniert mit GPT-Partitionen, z. B. wenn Sie die EFI-Partition von einer Festplatten-Festplatte ändern möchten.
Russ

3

Ich weiß nicht warum es sucht binary.img1

(… Und später für binary.img2im Kommentar begraben.)

Dies liegt daran, dass die Tools erwarten, dass die Dateinamen einem bestimmten Muster folgen. Dieses Muster wird von Gerätedateien für tatsächliche Datenträger und Datenträgervolumes auf Ihrem System verwendet, nämlich:

  • Eine Gerätedatei, die die gesamte Disc umfasst, wird benannt sda(oder etwas anderes). Dies wird fdiskvoraussichtlich genutzt.
  • Gerätedateien für die einzelnen Scheiben der Scheibe, durch die Partitionierung beschrieben, werden genannt sda1, sda2, sda3und so weiter. Dies ist, was Tools wie gpartederwarten, wenn sie mkfsDinge auf einzelnen Disc-Volumes tun sollen .

Natürlich überlappen sich normale Dateien nicht so wie Dateien von Disc-Geräten. Die Diskussionen der Loopback - Dateisystem beteiligt , dass Sie Loopback gesehen zu erstellen sind alle über eine einzige Ganz Disk - Image - Datei zu nehmen und mit den 1, 2, 3und so weiter - Dateien , die die einzelnen Scheiben in ihm widerspiegeln, sobald die gewünschte Partitionslayout geschrieben wurde zur Partitionstabelle.


Das macht Sinn!
Mikhail Morfikov

0

Obwohl dieses Thema nicht direkt verwandt ist, werden viele der gleichen und verwandten Informationen erwähnt.

Debian Wiki | Raspberry Pi und qemu-user-static

Wenn Sie apteinige der in diesem Beitrag genannten Befehle nicht installieren können, versuchen Sie es mit apt-cache search [package_name]. Dies führt möglicherweise nicht zu Ergebnissen, wenn der Befehl aus einem Paket mit einem anderen Namen stammt.

Zum Beispiel losetupkönnte früher als losetupusing installiert werden apt install losetup, aber es ist jetzt Teil von util-linuxUbuntus Repository. Um herauszufinden, welches Paket als Container für ein anderes Paket fungiert, müssen Sie die Suche nach dem Online-Repository für Ihre Linux-Distribution verwenden. Wenn Sie es von einer anderen Quelle installieren müssen, verwenden Sie eine Websuchmaschine.

Einige Pakete, die einen Besuch wert sind ...

util-linux genisoimage dosfstools squashfs-tools fsarchiver xfsprogs reiserfsprogs reiser4progs jfsutils ntfsprogs btrfs-tools

Jede Linux-Distribution hat auch ihre eigenen Online-Manpages. Manchmal ist es einfacher, die Manpages zu verwenden als ein Tutorial. Auf den Handbuchseiten finden Sie auch alle Befehlsoptionen und -parameter. Ein Tutorial konzentriert sich normalerweise nur auf die verwendeten.


0

Minimal lauffähig sfdisk+ mke2fsBeispiel ohnesudo

In diesem Beispiel erstellen wir ohne sudooder ohne setsuideine Image-Datei, die zwei ext2-Partitionen enthält, die jeweils mit Dateien aus einem Host-Verzeichnis gefüllt sind.

Wir werden dann sudo losetupnur die Partitionen mounten, um zu testen, ob der Linux-Kernel sie tatsächlich lesen kann, wie unter /programming/1419489/how-to-mount-one-partition-from-an-image erläutert -Datei-die-mehrere-Partitionen enthält / 39675265 # 39675265

Weitere Einzelheiten finden Sie unter:

Das Beispiel:

#!/usr/bin/env bash

# Input params.
root_dir_1=root1
root_dir_2=root2
partition_file_1=part1.ext2
partition_file_2=part2.ext2
partition_size_1_megs=32
partition_size_2_megs=32
img_file=img.img
block_size=512

# Calculated params.
mega="$(echo '2^20' | bc)"
partition_size_1=$(($partition_size_1_megs * $mega))
partition_size_2=$(($partition_size_2_megs * $mega))

# Create a test directory to convert to ext2.
mkdir -p "$root_dir_1"
echo content-1 > "${root_dir_1}/file-1"
mkdir -p "$root_dir_2"
echo content-2 > "${root_dir_2}/file-2"

# Create the 2 raw ext2 images.
rm -f "$partition_file_1"
mke2fs \
  -d "$root_dir_1" \
  -r 1 \
  -N 0 \
  -m 5 \
  -L '' \
  -O ^64bit \
  "$partition_file_1" \
  "${partition_size_1_megs}M" \
;
rm -f "$partition_file_2"
mke2fs \
  -d "$root_dir_2" \
  -r 1 \
  -N 0 \
  -m 5 \
  -L '' \
  -O ^64bit \
  "$partition_file_2" \
  "${partition_size_2_megs}M" \
;

# Default offset according to
part_table_offset=$((2**20))
cur_offset=0
bs=1024
dd if=/dev/zero of="$img_file" bs="$bs" count=$((($part_table_offset + $partition_size_1 + $partition_size_2)/$bs)) skip="$(($cur_offset/$bs))"
printf "
type=83, size=$(($partition_size_1/$block_size))
type=83, size=$(($partition_size_2/$block_size))
" | sfdisk "$img_file"
cur_offset=$(($cur_offset + $part_table_offset))
# TODO: can we prevent this and use mke2fs directly on the image at an offset?
# Tried -E offset= but could not get it to work.
dd if="$partition_file_1" of="$img_file" bs="$bs" seek="$(($cur_offset/$bs))"
cur_offset=$(($cur_offset + $partition_size_1))
rm "$partition_file_1"
dd if="$partition_file_2" of="$img_file" bs="$bs" seek="$(($cur_offset/$bs))"
cur_offset=$(($cur_offset + $partition_size_2))
rm "$partition_file_2"

# Test the ext2 by mounting it with sudo.
# sudo is only used for testing, the image is completely ready at this point.

# losetup automation functions from:
# /programming/1419489/how-to-mount-one-partition-from-an-image-file-that-contains-multiple-partitions/39675265#39675265
loop-mount-partitions() (
  set -e
  img="$1"
  dev="$(sudo losetup --show -f -P "$img")"
  echo "$dev" | sed -E 's/.*[^[:digit:]]([[:digit:]]+$)/\1/g'
  for part in "${dev}p"*; do
    if [ "$part" = "${dev}p*" ]; then
      # Single partition image.
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    echo "$dst" 1>&2
    sudo mkdir -p "$dst"
    sudo mount "$part" "$dst"
  done
)
loop-unmount-partitions() (
  set -e
  for loop_id in "$@"; do
    dev="/dev/loop${loop_id}"
    for part in "${dev}p"*; do
      if [ "$part" = "${dev}p*" ]; then
        part="${dev}"
      fi
      dst="/mnt/$(basename "$part")"
      sudo umount "$dst"
    done
    sudo losetup -d "$dev"
  done
)

loop_id="$(loop-mount-partitions "$img_file")"
sudo cmp /mnt/loop0p1/file-1 "${root_dir_1}/file-1"
sudo cmp /mnt/loop0p2/file-2 "${root_dir_2}/file-2"
loop-unmount-partitions "$loop_id"

Getestet unter Ubuntu 18.04. GitHub stromaufwärts .

Hilfsprogramm zum Umschließen einer vorhandenen unformatierten Dateisystemdatei in ein Image

Aus dem oben Gesagten kann Folgendes nützlich sein:

# Put a raw filesystem file into a disk image with a partition table.
#
# /unix/209566/how-to-format-a-partition-inside-of-an-img-file/527132#527132
#
# Usage:
#
#     sfdisk-fs-to-img root.ext2
#
# Creates a file:
#
#     sfdisk-fs-to-img root.ext2.img
#
sfdisk-fs-to-img() (
  partition_file_1="$1"
  img_file="${partition_file_1}.img"
  block_size=512
  partition_size_1="$(wc -c "$partition_file_1" | awk '{print $1}')"
  part_table_offset=$((2**20))
  cur_offset=0
  bs=1024
  dd if=/dev/zero of="$img_file" bs="$bs" count=$((($part_table_offset + $partition_size_1)/$bs)) skip="$(($cur_offset/$bs))"
  printf "
  type=83, size=$(($partition_size_1/$block_size))
  " | sfdisk "$img_file"
  cur_offset=$(($cur_offset + $part_table_offset))
  dd if="$partition_file_1" of="$img_file" bs="$bs" seek="$(($cur_offset/$bs))"
  cur_offset=$(($cur_offset + $partition_size_1))
)

GitHub stromaufwärts .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.