Archivo de swap en disco encriptado con Manjaro

Vamos a ver cómo crear un archivo de swap dentro de una partición encriptada que hace de root, para poder hibernar un laptop.

En este caso, lo he hecho en Manjaro Linux versión 21.1.3 (Pahvo). Con encriptación completa y sistema de ficheros Btrfs. El ordenador es un laptop HP x360 modelo 13-4100ns, equipado con 4 Gb de RAM y un procesador Intel i5. Bueno, pues empececemos.

En sistemas Btrfs

En un sistema Btrfs no puedes usar un fichero normal como swap. Primero hay que prepararlo un poco. El motivo es que hay que anular el sistema de copy on write (COW) propio de Btrfs, y además hay que poner el fichero fuera del subvolumen montado como root para que Timeshift no se lie y empiece a hacer snapshots del fichero de swap. Si tienes un sistema ext4, puedes omitir esta parte y pasar a la siguiente desde «Desactivamos nuestra swap».

Primero creamos el subvolumen aparte.

lacofi@rose$ sudo btrfs subvolume create /@swapfile
[sudo] password for lacofi:
Create subvolume '//@swapfile'
lacofi@rose$ __

Ahora vamos a poner nuestro fichero de swap en el subvolumen que hemos creado, es decir, el fichero será /@swapfile/swapfile. Bien, ahora vamos a crear el fichero vacío con el COW anulado.

lacofi@rose$ sudo truncate -s 0 /@swapfile/swapfile
lacofi@rose$ sudo chattr +C /@swapfile/swapfile
lacofi@rose$ sudo btrfs property set /@swapfile/swapfile compression none 
lacofi@rose$ __

Desactivamos nuestro swap

Ahora entramos en materia. Primero comprobamos si tenemos alguna swap activa. Si la hay, la desactivamos para quedarnos sin swap.

lacofi@rose$ sudo swapon -s
Nomfich.      Tipo         Tam.    Util.        Prioridad
/dev/dm-1     partition    4384588     0                   -2
lacofi@rose$ sudo swapoff -a
lacofi@rose$ __

Creamos y activamos nueva swap en nuestro fichero. Respecto al tamaño del fichero, se recomienda un poquito más de lo que tengas de RAM. En mi caso, tengo 4 Gb de RAM, así que vendrían a ser por ejemplo 6 Gb de swap. Pero como me gustan los números redondos vamos a poner 8 Gb, el doble de mi RAM. Como sabes, 8 Gb equivalen a 8*1024=8192 Mb.

lacofi@rose$ sudo dd if=/dev/zero of=/@swapfile/swapfile bs=1M count=8192                                    
8097+0 registros leídos
8097+0 registros escritos
8489271296 bytes (8,5 GB, 7,9 GiB) copied, 94,9865 s, 89,4 MB/s
lacofi@rose$ sudo mkswap /@swapfile/swapfile                                                           
mkswap: /@swapfile/swapfile: permisos 0644 no seguros; se arregla con: chmod 0600 /@swapfile/swapfile
Configurando espacio de intercambio versión 1, tamaño = 7,9 GiB (8489267200 bytes)
sin etiqueta, UUID=e7fd9694-74e9-4bfb-b50c-4a6157345d11
lacofi@rose$ sudo chmod 600 /@swapfile/swapfile                                                                     
lacofi@rose$ sudo swapon /@swapfile/swapfile                                                                        
lacofi@rose$ __                                                                           

Y ya está. Ya tenemos nuestra nueva swap activada y funcionando. Puedes comprobarlo con un «swapon -s».

Hacer estos cambios permanentes

Obviamente, ahora querrás que tu nueva swap se active siempre, en cuanto arranques el ordenador. Para ello tienes que editar tu fichero /etc/fstab y meter la línea que configurará la swap. Si tenías de antes una línea para la vieja swap, coméntala para desactivarla.

#/dev/mapper/luks-blablabla swap swap defaults,noatime  0   0
/@swapfile/swapfile         none swap defaults          0   0

Si quieres, es recomendable comprobar que la nueva línea no da errores haciendo un «sudo mount -a».

Activar la hibernación

Vale, ahora vamos a activar la hibernación en ese swapfile. Hay que tener en cuenta que cuando el ordenador intente recuperarse de la hibernación, va a leer el swapfile lo primerito de todo, antes de cargar el sistema operativo y antes de cargar el sistema de ficheros, así que lo leerá de seguido y sin usar btrfs ni ext4. Por eso es necesario un número que se llama «offset» y que viene a ser el sector concreto del disco duro que es donde tiene que empezar a leer. Para encontrar ese offset tienes que hacer esto:

