![Использование файла подкачки для гибернации с BTRFS и ядром 5.0.16-gentoo](https://rvso.com/image/154439/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%B0%D1%87%D0%BA%D0%B8%20%D0%B4%D0%BB%D1%8F%20%D0%B3%D0%B8%D0%B1%D0%B5%D1%80%D0%BD%D0%B0%D1%86%D0%B8%D0%B8%20%D1%81%20BTRFS%20%D0%B8%20%D1%8F%D0%B4%D1%80%D0%BE%D0%BC%205.0.16-gentoo.png)
Я создал файл подкачки, как описано здесь:https://wiki.archlinux.org/index.php/Swap#Swap_file_creation
При попытке перехода в спящий режим возникает следующая ошибка:
$ echo disk > /sys/power/state
echo: write error: no such device
Также в dmesg я получаю:
[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.
Как описано вhttps://wiki.archlinux.org/index.php/Power_management/Suspend_and_hibernate#Hibernation_into_swap_fileЯ установил следующие параметры ядра:
resume=UUID=2bfb4ccd-6b80-4806-8a08-4f1e67ef035f
resume_offset=148378880
Вот как я получаю значения параметров resume_offset и 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
При попытке использования swap_offset
возникает следующая проблема:
$ swap-offset /swapfile
ioctl(FIBMAP) failed: Invalid argument
Так возможно ли вообще использовать файл подкачки для гибернации при использовании BTRFS? Похоже, что ядро не знает о правильном расположении файла подкачки.
решение1
u/hшутка (https://www.reddit.com/user/kjoke/) сделал мой день:
filefrag неправильно вычисляет смещение для BTRFS, но есть скрипт, который вычисляет правильное смещение:https://github.com/osandov/osandov-linux/blob/master/scripts/btrfs_map_physical.c
Загрузите и gcc btrfs_map_physical.c -o btrfs_map_physical
получите первое физическое смещение для файла подкачки:
$ 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
Здесь: 608833634304
. Разделите это смещение на размер страницы:
$ getconf PAGESIZE
4096
Итак, resume_offset
это 608833634304 / 4096 = 148641024
. Добавьте это значение с resume
параметром как параметры ядра и перезагрузитесь. После этого systemd hibernate
все равно будет сбой, потому что systemd игнорирует параметры ядра и вычисляет смещение неправильно, но echo disk > /sys/power/state
работает.