Converti directory in immagine disco virtuale QEMU / KVM


10

Ho una directory piena di dati /var/backups/disk1che voglio convertire in un'immagine del disco virtuale che potrò quindi avviare usando QEMU o KVM (la directory contiene il file system per una macchina virtuale, copiato tramite rsync).

Mentre ci sono molte istruzioni là fuori per convertire un disco fisico completo in un disco virtuale, impacchettare solo il contenuto di una singola directory in un'immagine del disco virtuale si sta rivelando molto più difficile di quanto mi aspettassi. Qualche idea?

A proposito, so che posso usare qemu-imgper convertire un dispositivo a blocchi in un disco virtuale (ad esempio, qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2), quindi se solo potessi far /var/backups/disk1apparire la directory come un dispositivo a blocchi, teoricamente dovrei essere in grado di raggiungere il mio obiettivo usando qemu-img. Ho pensato a modi creativi per esporre la directory come dispositivo a blocchi usando NBD o un dispositivo di loopback, tuttavia, e non ho avuto successo.

Risposte:


16

Innanzitutto, crea un'immagine non elaborata della dimensione richiesta. Presumo che 10G sia abbastanza. L'uso di seek crea un file sparso , che consente di risparmiare spazio.

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

Quindi, crea un filesystem su di esso.

mkfs.ext4 -F example.img

(Nota che hai bisogno -Fdell'opzione per mkfs.ext4operare su un file invece che su una partizione del disco)

Quindi montalo.

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

Ora puoi copiare i tuoi file in / mnt / example. Fatto ciò, smontalo e puoi usare example.img come unità in una macchina virtuale. Se vuoi puoi convertirlo da un'immagine grezza in un altro formato come qcow2e usando qemu-img, ma questo non è necessario.


1
qemu-imge fallocatesono leggermente più convenienti di dd.
Ciro Santilli 20 病毒 审查 六四 事件 法轮功



4

virt-make-fsda libguestfs qcow2esempio

https://serverfault.com/a/332114/163884 lo ha menzionato, ma ecco un esempio completo:

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 

Nota come sudonon è richiesto, ad eccezione dell'installazione e delle soluzioni alternative ai bug di Ubuntu.

Ho quindi verificato che QEMU può effettivamente leggerlo con:

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

Sono quindi in grado di montare l'immagine all'interno di QEMU Linux e leggere il file.

virt-make-fs ext esempio

Questo fantastico strumento può anche creare filesystem ext non elaborati, ad esempio:

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

che possiamo verificare direttamente sull'host con:

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

Riduzione al minimo delle dimensioni dell'immagine

Una caratteristica davvero buona di virt-make-fsè che cerca automaticamente di ridurre al minimo le dimensioni dell'immagine se è quello che vogliamo:

Predefinito Virt-make-fs riduce al minimo lo spazio extra, ma puoi usare il flag --size per lasciare spazio nel filesystem se lo desideri.

così:

df -h

mi dice che l'immagine è riempita all'82%:

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

Possiamo facilmente aggiungere un po 'di spazio in più rispetto al minimo con --size-=+:

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

ext4 journal overhead

Il manuale menziona inoltre che:

Si noti che i filesystem ext3 contengono un journal, in genere di dimensioni 1-32 MB. Se non hai intenzione di utilizzare il filesystem in un modo che richiede il journal, questo è solo uno spreco di risorse.

ed è interessante verificarlo con:

du -bs *

che produce:

1052672 sysroot
1446297 sysroot.ext2
2599731 sysroot.ext4

quindi vediamo che ext4 è uscito significativamente più grande.

libguestfs Bug di Ubuntu

Ora per il rovescio della medaglia: sembra che al momento non ci siano manutentori di Ubuntu e la libreria è generalmente buggy su Ubuntu.

sudoin teoria non è richiesto, ma è necessario a causa di un bug di packaging di Ubuntu a meno che non eseguiamo una soluzione alternativa: /ubuntu/1046828/how-to-run-libguestfs-tools-tools-such-as- virt-make-FS-senza-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.

Successivamente, senza le nostre soluzioni alternative, il 18.04 (ma non il 16.04) fallisce con: https://bugzilla.redhat.com/show_bug.cgi?id=1591617

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

a causa di un bug che era già stato corretto a monte.

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


1

Utilizzando la strategia di Michaels in Fedora 23:

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

Questo crea il file system ext2, che puoi montare in alcune directory:

# mount file.fs /mnt 

Ora / mnt contiene tutti i tuoi file


Se file.fsè un file, il mountcomando non dovrebbe essere mount -o loop file.fs /mnt:?
Kasperd,

0

Che dire dell'accesso alla directory come condivisione di rete da una macchina virtuale montata anche sull'immagine del disco virtuale di destinazione? Oltre a eseguire una semplice copia dalla condivisione all'immagine del disco montata.


Dovrebbe funzionare, ed è simile alla mia attuale strategia, che è quella di costruire una macchina virtuale e sincronizzare i dati. Sarebbe bello se ci fosse una soluzione più rapida e pulita. Copiare i dati in una nuova macchina diventa piuttosto complicato perché devi preoccuparti di escludere determinati file che non dovrebbero essere copiati, come fstab e la maggior parte delle cose in / boot
Chris

"escludi alcuni file che non devono essere copiati, come fstab e la maggior parte delle cose in / boot" - potrebbe non essere un grosso problema quando la destinazione della VM è un volume aggiuntivo.
user48838

0

Preferisco (e uso) la risposta di Ciro Santilli, ma ecco qualcosa che funziona con una guestfishshell:

# 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.