Konvertieren Sie das Verzeichnis in ein virtuelles QEMU / KVM-Image


10

Ich habe ein Verzeichnis mit Daten /var/backups/disk1, die ich in ein Image einer virtuellen Festplatte konvertieren möchte, das ich dann mit QEMU oder KVM starten kann (das Verzeichnis enthält das Dateisystem für eine virtuelle Maschine, das über rsync kopiert wurde).

Zwar gibt es viele Anweisungen zum Konvertieren einer vollständigen physischen Festplatte in eine virtuelle Festplatte, doch das Packen nur des Inhalts eines einzelnen Verzeichnisses in ein Image einer virtuellen Festplatte ist viel schwieriger als erwartet. Irgendwelche Ideen?

Übrigens weiß ich, dass ich damit qemu-imgein Blockgerät in eine virtuelle Festplatte konvertieren kann (z. B. qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2). Wenn ich also nur das Verzeichnis /var/backups/disk1als Blockgerät erscheinen lassen könnte, sollte ich theoretisch in der Lage sein, mein Ziel mit zu erreichen qemu-img. Ich habe über kreative Möglichkeiten nachgedacht, das Verzeichnis mit NBD oder einem Loopback-Gerät als Blockgerät verfügbar zu machen, und hatte keinen Erfolg.

Antworten:


16

Erstellen Sie zunächst ein Rohbild mit der erforderlichen Größe. Ich gehe davon aus, dass 10G genug ist. Durch die Verwendung von seek wird eine spärliche Datei erstellt , die Platz spart.

dd if=/dev/null of=example.img bs=1M seek=10240

Erstellen Sie als Nächstes ein Dateisystem.

mkfs.ext4 -F example.img

(Beachten Sie, dass Sie die -FOption benötigen mkfs.ext4, um eine Datei im Gegensatz zu einer Festplattenpartition zu bearbeiten.)

Dann montieren Sie es.

mkdir /mnt/example
mount -t ext4 -o loop example.img /mnt/example

Jetzt können Sie Ihre Dateien nach / mnt / example kopieren. Sobald dies erledigt ist, heben Sie die Bereitstellung auf und Sie können example.img als Laufwerk in einer virtuellen Maschine verwenden. Wenn Sie möchten, können Sie es mit qemu-img von einem Rohbild in ein anderes Format wie qcow2e konvertieren, dies ist jedoch nicht erforderlich.


1
qemu-imgund fallocatesind etwas bequemer als dd.
Ciro Santilli 20 改造 中心 法轮功 六四



4

virt-make-fsaus libguestfs qcow2Beispiel

/server//a/332114/163884 erwähnte es, aber hier ist ein vollständiges Beispiel:

sudo apt-get install libguestfs-tools

# Workarounds for Ubuntu 18.04 bugs. See section below.
sudo rm -rf /var/cache/.guestfs-*
echo dash | sudo tee /usr/lib/x86_64-linux-gnu/guestfs/supermin.d/zz-dash-packages
sudo chmod +r /boot/vmlinuz-*

mkdir sysroot
# Just a test file.
dd if=/dev/urandom of=sysroot/myfile bs=1024 count=1024
virt-make-fs --format=qcow2 --type=ext2 sysroot sysroot.ext2.qcow2 

Beachten Sie, wie dies sudonicht erforderlich ist, außer für Installations- und Ubuntu-Fehlerumgehungen.

Ich habe dann überprüft, ob QEMU es tatsächlich lesen kann mit:

qemu-system-x86_64 -drive file=sysroot.ext2.qcow2,format=qcow2,if=virtio,snapshot ...

Ich kann dann das Image in QEMU Linux mounten und die Datei lesen.

virt-make-fs ext Beispiel

Dieses großartige Tool kann auch rohe ext-Dateisysteme erstellen, z.

virt-make-fs --format=raw --type=ext2 sysroot sysroot.ext2
virt-make-fs --format=raw --type=ext4 sysroot sysroot.ext4

die wir direkt auf dem Host überprüfen können mit:

mkdir -p mnt
dev="$(sudo losetup --show -f -P sysroot.ext4)"
sudo mount -o loop "$dev" mnt
cmp sysroot/myfile mnt/myfile

Minimierung der Bildgröße

Ein wirklich gutes Merkmal von virt-make-fsist, dass es automatisch versucht, die Bildgröße zu minimieren, wenn wir dies wünschen:

Virt-make-fs minimiert standardmäßig den zusätzlichen Speicherplatz. Sie können jedoch das Flag --size verwenden, um Speicherplatz im Dateisystem zu belassen, wenn Sie dies wünschen.

so:

df -h

sagt mir, dass das Bild zu 82% gefüllt ist:

