Usando Swapfile para Hibernación con BTRFS y Kernel 5.0.16-gentoo

Usando Swapfile para Hibernación con BTRFS y Kernel 5.0.16-gentoo

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_physicalluego 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_offsetes 608833634304 / 4096 = 148641024. Agregue este valor con el resumeparámetro como parámetros del kernel y reinicie. Después systemd hibernateseguirá fallando porque systemd ignora los parámetros del kernel y calcula el desplazamiento incorrectamente, pero echo disk > /sys/power/statefunciona.

información relacionada