Welches ist der User-Space-Befehl, um den Ruhezustand wieder aufzunehmen?

935
user2284570

Ich habe lange gebraucht

echo disk > /sys/power/state 

Um in den Ruhezustand zu kommen /dev/sda10und ich benutzte die Initrd meiner Debian-Distribution, um fortzufahren.

Vor kurzem habe ich jedoch zu einem Raid-Array gewechselt, bei dem ich ein vollständig benutzerdefiniertes initramfs verwenden musste (ich musste es von Grund auf neu erstellen, da der Versuch, vorhandene initrd zu ändern, nicht funktioniert hat), um das Raid-Array einzurichten, bevor der Root gemountet wird Trennwand.

Es gibt zwei Wege, um fortzufahren: Entweder kann der Kernel das Auslagerungsdateisystem mit dem resume=Kernel-Parameter direkt lesen (und er wird vor dem Start von init fortgesetzt) . oder es benötigt etwas Benutzerplatz (zum Beispiel Laden von Modulen), um auf die Swap-Partition zugreifen zu können.

Also, was ist der User Space-Befehl, um wieder aufzunehmen /dev/mapper/isw_qfyzrvbsusf_Volume0p9 ?

3

2 Antworten auf die Frage

7
Argonauts

Die kurze Antwort lautet / sys / power / resume

Antwort viel länger, denn das allein wird nicht viel bewirken. Die meisten Distros empfehlen die Initiierung eines Lebenslaufs vom init / PID 1-Prozess (Early User Space). In den Anweisungen werden Sie jedoch fast immer dazu aufgefordert, Ihrem Bootloader mit dem Resume-Ziel ein Kernel-Cmd-Zeilenargument hinzuzufügen. Der Grund dafür ist in fast allen Fällen, dass das initramfs-Buildwerkzeug (dracut / mkinitcpio / initramfs-tools) durch dieses Argument in der Konfiguration selbst ausgelöst wird.

Basierend auf Ihrem Beispiel und Ihrer Distribution gehe ich davon aus, dass Sie die Low-Level-Kernel-Schnittstelle für Suspend (swsusp) verwenden. Es gibt eine Reihe anderer Dienstprogramme, die zum Starten des Suspendierungsvorgangs verwendet werden können. Alle sind im Wesentlichen das erste Element swusp.

  • swusp - Low-Level-Kernel-Schnittstelle; Benutzerraum-Schnittstelle erfolgt über sysfs
  • uswswp - Suspend Wrapper für Low-Level- Userpace- Software - stellt Dienstprogramme für s2disk und s2ram bereit (wird nicht aktiv verwaltet)
  • pm-utils - High-Level-Skripts zur Konfiguration des Prozesses
  • systemd-suspend - Auf systemd-Systemen ist ein Suspend-Target verfügbar, das den Suspend-Vorgang über die Kernel-Schnittstelle initiiert.

Konfiguration fortsetzen

Eine vereinfachte Übersicht über die Startsequenz in Linux unter Verwendung eines initramfs-Images lautet:

[BIOS] ==> [Boot Loader] ==> [Kernel auf temporärem rootfs - initramfs] ==> [Kernel auf rootfs - Laufwerken]

Am Ende der initramfs-Phase befindet sich ein kleines Fenster, in dem die Wiederaufnahme stattfinden kann. Nachdem der Kernel PID 1 (systemd oder init) gestartet hat, werden die Treiber für den Raid geladen, aber bevor die eigentlichen Laufwerke gemountet werden.

Ich habe ein Beispiel für eine typische Lebenslaufkonfiguration bereitgestellt. Dies setzt voraus, dass der von Ihnen angegebene Wiederherstellungspfad eine Swap-Partition ist. und keine "normale" Partition, die eine Auslagerungsdatei enthält. Eine Auslagerungsdatei erfordert zusätzliche Konfiguration. Die systemd-Methode unterscheidet sich - sie verwendet eine udev-Regel auf der Grundlage von resume.target, die den Resume-Prozess auslöst. Es lohnt sich zu prüfen, ob der traditionellere Ansatz des Bootloader / initramfs-Images nicht funktioniert. Dies ist eine direkte Ergänzung der Art und Weise, wie ein init-basiertes System dies tun würde. Es ist jedoch etwas komplizierter, das eigene Skript manuell einzufügen und die Abhängigkeiten / relativen Zeitvorgaben zu korrigieren.

