-
Es ist eine schlechte Idee, Swap zu deaktivieren, wenn Sie bereits wissen, dass Ihr System an den Punkt kommen kann, an dem es nicht mehr genügend Speicher haben wird . Gerade in dem Moment, in dem der Kernel keinen Speicher zum Allokieren hat, wird Ihr System wahrscheinlich sehr-sehr sein reagiert nicht oder hängt sich einfach auf, sodass Sie es neu starten müssen. Hänge können zu Datenverlusten und manchmal zu Dateisystembeschädigungen führen. Abhängig vom Dateisystem kann es automatisch behoben werden (ext* family, fat family, btrfs und einige andere), aber nicht jedes FS unterstützt diese Funktion. Ich wette, Sie werden wahrscheinlich nicht gerne
fsck
ausführen im Einzelbenutzermodus jedes Mal, wenn Sie eine Beschädigung haben ... -
Der Kernel ist nicht so dumm, einfach alles auf Ihre SSD zu schreiben, er verhält sich anders als HDDs und versucht, mit Dingen wie TRIM so wenig wie möglich zu schreiben. Es schadet Ihrem Laufwerk nicht so sehr, wie Sie vielleicht denken.
-
Der Ruhezustand ist eingebaut Kernel-Subsystem, das auf niedriger Ebene arbeitet. Es muss immer noch eine separate Partition mit einer Größe ≥ RAM-Größe vorhanden sein, damit es nur einen vollständigen Schnappschuss Ihres Speichers erstellen kann. Hier können Sie lesen, wie Linux den Ruhezustand verwaltet. Wenn es keinen Platz gibt, um das Speicherabbild dauerhaft zu speichern, funktioniert der Ruhezustand nicht. Sie können keine Daten in der Luft speichern. Keine dauerhafte physische Speicherung =kein Ruhezustand. Das ist also auch die Antwort auf Ihre Frage:Sie können den Ruhezustand nicht ohne Swap unter Linux verwenden .
Mein Punkt ist also, dass Sie natürlich ohne Swap leben und ihn nur für den Ruhezustand aktivieren können, aber nur, wenn Sie sicher sind, dass das System zu 99,9% der Zeit eingeschaltet ist und genügend Speicher für alles hat. Wenn dies nicht der Fall ist, müssen Sie Swap verwenden.
Nun zur möglichen Lösung:
Wenn Sie systemctl hibernate
ausführen systemd startet einen Dienst namens systemd-hibernate.service . Unit-Datei, die sich normalerweise unter /usr/lib/systemd/system/ befindet Verzeichnis
Unter Debian sieht es so aus:
# SPDX-License-Identifier: LGPL-2.1+
#
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Hibernate
Documentation=man:systemd-suspend.service(8)
DefaultDependencies=no
Requires=sleep.target
After=sleep.target
[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-sleep hibernate
Wie Sie sehen, gibt es Anforderungen und Nach Optionen. Wir können eine andere Einheit schreiben, die den Austausch ermöglicht, und ihren Namen zu diesen Feldern hinzufügen. Wir nennen es swap-on.service und platzieren Sie es in /etc/systemd/system/ Verzeichnis
Unsere Datei sieht in etwa so aus:
# Unit filed is not required in our case so you can skip it
[Unit]
Description=Enable swap partition
[Service]
# This line means that service will be executed just once and immediately stop when
# swapon enables swap on /dev/sda3
Type=oneshot
# Change /dev/sda3 with device named after your swap partition
# like /dev/sdb3 or /dev/nvme0n1p3
# Use lsblk to determine your swap partition (partition with [SWAP] as mountpoint)
# Of course you can think of a more complex solution like running external script
# that determines your swap partition automatically every time service is executed
# but for now I'll go with simple /dev/sda3
ExecStart=/sbin/swapon /dev/sda3
Jetzt sollten wir den systemd-hibernate.service unseres Systems ändern :
# SPDX-License-Identifier: LGPL-2.1+
#
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Hibernate
Documentation=man:systemd-suspend.service(8)
DefaultDependencies=no
Requires=sleep.target swap-on.service <--
After=sleep.target swap-on.service <--
[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-sleep hibernate
Wir duplizieren swap-on.service in After, um sicherzustellen, dass Systemd den Ruhezustand nach startet der Swap ist eingeschaltet und nicht umgekehrt und in Erforderlich, um sicherzustellen, dass systemd nicht versucht, in den Ruhezustand zu wechseln, wenn swap-on.service fehlgeschlagen.
Wenn wir jetzt systemctl hibernate
ausführen systemd führt unseren modifizierten systemd-hibernate.service aus der swap-on.service ausführt das ermöglicht den Austausch. Wenn der Swap aktiviert ist und sowohl die Pflicht- als auch die Nach-Felder erfüllt sind, kann systemd unser System endlich in den Ruhezustand versetzen.
Um systemd den Swap nach der Wiederaufnahme aus dem Ruhezustand zu deaktivieren, müssen wir keine weitere Dienstdatei namens swap-off.service erstellen was dasselbe tut wie unser swap-on.service , platzieren Sie es im selben Verzeichnis wie den „on“-Dienst (/etc/systemd/system/). Der einzige Unterschied besteht darin, dass dieser Dienst swapoff ausführt statt Swap :
[Unit]
Description=Disable swap partition
[Service]
Type=oneshot
# again, change /dev/sda3 to your swap partition /dev file
ExecStart=/sbin/swapoff /dev/sda3 <--
Der nächste Schritt besteht darin, die Dienstdatei mit dem Namen [email protected] zu ändern befindet sich im selben /usr/lib/systemd/system Verzeichnis:
[Unit]
Description=Resume from hibernation using device %f
Documentation=man:[email protected](8)
DefaultDependencies=no
BindsTo=%i.device
Wants=local-fs-pre.target
After=%i.device
Before=local-fs-pre.target
ConditionPathExists=/etc/initrd-release
[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-hibernate-resume %f
Wir müssen Before ändern Feld jetzt. Fügen Sie swap-off.service hinzu neben local-fs-pre.target :
...
After=%i.device
Before=local-fs-pre.target swap-off.service <--
ConditionPathExists=/etc/initrd-release
...
Wenn Sie jetzt aus dem Ruhezustand zurückkehren, wird systemd swap-off.service ausführen nachdem das Swap-Image in den Speicher geladen wurde (eigentlich etwas später, aber das spielt für uns keine Rolle)
Denken Sie daran, dass dies eine vollständig theoretische Lösung ist. Ich habe sie noch nicht ausprobiert, aber basierend auf dem, was ich über systemd weiß, sollte dies funktionieren. Da UPower systemd auffordert, in den Ruhezustand zu versetzen, was, wie ich erklärt habe, systemd-hibernate.service ausführt, ist dies wahrscheinlich das, wonach Sie suchen