Hibernate auf ThinkPad X13 Gen 3 AMD (Arch Linux)

Die drei Schlafzustände

Suspend (Bereitschaft)

systemctl suspend

Hibernate (Ruhezustand)

systemctl hibernate

Hybrid-Sleep (Hybrider Schlaf)

systemctl hybrid-sleep

** Wenn noch Strom da war: Sofort aus dem RAM (wie Suspend).
** Wenn der Akku leer war: Von der Festplatte (wie Hibernate).

Hardware

Komponente Wert
Modell ThinkPad X13 Gen 3 AMD (21CM002GGE)
CPU AMD Ryzen 5 PRO 6650U (Rembrandt)
GPU Radeon 680M
BIOS R22ET76W (1.46)
Kernel 7.0.10-arch1-1
RAM 16 GB
Storage 1,8 TB NVMe (LUVS-verschlüsselt, ext4)

Das Problem: Suspend (s2idle) vs. Hibernate

Warum das Standardverhalten nicht funktioniert

Arch Linux (und systemd) verwendet standardmäßig *Suspend (s2idle)* beim Zuklappen des Deckels.
Das Problem: Der ThinkPad X13 Gen 3 AMD unterstützt im BIOS *nur S0 (s2idle), S4 (Hibernate) und S5 (Power Off)*.
S3 (Deep Sleep) wurde von Lenovo bei den neueren AMD-Modellen entfernt.

ACPI: PM: (supports S0 S4 S5)

s2idle (Modern Standby) ist bekanntermaßen fehleranfällig – besonders bei AMD Rembrandt.
Die GPU (amdgpu) und diverse Controller haben Probleme, korrekt aus s2idle aufzuwachen.

*Das Ergebnis im Alltag:* Deckel zu → System geht in s2idle → wacht beim Aufklappen oft nicht mehr auf.
Oder: Das System rödelt mit zugeklapptem Deckel weiter, weil s2idle nicht korrekt funktioniert.

Lösung: Hibernate statt Suspend

Da S3 (Deep Sleep) im BIOS fehlt und s2idle unzuverlässig ist, wurde auf *Hibernate (S4)* umgestellt.

Hibernate schreibt den gesamten RAM-Inhalt auf die Festplatte und fährt das System komplett herunter.
Beim Aufwachen wird der RAM-Inhalt von der Festplatte zurückgeladen – das System ist exakt im gleichen
Zustand wie vor dem Hibernate.

  Suspend (s2idle) Hibernate (S4)
Einschlafen ~1-2 Sek ~3-8 Sek
Aufwachen ~1-2 Sek ~5-10 Sek
Zuverlässigkeit Schlecht (AMD Rembrandt) Sehr gut
Stromverbrauch Gering (RAM bleibt aktiv) Null (System aus)

Auf einer NVMe ist Hibernate spürbar, aber nicht dramatisch langsamer als Suspend.

Einrichtung

1. Swap-File erstellen

Hibernate benötigt Swap ≥ RAM. Da kein Swap vorhanden war, wurde ein 16 GB Swap-File erstellt.

sudo fallocate -l 16G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

*Wichtig bei LUKS-Verschlüsselung:* Das Swap-File liegt auf der verschlüsselten Root-Partition
(/dev/mapper/root). Der Hibernate-Image ist somit automatisch mit verschlüsselt – kein zusätzliches
Risiko. Der Swap wird erst nach der LUKS-Entschlüsselung beim Boot verfügbar.

Swap-File persistent in /etc/fstab eintragen:

/swapfile none swap defaults 0 0

2. Resume-Hook zu mkinitcpio hinzufügen

Der resume Hook muss *nach* dem encrypt Hook stehen, damit zuerst LUKS entschlüsselt wird
und dann der Hibernate-Image vom Swap gelesen werden kann.

/etc/mkinitcpio.conf:

HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt resume filesystems fsck)

3. Kernel-Parameter für Resume

Für Swap-Files (im Gegensatz zu Swap-Partitionen) sind zwei Parameter nötig:

Den Offset ermitteln mit:

sudo filefrag -v /swapfile

Die erste physical_offset Zeile ist der relevante Wert:

   0:        0..       0:   21749760..  21749760:      1:

/etc/kernel/cmdline:

cryptdevice=PARTUUID=be750af8-98c2-4796-9fdf-2b34653e5d94:root root=/dev/mapper/root rw rootfstype=ext4 resume=/dev/mapper/root resume_offset=21749760

4. Initramfs neu bauen

sudo mkinitcpio -P

5. Lid-Switch und Power-Button konfigurieren

/etc/systemd/logind.conf:

HandleLidSwitch=hibernate
HandlePowerKey=hibernate
HandlePowerKeyLongPress=poweroff
HandleRebootKey=ignore
HandleSuspendKey=hibernate
sudo systemctl restart systemd-logind

6. I2C-HID Touchpad-Fix nach Resume

Das Touchpad (Synaptics SYNA8018, I2C-HID) wacht nach Hibernate oft nicht korrekt auf.
Der I2C-Bus verliert bei AMD Rembrandt nach S4 die Verbindung.

Script erstellen: /usr/lib/systemd/system-sleep/fix-i2c-hid

#!/bin/sh
case "$1" in
    post)
        rmmod i2c_hid_acpi
        rmmod i2c_hid
        modprobe i2c_hid
        modprobe i2c_hid_acpi
        ;;