Die Quintessenz ist, dass der Zeitpunkt, zu dem die Wiederaufnahme ausgelöst wird, unmittelbar vor dem Zeitpunkt liegt, zu dem der Kernel die "echten" Festplattenlaufwerke einfügt. Wenn der Kernel also die gesamten fs mounten kann, hat er auch alle Fähigkeiten und Informationen, die zum Mounten nur der Swap-Partition erforderlich sind.

Stellen Sie sicher, dass Ihre Swap-Partition über fstab eingehängt ist. Das Dracut-Tool initramfs sucht spezifisch danach und schließt das Resume-Modul nicht ein, wenn die Swap-Partition nicht vorhanden ist.

Bootloader konfigurieren

Wenn Sie grub2 verwenden, müssen Sie resume=/dev/mapper/isw_qfyzrvbsusf_Volume0p9an das GRUB_CMDLINE_LINUX_DEFAULTFeld in /etc/default/grub Update your grub image anhängen, normalerweise mit dem Befehl:sudo grub2-mkconfig -o /boot/grub2/grub.cfg

Initramfs neu aufbauen

Sie müssen das initramfs-Image mit der Resume-Funktion (sowie den bereits durchgeführten Raid-Änderungen) neu erstellen. Debian bietet sowohl Dracut- als auch Initramfs-Tools zum Generieren von Initramfs an. Es muss mit dem Resume-Modul regeneriert werden. Fügen Sie mit dracut das Befehlszeilenargument hinzu --add resume. Mit update-initramfs, fügen Sie den Eintrag resume=/dev/mapper/isw_qfyzrvbsusf_Volume0p9in die Konfigurationsdatei/etc/initramfs-tools/conf.d/resume

Das sollte es sein; Angenommen, ich habe einige korrekte Annahmen bezüglich Ihrer Konfiguration getroffen.

Bearbeiten; Vorausgesetzt, Sie können es zeitlich richtig einstellen, können Sie die Major- / Minor-Gerätenummer der Swap-Partition in / sys / power / resume von einem Init-Skript aus wiederholen, um den Resume auszulösen. Ihr initramfs-Image (oder initd-Image) muss Unterstützung für den Lebenslauf enthalten. Andernfalls ist das sysfs-Element und die darin enthaltene Funktion nicht vorhanden. Siehe https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/983805

