Ampliar swap a máquina virtual Linux sin reiniciar

AdriMcGrady 04/11/2022

La definición de requisitos de una máquina virtual puede ser una tarea tan sencilla de hacer como susceptible de modificaciones posteriores. En este caso, vamos a ver como ampliar la swap a una máquina virtual sin reiniciar el sistema operativo.

SWAP: Un poco de literatura

Si has llegado a este artículo es porque sabes que es la swap o memoria de intercambio. Pero por si acaso hago un pequeño resumen.

Al final, la memoria RAM física de un ordenador es finita. Para salvar este límite los sistemas operativos crean en disco un segundo nivel de memoria llamado de intercambio o swap.

Evidentemente este nivel es mas lento, pero te permite pasar programas desde la RAM a la swap cuando no estás haciendo uso de ellos, si necesitas memoria para otros programas que si está usando. Cuando vuelvas a necesitar algo que está en swap tu sistema operativo volverá a subirlo a RAM y listo.

La swap no es más que un pequeño truco que usan los sistemas operativos para disponer de más memoria. Normalmente está memoria swap debería usarse solo cuando tú sistema está falto de RAM. Aunque esto no es siempre así…

Ampliando la swap en caliente

Vamos a partir de una máquina virtual con 4 GB de swap. Estos 4 GB están ubicados en una partición LVM actualmente. En mi caso, no quiero ampliar por problemas de rendimiento sino por requisitos en la instalación de un software. Además, esta es solo una forma de las múltiples que hay para conseguir este objetivo.

Comprobación de configuración actual swap

En primer lugar, lo mejor es comprobar la configuración actual de swap con el comando swapon -s

[root@linux-mv ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       4194300 0       -2

Preparar el nuevo espacio

Lo siguiente es preparar el nuevo espacio para alojar la nueva memoria de intercambio. En mi caso, he añadido un nuevo disco virtual a mi máquina virtual de VirtualBox que ha sido reconocido como /dev/sdc. (El procedimiento de añadir un nuevo disco virtual y descubrirlo en la mv lo puedes encontrar en múltiples sitios de Internet.)

Una vez asignado el nuevo disco, hay que prepararlo para usarlo como memoria swap.

Lo primero será hacer una partición LVM con fdisk usando todo el disco, aunque el tamaño es a gusto del consumidor.

[root@linux-vm ~]# fdisk /dev/sdc
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x190a4313.

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

Command (m for help): p

Disk /dev/sdc: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk label type: dos
Disk identifier: 0x190a4313

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-20971519, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519):
Using default value 20971519
Partition 1 of type Linux and of size 10 GiB is set

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Con el comando partprobe hacemos que el kernel actualice la información de particiones y tenga en cuenta la nueva. Los mensajes del dispositivo /dev/sr0 pueden obviarse.

[root@linux-vm ~]# partprobe
Warning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.

Ahora con lvdiskscan comprobaremos que efectivamente nuestro sistema reconoce la nueva partición y está lista para ser usada con LVM.

[root@linux-vm ~]# lvmdiskscan
  /dev/vg_so/lv_raiz        [     <10.00 GiB]
  /dev/sda1                      [     512.00 MiB]
  /dev/vg_so/lv_swap        [       4.00 GiB]
  /dev/sda2                      [     <40.49 GiB] LVM physical volume
  /dev/vg_almacen/lv_almacen [    <20.00 GiB]
  /dev/vg_so/lv_home        [       6.00 GiB]
  /dev/vg_so/lv_opt         [       6.00 GiB]
  /dev/vg_so/lv_tmp         [       5.00 GiB]
  /dev/vg_so/lv_var         [       8.00 GiB]
  /dev/sdb                       [     20.00 GiB] LVM physical volume
  /dev/sdc1                      [     <10.00 GiB]
  7 disks
  2 partitions
  1 LVM physical volume whole disk
  1 LVM physical volume

En este punto ya podemos pasar a crear todos los elementos de LVM donde alojaremos nuestra nueva swap. Lo primero es crear el Physical Volume sobre nuestra partición con pvcreate y comprobarlo con pvs.

[root@linux-vm ~]# pvcreate /dev/sdc1
  Physical volume "/dev/sdc1" successfully created.

