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.