`Wiederaufbau initramfs`. ** Haben Sie meine Frage wirklich gelesen? ** Ich kann nichts von der mitgelieferten initramfs-Distribution verwenden, da ich zur Einrichtung meines Raid-Arrays ** eine benutzerdefinierte initrd manuell von Grund auf beibehalten muss ** * (I kann kein Skript aus meiner Distribution verwenden) *. Was muss also auf `/ sys / power / resume` geschrieben werden? user2284570 vor 7 Jahren 0
Es muss von initramfs gemacht werden. Sie sagten, Sie hätten es angepasst, vermutlich mit einem Dienstprogramm. In diesem Fall können Sie dies erneut tun - diesmal mit Unterstützung für den Lebenslauf. Argonauts vor 7 Jahren 0
Ich habe kein Dienstprogramm verwendet * (Denken Sie daran, dass eine initrd nur ein komprimiertes Archiv ist, das leichte rootfs enthält) *. Ich habe die rootfs von initrd wirklich von Grund auf erstellt. Dies bedeutet, dass Sie alle Start-Shell-Skripts schreiben und jede Datei und jeden Ordner einzeln auswählen müssen. ** Meine Frage bezieht sich also darauf, was sich hinter den Skripten befindet, die von Linux-Distributionen verwendet werden, um ** fortzusetzen (auch in initrd enthalten). user2284570 vor 7 Jahren 0
Sie haben angegeben, dass Sie initrd verwendet haben und dann zu einem initramfs-basierten Boot gewechselt sind - sie sind nicht gleichwertig. Also was ist das? Welche Version von Debian verwenden Sie? Verwenden Sie systemd? Das initrd-Image muss in das Image integriert sein, unabhängig davon, wie Sie es erstellt haben. Der Großteil dieses Images ist ein Kernel-Binärcode und muss mit Unterstützung für den Lebenslauf generiert werden. Kein Scripting bietet diese Funktion, wenn der anfängliche Boot-Kernel diese Funktion nicht zur Verfügung stellt (über sysfs verfügbar gemacht). Argonauts vor 7 Jahren 0
Wiederum gibt es keine Unterstützung für den Lebenslauf * (da ich `/ init` manuell von Grund auf schreibe) *. Was ich habe, ist `/ sys ', das vor der Root-Partition und bei allen Einträgen von` / sys / power / `.so installiert wird. Was wäre das minimale Shell-Skript, das den Lebenslauf auslösen würde? Andernfalls ist ja / sysfs / in meinem benutzerdefinierten initramfs vollständig verfügbar. und in der Tat benutze ich Darban. systemd oder sysv init ist hier jedoch irrelevant, da das Mounten der Root-Partition nicht durchgeführt werden sollte. Die wirkliche Lösung ist, `cho -n" $ major: $ minor "> / sys / power / resume`along [this] (http://stackoverflow.com/a/29347598/2284570) in` / init` hinzuzufügen. user2284570 vor 7 Jahren 0
Ich habe den Link in der Antwort auf eine Methode dafür angegeben. Sie müssen dies an der richtigen Stelle in der Startsequenz tun. Sofern systemd oder init nicht relevant ist, kann Ihr Init-Skript nicht aufgerufen werden, bevor PID 1 gestartet wurde. was anscheinend in Ihrem Fall init ist, nicht systemd. Argonauts vor 7 Jahren 0
`kann nicht aufgerufen werden, bevor PID 1 gestartet wurde` nichts. Das erste Programm auf einer initrd hat ᴘɪᴅ 1 * (`/ init`systemd oder nicht) *. Oder die erste vom Kernel ausgeführte Benutzerbereichs-Binärdatei hat immer ᴘɪᴅ 1. Sie mounten keine Dateisysteme von der Festplatte. user2284570 vor 7 Jahren 0
Hoffe, diese Informationen haben irgendwie geholfen. Sie scheinen meine Antwort als Unsinn zu bezeichnen und dann ihr zuzustimmen. Seltsame Reaktion. Argonauts vor 7 Jahren 0
Der Kommentar ist Unsinn. und ohne ordentliches Umformatieren schreibe ich mir die Antwort am nächsten Wochenende selbst. Es klingt, als würden Sie einige Dinge über initrd / initramfs missverstehen. user2284570 vor 7 Jahren 0
Der Punkt des Kommentars ist, dass das, was Sie für PID 1 verwenden, eine Rolle dabei spielt, wofür Sie es verwenden können. Sie könnten ls als PID 1 verwenden, bietet jedoch in diesem Zusammenhang wenig hilfreiche Funktionen. Wie Sie vielleicht wissen oder nicht wissen, sind alle anderen Prozesse, einschließlich der Shell, in der Ihre Skripte aufgerufen werden, Kinder von PID 1, und dies erfordert, dass PID 1 vor der Ausführung Ihres Skripts gestartet wurde. Dies ist die reine Funktionsweise oder andernfalls. Wenn Sie nach spezifischen Antworten auf Ihre Fragen suchen, geben Sie bestimmte Details an - insbesondere, wenn Sie dazu aufgefordert werden. Argonauts vor 7 Jahren 0
In meinem Fall `/ init` handelt es sich um ein Shell-Skript.` `/ Sys / power / resume` würde von pid 1 * geschrieben (echo ist ein integrierter Shell-Befehl) *. user2284570 vor 7 Jahren 0
Ok, ich brauchte nicht viel Erklärungen. Aber was muss getan werden, um das zu erreichen, was ich brauche? Also habe ich meine eigene Antwort gepostet, die klarer erscheint. user2284570 vor 7 Jahren 0
0
user2284570

Die Datei ist /sys/power/resume.

Um den Lebenslauf auszulösen, muss der Major des Geräts, gefolgt von dem Minor, in diese Datei geschrieben werden. So kann der folgende Befehl es erreichen:

echo `stat -c %t /dev/mapper/isw_*_Volume0p9`\:`stat -c %T /dev/mapper/isw_*_Volume0p9` > /sys/power/resume 
Sie können auch `echo / dev / mapper / isw _ * _ Volume0p9> / sys / power / resume 'ausführen, und der Kernel ermittelt automatisch die richtigen Major- / Minor-Gerätenummern. Hitechcomputergeek vor 6 Jahren 1