Convertir directorio a imagen de disco virtual QEMU / KVM

10

Tengo un directorio lleno de datos /var/backups/disk1que quiero convertir en una imagen de disco virtual que luego podré iniciar usando QEMU o KVM (el directorio contiene el sistema de archivos para una máquina virtual, copiado a través de rsync).

Si bien existen muchas instrucciones para convertir un disco físico completo en un disco virtual, empaquetar solo el contenido de un solo directorio en una imagen de disco virtual resulta ser mucho más difícil de lo que esperaba. ¿Algunas ideas?

Por cierto, sé que puedo usar qemu-imgpara convertir un dispositivo de bloque en un disco virtual (por ejemplo, qemu-img convert -f /dev/sdc -O qcow2 disk.qcow2), por lo que si solo pudiera hacer que el directorio /var/backups/disk1parezca un dispositivo de bloque, entonces, en teoría, debería ser capaz de lograr mi objetivo usando qemu-img. Sin embargo, he pensado en formas creativas de exponer el directorio como un dispositivo de bloque usando NBD o un dispositivo de bucle invertido, y no he tenido éxito.

Chris
fuente

Respuestas:

16

Primero, cree una imagen en bruto del tamaño requerido. Asumiré que 10G es suficiente. El uso de la búsqueda crea un archivo disperso , que ahorra espacio.

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

A continuación, cree un sistema de archivos en él.

mkfs.ext4 -F example.img

(Tenga en cuenta que necesita la -Fopción para mkfs.ext4operar en un archivo en lugar de una partición de disco)

Luego, móntalo.

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

Ahora puede copiar sus archivos a / mnt / example. Una vez hecho esto, desmóntelo y puede usar example.img como unidad en una máquina virtual. Si lo desea, puede convertirlo de una imagen en bruto a otro formato como qcow2e usando qemu-img, pero esto no es obligatorio.

Sciurus
fuente
1
qemu-imgy fallocateson un poco más convenientes que dd.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
Cómo calcular el tamaño mínimo requerido: unix.stackexchange.com/questions/353156/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
4

virt-make-fsdel qcow2ejemplo de libguestfs

/server//a/332114/163884 lo mencionó, pero aquí hay un ejemplo 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 

Tenga en cuenta que sudono es necesario, excepto para la instalación y las soluciones de errores de Ubuntu.

Luego verifiqué que QEMU realmente puede leerlo con:

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

Entonces puedo montar la imagen dentro de QEMU Linux y leer el archivo.

virt-make-fs ejemplo ext

Esta increíble herramienta también puede crear sistemas de archivos ext sin procesar, por ejemplo:

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

que podemos verificar directamente en el host con:

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

Minimización del tamaño de la imagen.

Una característica realmente buena virt-make-fses que intenta minimizar automáticamente el tamaño de la imagen si eso es lo que queremos:

Virt-make-fs por defecto minimiza el espacio extra, pero puede usar el indicador --size para dejar espacio en el sistema de archivos si lo desea.

entonces:

df -h

me dice que la imagen está llena al 82%:

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

Podemos agregar fácilmente algo de espacio adicional al mínimo con --size-=+:

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

gastos generales del diario ext4

El manual también menciona que:

Tenga en cuenta que los sistemas de archivos ext3 contienen un diario, generalmente de 1 a 32 MB de tamaño. Si no va a utilizar el sistema de archivos de una manera que requiera el diario, entonces esto solo se desperdicia.

y es interesante verificar eso con:

du -bs *

que produce:

1052672 sysroot
1446297 sysroot.ext2
2599731 sysroot.ext4

así que vemos que el ext4 salió significativamente más grande.

errores de Ubuntu libguestfs

Ahora por el lado negativo: parece que actualmente no hay mantenedor de Ubuntu y la biblioteca generalmente tiene errores en Ubuntu.

sudoen teoría no se requiere, pero se requiere debido a un error de empaquetado de Ubuntu a menos que hagamos una solución alternativa: /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.

Después de eso, sin nuestras soluciones, 18.04 (pero no 16.04) falla con: https://bugzilla.redhat.com/show_bug.cgi?id=1591617

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

debido a un error que ya se corrigió en sentido ascendente.

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

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

Usando la estrategia de Michaels en Fedora 23:

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

Esto crea un sistema de archivos ext2, que puede montar en algún directorio:

# mount file.fs /mnt 

Ahora / mnt contiene todos tus archivos

Jauzus
fuente
Si file.fses un archivo, ¿no debería ser el mountcomando mount -o loop file.fs /mnt:?
kasperd
0

¿Qué pasa con el acceso al directorio como un recurso compartido de red desde una VM que también está montada en su imagen de disco virtual de destino? Usted que simplemente realizar una copia simple del recurso compartido a la imagen de disco montada.

usuario48838
fuente
Eso debería funcionar, y es similar a mi estrategia actual, que es construir una VM y sincronizar los datos. Sin embargo, sería genial si hubiera una solución más rápida y limpia. Copiar los datos en una nueva máquina se vuelve bastante complicado porque debe preocuparse por asegurarse de excluir ciertos archivos que no deben copiarse, como fstab y la mayoría de las cosas en / boot
Chris
"excluir ciertos archivos que no deberían copiarse, como fstab y la mayoría de las cosas en / boot", puede no ser un gran problema cuando el objetivo de VM es un volumen adicional.
user48838
0

Prefiero (y uso) la respuesta de Ciro Santilli, pero aquí hay algo que funciona con 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
fuente