Saltar la navegación

Ampliación y reducción de los LVs

La ampliación y reducción de los LVs es una de las flexibilidades que nos aporta LVM con respecto al almacenamiento tradicional. Los comandos que podemos usar para tal fin son los siguientes:

  • lvextend: Permite ampliar el tamaño de un LV mediante las opciones -L, --size, -l, --extents.
  • lvreduce: Permite reducir el tamaño de un LV mediante las opciones -L, --size, -l, --extents.
  • lvresize: Permite hacer ambas cosas, tanto la ampliación como la reducción, y se usan las opciones -L, --size, -l, --extents. El valor de estas opciones pueden llevar el signo + o el signo -, para indicar aumento o disminución del tamaño, respectivamente. Un valor sin signo indica un valor absoluto.

Tanto si se amplía o se reduce el tamaño de un LV, tendremos que redimensionar el sistema de ficheros, lo cual haremos con el comando resize2fs para extN o fsadm para extN, ReiserFS y XFS, pero los tres comandos anteriores incorporan las opciones -r y --resizefs para hacer lo mismo que resize2fs o fsadm, pero en un solo paso, a la vez que ampliamos o reducimos el LV.

Si lo que queremos es ampliar el tamaño de un LV, primero tendremos que aumentar LV y después redimensionar el sistema de ficheros, pero si lo que queremos es reducir el tamaño de un LV, entonces actuaremos al contrario, primero redimensionaremos el sistema de ficheros disminuyéndolo y posteriormente reduciremos el LV. El sistema de ficheros nunca puede ser más grande que el dispositivo donde reside.

Otro punto, muy importante a recordar, está relacionado con el montaje y desmontaje de los LVs que se van a redimensionar debido las características del sistema de ficheros que contengan. No todos los sistemas de ficheros permiten que su tamaño se cambie con facilidad sin perder información, por lo que habrá que consultar la documentación para saber si son obligatorias o no las operaciones de montaje y desmontaje de los sistemas de ficheros que van a cambiar.

Los sistemas de ficheros ext3, ext4 y XFS pueden ampliarse sin desmontarlos, pero sí hay que desmontarlos para reducirlos (XFS no se puede reducir). El ext2 siempre habrá que desmontarlo, tanto para ampliarlo como para reducirlo. Es con el sistema de ficheros ReiserFS cuando nunca tendremos la obligación de desmontarlo.

Vamos ahora a aumentar el LV que estamos utilizando como ejemplo:

# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
web disco_virtual -wi-a----- 152,00m
# vgs
VG #PV #LV #SN Attr VSize VFree
disco_virtual 3 1 0 wz--n- 240,00m 88,00m

Disponemos del LV de nombre web y de tamaño 152 MB, que se encuentra en el VG de nombre disco_virtual y tamaño 240 MB. Lo que pretendemos es aumentar el LV a 200 MB, ya que, supuestamente, se nos está quedando pequeño. Podemos hacerlo usando el comando lvextend o lvresize. Empezaremos mostrando el tamaño del sistema de ficheros y terminaremos haciendo lo mismo para ver que lo hemos ampliado.

# mount -t ext4 /dev/disco_virtual/web /mnt
# df -h /mnt
S.ficheros                    Tamaño Usados  Disp Uso% Montado en
/dev/mapper/disco_virtual-web   144M   1,9M  131M   2% /mnt
# lvs
  LV   VG            Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  web  disco_virtual -wi-ao---- 152,00m                                                    
# lvextend -L 200m disco_virtual/web 
  Size of logical volume disco_virtual/web changed from 152,00 MiB (38 extents) to 200,00 MiB (50 extents).
  Logical volume web successfully resized
# lvs
  LV   VG            Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  web  disco_virtual -wi-ao---- 200,00m                                                    
# df -h /mnt
S.ficheros                    Tamaño Usados  Disp Uso% Montado en
/dev/mapper/disco_virtual-web   144M   1,9M  131M   2% /mnt
# resize2fs /dev/disco_virtual/web 
resize2fs 1.42.12 (29-Aug-2014)
El sistema de ficheros de /dev/disco_virtual/web está montado en /mnt; hace falta cambiar el tamaño en línea
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/disco_virtual/web is now 204800 (1k) blocks long.
# df -h /mnt
S.ficheros                    Tamaño Usados  Disp Uso% Montado en
/dev/mapper/disco_virtual-web   190M   1,9M  176M   2% /mnt

