Ich arbeite an der Einrichtung eines Linux-Servers, der Dutzende von Daemons enthalten wird, die von systemd gesteuert werden. Die Daemons sind in Ziele gruppiert, sodass sie in Gruppen hoch- und heruntergefahren werden können, die Systemadministratoren jedoch einzelne Dienste manuell steuern können. Ich suche nach einer Möglichkeit, den Status (welche Dienste aktiviert sind) nach einem Neustart beizubehalten. Die Idee ist, dass Personen, die auf dem Server debuggen, testen und entwickeln, ihn bei Bedarf neu starten können und das System in derselben Konfiguration wie vor dem Neustart hochfährt.
Die Funktionalität von systemd snapshot
scheint hierfür ideal zu sein, aber soweit ich das beurteilen kann, können Sie keinen Snapshot auf die Festplatte schreiben, um ihn später zu verwenden.
multi-user.target.wants/
Mein ursprünglicher Plan war, einen symbolischen Link von zu einem Dienst namens zu erstellen bootingup.service
. Jedes Ziel, das der Systemadministrator aktiviert, würde dann neu geschrieben bootingup.service.d/bootingup.conf
, um das gerade aktivierte Ziel zu starten. Dies würde bedeuten, dass das System beim Booten das zuletzt gestartete Ziel aktivieren würde, sich aber keine Dienste merken würde, die einzeln aktiviert/deaktiviert wurden.
Gibt es eine Möglichkeit, systemd dazu zu bringen, sich den Status aller Dienste auch nach einem Neustart zu merken?
Antwort1
Ich werde diese Antwort mit Folgendem beginnen:
Ich empfehle Ihnen, die Entwickler zu zwingen, Dinge wie enable
, disable
, after
und wants
in den systemd
Diensten richtig zu verwenden, anstatt einen Dump und eine Wiederherstellung dessen durchzuführen, was ausgeführt wird.
Nachdem ich das nun losgeworden bin …
systemctl snapshot
kann Ihnen dabei helfen, das zu tun, wonach Sie suchen.
Beim Ausführen systemctl snapshot ${SNAPSHOT_NAME}
systemd
wird eine Einheit namens erstellt ${SNAPSHOT_NAME}.snapshot
. Diese Einheit scheint nur im Speicher zu existieren. Sie können sie jedoch weiterhin mit abfragen systemctl
.
Die Verwendung systemctl show ${SNAPSHOT_NAME}.snapshot
von listet alle für den Snapshot gesammelten Informationen auf systemd
. Besonders hervorzuheben sind die Wants=
/ After=
-Abschnitte (die beide gleich zu sein scheinen), in denen alle Einheiten aufgelistet sind, die zum Zeitpunkt des Snapshots aktiv waren. Wenn Sie diese Liste analysieren und in ein benutzerdefiniertes Ziel einfügen, können Sie mit erreichen, wonach Sie suchen systemctl isolate ${CUSTOM_TARGET}
.
Startet die in der Befehlszeile angegebene Einheit und ihre Abhängigkeiten und stoppt alle anderen. Wenn ein Einheitenname ohne Erweiterung angegeben wird, wird die Erweiterung „.target“ angenommen.
Dies ist vergleichbar mit dem Ändern des Runlevels in einem herkömmlichen Init-System. Der Befehl „isolate“ stoppt sofort Prozesse, die in der neuen Einheit nicht aktiviert sind, möglicherweise einschließlich der grafischen Umgebung oder des Terminals, das Sie gerade verwenden.
Beachten Sie, dass dies nur auf Units zulässig ist, bei denen AllowIsolate= aktiviert ist. Weitere Informationen finden Sie in systemd.unit(5).
${CUSTOM_TARGET}
Wants
Sie könnten sogar einen Dienst schreiben, der die / After
-Abschnitte beim Herunterfahren aktualisiert .
Antwort2
Ich denke, Sie sollten hierfür einen Konfigurationsmanager wie Puppet oder Ansible verwenden. Ein Konfigurationsmanager ist die beste Möglichkeit, Ihr System in dem gewünschten Zustand zu halten. Systemd-Snapshots bleiben nach einem Neustart nicht erhalten.