Montar volumen zvol zfs de una vm bhyve en FreeBSD (también válido para linux/kvm)

Hace unos días tuve la necesidad de acceder al disco de una vm para realizar una sincronización de ficheros para una migración desde un servidor físico a una máquina virtual gestionada con Byhve en FreeBSD.

La configuración de disco que utilizo para el hypervisor byhve se basa en ZFS en lugar de imágenes raw que permite crear un volumen dedicado a cada VM, optimizando el espacio en disco junto con compresión, encriptación, snapshots y todas las ventajas que puede aportar ZFS (y desventajas). También se puede optar por el formato qcow en Linux/KVM y cada tecnología aporta sus ventajas e inconvenientes.

Pero centremos nos en el título de la entrada. La memoria es frágil y con tanta infinidad de opciones que ofrece cada tecnología a veces se olvidan algunas opciones y configuraciones.

Para realizar la sincronización de los ficheros en la vm de destino mi objetivo era montar el volumen de la VM en el hypervisor y desde él realizar un rsync desde la antigua máquina (aún en producción) al volumen montado con la idea de minimizar el downtime mientras se realizan cambios de ips y bla bla bla.

En zfs por cada dataset de tipo volumen que se crea, en el directorio /dev aparecerá un dispositivo para poder acceder a él como si se tratara de un disco mas:

# ls -la /dev/zvol/zroot/bhyve/testvm/disk0
crw-r----- 1 root operator 0xe3 10 nov. 17:16 /dev/zvol/zroot/bhyve/testvm/disk0

Esta característica de ZFS es muy conveniente para poder manipular y realizar acciones en el volumen como en cualquier otro dispositivo.

El problema que me surgió (y me sirva como recordatorio) es que el acceso al dispotivio en principio no era posible:

# gpart show /dev/zvol/zroot/bhyve/testvm/disk0
gpart: No such geom: /dev/zvol/zroot/bhyve/testvm/disk0.

El motivo es que por defecto, cuando vm-bhyve crea el volumen zfs establece el volmode como «dev» y este modo no permite tener una visión completa del dispositivo creado en el sistema:

volmode=default|full|geom|dev|none
  This property specifies how volumes should be exposed to the OS.
  Setting it to full exposes volumes as fully fledged block devices,
  providing maximal functionality. The value geom is just an alias for
  full and is kept for compatibility. Setting it to dev hides its
  partitions. Volumes with property set to none are not exposed outside
  ZFS, but can be snapshotted, cloned, replicated, etc, that can be
  suitable for backup purposes. Value default means that volumes
  exposition is controlled by system-wide tunable zvol_volmode, where
  full, dev and none are encoded as 1, 2 and 3 respectively. The default
  value is full.

La solución es bien sencilla y se arregla con un sencillo comando:

# zfs set volmode=full zroot/bhyve/testvm/disk0

Y ahora si:

# gpart show /dev/zvol/zroot/bhyve/testvm/disk0
=> 2048 4192223 zvol/zroot/bhyve/testvm/disk0 GPT (10G) [CORRUPT]
2048 6144 14 bios-boot (3.0M)
8192 253952 15 efi (124M)
262144 3932127 1 linux-data (1.9G)

Tenemos acceso completo al disco, además aparecen las particiones que es lo que necesitamos para poder montarlas en el hypervisor:

# ls -la /dev/zvol/zroot/bhyve/testvm/disk0*
crw-r----- 1 root operator 0xdd 10 nov. 17:28 /dev/zvol/zroot/bhyve/testvm/disk0
crw-r----- 1 root operator 0xe2 10 nov. 17:28 /dev/zvol/zroot/bhyve/testvm/disk0p1
crw-r----- 1 root operator 0xe4 10 nov. 17:28 /dev/zvol/zroot/bhyve/testvm/disk0p14
crw-r----- 1 root operator 0xe5 10 nov. 17:28 /dev/zvol/zroot/bhyve/testvm/disk0p15

Ahora, montar la partición deseada es tan sencillo como:

# mkdir /mnt/testvm

# mount -t ext2fs -o rw /dev/zvol/zroot/bhyve/testvm/disk0p1 /mnt/testvm/

Con lo que tendremos acceso al disco de la VM en /mnt/testvm.

Recuerda realizar esta operación siempre con la VM parada y no iniciarla nunca sin verificar que ha sido desmontado el volumen.

# umount /mnt/testvm

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este formulario guarda los datos que indiques de nombre, email y comentario para poder realizar un seguimiento de los comentarios dejados en cada entrada.