Saltar al contenido principal

% 16k.es

Añadir un VDO a una máquina virtual

Table of Contents

Cómo añadir un disco VDO a una máquina virtual para añadir almacenamiento aprovechando la compresión y deduplicación transparentes

rhel

Mierda, una de las máquinas virtuales de mi laboratorio casero ha petado porque el filesystem root se ha llenado. Parece que Nessus Essentials genera reportes mucho más frecuentes y grandes de lo que yo esperaba :)

Para arreglarlo añadiré un disco para mover el directorio /opt (o parte de él). Pero usaré el nuevo Red Hat Virtual Data Optimizer (VDO) para aprovechar sus características de compresión y deduplicación transparentes.

Para empezar, crearé el disco nuevo lo contectaré a la VM. Cómo hacerlo dependerá del sistema de virtualización que está usando cada cual.

Lo importante es terminar con un nuevo disco en la VM:

# dmesg | tail
[...]
[89575.706450] scsi 0:0:0:1: Direct-Access     QEMU     QEMU HARDDISK    2.5+ PQ: 0 ANSI: 5
[89575.710622] sd 0:0:0:1: Power-on or device reset occurred
[89575.710950] sd 0:0:0:1: Attached scsi generic sg2 type 0
[89575.713614] sd 0:0:0:1: [sdb] 33554432 512-byte logical blocks: (17.2 GB/16.0 GiB)
[89575.713719] sd 0:0:0:1: [sdb] Write Protect is off
[89575.713720] sd 0:0:0:1: [sdb] Mode Sense: 63 00 00 08
[89575.713869] sd 0:0:0:1: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[89575.723197] sd 0:0:0:1: [sdb] Attached SCSI disk

vdo no se instala por defecto en CentOS 8 así que:

yum -y install vdo kmod-kvdo

Ya podemos crear el volumen vdo donde /opt podrá ir a vivir:

# vdo create --vdoLogicalSize=32G -n vdo_opt --device=/dev/sdb
Creating VDO vdo_opt
Starting VDO vdo_opt
Starting compression on VDO vdo_opt
VDO instance 0 volume is ready at /dev/mapper/vdo_opt

Crear el filesystem XFS (no olvidar el argumento -K)

mkfs.xfs -K /dev/mapper/vdo_opt

De momento todo ok. Falta mover los datos, Antes de empezar, tenemos que asegurarnos de que no hy ficheros en uso en el directorio que queremos mover; si es el caso, probablemente tengamos que parar el servicio nessusd.service.

Y ahora el proceso habitual: renombrar /opt a /opt2 y crear el nuevo /opt que será el nuevo hogar del volumen vdo:

cd /
mv /opt /opt2
mkdir /opt
mount /dev/mapper/vdo_opt /opt
mv /opt2/* /opt/

Dependiendo de cuántos datos haya que mover, esto puede llevar un rato. Si todo va bien, una vez termine de ejecutarse podremos borrar el viejo directorio /opt2:

rmdir /opt2

En caso de error, posiblemente haya ficheros ocultos en uso, tocará hacer troublehsooting.

# Montando el disco VDO

Probablemente hayas notado que montamos el vdo manualmente sin crear una entrada /etc/fstab. Y no lo vamos a hacer.

Vamos a dejar que sea systemd quien se haga cargo. Como sabrás, las unidades systemd no se limitan a los servicios tradicionales sino que pueden ser también puntos de montaje.

Con la instalación de vdo, se crearon algunos ficheros de ejemplo /usr/share/doc/vdo/examples. Vamos a usar uno de ellos:

cp /usr/share/doc/vdo/examples/systemd/VDO.mount.example /etc/systemd/system/opt.mount

Editar vdo-opt.mount a nuestra conveniencia:

[Unit]
Description = Mount filesystem that lives on VDO
name = opt.mount
Requires = vdo.service systemd-remount-fs.service
After = multi-user.target
Conflicts = umount.target
 
[Mount]
What = /dev/mapper/vdo_opt
Where = /opt
Type = xfs
Options = discard

[Install]
WantedBy = multi-user.target

WARNING: to be able to do this, mount unit name (opt) must match mount point name (/opt). OJOCUIDAO: para poder hacer esto, el nombre de la unidad (opt) tiene que coincidir con el nombre del punto de montaje (opt).

Enable y start:

# systemctl enable --now opt.mount
# df
Filesystem                 1K-blocks    Used Available Use% Mounted on
devtmpfs                      920060       0    920060   0% /dev
tmpfs                         936732       0    936732   0% /dev/shm
tmpfs                         936732    8692    928040   1% /run
tmpfs                         936732       0    936732   0% /sys/fs/cgroup
/dev/mapper/vg_system-root  10475520 1633256   8842264  16% /
/dev/mapper/vg_system-home   1038336  126544    911792  13% /home
/dev/mapper/vg_system-tmp    2086912   47780   2039132   3% /tmp
/dev/sda1                     999320  265636    664872  29% /boot
tmpfs                         187344       0    187344   0% /run/user/1000
/dev/mapper/vdo_opt         33538048 8992684  24545364  27% /opt

¿Cuánto tardaré en volver a llenarse? Pues yo qué sé, habrá que echar un ojo a las estadísticas de vez en cuando:

vdostats --human-readable
Device                    Size      Used Available Use% Space saving%
/dev/mapper/vdo_opt      16.0G      8.8G      7.2G  55%           42%

## Referencias

A look at VDO, the new Linux compression layer