Winterschlaf verwenden systemctl
und in schwierigen Fällen zum Laufen bringen
Für mich scheitert pm-hibernate
immer. Nach einigen Optimierungen konnte ich über die Schnittstelle von systemd (Init-System in 16.04 und höher) in den Ruhezustand wechseln. Ich habe es auch geschafft, es am 17.04 mit einer Auslagerungsdatei zum Laufen zu bringen. Diese Fallstudie kann für andere mit Problemen nützlich sein.
Erster Versuch:
sudo systemctl hibernate
Wenn dies fehlschlägt, beginnen Sie mit der Fehlerbehebung: Im Ruhezustand (HTD oder ACPI S4) wird der Rechnerstatus auf die Festplatte geschrieben, sodass kein Strom erforderlich ist, um ihn zu erhalten. Der Status wird entweder in eine Auslagerungspartition oder in eine Auslagerungsdatei geschrieben. Hinweis: Wenn Sie BTRFS verwenden, versuchen Sie NICHT, eine Auslagerungsdatei zu verwenden, da dies zu einer Beschädigung des Dateisystems führen kann
Ihre Auslagerungspartition oder Auslagerungsdatei muss möglicherweise dieselbe Größe wie der Arbeitsspeicher haben, um den Ruhezustand zu ermöglichen. Es besteht jedoch eine gute Chance, dass Sie in den Ruhezustand versetzt werden können, wenn sie mindestens 2/5 der Größe des Arbeitsspeichers entspricht, wie auf der Wiki-Seite "Arch" angegeben Probieren Sie zuerst andere Schritte aus, bevor Sie die Swap-Größe erhöhen.
Wenn Ihr Problem darin besteht, dass Sie einen sauberen Neustart anstelle der erwarteten Wiederaufnahme erhalten, müssen Sie höchstwahrscheinlich mindestens einen Startparameter festlegen, um das Festplatten-Image zu finden
Finden Sie Ihre Swap-Partition:
grep swap /etc/fstab
für mich kehrt dies zurück (Teilausgabe)
# swap was on /dev/mmcblk0p3 during installation
Wo /dev/mmcblk0p3
soll die Partition angegeben werden?
Fügen Sie einen Boot-Parameter hinzu:
sudoedit /etc/default/grub
Zur Linie Start GRUB_CMDLINE_LINUX_DEFAULT
fügen resume=/dev/YourSwapPartition
Sie den Abschnitt in Anführungszeichen (ersetzen mit der Partition , die Sie früher identifiziert). Mit meinem Beispiel:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=/dev/mmcblk0p3"
Jedes Mal, wenn Sie diese Datei ändern, müssen Sie sie ausführen. sudo update-grub
Andernfalls haben die Änderungen keine Auswirkungen.
Jetzt müssen Sie neu starten. Anschließend können Sie versuchen, den Ruhezustand zu beenden, indem Sie den folgenden Befehl eingeben:
sudo systemctl hibernate
Drücken Sie den Netzschalter, um fortzufahren, und das System wird gestartet.
Wenn Sie immer noch Probleme haben, starten Sie das Debuggen.
Ich führe meinen Fall unten als Beispiel an, aber detaillierte Informationen zum Debuggen von S-Zuständen finden Sie in diesem Blog und auch in diesem .
Legen Sie weitere Startparameter fest, um weitere Informationen zu erfassen. Entfernen quiet
und splash
und Hinzufügen von initcall_debug
und, no_console_suspend
wodurch Init-Systemaufrufe an die Konsole ausgegeben werden, damit Sie beobachten können, was falsch läuft. Ich habe folgendes eingestellt:
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/mmcblk0p3 no_console_suspend initcall_debug"
Das hat mir geholfen zu sehen, was im Ruhezustand schief gelaufen ist.
In meinem Fall habe ich nach dem Fortsetzen das WLAN verloren und der Kernel war eindeutig verärgert, da die meisten Befehle (zum Beispiel das Lesen von /sys
Elementen, das Neuladen von Modulen oder Befehlen systemctl
) nicht funktionieren würden - der Prozess scheint zu starten und einfach zu hängen (all dies wäre der Fall) natürlich nach dem Neustart wieder normal). Als ich sah, wie das System sehr langsam heruntergefahren und alle Debug-Meldungen gelesen wurden, bemerkte ich, dass es viele Probleme mit "brcm" gab, weshalb ich vermutete, dass mein drahtloses Broadcom-Treibermodul daran schuld war. Sicher genug, dass ich meinen Ruhezustand angepasst habe, um das Modul zuerst zu entladen:
sudo modprobe -r brcmfmac
sudo systemctl hibernate
Nach dem Fortsetzen stecke ich das Modul wieder ein
sudo modprobe brcmfmac
Und alles hat perfekt funktioniert. Ich muss auch das btsdio
Modul auf die schwarze Liste setzen, mit dem es nicht kompatibel zu sein scheintbrcmfmac
Update: Ruhezustand mit einer Auslagerungsdatei am 17.04.
Noch einmal mit Hilfe der Arch-Wiki-Seite und einigen zusätzlichen Bastelarbeiten gelang es mir, den Ruhezustand auf 17.04 mit einer Auslagerungsdatei arbeiten zu lassen. Dies erforderte einen zusätzlichen Boot-Parameter, resume_offset=n
wobei n die erste Zahl physical_offset
in der Ausgabe von ist sudo filefrag -v /swapfile
:
$ sudo filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 1425873920 (348114 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 32767: 34816.. 67583: 32768:
1: 32768.. 63487: 67584.. 98303: 30720:
....
Daher ist der zusätzliche Boot-Parameter in meinem Fall resume_offset=34816
. Sie müssen noch einen Boot-Parameter festlegen, von dem aus die Partition fortgesetzt werden soll. Dies ist die Root-Partition (oder die Partition, auf der sich Ihre Auslagerungsdatei befindet). Meine Parameter sind jetzt:
GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=/dev/mmcblk1p2 resume_offset=34816"
Wo /dev/mmcblk1p2
ist meine Root-Partition (Ihre ist eher so etwas wie /dev/sda2
).
Während des Lebenslaufs konnte ich sehen, dass das Bild erfolgreich geladen wurde. In meinem Fall (nur ein Beispiel - YMMVAPD) haben dann einige weitere Treiber ( i2c_designware
) einige Fehler ausgegeben und ich habe ein vollständiges Einfrieren des Systems beim Lebenslauf erhalten. Der Ruhezustand funktioniert, wenn ich diese Module zusätzlich entlade brcmfmac
, das System jedoch ohne diese Module schnell unbrauchbar wird. Ich habe daher eine Art Skript erstellt, um die fehlerhaften Module zu entladen und sie sofort wieder in den Lebenslauf einzufügen:
# remove buggy modules
modprobe -r brcmfmac i2c_designware_platform i2c_designware_core &&
# hibernate
echo disk > /sys/power/state
# reinsert
modprobe i2c_designware_core i2c_designware_platform brcmfmac
Wenn ich überwintern will, renne ich sudo bash script
. Das funktioniert super.
TL; DR
Verwenden Sie systemd, legen Sie einen Boot-Parameter für die Wiederaufnahme des Auslagerungsvorgangs fest, identifizieren Sie fehlerhafte Treiber und entladen Sie sie, bevor Sie den Ruhezustand einleiten. Wenn das System ohne diese Module nicht lange funktioniert oder Sie mehrere Module entladen müssen, ist es möglicherweise einfacher, ein einfaches Skript zum Einleiten des Ruhezustands zu verwenden.