lacofi@rose$ sudo filefrag -v /@swapfile/swapfile
Filesystem type is: 9123683e
File size of /@swapfile/swapfile is 8489271296 (2072576 blocks of 4096 bytes)
ext: logical_offset:   physical_offset:    length: expected: flags:
0: 0..       259931:   1973504.. 2233435:  259932:
1: 259932..  520581:   2235648.. 2496297:  260650: 2233436:
2: 520582..  534674:   1885765.. 1899857:  14093:  2496298:
3: 534675..  534973:   1866884.. 1867182:  299:    1899858:
4: 534974..  797017:   2497792.. 2759835:  262044: 1867183:
5: 797018..  1309595:  2759936.. 3272513:  512578: 2759836:
6: 1309596.. 1539583:  3284224.. 3514211:  229988: 3272514:

Vale, intimida un poquito, pero en realidad de toda esa retahila solo nos interesa UN número que es el que he marcado en color rojo. Es en la línea 0, el tercer número por la izquierda, que es donde empieza el fichero (offset físico).

Vale, ahora tenemos que editar el fichero /etc/default/grub. Dentro de él, hay una línea que dice GRUB_CMDLINE_LINUX_DEFAULT que es la que hay que cambiar. Fíjate en ella, vamos a analizarla un poquito, que nunca viene mal. Será algo parecido a esto.

GRUB_CMDLINE_LINUX_DEFAULT="quiet cryptdevice=UUID=94d0287f-6c87-4003-aa6b-286993de7e77:luks-94d0287f-6c87-4003-aa6b-28
6993de7e77 root=/dev/mapper/luks-94d0287f-6c87-4003-aa6b-286993de7e77 splash apparmor=1 security=apparmor resume=/dev/m
apper/luks-97668c40-2fdd-43a0-9d2f-7831dfdf69e4 udev.log_priority=3"

Bien, vamos por parte, los argumentos que pone son estos:

quiet

La opción quiet indica al sistema que no muestre los mensajes iniciales.

cryptdevice=UUID=94d0287f-6c87-4003-aa6b-286993de7e77:luks-94d0287f-6c87-4003-aa6b-28 6993de7e77

Esta opción le dice al sistema que cuando arranque tendrá una unidad de disco con UUID 94d0287etc que es una unidad encriptada que tendra un identificador de nombre luks-94d0287etc. Esto le dice al sistema que hay un disco que tiene que desencriptar.

root=/dev/mapper/luks-94d0287f-6c87-4003-aa6b-286993de7e77

Esta opción, le dice al sistema que esa unidad que acaba de desencriptar es la unidad root (es decir, se montará como «/»).

splash apparmor=1 security=apparmor

Las opciones splash, apparmor y security no nos interesan para el tema en el que estamos, así que las ignoraremos y las dejaremos como están.

resume=/dev/mapper/luks-97668c40-2fdd-43a0-9d2f-7831dfdf69e4

Ésta. Esta es la opción que nos interesa. Está apuntando a otra unidad de disco totalmente diferente, en este caso una partición encriptada. Tenemos que cambiar esta opción para que apunte a nuestro fichero de swap. Es decir, tendrá que apuntar a nuestra partición que está montada como root, y luego ir al sector que dice el offset del fichero. Pues eso es lo que hay que poner, la partición root y el offset. Con lo cual esta opción quedará así:

resume=/dev/mapper/luks-94d0287f-6c87-4003-aa6b-286993de7e77 resume_offset=1973504

Con lo cual, la linea GRUB_CMDLINE_LINUX_DEFAULT al final va a quedar así:

GRUB_CMDLINE_LINUX_DEFAULT="quiet cryptdevice=UUID=94d0287f-6c87-4003-aa6b-286993de7e77:luks-94d0287f-6c87-4003-aa6b-28 6993de7e77 root=/dev/mapper/luks-94d0287f-6c87-4003-aa6b-286993de7e77 splash apparmor=1 security=apparmor resume=/dev/mapper/luks-94d0287f-6c87-4003-aa6b-286993de7e77 resume_offset=1973504 udev.log_priority=3"

Y ya está. Ahora hay que hacer un «update-grub» y la hibernación y el swap deberían funcionar sin problemas.

Todo lo que te he contado aquí lo tienes con más detalle explicado en las páginas Use a swap file and enable hibernation on Arch Linux – including on a LUKS root partition de Jay Ta’ala y el Wiki de Manjaro sobre el Swap. Te recomiendo que les hagas una visita porque saben mucho más que yo.

Deja una respuesta