Compresión de datos en Linux con VDO

Share on facebook
Share on twitter
Share on linkedin
Share on whatsapp
Share on telegram
Share on email

VDO expVirtual Data Optimizer es una característica nueva que aparece en Linux RedHat 8 que sirve para ahorrar espacio en disco en tiempo real mediante la compresión y deduplicación de datos.

La deduplicación consiste en la eliminación de datos repetidos.

En este tutorial vamos a aprender a crear un dispositivo VDO en Linux Centos 8 y veremos algunas de sus características más importantes.

Tutorial de VDO

¿Cuándo utilizar VDO?

VDO lo utilizaremos cuando el ahorro de espacio en disco es más importante que el rendimiento, ya que la compresión penaliza al rendimiento. Por ejemplo, en copias de seguridad.

¿Cuándo no utilizaremos VDO?

No debemos utilizar VDO en los siguientes casos:

  • Con LUKs: Los datos encriptados no se comprimen ni se deduplican.
  • Con dispostivos de caché o thin. Al ser datos efímeros, temporales o aleatórios, éstos no se duplican de una manera eficiente.
  • Con dispositivos RAID:
    • El RAID1 hace una copia «espejo» de los datos, por lo que no tiene sentido utilizar VDO para deduplicar datos.
    • El RAID0 utiliza varios discos para distribuir los datos, por lo que encontrará menos información para la deduplicación.
    • Los RAIDS 4, 5 y 6 aumentará la actividad de escritura que se tendrá que distribuir entre varios discos.

Instalación de los paquetes RPM necesarios para utilizar VDO

Los paquetes RPM que necesitamos para poder usar VDO son los siguientes:

[[email protected] ~]# rpm -qa |grep -i vdo
kmod-kvdo-6.2.2.117-65.el8.x86_64
vdo-6.2.2.117-13.el8.x86_64
[[email protected] ~]# 

Para instalarlos, utilizaremos el comando:

dnf install vdo kmod-vdo

Una vez instalado, habilitaremos el servicio VDO:

[[email protected] /]# systemctl enable vdo
[[email protected] /]# systemctl start vdo
[[email protected] /]# systemctl list-unit-files |grep -i vdo
vdo.service                                                            enabled  
[[email protected] /]#

Creación de un dispositivo VDO en Linux

Para esta práctica he asignado un disco de 15GB que lo utilizaremos para crear nuestro dispositivo VDO (/dev/sdb).

[[email protected] ~]# fdisk -l |grep dev |grep -v mapper
Disk /dev/sdb: 15 GiB, 16106127360 bytes, 31457280 sectors
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
/dev/sda1  *       2048   616447   614400  300M 83 Linux
/dev/sda2        616448  4810751  4194304    2G 82 Linux swap / Solaris
/dev/sda3       4810752 41943039 37132288 17.7G 83 Linux
[[email protected] ~]# 

A continuación, vamos a crearlo:

[[email protected] ~]# vdo create --name vdotest --device /dev/sdb
Creating VDO vdotest
vdo: ERROR - Not enough available memory in system for index requirement of 256M
[[email protected] ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1554        1177          77          20         299         218
Swap:          2047        1161         886
[[email protected] ~]# 

En este caso ha fallado porque el sistema no tiene suficiente memoria libre, así que he asignado más memoria al servidor virtual y lo volvemos a intentar. Quería añadir este error para que sepáis que os lo podéis encontrar si intentáis utilizar VDO en un servidor con poca memoria.

En la documentación oficial de RedHat tenemos una tabla de requerimientos de memoria y disco de VDO, en función del tamaño del dispositivo:

Requerimientos de espacio y memoria de VDO (Virtual Data Optimizer)

[[email protected] ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3752        2362         263          29        1125        1128
Swap:          2047           0        2047
[[email protected] ~]# vdo create --name vdotest --device /dev/sdb
Creating VDO vdotest
      Logical blocks defaulted to 3139552 blocks.
      The VDO volume can address 12 GB in 6 data slabs, each 2 GB.
      It can grow to address at most 16 TB of physical storage in 8192 slabs.
      If a larger maximum size might be needed, use bigger slabs.
Starting VDO vdotest
Starting compression on VDO vdotest
VDO instance 0 volume is ready at /dev/mapper/vdotest
[[email protected] ~]# 

[[email protected] ~]# vdo list
vdotest
[[email protected] ~]# 

Si no deseamos dar todo el espacio de disco en el momento de la creación del dispostivo VDO, podemos especificar cuánto espacio lógico queremos asignarle:

vdo create --name vdotest --device /dev/sdb --vdoLogicalSize 3G

Si por alguna razón queremos parar el dispositivo VDO, lo podremos hacer de la siguiente manera:

[[email protected] ~]# vdo stop -n vdotest
Stopping VDO vdotest
[[email protected] ~]# vdo start -n vdotest
Starting VDO vdotest
Starting compression on VDO vdotest
VDO instance 1 volume is ready at /dev/mapper/vdotest
[[email protected] ~]# 

Consultar el estado de un dispositivo VDO

Una vez creado el dispositivo VDO podemos consultar su estado con el siguiente comando:

[[email protected] ~]# vdo status --name vdotest
VDO status:
  Date: '2021-04-14 12:10:26+02:00'
  Node: server1
Kernel module:
  Loaded: true
  Name: kvdo
  Version information:
    kvdo version: 6.2.2.117
Configuration:
  File: /etc/vdoconf.yml
  Last modified: '2021-04-14 12:09:24'
VDOs:
  vdotest:
    Acknowledgement threads: 1
    Activate: enabled
    Bio rotation interval: 64
    Bio submission threads: 4
    Block map cache size: 128M
    Block map period: 16380
    Block size: 4096
    CPU-work threads: 2
    Compression: enabled
    Configured write policy: auto
    Deduplication: enabled
    Device mapper status: 0 25116416 vdo /dev/sdb normal - online online 788556 3932160
    Emulate 512 byte: disabled
    Hash zone threads: 1
    Index checkpoint frequency: 0
    Index memory setting: 0.25
    Index parallel factor: 0
    Index sparse: disabled
    Index status: online
    Logical size: 12558208K
    Logical threads: 1
    Max discard size: 4K
    Physical size: 15G
    Physical threads: 1
    Slab size: 2G
    Storage device: /dev/sdb
    UUID: VDO-765794b3-052f-4c4e-8a7b-7b58e80c4234
    VDO statistics:
      /dev/mapper/vdotest:
        1K-blocks: 15728640
        1K-blocks available: 12574416
        1K-blocks used: 3154224
        512 byte emulation: false
        KVDO module bios used: 0
        KVDO module bytes used: 411233984
        KVDO module peak bio count: 0
        KVDO module peak bytes used: 411233984
        bios acknowledged discard: 0
        bios acknowledged flush: 0
        bios acknowledged fua: 0
        bios acknowledged partial discard: 0
        bios acknowledged partial flush: 0
        bios acknowledged partial fua: 0
        bios acknowledged partial read: 0
        bios acknowledged partial write: 0
        bios acknowledged read: 266
        bios acknowledged write: 0
        bios in discard: 0
        bios in flush: 0
        bios in fua: 0
        bios in partial discard: 0
        bios in partial flush: 0
        bios in partial fua: 0
        bios in partial read: 0
        bios in partial write: 0
        bios in progress discard: 0
        bios in progress flush: 0
        bios in progress fua: 0
        bios in progress read: 0
        bios in progress write: 0
        bios in read: 266
        bios in write: 0
        bios journal completed discard: 0
        bios journal completed flush: 0
        bios journal completed fua: 0
        bios journal completed read: 0
        bios journal completed write: 0
        bios journal discard: 0
        bios journal flush: 0
        bios journal fua: 0
        bios journal read: 0
        bios journal write: 0
        bios meta completed discard: 0
        bios meta completed flush: 0
        bios meta completed fua: 0
        bios meta completed read: 5
        bios meta completed write: 65
        bios meta discard: 0
        bios meta flush: 1
        bios meta fua: 1
        bios meta read: 5
        bios meta write: 65
        bios out completed discard: 0
        bios out completed flush: 0
        bios out completed fua: 0
        bios out completed read: 0
        bios out completed write: 0
        bios out discard: 0
        bios out flush: 0
        bios out fua: 0
        bios out read: 0
        bios out write: 0
        bios page cache completed discard: 0
        bios page cache completed flush: 0
        bios page cache completed fua: 0
        bios page cache completed read: 0
        bios page cache completed write: 0
        bios page cache discard: 0
        bios page cache flush: 0
        bios page cache fua: 0
        bios page cache read: 0
        bios page cache write: 0
        block map cache pressure: 0
        block map cache size: 134217728
        block map clean pages: 0
        block map dirty pages: 0
        block map discard required: 0
        block map failed pages: 0
        block map failed reads: 0
        block map failed writes: 0
        block map fetch required: 0
        block map flush count: 0
        block map found in cache: 0
        block map free pages: 32768
        block map incoming pages: 0
        block map outgoing pages: 0
        block map pages loaded: 0
        block map pages saved: 0
        block map read count: 0
        block map read outgoing: 0
        block map reclaimed: 0
        block map wait for page: 0
        block map write count: 0
        block size: 4096
        completed recovery count: 0
        compressed blocks written: 0
        compressed fragments in packer: 0
        compressed fragments written: 0
        concurrent data matches: 0
        concurrent hash collisions: 0
        current VDO IO requests in progress: 0
        current dedupe queries: 0
        data blocks used: 0
        dedupe advice stale: 0
        dedupe advice timeouts: 0
        dedupe advice valid: 0
        entries indexed: 0
        flush out: 0
        instance: 0
        invalid advice PBN count: 0
        journal blocks batching: 0
        journal blocks committed: 0
        journal blocks started: 0
        journal blocks writing: 0
        journal blocks written: 0
        journal commits requested count: 0
        journal disk full count: 0
        journal entries batching: 0
        journal entries committed: 0
        journal entries started: 0
        journal entries writing: 0
        journal entries written: 0
        logical blocks: 3139552
        logical blocks used: 0
        maximum VDO IO requests in progress: 63
        maximum dedupe queries: 0
        no space error count: 0
        operating mode: normal
        overhead blocks used: 788556
        physical blocks: 3932160
        posts found: 0
        posts not found: 0
        queries found: 0
        queries not found: 0
        read only error count: 0
        read-only recovery count: 0
        recovery progress (%): N/A
        reference blocks written: 0
        release version: 133524
        saving percent: N/A
        slab count: 6
        slab journal blocked count: 0
        slab journal blocks written: 0
        slab journal disk full count: 0
        slab journal flush count: 0
        slab journal tail busy count: 0
        slab summary blocks written: 0
        slabs opened: 0
        slabs reopened: 0
        updates found: 0
        updates not found: 0
        used percent: 20
        version: 30
        write amplification ratio: 0.0
        write policy: sync
[[email protected] ~]# 

Como vemos, nos da muchas opciones que podemos comprobar.

Comprimiendo los datos en tiempo real en dispositivos VDO de Linux

Una de las características que nos interesa conocer en el estado del dispositivo es si está habilitada la compresión y la deduplicación. Si no estuviesen activadas, los datos no se podrían comprimir.

[[email protected] /]# vdo status |grep -i compres
    Compression: enabled
        compressed blocks written: 1113
        compressed fragments in packer: 33
        compressed fragments written: 2748
[[email protected] /]# 

[[email protected] /]# vdo status |grep -i dedu
    Deduplication: enabled
        current dedupe queries: 0
        dedupe advice stale: 0
        dedupe advice timeouts: 0
        dedupe advice valid: 1568437
        maximum dedupe queries: 1400
[[email protected] /]# 

Creación de un filesystem XFS en un dispositivo VDO

Un vez que nuestro dispositivo VDO se ha creado correctamente, ya estamos listo para utilizarlo y guardar datos en él. Lo que vamos a hacer es crear un filesystem XFS, como hacemos habitualmente con otros dispositivos.

[[email protected] ~]# mkfs.xfs -K /dev/mapper/vdotest 
meta-data=/dev/mapper/vdotest    isize=512    agcount=4, agsize=784888 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=3139552, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[[email protected] ~]# 

A continuación, montamos el filesystem:

[[email protected] ~]# mkdir /vdotest
[[email protected] ~]# mount /dev/mapper/vdotest /vdotest/
[[email protected] ~]# df -hP /vdotest/
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/vdotest   12G  118M   12G   1% /vdotest
[[email protected] ~]# 

Importante: VDO se queda con unos 3GB, aproximadamente, para su propia gestión. Recordemos que el disco tenía 15GB pero el filesystem que hemos creado tiene un espacio de 12GB.

Configuración de fstab para el montaje de filesystems con VDO durante el arranque del sistema operativo

Tenemos que asegurarnos de que el sistema no intenta montar los filesystems con VDO hasta que el servicio vdo.service haya arrancado. Para ello, configuraremos el fichero /etc/fstab de la siguiente manera:

[[email protected] ~]# grep vdotest /etc/fstab
/dev/mapper/vdotest	/vdotest	xfs	defaults,x-systemd.requires=vdo.service	0 0
[[email protected] ~]# 

Poniendo a prueba la compresión de un dispositivo VDO

Ahora que ya tenemos un filesystem bajo un disco VDO listo para ser usado, vamos a copiar un archivo de 628MB diez veces, lo que significa que debería ocupar un espacio de unos 7GB. Veremos cómo actúa la compresión.

[[email protected] ~]# cp -p /ISO/rhel-8.3-x86_64-boot.iso /vdotest/
[[email protected] ~]# cp -p /ISO/rhel-8.3-x86_64-boot.iso /vdotest/rhel-8.3-x86_64-boot.iso-2
[[email protected] ~]# cp -p /ISO/rhel-8.3-x86_64-boot.iso /vdotest/rhel-8.3-x86_64-boot.iso-3
[[email protected] ~]# cp -p /ISO/rhel-8.3-x86_64-boot.iso /vdotest/rhel-8.3-x86_64-boot.iso-4
[[email protected] ~]# cp -p /ISO/rhel-8.3-x86_64-boot.iso /vdotest/rhel-8.3-x86_64-boot.iso-5
[[email protected] ~]# cp -p /ISO/rhel-8.3-x86_64-boot.iso /vdotest/rhel-8.3-x86_64-boot.iso-6
[[email protected] /]# cp -p /ISO/rhel-8.3-x86_64-boot.iso /vdotest/rhel-8.3-x86_64-boot.iso-7
[[email protected] /]# cp -p /ISO/rhel-8.3-x86_64-boot.iso /vdotest/rhel-8.3-x86_64-boot.iso-8
[[email protected] /]# cp -p /ISO/rhel-8.3-x86_64-boot.iso /vdotest/rhel-8.3-x86_64-boot.iso-9
[[email protected] /]# cp -p /ISO/rhel-8.3-x86_64-boot.iso /vdotest/rhel-8.3-x86_64-boot.iso-10
[[email protected] /]# ls -lh /vdotest/
total 6.7G
-rw-r--r-- 1 root root 682M Oct 14 10:21 rhel-8.3-x86_64-boot.iso
-rw-r--r-- 1 root root 682M Oct 14 10:21 rhel-8.3-x86_64-boot.iso-10
-rw-r--r-- 1 root root 682M Oct 14 10:21 rhel-8.3-x86_64-boot.iso-2
-rw-r--r-- 1 root root 682M Oct 14 10:21 rhel-8.3-x86_64-boot.iso-3
-rw-r--r-- 1 root root 682M Oct 14 10:21 rhel-8.3-x86_64-boot.iso-4
-rw-r--r-- 1 root root 682M Oct 14 10:21 rhel-8.3-x86_64-boot.iso-5
-rw-r--r-- 1 root root 682M Oct 14 10:21 rhel-8.3-x86_64-boot.iso-6
-rw-r--r-- 1 root root 682M Oct 14 10:21 rhel-8.3-x86_64-boot.iso-7
-rw-r--r-- 1 root root 682M Oct 14 10:21 rhel-8.3-x86_64-boot.iso-8
-rw-r--r-- 1 root root 682M Oct 14 10:21 rhel-8.3-x86_64-boot.iso-9
[[email protected] /]# df -hP /vdotest/
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/vdotest   12G  6.8G  5.2G  57% /vdotest
[[email protected] /]# 

Efectivamente, el comando «df» nos muestra 6,8GB ocupados pero, en realidad, estamos usando 3,7 con la compresión de VDO:

[[email protected] /]# vdostats --human-readable 
Device                    Size      Used Available Use% Space saving%
/dev/mapper/vdotest      15.0G      3.7G     11.3G  24%           90%
[[email protected] /]# 

Para aumentar el tamaño lógico del filesystem y, por lo tanto, tener más espacio disponible a nivel de filesystem, aumentaremos el tamaño lógico del dispositivo VDO:

[[email protected] ~]# vdo growLogical -n vdotest --vdoLogicalSize 15G
[[email protected] ~]# vdostats --human-readable 
Device                    Size      Used Available Use% Space saving%
/dev/mapper/vdotest      15.0G      7.1G      7.9G  47%           65%
[[email protected] ~]# 
[[email protected] vdotest]# xfs_growfs /dev/mapper/vdotest
meta-data=/dev/mapper/vdotest    isize=512    agcount=4, agsize=784888 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=3139552, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 3139552 to 3932160
[[email protected] vdotest]# df -hP .
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/vdotest   15G   12G  3.1G  80% /vdotest
[[email protected] vdotest]# 

Como vemos, ahora el filesystem ha aumentado de 12GB a 15 y todavía tenemos más espacio disponible en el dispositivo VDO para seguir ampliando el filesystem.

Aumentar el tamaño del dispositivo VDO

Al inicio de este tutorial, escogimos un disco de 15GB para crear nuestro dispostivo VDO. Ahora imaginemos que necesitamos más espacio porque lo hemos agotado y el técnico de storage nos amplia la LUN de 15 a 18GB:

[[email protected] ~]# fdisk -l |grep sdb
Disk /dev/sdb: 18 GiB, 19327352832 bytes, 37748736 sectors
[[email protected] ~]# 

Sin embargo, el disco VDO todavía sigue siendo de 15GB:

[[email protected] ~]# vdo status --name=vdotest |grep "Physical size"
    Physical size: 15G
[[email protected] ~]# 

Lo que tenemos que hacer para utilizar los 18GB del disco asignado al sistema, es ampliar el tamaño físico del dispositivo VDO. Lo haremos de la siguiente manera:

[[email protected] ~]# vdo growPhysical --name vdotest

[[email protected] ~]# vdo status --name=vdotest |grep "Physical size"
    Physical size: 18G
[[email protected] ~]# 

[[email protected] ~]# vdostats --human-readable 
Device                    Size      Used Available Use% Space saving%
/dev/mapper/vdotest      18.0G      8.1G      9.9G  44%           70%
[[email protected] ~]#

Eliminar un dispositivo VDO

Si ya no vamos a utilizar el dispositivo VDO y lo queremos eliminar, lo haremos así:

[[email protected] ~]# umount /vdotest 
[[email protected] ~]# vdo remove --name=vdotest
Removing VDO vdotest
Stopping VDO vdotest
[[email protected] ~]# 

No hay que olvidarse de eliminar las entradas en el fstab, si las hubiera.

Uso de VDO con LVM

Con las versiones de Linux RedHat 8.3 o CentOS 8.3 y VDO vdo-6.2.3.114-14, LVM se puede utilizar pero su uso es experimental. Tenemos más información en https://access.redhat.com/articles/2106521#vdo.

[[email protected] ~]# apropos vdo
lvmvdo (7)           - EXPERIMENTAL LVM Virtual Data Optimizer support

No obstante, he querido probarlo y ha funcionado correctamente. Veamos las pruebas realizadas:

  • Creación de un VG, un LV y un filesystem con un dispositivo VDO:
[[email protected] ~]# vgcreate vgvdo /dev/mapper/vdotest
WARNING: xfs signature detected on /dev/mapper/vdotest at offset 0. Wipe it? [y/n]: y
  Wiping xfs signature on /dev/mapper/vdotest.
  Physical volume "/dev/mapper/vdotest" successfully created.
  Volume group "vgvdo" successfully created
[[email protected] ~]#

[[email protected] ~]# lvcreate -n lvvdotest -L5G vgvdo
  Logical volume "lvvdotest" created.
[[email protected] ~]# 

[[email protected] ~]# mkfs.xfs -K -f /dev/vgvdo/lvvdotest 
meta-data=/dev/vgvdo/lvvdotest   isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[[email protected] ~]# 

[[email protected] ~]# mount /dev/vgvdo/lvvdotest /vdotest/
[[email protected] ~]# df -hP /vdotest/
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vgvdo-lvvdotest  5.0G   68M  5.0G   2% /vdotest
[[email protected] ~]# 
  • Ampliación del LV y el filesystem:
[[email protected] ~]# lvextend -n /dev/vgvdo/lvvdotest -L+1G 
  Size of logical volume vgvdo/lvvdotest changed from 5.00 GiB (1280 extents) to 6.00 GiB (1536 extents).
  Logical volume vgvdo/lvvdotest successfully resized.
[[email protected] ~]# xfs_growfs /dev/vgvdo/lvvdotest
meta-data=/dev/mapper/vgvdo-lvvdotest isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 1310720 to 1572864
[[email protected] ~]# df -hP /vdotest/
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vgvdo-lvvdotest  6.0G  1.1G  5.0G  18% /vdotest
[[email protected] ~]# 
  • Probando la configuración de fstab:
[[email protected] ~]# tail -1 /etc/fstab
/dev/vgvdo/lvvdotest	/vdotest        xfs     defaults,x-systemd.requires=vdo.service 0 0
[[email protected] ~]# umount /vdotest 
[[email protected] ~]# mount /vdotest/
[[email protected] ~]# 
  • Ampliamos el disco físico de 15 a 18GB:
[[email protected] ~]# fdisk -l |grep sdb
Disk /dev/sdb: 18 GiB, 19327352832 bytes, 37748736 sectors
[[email protected] ~]#

[[email protected] ~]# vdo growPhysical --name vdotest
[[email protected] ~]# vdo status --name=vdotest |grep "Physical size"
    Physical size: 18G
[[email protected] ~]#

[[email protected] ~]# pvresize /dev/mapper/vdotest 
  Physical volume "/dev/mapper/vdotest" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized

[[email protected] ~]# vgs vgvdo
  VG    #PV #LV #SN Attr   VSize   VFree
  vgvdo   1   1   0 wz--n- <30.00g 5.00g
[[email protected] ~]#

[[email protected] ~]# xfs_growfs /dev/vgvdo/lvvdotest
meta-data=/dev/mapper/vgvdo-lvvdotest isize=512    agcount=20, agsize=327680 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=6552576, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 6552576 to 7863296
[[email protected] ~]# df -hP /vdotest/
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vgvdo-lvvdotest   30G  7.0G   24G  24% /vdotest
[[email protected] ~]# 

Como podemos comprobar, acabamos de crear un filesystem de 30GB en un disco de 18GB.

Pero todavía lo podemos ampliar más porque el uso del dispositivo VDO está al 25%:

[[email protected] ~]# vdostats --human-readable
Device                    Size      Used Available Use% Space saving%
/dev/mapper/vdotest      18.0G      4.7G     13.3G  25%           90%
[[email protected] ~]# 

Ahora podemos validar que realmente podemos meter 30GB de datos en el FS en un disco físico de menor tamaño:

[[email protected] vdotest]# dd if=/dev/urandom of=test bs=8192 count=131072
131072+0 records in
131072+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 34.867 s, 30.8 MB/s
[[email protected] vdotest]#

[[email protected] vdotest]# for i in `seq 2 30`; do cp -p test test$i; done
cp: error writing 'test30': No space left on device
[[email protected] vdotest]# 

[[email protected] vdotest]# ls -lh
total 30G
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test10
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test11
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test12
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test13
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test14
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test15
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test16
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test17
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test18
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test19
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test2
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test20
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test21
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test22
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test23
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test24
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test25
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test26
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test27
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test28
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test29
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test3
-rw------- 1 root root 762M Apr 15 22:58 test30
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test4
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test5
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test6
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test7
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test8
-rw-r--r-- 1 root root 1.0G Apr 15 22:48 test9
[[email protected] vdotest]# df -hP .
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vgvdo-lvvdotest   30G   30G   64K 100% /vdotest
[[email protected] vdotest]# 

Lo más increíble es que de los 30GB de datos que hemos almacenado en el filesystem, en el dispositivo VDO solamente estamos utilizando 5,1.

[[email protected] vdotest]# vdostats --human-readable
Device                    Size      Used Available Use% Space saving%
/dev/mapper/vdotest      18.0G      5.1G     12.9G  28%           96%
[[email protected] vdotest]# 

Esto significa que el filesystem todavía puede ampliarse más:

[[email protected] ~]# vdo growLogical -n vdotest --vdoLogicalSize 40G
[[email protected] ~]# pvresize /dev/mapper/vdotest 
  Physical volume "/dev/mapper/vdotest" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized
[[email protected] ~]# lvextend -n /dev/vgvdo/lvvdotest -l+100%FREE
  Size of logical volume vgvdo/lvvdotest changed from <30.00 GiB (7679 extents) to <40.00 GiB (10239 extents).
  Logical volume vgvdo/lvvdotest successfully resized.
[[email protected] ~]# xfs_growfs /dev/mapper/vgvdo-lvvdotest
meta-data=/dev/mapper/vgvdo-lvvdotest isize=512    agcount=24, agsize=327680 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=7863296, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 7863296 to 10484736
[[email protected] ~]# df -hP /vdotest/
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vgvdo-lvvdotest   40G   31G   10G  76% /vdotest
[[email protected] ~]# 


[[email protected] ~]# vdostats --human-readable
Device                    Size      Used Available Use% Space saving%
/dev/mapper/vdotest      18.0G      5.1G     12.9G  28%           96%
[[email protected] ~]# 

Ahora, el FS es de 40GB y en el disco VDO todavía tenemos 12,9 disponibles. Como podemos comprobar, el ahorro de espacio es increíble.

Sustitución de un disco VDO por otro en arquitectura LVM

Siguiendo el mismo procedimiento que hemos visto hasta ahora, he añadido un nuevo disco VDO que sustituirá al que se está utilizando actualmente en el VG. Esto es muy útil, por ejemplo, cuando tenemos que migrar a una cabina de discos nueva.

[[email protected] ~]# vdostats --human-readable
Device                    Size      Used Available Use% Space saving%
/dev/mapper/vdotest2     18.0G      4.0G     14.0G  22%           N/A
/dev/mapper/vdotest      18.0G      5.1G     12.9G  28%           96%
[[email protected] ~]# 

Sustituiremos el disco «test» por el «test2».

[[email protected] ~]# vgextend vgvdo /dev/mapper/vdotest2
  Physical volume "/dev/mapper/vdotest2" successfully created.
  Volume group "vgvdo" successfully extended
[[email protected] ~]# pvs
  PV                   VG    Fmt  Attr PSize   PFree  
  /dev/mapper/vdotest  vgvdo lvm2 a--  <40.00g      0 
  /dev/mapper/vdotest2 vgvdo lvm2 a--  <40.00g <40.00g
[[email protected] ~]# 

[[email protected] ~]# pvmove /dev/mapper/vdotest /dev/mapper/vdotest2
  /dev/mapper/vdotest: Moved: 0.05%
  /dev/mapper/vdotest: Moved: 2.59%
  /dev/mapper/vdotest: Moved: 4.26%
...
  /dev/mapper/vdotest: Moved: 89.34%
  /dev/mapper/vdotest: Moved: 94.99%
  /dev/mapper/vdotest: Moved: 100.00%
[[email protected] ~]# 

[[email protected] ~]# pvs |grep vgvdo
  /dev/mapper/vdotest  vgvdo lvm2 a--  <40.00g <40.00g
  /dev/mapper/vdotest2 vgvdo lvm2 a--  <40.00g      0 
[[email protected] ~]# 

[[email protected] ~]# vgreduce vgvdo /dev/mapper/vdotest
  Removed "/dev/mapper/vdotest" from volume group "vgvdo"
[[email protected] ~]# pvs |grep vgvdo
  /dev/mapper/vdotest2 vgvdo lvm2 a--  <40.00g     0 
[[email protected] ~]# 

[[email protected] ~]# ls -la /vdotest |head
total 31188996
drwxr-xr-x   2 root root       4096 Apr 15 22:57 .
dr-xr-xr-x. 19 root root        270 Apr 14 21:56 ..
-rw-r--r--   1 root root 1073741824 Apr 15 22:48 test
-rw-r--r--   1 root root 1073741824 Apr 15 22:48 test10
-rw-r--r--   1 root root 1073741824 Apr 15 22:48 test11
-rw-r--r--   1 root root 1073741824 Apr 15 22:48 test12
-rw-r--r--   1 root root 1073741824 Apr 15 22:48 test13
-rw-r--r--   1 root root 1073741824 Apr 15 22:48 test14
-rw-r--r--   1 root root 1073741824 Apr 15 22:48 test15
[[email protected] ~]# 

Te podría interesar

¿Te ha gustado? Compártelo

Share on facebook
Share on twitter
Share on linkedin
Share on whatsapp
Share on telegram
Share on email
About Author

Contenido Relacionado

Artículos Recientes

Deja un comentario