esac
sudo chmod +x /usr/lib/systemd/system-sleep/fix-i2c-hid

Das Script wird von systemd automatisch nach jedem Resume (post) ausgeführt und lädt den
I2C-HID-Treiber neu.

Bedienung

Aktion Ergebnis
Deckel zuklappen Hibernate
Power-Button kurz drücken Hibernate
Power-Button 5 Sek drücken Poweroff
systemctl hibernate Hibernate manuell auslösen
systemctl reboot Neustart über Konsole
systemctl poweroff Herunterfahren über Konsole

Standby-Alias (Laptop wach halten)

Alias in ~/.config/shell/aliasrc:

alias standby='(while true; do for var in / - \\ \|; do printf "\r$var"; sleep .05; done; done) & systemd-inhibit --what=handle-lid-switch --why="Musik hören" sleep infinity; kill %1 2>/dev/null'

systemd-inhibit überschreibt jede konfigurierte Lid-Action. Solange der Befehl läuft,
ignoriert systemd-logind den Deckel-Switch komplett. Deckel zu = Laptop bleibt an.
Der Spinner visualisiert den aktiven Zustand.

Mit Ctrl+C beenden – der Spinner wird automatisch gekillt.

Diagnose-Befehle

Systemstatus prüfen:

systemctl status sleep.target suspend.target hibernate.target hybrid-sleep.target
cat /sys/power/mem_sleep
cat /proc/acpi/wakeup
cat /sys/power/disk
cat /sys/power/state

Hibernate-Logs prüfen:

journalctl -k | grep -iE "hibernat|resume|PM:"
journalctl -b -1 | grep -iE "hibernat|resume|error"

Swap-File Offset prüfen:

sudo filefrag -v /swapfile

Aktuelle Kernel-Parameter:

cat /proc/cmdline

Bekannte Probleme

USB-Root-Hubs verlieren Power nach Hibernate

usb usb1: root hub lost power or was reset

USB-Geräte werden nach dem Resume neu erkannt, aber der Display-Server kriegt sie nicht
immer richtig zurück. Externe USB-Mäuse können betroffen sein.

amdgpu SMU Resume

amdgpu 0000:33:00.0: SMU is resumed successfully!

Die GPU wacht normalerweise korrekt auf. Falls nicht, kann amdgpu.sg_display=0 als
Kernel-Parameter helfen (deaktiviert Scatter-Gather Display).

LUKS-Passwort beim Resume

Beim Aufwachen aus Hibernate muss das LUKS-Passwort eingegeben werden, da die Festplatte
entschlüsselt werden muss bevor der RAM-Image vom Swap gelesen werden kann. Das ist das
erwartete Verhalten bei voll verschlüsselten Systemen.

Optimierungen

Hibernate-Kompression

Das RAM-Image vor dem Schreiben komprimieren – reduziert die Schreibmenge um ~50%,
schnelleres Hibernate und Resume, schont die SSD.

# /etc/systemd/sleep.conf.d/hibernate.conf anlegen
sudo mkdir -p /etc/systemd/sleep.conf.d
sudo tee /etc/systemd/sleep.conf.d/hibernate.conf << EOF
[Sleep]
Compress=yes
EOF

Danach systemctl daemon-reload ausführen.

TLP installieren

Besseres Power Management speziell für ThinkPads. Regelt CPU-Frequenzen, USB-Suspend,
PCIe-ASPM, Battery-Charge-Thresholds und mehr.

sudo pacman -S tlp tlp-rdw
sudo systemctl enable tlp.service
sudo systemctl mask systemd-rfkill.service systemd-rfkill.socket
# Für ThinkPad-spezifische Features (Battery-Thresholds):
sudo pacman -S acpi_call

Konfiguration in /etc/tlp.conf. Die Defaults sind bereits gut.

Early KMS für amdgpu

Den GPU-Treiber früher im Boot-Prozess laden (in der Initramfs statt erst später).
Kann Resume-Probleme reduzieren und Screen-Tearing beim Boot verhindern.

# In /etc/mkinitcpio.conf die MODULES-Zeile ändern:
MODULES=(amdgpu)

Danach sudo mkinitcpio -P ausführen.

BIOS-Update prüfen

Lenovo veröffentlicht regelmäßig BIOS-Updates mit ACPI- und Power-Management-Fixes.
Über fwupd prüfen und installieren:

# Verfügbare Updates prüfen
fwupdmgr refresh
fwupdmgr get-updates

# Updates installieren
fwupdmgr update

ACHTUNG: Laptop muss am Netzteil hängen und ausreichend Akku haben.

systemd-sleep.conf Tuning

suspend-then-hibernate als Fallback einrichten: Erst schneller Suspend, nach z.B.
15 Minuten automatisch Hibernate. Spart Strom wenn man den Laptop doch mal vergisst.

# /etc/systemd/logind.conf
HandleLidSwitch=suspend-then-hibernate

# /etc/systemd/sleep.conf.d/hibernate.conf
[Sleep]
HibernateDelaySec=15min

Danach sudo systemctl restart systemd-logind.

SSD-Lebensdauer im Blick behalten

16 GB × 2× täglich Hibernate = ~12 TB Schreibzugriff/Jahr. Bei einer 1,8 TB NVMe
(typisch 600-1200 TBW) ist das vernachlässigbar, aber gut zu wissen.

Schreibmenge prüfen:

sudo smartctl -A /dev/nvme0n1 | grep -i "Data Units"