Convertir le répertoire en image de disque virtuel QEMU / KVM

10

J'ai un répertoire rempli de données /var/backups/disk1que je veux convertir en une image de disque virtuel que je pourrai ensuite démarrer en utilisant QEMU ou KVM (le répertoire contient le système de fichiers pour une machine virtuelle, copié via rsync).

Bien qu'il existe de nombreuses instructions pour convertir un disque physique complet en disque virtuel, empaqueter uniquement le contenu d'un seul répertoire en une image de disque virtuel s'avère beaucoup plus difficile que prévu. Des idées?

Soit dit en passant, je sais que je peux utiliser qemu-imgpour convertir un périphérique de bloc en disque virtuel (par exemple, qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2), donc si seulement je pouvais faire en sorte que le répertoire /var/backups/disk1apparaisse comme un périphérique de bloc, alors théoriquement, je devrais pouvoir atteindre mon objectif en utilisant qemu-img. J'ai pensé à des moyens créatifs d'exposer le répertoire en tant que périphérique de bloc à l'aide de NBD ou d'un périphérique de bouclage, mais je n'ai pas réussi.

Chris
la source

Réponses:

16

Créez d'abord une image brute de la taille requise. Je suppose que 10G est suffisant. L'utilisation de la recherche crée un fichier clairsemé , ce qui économise de l'espace.

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

Ensuite, créez un système de fichiers dessus.

mkfs.ext4 -F example.img

(Notez que vous avez besoin de l' -Foption pour mkfs.ext4opérer sur un fichier par opposition à une partition de disque)

Ensuite, montez-le.

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

Vous pouvez maintenant copier vos fichiers dans / mnt / example. Une fois cela fait, démontez-le et vous pouvez utiliser example.img comme lecteur dans une machine virtuelle. Si vous le souhaitez, vous pouvez le convertir d'une image brute vers un autre format comme qcow2e en utilisant qemu-img, mais ce n'est pas obligatoire.

sciurus
la source
1
qemu-imget fallocatesont un peu plus pratique que dd.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
Comment calculer la taille minimale requise: unix.stackexchange.com/questions/353156/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
4

virt-make-fsà partir de l' qcow2exemple de libguestfs

/server//a/332114/163884 l'a mentionné, mais voici un exemple complet:

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 

Notez comment sudon'est pas requis, sauf pour l'installation et les solutions de contournement des bogues Ubuntu.

J'ai ensuite vérifié que QEMU peut réellement le lire avec:

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

Je peux ensuite monter l'image dans QEMU Linux et lire le fichier.

virt-make-fs exemple ext

Cet outil génial peut également créer des systèmes de fichiers ext bruts, par exemple:

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

que nous pouvons vérifier directement sur l'hôte avec:

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

Minimisation de la taille de l'image

Une très bonne caractéristique de virt-make-fsest qu'il essaie automatiquement de minimiser la taille de l'image si c'est ce que nous voulons:

Virt-make-fs par défaut minimise l'espace supplémentaire, mais vous pouvez utiliser l'indicateur --size pour laisser de l'espace dans le système de fichiers si vous le souhaitez.

donc:

df -h

me dit que l'image est remplie à 82%:

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

Nous pouvons facilement ajouter de l'espace supplémentaire en plus du minimum avec --size-=+:

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

frais généraux de journal ext4

Le manuel mentionne également que:

Notez que les systèmes de fichiers ext3 contiennent un journal, généralement de 1 à 32 Mo. Si vous n'allez pas utiliser le système de fichiers d'une manière qui nécessite le journal, alors c'est juste une surcharge.

et il est intéressant de vérifier cela avec:

du -bs *

qui produit:

1052672 sysroot
1446297 sysroot.ext2
2599731 sysroot.ext4

nous voyons donc que l'ext4 est sorti beaucoup plus gros.

libguestfs bogues Ubuntu

Maintenant, pour le revers de la médaille: il ne semble pas y avoir de responsable Ubuntu actuellement et la bibliothèque est généralement boguée sur Ubuntu.

sudon'est pas en théorie requis, mais il est requis en raison d'un bogue de package Ubuntu, sauf si nous faisons une solution de contournement: /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.

Après cela, sans nos solutions de contournement, 18.04 (mais pas 16.04) échoue avec: https://bugzilla.redhat.com/show_bug.cgi?id=1591617

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

en raison d'un bogue déjà corrigé en amont.

Testé dans Ubuntu 18.04, libguestfs-tools 1: 1.36.13-1ubuntu3, QEMU 1: 2.11 + dfsg-1ubuntu7.3.

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
la source
1

Utiliser la stratégie de Michaels dans Fedora 23:

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

Cela crée un système de fichiers ext2, que vous pouvez monter dans un répertoire:

# mount file.fs /mnt 

Maintenant / mnt contient tous vos fichiers

Jauzus
la source
Si file.fsc'est un fichier, la mountcommande ne devrait-elle pas être mount -o loop file.fs /mnt:?
kasperd
0

Qu'en est-il de l'accès au répertoire en tant que partage réseau à partir d'une machine virtuelle également montée sur votre image de disque virtuel cible? Vous pouvez alors effectuer une simple copie du partage sur l'image disque montée.

user48838
la source
Cela devrait fonctionner et est similaire à ma stratégie actuelle, qui consiste à créer une machine virtuelle et à synchroniser les données. Ce serait formidable s'il existait une solution plus rapide et plus propre. La copie des données sur une nouvelle machine devient assez compliquée car vous devez vous assurer d'exclure certains fichiers qui ne devraient pas être copiés, comme fstab et la plupart des choses dans / boot
Chris
"exclure certains fichiers qui ne devraient pas être copiés, comme fstab et la plupart des choses dans / boot" - peut ne pas être un gros problème lorsque la cible VM est un volume supplémentaire.
user48838
0

Je préfère (et utilise) la réponse de Ciro Santilli, mais voici quelque chose qui fonctionne avec un 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
rubicks
la source