swapfile: el archivo de intercambio en GNU/Linux

Publicado por Diego Córdoba en

Hoy aprenderemos a montar un archivo de intercambio, o swapfile, en nuestro sistema GNU/Linux, sin necesidad de crear particiones para este fin.

En varias oportunidades hemos hablado sobre el espacio de intercambio o swap en GNU/Linux. Para comprender mejor lo que es la swap, les recomiendo pasar por algunos de los posts anteriores:

Hoy les voy a comentar otra forma de montar una swap en sistemas GNU/Linux: usando un archivo de intercambio, o swapfile, en lugar de una partición o dispositivo virtual.

¿Por qué es útil esto? Porque podemos crear un archivo de intercambio y comenzar a utilizarlo sin necesidad de reiniciar el equipo (mejor si se trata de un servidor), ni siquiera realizar particionados en los discos.

¡Manos a la obra!

Verificando el estado de nuestra swap

La swap es muy útil en sistemas GNU/Linux, más cuando la memoria RAM es escasa, por lo que seguramente nuestro sistema ya disponga de algún mecanismo de swap o intercambio.

Lo primero que vamos a hacer es verificar el estado de la swap en nuestro sistema. Esto puede hacerse mediante el comando swapon:

sudo swapon --show
swapfile swapon show

Este es el estado de mi swap: sí, me compliqué la vida xD

En mi caso, tengo habilitados 4 dispositivos de swap comprimidos en RAM, y una partición de swap tradicional con menos prioridad (se ve que no se ha utilizado en mi sistema).

También podemos analizar la salida del comando free -h para saber el estado de nuestra swap:

free -h

Creando un archivo de swap

El swapfile es un archivo swap, o archivo de intercambio (sí, similar al archivo de intercambio de Windows).

Este archivo va a ocupar en disco el tamaño completo de lo que sería nuestra partición de swap. Es decir, si queremos una swap de 2GiB, vamos a necesitar crear un swapfile de 2GiB.

Con esto quiero decir que debemos primero verificar que en la partición donde vayamos a crear el archivo de intercambio tengamos el suficiente espacio disponible.

Existen varias formas de crear un archivo de un tamaño determinado. Yo en general suelo usar dd, pero hay otros comandos más amigables, como fallocate. Veamos ambas formas.

Supongamos que queremos crear, para probar, un swapfile de 1GiB, cuyo path será /swapfile.

Para ello podemos usar la alternativa dd:

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 status=progress

Otra forma, usar fallocate:

sudo fallocate -l 1G /swapfile

De cualquier manera tendremos un archivo de swapfile de 1GiB en el disco rígido, dentro del directorio raíz, y denominado /swapfile.

swapfile creado

Convirtiendo el swapfile en swap 🙂

Ya tenemos el archivo que va a ser nuestra swap, ahora debemos convertirlo en un archivo de tipo swap para que el sistema operativo lo reconozca y pueda utilizarlo.

Primero vamos a darle permisos de lectura y escritura para el usuario root:

sudo chmod 0600 /swapfile

Y vamos a convertirlo en archivo swap con el comando mkswap (el mismo que usaríamos para particiones swap nuevas).

sudo mkswap /swapfile

La siguiente captura muestra el cambio de permisos, y la creación del formato swap. Utilicé el comando file para mostrar cómo cambia el swapfile de su formato original de datos puros, a un archivo regular de GNU/Linux.

Cabe resaltar que, cuando creamos el formato swap, la salida del comando muestra el UUID de dicho archivo swap, como si se tratase de un sistema de archivos (de hecho, es un sistema de archivos escrito sobre un archivo :-P).

swapfile mkswap formateando el swapfile

Comenzando a utilizar el swapfile

Ya tenemos el swapfile creado y formateado, sólo nos resta cargarlo para comenzar a utilizarlo.

Al vuelo, podemos utilizar swapon para comenzar a utilizar nuestro nuevo swapfile!

sudo swapon /swapfile

Esto activará el nuevo swap, y podemos chequearlo igual hicimos al principio:

activando el swapfile con swapon

Listo! Ya tenemos el archivo de swap funcionando! 🙂

Si tenemos varios dispositivos swap podemos darle prioridad determinada con el modificador -p de swapon (mayor valor, mayor prioridad), por ejemplo, para una prioridad de 100 (desactivé el swapfile con el comando swapoff, y lo cargué con una nueva prioridad):

cambiando la prioridad del archivo swap con swapon

Hacer persistentes los cambios con /etc/fstab

Eso sí, esto no es persistente, para que se mantenga y monte dicho archivo al inicio del sistema, debemos añadirlo al archivo /etc/fstab:

Una línea de ejemplo para este caso, dentro de nuestro archivo /etc/fstab, podría ser la siguiente:

/swapfile       none       swap      defaults    0 0

La primer columna especifica el dispositivo. En el caso de swapfile debe especificarse la ruta al archivo de swap.

Si queremos especificar también la prioridad de montaje del swapfile podemos hacerlo con la opción de configuración pri de esta forma:

/swapfile       none       swap      sw,pri=100    0 0

Al reiniciar el sistema veremos el cambio aplicado: la swap activa usando el swapfile.

Conclusiones

Hemos llegado al final! Y ya tenemos nuestro swapfile en funcionamiento.

Este método de swap por archivo dentro de una partición principal es muy utilizado en los servicios de nube como AWS, Azure o DigitalOcean, donde los proveedores generalmente nos entregan un equipo virtual instalado con una sola partición raíz, y para agregar particiones swap deberíamos añadir discos adicionales, que se pagan aparte.

Por cierto, el soporte de swapfile depende del sistema de archivos que utilicemos en nuestro GNU/Linux. Los filesystems más conocidos lo soportan, como ser Ext3, Ext4, XFS, o brtfs, pero no está de mas aclarar esto, si los experimentos fallan, verifiquen que el sistema de archivos que estén usando para almacenar el /swapfile lo permita.

Además de montar una swap en archivo o, como aprendimos antes, utilizando dispositivos comprimidos en RAM como zswap, se pueden configurar parámetros del núcleo para optimizar el uso de la swap, y por ende, mejorar el rendimiento general del sistema operativo. Eso lo dejo para otro artículo.

Espero que les sea útil!

Como siempre, quedo atento a dudas o comentarios.

Hasta la próxima!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!

Categorías: Linux

Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador