![Usando Swapfile para Hibernación con BTRFS y Kernel 5.0.16-gentoo](https://rvso.com/image/154439/Usando%20Swapfile%20para%20Hibernaci%C3%B3n%20con%20BTRFS%20y%20Kernel%205.0.16-gentoo.png)
Creé un archivo de intercambio como se describe aquí:https://wiki.archlinux.org/index.php/Swap#Swap_file_creation
Cuando intento hibernar me sale el siguiente error:
$ echo disk > /sys/power/state
echo: write error: no such device
También en dmesg me sale:
[30721.352822] [drm] Reducing the compressed framebuffer size. This may lead to less power savings than a non-reduced-size. Try to increase stolen memory size if available in BIOS.
[30721.454735] acpi LNXPOWER:07: Turning OFF
[30721.454987] acpi LNXPOWER:02: Turning OFF
[30721.455365] acpi LNXPOWER:01: Turning OFF
[30721.455563] PM: Cannot find swap device, try swapon -a
[30721.455563] PM: Cannot get swap writer
[30721.553943] OOM killer enabled.
[30721.553944] Restarting tasks ... done.
Como se describe enhttps://wiki.archlinux.org/index.php/Power_management/Suspend_and_hibernate#Hibernation_into_swap_file, configuro los siguientes parámetros del kernel:
resume=UUID=2bfb4ccd-6b80-4806-8a08-4f1e67ef035f
resume_offset=148378880
Así es como obtengo los valores de los parámetros resume_offset y resume:
$ filefrag -v /swapfile
Filesystem type is: 9123683e
File size of /swapfile is 536870912 (131072 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 148378880.. 148378880: 1:
1: 1.. 131071: 148378881.. 148509951: 131071: last,unwritten,eof
$ findmnt -no SOURCE,UUID -T /swapfile
/dev/mapper/nvme0n1p2[/root] 2bfb4ccd-6b80-4806-8a08-4f1e67ef035f
Cuando intento usar swap_offset
, aparece el siguiente problema:
$ swap-offset /swapfile
ioctl(FIBMAP) failed: Invalid argument
Entonces, ¿es posible utilizar un archivo de intercambio para la hibernación cuando se utiliza BTRFS? Parece que el kernel no conoce la ubicación de corrección del archivo de intercambio.
Respuesta1
u/hbroma (https://www.reddit.com/user/kjoke/) me alegró el día:
filefrag calcula el desplazamiento incorrectamente para BTRFS pero hay un script que calcula el desplazamiento correcto:https://github.com/osandov/osandov-linux/blob/master/scripts/btrfs_map_physical.c
Descargue y gcc btrfs_map_physical.c -o btrfs_map_physical
luego obtenga el primer desplazamiento físico para el archivo de intercambio:
$ sudo ./btrfs-map-physical /swap | head -n2
FILE OFFSET EXTENT TYPE LOGICAL SIZE LOGICAL OFFSET PHYSICAL SIZE DEVID PHYSICAL OFFSET
0 regular 4096 607759892480 268435456 1 608833634304
Aquí: 608833634304
. Divida este desplazamiento por el tamaño de la página:
$ getconf PAGESIZE
4096
Así resume_offset
es 608833634304 / 4096 = 148641024
. Agregue este valor con el resume
parámetro como parámetros del kernel y reinicie. Después systemd hibernate
seguirá fallando porque systemd ignora los parámetros del kernel y calcula el desplazamiento incorrectamente, pero echo disk > /sys/power/state
funciona.