/dev/loop17    1.5M  1.1M  244K  82% /home/ciro/test/guestfs/mnt

Wir können leicht zusätzlichen Platz über dem Minimum hinzufügen mit --size-=+:

virt-make-fs --format=raw --size=+8M --type=ext2 sysroot sysroot.ext2

ext4 Journal Overhead

Das Handbuch erwähnt auch, dass:

Beachten Sie, dass ext3-Dateisysteme ein Journal enthalten, das normalerweise 1 bis 32 MB groß ist. Wenn Sie das Dateisystem nicht so verwenden, dass das Journal erforderlich ist, ist dies nur ein Overhead.

und es ist interessant, dies zu überprüfen mit:

du -bs *

welches produziert:

1052672 sysroot
1446297 sysroot.ext2
2599731 sysroot.ext4

so sehen wir, dass die ext4 deutlich größer herauskam.

libguestfs Ubuntu-Fehler

Nun zum Nachteil: Es scheint derzeit keinen Ubuntu-Betreuer zu geben, und die Bibliothek ist unter Ubuntu im Allgemeinen fehlerhaft.

sudoist theoretisch nicht erforderlich, aber aufgrund eines Ubuntu-Verpackungsfehlers erforderlich, es sei denn, wir führen eine Problemumgehung durch: /ubuntu/1046828/how-to-run-libguestfs-tools-tools-such-as- virt-make-fs-without-sudo / 1046829 # 1046829

libguestfs: error: /usr/bin/supermin exited with error status 1.
To see full error messages you may need to enable debugging.
Do:
  export LIBGUESTFS_DEBUG=1 LIBGUESTFS_TRACE=1
and run the command again.  For further information, read:
  http://libguestfs.org/guestfs-faq.1.html#debugging-libguestfs
You can also run 'libguestfs-test-tool' and post the *complete* output
into a bug report or message to the libguestfs mailing list.
    libguestfs: error: /usr/bin/supermin exited with error status 1.

Danach schlägt 18.04 (aber nicht 16.04) ohne unsere Problemumgehungen fehl mit: https://bugzilla.redhat.com/show_bug.cgi?id=1591617

libguestfs: error: tar_in: write error on directory: /: 

aufgrund eines Fehlers, der bereits stromaufwärts behoben wurde.

Getestet in Ubuntu 18.04, libguestfs-tools 1: 1.36.13-1ubuntu3, QEMU 1: 2.11 + dfsg-1ubuntu7.3.


1

Verwenden der Michaels-Strategie in Fedora 23:

# dnf install -y libguestfs-tools-c
# virt-make-fs --format=raw --label mylabel the_directory myfs.raw

Dadurch wird ein ext2-Dateisystem erstellt, das Sie in ein Verzeichnis einbinden können:

# mount file.fs /mnt 

Jetzt enthält / mnt alle Ihre Dateien


Wenn file.fses sich um eine Datei handelt, sollte der mountBefehl nicht lauten : mount -o loop file.fs /mnt?
Kasperd

0

Wie wäre es mit dem Zugriff auf das Verzeichnis als Netzwerkfreigabe von einer VM aus, die auch auf Ihrem Image der virtuellen Zielfestplatte bereitgestellt ist? Sie führen dann einfach eine einfache Kopie von der Freigabe auf das bereitgestellte Disk-Image durch.


Das sollte funktionieren und ähnelt meiner aktuellen Strategie, eine VM zu erstellen und die Daten zu synchronisieren. Es wäre jedoch großartig, wenn es eine schnellere und sauberere Lösung gäbe. Das Kopieren der Daten auf einen neuen Computer wird ziemlich chaotisch, da Sie sich Sorgen machen müssen, dass Sie bestimmte Dateien ausschließen, die nicht kopiert werden sollten, wie fstab und die meisten Dinge in / boot
Chris

"bestimmte Dateien ausschließen, die nicht kopiert werden sollten, wie fstab und die meisten Dinge in / boot" - ist möglicherweise kein so großes Problem, wenn das VM-Ziel ein zusätzliches Volume ist.
user48838

0

Ich bevorzuge (und verwende) die Antwort von Ciro Santilli, aber hier ist etwas, das mit einer guestfishShell funktioniert :

# assumes extant directory "rootfs"
tar -cf rootfs.tar -C rootfs .
guestfish <<EOF
disk-create rootfs.qcow2 qcow2 "$((2 * $(stat -c%s rootfs.tar)))"
add-drive rootfs.qcow2
run
part-disk /dev/sda gpt
mkfs ext4 /dev/sda
mount /dev/sda /
tar-in rootfs.tar /
umount-all
exit
EOF
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.