Podríamos haber hecho lo mismo usando otras sintaxis de lvextend o usando el comando lvresize. Por ejemplo:

# lvextend -L +50m /dev/disco_virtual/web
# resize2fs /dev/disco_virtual/web
# lvresize -L 200m /dev/disco_virtual/web
# resize2fs /dev/disco_virtual/web
# lvresize -L +50m disco_virtual/web
# resize2fs /dev/disco_virtual/web

Con -r o --resizefs podríamos haberlo hecho todo en una sola línea con cualquiera de los dos comandos anteriores, y es lo recomendable, por ejemplo:

# lvresize -L 200m --resizefs /dev/disco_virtual/web 
fsck de util-linux 2.25.2
/dev/mapper/disco_virtual-web: 12/38912 ficheros (0.0% no contiguos), 10860/155648 bloques
Size of logical volume disco_virtual/web changed from 152,00 MiB (38 extents) to 200,00 MiB (50 extents).
Logical volume web successfully resized
resize2fs 1.42.12 (29-Aug-2014)
Cambiando el tamaño del sistema de ficheros en /dev/mapper/disco_virtual-web a 204800 (1k) bloques.
The filesystem on /dev/mapper/disco_virtual-web is now 204800 (1k) blocks long.

Se podría haber hecho la ampliación habiendo solicitado que las PEs se cojan de /dev/sde1, como vemos en el ejemplo, donde se ha ampliado solo 30 MB para que haya espacio suficiente en el dispositivo físico elegido, si hubiésemos puesto 50 MB de ampliación, el comando lvextend o lvresize hubieran fallado.

# pvs
  PV         VG            Fmt  Attr PSize  PFree 
  /dev/sdb   disco_virtual lvm2 a--  96,00m     0 
  /dev/sdc   disco_virtual lvm2 a--  96,00m 40,00m
  /dev/sde1  disco_virtual lvm2 a--  48,00m 48,00m
# lvextend -L +30M -r /dev/disco_virtual/web /dev/sde1
  Rounding size to boundary between physical extents: 32,00 MiB
fsck de util-linux 2.25.2
/dev/mapper/disco_virtual-web: 12/38912 ficheros (0.0% no contiguos), 10860/155648 bloques
  Size of logical volume disco_virtual/web changed from 152,00 MiB (38 extents) to 184,00 MiB (46 extents).
  Logical volume web successfully resized
resize2fs 1.42.12 (29-Aug-2014)
Cambiando el tamaño del sistema de ficheros en /dev/mapper/disco_virtual-web a 188416 (1k) bloques.
The filesystem on /dev/mapper/disco_virtual-web is now 188416 (1k) blocks long.
# pvs
  PV         VG            Fmt  Attr PSize  PFree 
  /dev/sdb   disco_virtual lvm2 a--  96,00m     0 
  /dev/sdc   disco_virtual lvm2 a--  96,00m 40,00m
  /dev/sde1  disco_virtual lvm2 a--  48,00m 16,00m
# lvs
  LV   VG            Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  web  disco_virtual -wi-a----- 184,00m                                                    

Si lo que queremos es reducir un LV, algo menos frecuente, lo podemos hacer con lvreduce o lvresize, pero antes, con extN hay que desmontar el sistema de ficheros, chequearlo y reducirlo, tras esto ya podemos reducir el LV, aunque la opción -r o --resizefs podría hacerse todo junto menos el desmontado. Hagamos un ejemplo reduciendo el LV a 100 MB.

