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 -d
minimales lauffähiges Beispiel ohnesudo
mke2fs
ist 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"
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 mke2fs
das 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 tmpfs
anstelle von extX befindet, da diese Dateisystemescheinen keine erweiterten Eigenschaften zu haben.
mke2fs
ist häufig symbolisch mit verknüpft mkfs.extX
und man mke2fs
bedeutet, dass bei Verwendung von „call if“ mit einem solchen symbolischen Link dann -t
impliziert 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=1
und 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:
- Erstellen Sie Sudo-eigene Dateien im Image. Buildroot erledigt das.
- automatisch die minimal erforderliche Größe berechnen. Eine erste Schätzung mit
du
Dateigröße undfind . | wc
Verzeichnisstruktur, mindestens 32 MB (kleinere schlägt fehl), dann verdoppeln, bis der Befehl funktioniert, ist wahrscheinlich ein sehr guter Ansatz. Buildroot hat das früher gemacht, aber aus irgendeinem Grund damit aufgehört, aber es war einfach, es selbst umzusetzen. - bequem alle Dateien aus der Partition extrahieren:
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 e2fsimage
es 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 e2fsimage
mit -n
dem 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