![Verwenden der Auslagerungsdatei für den Ruhezustand mit BTRFS und Kernel 5.0.16-gentoo](https://rvso.com/image/154439/Verwenden%20der%20Auslagerungsdatei%20f%C3%BCr%20den%20Ruhezustand%20mit%20BTRFS%20und%20Kernel%205.0.16-gentoo.png)
Ich habe eine Auslagerungsdatei wie hier beschrieben erstellt:https://wiki.archlinux.org/index.php/Swap#Swap_file_creation
Beim Versuch, in den Ruhezustand zu wechseln, erhalte ich die folgende Fehlermeldung:
$ echo disk > /sys/power/state
echo: write error: no such device
Auch in dmesg erhalte ich:
[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.
Wie beschrieben inhttps://wiki.archlinux.org/index.php/Power_management/Suspend_and_hibernate#Hibernation_into_swap_filehabe ich die folgenden Kernelparameter festgelegt:
resume=UUID=2bfb4ccd-6b80-4806-8a08-4f1e67ef035f
resume_offset=148378880
So erhalte ich die Parameterwerte resume_offset und 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
Beim Versuch, zu verwenden swap_offset
, tritt das folgende Problem auf:
$ swap-offset /swapfile
ioctl(FIBMAP) failed: Invalid argument
Ist es überhaupt möglich, bei Verwendung von BTRFS eine Auslagerungsdatei für den Ruhezustand zu verwenden? Es scheint, dass der Kernel den korrekten Speicherort der Auslagerungsdatei nicht kennt.
Antwort1
u/hwitz (https://www.reddit.com/user/kjoke/) meinen Tag gerettet:
Filefrag berechnet den Offset für BTRFS falsch, aber es gibt ein Skript, das den richtigen Offset berechnet:https://github.com/osandov/osandov-linux/blob/master/scripts/btrfs_map_physical.c
gcc btrfs_map_physical.c -o btrfs_map_physical
Laden Sie die Auslagerungsdatei herunter und rufen Sie sie ab:
$ 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
Hier: 608833634304
. Teilen Sie diesen Offset durch die Seitengröße:
$ getconf PAGESIZE
4096
Das resume_offset
ist also 608833634304 / 4096 = 148641024
. Fügen Sie diesen Wert mit dem resume
Parameter als Kernelparameter hinzu und starten Sie neu. Danach systemd hibernate
schlägt es immer noch fehl, da systemd Kernelparameter ignoriert und den Offset falsch berechnet, aber echo disk > /sys/power/state
es funktioniert.