Wie erstelle ich ein Ext2-Image ohne Superuser-Rechte?

Wie erstelle ich ein Ext2-Image ohne Superuser-Rechte?

Ich muss mehrere ext2-Images generieren. Der naheliegendste Weg dazu ist, ein Image zu erstellen, es zu mounten und den Inhalt zu kopieren. Dafür sind allerdings zweimal Root-Berechtigungen erforderlich (um die Dateien zu chownen und um das Image zu mounten). Außerdem habe ich zwei Tools zum Generieren von Images gefunden: e2fsimage und genext2fs.

  • genext2fs platziert das Bild während der Generierung im RAM, aber die Größe eines meiner Bilder beträgt ~30 GiB.

  • e2fsimage stürzt bei einigen Bildgrößenwerten ab.

Wie kann ich also meine Bilder generieren? Es wäre schön, wenn das Tool die Bildgröße selbst berechnen würde.

Antwort1

mke2fs -dminimales lauffähiges Beispiel ohnesudo

mke2fsist Teil des e2fsprogs-Pakets. Es wurde vom berühmten Linux-Kernel-Dateisystementwickler Theodore Ts'o geschrieben, der seit 2018 bei Google ist, und der Upstream-Quellcode befindet sich unter kernel.org unter:https://git.kernel.org/pub/scm/fs/ext2/e2fsprogsDaher kann dieses Repository als Referenz-Userland-Implementierung von Ext-Dateisystemoperationen betrachtet werden:

#!/usr/bin/env bash
set -eu

root_dir=root
img_file=img.ext2

# Create a test directory to convert to ext2.
mkdir -p "$root_dir"
echo asdf > "${root_dir}/qwer"

# Create a 32M ext2 without sudo.
# If 32M is not enough for the contents of the directory,
# it will fail.
rm -f "$img_file"
mke2fs \
  -L '' \
  -N 0 \
  -O ^64bit \
  -d "$root_dir" \
  -m 5 \
  -r 1 \
  -t ext2 \
  "$img_file" \
  32M \
;

# Test the ext2 by mounting it with sudo.
# sudo is only used for testing.
mountpoint=mnt
mkdir -p "$mountpoint"
sudo mount "$img_file" "$mountpoint"
sudo ls -l "$mountpoint"
sudo cmp "${mountpoint}/qwer" "${root_dir}/qwer"
sudo umount "$mountpoint"

GitHub Upstream.

Die Schlüsseloption ist -d, die auswählt, welches Verzeichnis für das Bild verwendet werden soll, und es ist eine relativ neue Ergänzung zu v1.43 in Commit0d4deba22e2aa95ad958b44972dc933fd0ebbc59

Daher funktioniert es sofort unter Ubuntu 18.04, das über e2fsprogs 1.44.1-1 verfügt, nicht jedoch unter Ubuntu 16.04, das über 1.42.13 verfügt.

Wir können es jedoch genauso machen wie Buildroot und es unter Ubuntu 16.04 problemlos aus dem Quellcode kompilieren mit:

git clone git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
cd e2fsprogs
git checkout v1.44.4
./configure
make -j`nproc`
./misc/mke2fs -h

Wenn mke2fsdas Problem auftritt mit:

__populate_fs: Operation not supported while setting xattrs for "qwer"
mke2fs: Operation not supported while populating file system

wenn Sie die Option hinzufügen:

-E no_copy_xattrs

Dies ist beispielsweise erforderlich, wenn sich das Stammverzeichnis in NFS oder tmpfsanstelle von extX befindet, da diese Dateisystemescheinen keine erweiterten Eigenschaften zu haben.

mke2fsist häufig symbolisch mit verknüpft mkfs.extXund man mke2fsbedeutet, dass bei Verwendung von „call if“ mit einem solchen symbolischen Link dann -timpliziert wird.

Wie ich das herausgefunden habe und wie ich zukünftige Probleme lösen kann:Buildrooterzeugt ext2-Images ohne sudowie hier gezeigt, also habe ich den Build einfach ausgeführt V=1und die Befehle aus dem Bildgenerierungsteil extrahiert, der ganz am Ende kommt. Das gute alte Kopieren und Einfügen hat mich noch nie im Stich gelassen.

TODO: Beschreiben Sie, wie die folgenden Probleme gelöst werden können:

Mehrere Partitionen in einer Image-Datei

Sieh dir das an:https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-image-without-root-privileges/52850819#52850819

Antwort2

Habe herausgefunden, warum e2fsimagees abstürzt. Es wird durch einen int32-Überlauf verursacht, wenn die Bildgröße größer als 4 GiB ist. Die Lösung besteht also darin, die erforderlichen Blöcke und Inodes zu zählen, eine Loop-Datei ( truncate& mke2fs) zu erstellen und sie dann e2fsimagemit -ndem Argument zu verwenden (sodass die Loop-Datei nicht erstellt wird, sondern eine bereits erstellte verwendet wird).

Antwort3

Zum Erstellen eines Images sind keine Root-Rechte erforderlich. Hier ist ein Beispiel zum Erstellen eines ext2-Images:

dd if=/dev/zero of=./MyDisk.ext2 bs=512 count=20480
mkfs.ext2 ./MyDisk.ext2

Zum Mounten des Geräts sind jedoch Root-Rechte erforderlich:

mkdir MyDisk
sudo mount ./MyDisk.ext2 MyDisk

verwandte Informationen