# lsblk -f
NAME                FSTYPE      LABEL UUID                                   MOUNTPOINT
sda                                                                          
├─sda1              ext4              09db078f-57e4-4d86-9d2b-918da1f2da0a   /
└─sda2              swap              4fab3948-c9a2-4a42-8527-686296fab931   [SWAP]
sdb                 LVM2_member       mHsm57-0CKQ-fBt7-VecZ-hR01-7e8F-jVUwKz 
└─disco_virtual-web ext4              8a9a5cdf-fb7b-4341-8a18-ce030fd96a64   /mnt
sdc                 LVM2_member       Gtg7dE-k4YQ-nSgE-7KvZ-dbU2-Jrev-W1dBqf 
└─disco_virtual-web ext4              8a9a5cdf-fb7b-4341-8a18-ce030fd96a64   /mnt
sdd                                                                          
sde                                                                          
├─sde1              LVM2_member       1H04tT-uiti-5obu-qO7r-DxUs-a6dd-DdnVuB 
└─sde2                                                                       
sr0                                                                          
# lvs
  LV   VG            Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  web  disco_virtual -wi-ao---- 152,00m                                                    
# df -h /mnt
S.ficheros                    Tamaño Usados  Disp Uso% Montado en
/dev/mapper/disco_virtual-web   144M   1,9M  131M   2% /mnt
# umount /mnt
# lvresize -L -52m --resizefs /dev/disco_virtual/web 
fsck de util-linux 2.25.2
/dev/mapper/disco_virtual-web: 12/38912 ficheros (0.0% no contiguos), 10860/155648 bloques
resize2fs 1.42.12 (29-Aug-2014)
Cambiando el tamaño del sistema de ficheros en /dev/mapper/disco_virtual-web a 102400 (1k) bloques.
The filesystem on /dev/mapper/disco_virtual-web is now 102400 (1k) blocks long.

  Size of logical volume disco_virtual/web changed from 152,00 MiB (38 extents) to 100,00 MiB (25 extents).
  Logical volume web successfully resized
# mount -t ext4 /dev/disco_virtual/web /mnt
# df -h /mnt
S.ficheros                    Tamaño Usados  Disp Uso% Montado en
/dev/mapper/disco_virtual-web    93M   1,9M   84M   3% /mnt
# lvs
  LV   VG            Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  web  disco_virtual -wi-ao---- 100,00m                                                    

Si usamos lvreduce y sin la opción --resizefs, la instrucción lvresize la sustituiríamos por:

# vgs
  VG            #PV #LV #SN Attr   VSize   VFree 
  disco_virtual   3   1   0 wz--n- 240,00m 88,00m
# e2fsck -f /dev/disco_virtual/web 
e2fsck 1.42.12 (29-Aug-2014)
Paso 1: Verificando nodos-i, bloques y tamaños
Paso 2: Verificando la estructura del directorio
Paso 3: Revisando la conectividad de directorios
Paso 4: Revisando las cuentas de referencia
Paso 5: Revisando el resumen de información de grupos
/dev/disco_virtual/web: 12/38912 ficheros (0.0% no contiguos), 10860/155648 bloques
# resize2fs /dev/disco_virtual/web 100M
resize2fs 1.42.12 (29-Aug-2014)
Cambiando el tamaño del sistema de ficheros en /dev/disco_virtual/web a 102400 (1k) bloques.
The filesystem on /dev/disco_virtual/web is now 102400 (1k) blocks long.
# lvreduce -L 100m /dev/disco_virtual/web 
  WARNING: Reducing active logical volume to 100,00 MiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce web? [y/n]: 
Do you really want to reduce web? [y/n]: y
  Size of logical volume disco_virtual/web changed from 152,00 MiB (38 extents) to 100,00 MiB (25 extents).
  Logical volume web successfully resized
# mount -t ext4 /dev/disco_virtual/web /mnt
# df -h /mnt
S.ficheros                    Tamaño Usados  Disp Uso% Montado en
/dev/mapper/disco_virtual-web    93M   1,9M   84M   3% /mnt
# lvs
  LV   VG            Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  web  disco_virtual -wi-a----- 100,00m                                                    
# vgs
  VG            #PV #LV #SN Attr   VSize   VFree  
  disco_virtual   3   1   0 wz--n- 240,00m 140,00m

Observamos que el espacio que le hemos reducido al LV se ha incorporado al espacio libre de su VG.