[root@linux-vm ~]# pvs
  PV         VG           Fmt  Attr PSize    PFree
  /dev/sda2  vg_so   lvm2 a--    40.49g   4.00m
  /dev/sdb   vg_almacen lvm2 a--  <20.00g      0
  /dev/sdc1               lvm2 ---   <10.00g <10.00g

Posteriormente, añadiremos el PV creado al Volume Group existente para el sistema operativo donde tenemos actualmente el volumen de swap. Si lo prefieres puedes crear un VG nuevo solo para la nueva swap. Pero en este caso usaremos el existente para el sistema operativo. Así que primero se ampliará el VG con vgextend y después se comprobará la ampliación con vgs.

[root@linux-vm ~]# vgextend vg_so /dev/sdc1
  Volume group "vg_so" successfully extended

[root@linux-vm ~]# vgs
  VG           #PV #LV #SN Attr   VSize    VFree
  vg_almacen   1   1   0 wz--n- <20.00g     0
  vg_so     2   6   0 wz--n-  <40.49g 10.00g

Deshabilitar swap para redimensionar

En este ejemplo veremos cómo ampliar el volumen de swap actual. Se podría generar una nueva swap2 y tener ambas activadas a la vez, o descartar la antigua y solo usar la nueva. Pero, en este caso lo que haremos será ampliar el espacio de intercambio anterior con el espacio del nuevo disco para acabar con una única memoria swap con el total del espacio.

Para esto, lo primero ha hacer es deshabilitar las swap actual para poder redimensionarla. Al hacer esta operación todo lo que está en swap pasará a memoria RAM. Así que es recomendable realizar este paso cuando el consumo de memoria RAM no esté en su punto más elevado. En cualquier caso, deberías asegurarte antes de que tienes suficiente memoria con free -m por ejemplo.

[root@linux-vm ~]# swapoff -v /dev/vg_so/lv_swap
swapoff /dev/vg_so/lv_swap

Para comprobar que efectivamente se ha deshabilitado se puede hacer así:

[root@linux-vm ~]# swapon -s

Redimensionar swap

Una vez que nuestra memoria de intercambio está inactiva, podemos proceder a ampliar el volumen lógico con el espacio del nuevo disco y su nueva partición /dev/sdc1 con lvresize. Aunque antes y después comprobaremos el tamaño del volumen de swap con lvs para ir revisando como se ejecuta la ampliación.

La ampliación la vamos a hacer añadiendo 8 GB. Pero puedes hacerla por el tamaño total si obvias el +8G o simplemente por la cantidad que desees, siempre que tengas espacio disponible en el VG.

[root@linux-vm ~]# lvs /dev/vg_so/lv_swap
  LV      VG         Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv_swap vg_so -wi-a----- 4.00g

[root@linux-vm ~]# lvresize /dev/vg_so/lv_swap -L +8G /dev/sdc1
  Size of logical volume vg_so/lv_swap changed from 4.00 GiB (1024 extents) to 12.00 GiB (3072 extents).
  Logical volume vg_so/lv_swap successfully resized.

[root@linux-vm ~]# lvs /dev/vg_so/lv_swap
  LV      VG         Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv_swap vg_so -wi-a----- 12.00g
[root@linux-vm ~]# mkswap /dev/vg_so/lv_swap
mkswap: /dev/vg_so/lv_swap: warning: wiping old swap signature.
Setting up swapspace version 1, size = 12582908 KiB
no label, UUID=6d710bbb-6efb-586e-955c-235e83ef7d29

Activación de swap ampliada

Como ya tenemos nuestra memoria swap ampliada a 12 GB, solo queda reactivarla con swapon. En el ejemplo usamos parametrización para activar todas las disponibles, pero se podría modificar el comando para activar una swap en específico si tuvieras mas de una.

[root@linux-vm ~]# swapon -va
swapon /dev/mapper/vg_so-lv_swap
swapon: /dev/mapper/vg_so-lv_swap: found swap signature: version 1, page-size 4, same byte order
swapon: /dev/mapper/vg_so-lv_swap: pagesize=4096, swapsize=12884901888, devsize=12884901888

Para finalizar, ya solo queda comprobar que la swap ampliada esta activa y tiene el nuevo tamaño con swapon -s. Así como revisar el estado de la memoria con free.

[root@linux-vm ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       12582908        0       -2

[root@linux-vm ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          10005        4819        4993           8         192        3496
Swap:         12287           0       12287
Enlaces de interés

Artículo anterior Artículo siguiente

Artículos relacionados: