Verwenden der Auslagerungsdatei für den Ruhezustand mit BTRFS und Kernel 5.0.16-gentoo

Verwenden der Auslagerungsdatei für den Ruhezustand mit BTRFS und Kernel 5.0.16-gentoo

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_physicalLaden 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_offsetist also 608833634304 / 4096 = 148641024. Fügen Sie diesen Wert mit dem resumeParameter als Kernelparameter hinzu und starten Sie neu. Danach systemd hibernateschlägt es immer noch fehl, da systemd Kernelparameter ignoriert und den Offset falsch berechnet, aber echo disk > /sys/power/statees funktioniert.

verwandte Informationen