.\" -*- coding: UTF-8 -*-
'\" t
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH SYSTEMD\-SOFT\-REBOOT\&.SERVICE 8 "" "systemd 255" systemd\-soft\-reboot.service
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH BEZEICHNUNG
systemd\-soft\-reboot.service \- Neustartaktion im Anwendungsraum
.SH ÜBERSICHT
.PP
systemd\-soft\-reboot\&.service
.SH BESCHREIBUNG
.PP
systemd\-soft\-reboot\&.service ist ein Systemdienst, der von
soft\-reboot\&.target hereingezogen wird und für die Durchführung einer
Neustartaktion rein im Anwendungsraum verantwortlich ist\&. Beim Aufruf wird
er ein Signal \fBSIGTERM\fP an alle noch laufenden Prozesse senden (aber wartet
nicht darauf, dass sich die Prozesse beenden) und folgt dann mit
\fBSIGKILL\fP\&. Falls das Verzeichnis /run/nextroot/ existiert (dies kann ein
normales Verzeichnis, ein Verzeichnis\-Einhängepunkt oder ein Symlink auf
diese sein), dann wird es die Dateisystemwurzel dorthin umschalten\&. Es
führt dann den Diensteverwalter von dem (jetzt möglicherweise neuen)
Wurzeldateisystem erneut aus, wodurch eine neue Systemstarttransaktion in
die Warteschlange kommt, wie bei einem normalen Systemneustart\&.
.PP
Solch eine reine Neustartaktion im Anwendungsraum erlaubt das Aktualisieren
oder Zurücksetzen der Gesamtheit des Anwendungsraums mit minimaler
Ausfallzeit, da die Neustartaktion \fBnicht\fP folgende Punkte durchlaufen
muss:
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
Die zweite Phase des regulären Herunterfahrens, wie von
\fBsystemd\-shutdown\fP(8) implementiert\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
Die dritte Phase des regulären Herunterfahrens, d\&.h\&. der Rückkehr in den
Initrd\-Kontext\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
Die Hardware\-Neustart\-Aktion\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
Die Firmware\-Initialisierung\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
Die Initialisierung des Systemstartprogramms\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
Die Kernel\-Initialisierung\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
Die Initrd\-Initialisierung\&.
.RE
.PP
Allerdings hat diese Art des Neustarts auch Nachteile:
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
Die Betriebssystemaktualisierung bliebt unvollständig, da der Kernel nicht
zurückgesetzt wird und weiter läuft\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
Kerneleinstellungen (wie die Einstellungen in /proc/sys/, bekannt auch als
»sysctl«\- oder /sys/\-Einstellungen) werden nicht zurückgesetzt\&.
.RE
.PP
Diese Beschränkungen können mit verschiedenen Mitteln adressiert werden, die
außerhalb des Umfangs dieser Dokumentation sind, wie beispielsweise dem
Live\-Patchen des Kernels und hinreichend umfangreichen Dateien in
/etc/sysctl\&.d/\&.
.SH RESSOURCEN\-WEITERGABE
.PP
Verschiedene Laufzeit\-Betriebssystem\-Ressourcen können von einer
Systemlaufzeit zu der nächsten über die Neustartaktion im Anwendungsraum
hinweg weitergegeben werden\&. Konkret:
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
Dateideskriptoren, die im Dateideskriptorspeicher von Diensten abgelegt
sind, die bis zum allerletzten Ende aktiv bleiben, werden zum nächsten Start
weitergegeben, wo sie in dem Dateideskriptorspeicher der gleichen Unit
abgelegt werden\&. Damit dies funktioniert, müssen Units
\fIDefaultDependencies=no\fP deklarieren (und ein manuelles
\fIConflicts=shutdown\&.target\fP und ähnliches vermeiden), um sicherzustellen,
dass sie nicht normal während der Herunterfahraktion des Systems beendet
werden\&. Alternativ können Sie \fIFileDescriptorStorePreserve=\fP verwenden,
um dem Dateideskriptorspeicher zu erlauben, festgehalten zu werden, selbst
wenn die Unit heruntergefahren ist\&. Siehe \fBsystemd.service\fP(5) zu Details
des Dateideskriptorspeichers\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
Entsprechend bleiben Dateideskriptoren offen (auch verbindbar), die
\&.socket\-Units zugeordnet sind, falls die Units nicht während des Übergangs
gestoppt werden\&. (Dies wird durch \fIDefaultDependencies=no\fP erreicht\&.)
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
Das Dateisystem /run/ bleibt eingehängt und gefüllt und kann zur Übergabe
von Zustandsinformationen zwischen Neustartzyklen im Anwendungsraum verwandt
werden\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
Diensteprozesse können über den Übergang hinweg, hinter den weichen Neustart
und in die nächste Sitzung hinein laufen, falls sie in Diensten abgelegt
sind, die bis zum allerletzten Ende des Herunterfahrens aktiv bleiben (was
wiederum durch \fIDefaultDependencies=no\fP erreicht wird)\&. Sie müssen auch
so eingerichtet werden, dass sie das Beenden mit den vorher erwähnten
\fBSIGTERM\fP und \fBSIGKILL\fP mittels \fISurviveFinalKillSignal=yes\fP vermeiden
und auch so konfiguriert sein, dass sie das Stoppen beim Isolieren mittels
\fIIgnoreOnIsolate=yes\fP vermeiden\&. Sie müssen auch so konfiguriert sein,
dass sie beim normalen Herunterfahren, Neustarten oder im Wartungsmodus
angehalten werden\&. Schließlich müssen sie nach \fBbasic\&.target\fP
angeordnet sein, um die korrekte Sortierung beim Systemstart
sicherzustellen\&. Falls irgendwelche neuen oder angepassten Units zum
Hineinisolieren verwandt werden oder diese eine äquivalente
Herunterfahrfunktionalität bereitstellen, dann müssen diese Prozesse auch
manuell für die korrekte Sortierung und Konflikte konfiguriert
sein\&. Beispiel:
.sp
.if n \{\
.RS 4
.\}
.nf
[Unit]
Description=Mein überlebender Dienst
SurviveFinalKillSignal=yes
IgnoreOnIsolate=yes
DefaultDependencies=no
After=basic\&.target
Conflicts=reboot\&.target
Before=reboot\&.target
Conflicts=kexec\&.target
Before=kexec\&.target
Conflicts=poweroff\&.target
Before=poweroff\&.target
Conflicts=halt\&.target
Before=halt\&.target
Conflicts=rescue\&.target
Before=rescue\&.target
Conflicts=emergency\&.target
Before=emergency\&.target
[Service]
Type=oneshot
ExecStart=sleep infinity
.fi
.if n \{\
.RE
.\}
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
Dateisystemeinhängungen können während des Übergangs eingehängt bleiben und
komplexe Speichersysteme angehängt, falls sie so konfiguriert wurden, dass
sie bis zum allerletzten Ende des Herunterfahrprozesses aktiv
bleiben\&. (Dies wird auch mittels \fIDefaultDependencies=no\fP und dem
Vermeiden von \fIConflicts=umount\&.target\fP erreicht\&.)
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
Falls die Unit einen Dienst über D\-Bus veröffentlicht, muss die Verbindung
nach einem weichen Neustart neu etabliert werden, da der D\-Bus\-Vermittler
gestoppt und dann wieder gestartet wird\&. Unter Verwendung der Bibliothek
\fBsd\-bus\fP(3) kann dies durch Anpassung des folgenden Beispiels erfolgen\&.
.sp
.if n \{\
.RS 4
.\}
.nf
/* SPDX\-License\-Identifier: MIT\-0 */
/* Implementiert einen D\-Bus\-Dienst, der sich automatisch neu verbindet, wenn der Systembus neu gestartet wird\&.
*
* Kompilieren Sie mit »cc sd_bus_service_reconnect\&.c $(pkg\-config \-\-libs \-\-cflags libsystemd)«
*
* Um dem Programm zu erlauben, die Eigentümerschaft des Namen »org\&.freedesktop\&.ReconnectExample« anzunehmen,
* fügen Sie folgendes als /etc/dbus\-1/system\&.d/org\&.freedesktop\&.ReconnectExample\&.conf hinzu
* und laden Sie den Verwalter mit »systemctl reload dbus« neu:
*
* Um die Eigenschaften mittel busctl zu erlangen:
*
* $ busctl \-\-user get\-property org\&.freedesktop\&.ReconnectExample \e
* /org/freedesktop/ReconnectExample \e
* org\&.freedesktop\&.ReconnectExample \e
* Example
* s "example"
*/
#include
#include
#include
#include
#define _cleanup_(f) __attribute__((cleanup(f)))
#define check(x) ({ \e
int _r = (x); \e
errno = _r < 0 ? \-_r : 0; \e
printf(#x ": %m\en"); \e
if (_r < 0) \e
return EXIT_FAILURE; \e
})
typedef struct object {
const char *example;
sd_bus **bus;
sd_event **event;
} object;
static int property_get(
sd_bus *bus,
const char *path,
const char *interface,
const char *property,
sd_bus_message *reply,
void *userdata,
sd_bus_error *error) {
object *o = userdata;
if (strcmp(property, "Example") == 0)
return sd_bus_message_append(reply, "s", o\->example);
return sd_bus_error_setf(error,
SD_BUS_ERROR_UNKNOWN_PROPERTY,
"Unbekannte Eigenschaft »%s«",
property);
}
/* https://www\&.freedesktop\&.org/software/systemd/man/sd_bus_add_object\&.html */
static const sd_bus_vtable vtable[] = {
SD_BUS_VTABLE_START(0),
SD_BUS_PROPERTY(
"Example", "s",
property_get,
0,
SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_VTABLE_END
};
static int setup(object *o);
static int on_disconnect(sd_bus_message *message, void *userdata, sd_bus_error *ret_error) {
check(setup((object *)userdata));
return 0;
}
/* Sicherstellen, dass sich die Ereignisschleife mit einem klaren Fehler beendet, falls das Erlangen des gut bekannten Dienstenamens fehlschlägt */
static int request_name_callback(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
if (!sd_bus_message_is_method_error(m, NULL))
return 1;
const sd_bus_error *error = sd_bus_message_get_error(m);
if (sd_bus_error_has_names(error, SD_BUS_ERROR_TIMEOUT, SD_BUS_ERROR_NO_REPLY))
return 1; /* Der Bus ist nicht verfügbar, später erneut versuchen */
printf("Fehlschlag beim Anfragen des Namens: %s\en", error\->message);
object *o = userdata;
check(sd_event_exit(*o\->event, \-sd_bus_error_get_errno(error)));
return 1;
}
static int setup(object *o) {
/* Falls es eine Neuverbindung ist, muss das Busobjekt geschlossen, abgehängt von
* der Ereignisschleife und neu erstellt werden\&.
* https://www\&.freedesktop\&.org/software/systemd/man/sd_bus_detach_event\&.html
* https://www\&.freedesktop\&.org/software/systemd/man/sd_bus_close_unref\&.html
*/
if (*o\->bus) {
check(sd_bus_detach_event(*o\->bus));
*o\->bus = sd_bus_close_unref(*o\->bus);
}
/* Einrichten eines neuen Busobjekts für den Systembus, dessen Konfiguration, auf die Verfügbarkeit
* des D\-Busses zu warten, statt bei Nichtverfügbarkeit fehlzuschlagen und ihn zu starten\&. Alle
* folgenden Aktionen sind asyncron und blockieren nicht beim Warten auf die Verfügbarkeit des D\-Bus\.
* https://www\&.freedesktop\&.org/software/systemd/man/sd_bus_new\&.html
* https://www\&.freedesktop\&.org/software/systemd/man/sd_bus_set_address\&.html
* https://www\&.freedesktop\&.org/software/systemd/man/sd_bus_set_bus_client\&.html
* https://www\&.freedesktop\&.org/software/systemd/man/sd_bus_negotiate_creds\&.html
* https://www\&.freedesktop\&.org/software/systemd/man/sd_bus_set_watch_bind\&.html
* https://www\&.freedesktop\&.org/software/systemd/man/sd_bus_set_connected_signal\&.html
* https://www\&.freedesktop\&.org/software/systemd/man/sd_bus_start\&.html
*/
check(sd_bus_new(o\->bus));
check(sd_bus_set_address(*o\->bus, "unix:path=/run/dbus/system_bus_socket"));
check(sd_bus_set_bus_client(*o\->bus, 1));
check(sd_bus_negotiate_creds(*o\->bus, 1, SD_BUS_CREDS_UID|SD_BUS_CREDS_EUID|SD_BUS_CREDS_EFFECTIVE_CAPS));
check(sd_bus_set_watch_bind(*o\->bus, 1));
check(sd_bus_start(*o\->bus));
/* Veröffentlicht eine Schnittstelle auf dem Bus unter Angabe des gut bekannte Objektzugriffspfades
und des öffentlichen Schnittstellennamens\&.
* https://www\&.freedesktop\&.org/software/systemd/man/sd_bus_add_object\&.html
* https://dbus\&.freedesktop\&.org/doc/dbus\-tutorial\&.html
*/
check(sd_bus_add_object_vtable(*o\->bus,
NULL,
"/org/freedesktop/ReconnectExample",
"org\&.freedesktop\&.ReconnectExample",
vtable,
o));
/* Standardmäßig ist dem Dienst nur ein flüchtiger Name zugewiesen\&. Der gut bekannte
* wird hinzugefügt, damit Clients ihn für den Aufruf kennen\&. Dies muss asynchron erfolgen
* da der D\-Bus noch nicht verfügbar sein könnte\&. Der Rückruf wird prüfen, ob der Fehler
* erwartet wurde oder nicht, falls er fehlschlägt\&.
* https://www\&.freedesktop\&.org/software/systemd/man/sd_bus_request_name\&.html
*/
check(sd_bus_request_name_async(*o\->bus,
NULL,
"org\&.freedesktop\&.ReconnectExample",
0,
request_name_callback,
o));
/* Wenn der D\-Bus abgetrennt wird, wird dieser Rückruf aufgerufen, der die Verbindung
* erneut einrichtet\&. Dies muss asynchron erfolgen, da der D\-Bus noch nicht verfügbar
* sein könnte\&.
* https://www\&.freedesktop\&.org/software/systemd/man/sd_bus_match_signal_async\&.html
*/
check(sd_bus_match_signal_async(*o\->bus,
NULL,
"org\&.freedesktop\&.DBus\&.Local",
NULL,
"org\&.freedesktop\&.DBus\&.Local",
"Disconnected",
on_disconnect,
NULL,
o));
/* Das Bus\-Objekt an die Ereignisschleife anhängen, so dass Aufrufe und Signale verarbeitet
* werden\&.
* https://www\&.freedesktop\&.org/software/systemd/man/sd_bus_attach_event\&.html
*/
check(sd_bus_attach_event(*o\->bus, *o\->event, 0));
return 0;
}
int main(int argc, char **argv) {
/* Der Bus sollte aufgegeben werden, bevor sich das Programm beendet\&. Die
* Aufräumattribute ermöglichen es, dass dies beim Verlassen des Blocks nett
* und sauber erfolgt\&.
*/
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
object o = {
\&.example = "example",
\&.bus = &bus,
\&.event = &event,
};
/* Erzeugt eine Ereignisschleifen\-Datenstruktur mit Standard\-Parametern\&.
* https://www\&.freedesktop\&.org/software/systemd/man/sd_event_default\&.html
*/
check(sd_event_default(&event));
/* Standardmäßig wird sich die Ereignisschleife beenden, wenn alle Quellen verschwunden
* sind, daher muss sie »belegt« bleiben\&. Dafür wird Signalverarbeitung registriert\&.
* https://www\&.freedesktop\&.org/software/systemd/man/sd_event_add_signal\&.html
*/
check(sd_event_add_signal(event, NULL, SIGINT|SD_EVENT_SIGNAL_PROCMASK, NULL, NULL));
check(sd_event_add_signal(event, NULL, SIGTERM|SD_EVENT_SIGNAL_PROCMASK, NULL, NULL));
check(setup(&o));
/* Eintreten in die Hauptschleife, sie wird nur bei Sigint/Sigterm verlassen\&.
* https://www\&.freedesktop\&.org/software/systemd/man/sd_event_loop\&.html
*/
check(sd_event_loop(event));
/* https://www\&.freedesktop\&.org/software/systemd/man/sd_bus_release_name\&.html */
check(sd_bus_release_name(bus, "org\&.freedesktop\&.ReconnectExample"));
return 0;
}
.fi
.if n \{\
.RE
.\}
.sp
.RE
.PP
Obwohl die Weitergabe von Ressourcen von einem weichen Neustartzyklus zum
nächsten auf diese Art möglich ist, empfehlen wir nachdrücklich, diese
Funktionalität nur restriktiv zu verwenden, da sie zu fragileren Systemen
führt, da Ressourcen von verschiedenen Versionen des Betriebssystems und
Anwendungen mit unvorhergesehenen Konsequenzen gemischt
werden\&. Insbesondere wird empfohlen zu \fIvermeiden\fP, es Prozessen zu
erlauben, die weiche Neustartaktion zu überleben, da dies bedeutet, dass
Code\-Aktualisierungen notwendigerweise unvollständig sind und Prozesse
typischerweise verschiedene andere Ressourcen festhalten (wie das ihnen
zugrundeliegende Dateisystem), wodurch der Speicherverbrauch erhöht wird (da
zwei Versionen des Betriebssystems/der Anwendung/des Dateisystems im
Speicher verbleiben können)\&. Das Weiterlaufen von Prozessen während einer
weichen Neustartaktion benötigt die umfassende Abtrennung des Dienstes vom
Betriebssystem, d\&.h\&. die Minimierung von IPC und die Reduktion der
gemeinsamen Verwendung von Ressourcen mit dem Rest des
Betriebssystems\&. Ein möglicher Mechanismus, dies zu erreichen, ist das
Konzept des \m[blue]\fBPortablen Dienstes\fP\m[]\&\s-2\u[1]\d\s+2\&. Stellen
Sie aber sicher, dass keine Ressource vom Betriebssystem\-Dateisystem des
Hauptsystems mittels \fIBindPaths=\fP oder ähnlichen Unit\-Einstellungen
festgehalten wird\&. Andernfalls verbleibt das alte, ursprüngliche
Dateisystem eingehängt, solange die Unit läuft\&.
.SH ANMERKUNGEN
.PP
Beachten Sie, dass auch die Programme in /usr/lib/systemd/system\-shutdown/
nicht ausgeführt werden, da \fBsystemd\-shutdown\fP(8) nicht ausgeführt wird\&.
.PP
Beachten Sie, dass \fBsystemd\-soft\-reboot\&.service\fP (und zugehörige Units)
niemals direkt ausgeführt werden sollten\&. Lösen Sie stattdessen das
Herunterfahren des Systems mit Befehlen wie »systemctl soft\-reboot« aus\&.
.PP
Falls ein neues Wurzeldateisystem unter »/run/nextroot/« eingerichtet wurde,
beachten Sie, dass ein \fBsoft\-reboot\fP durchgeführt wird, wenn der Befehl
\fBreboot\fP aufgerufen wird\&.
.SH "SIEHE AUCH"
.PP
\fBsystemd\fP(1), \fBsystemctl\fP(1), \fBsystemd.special\fP(7),
\fBsystemd\-poweroff.service\fP(8), \fBsystemd\-suspend.service\fP(8), \fBbootup\fP(7)
.SH ANMERKUNGEN
.IP " 1." 4
Portable Dienste
.RS 4
\%https://systemd.io/PORTABLE_SERVICES
.RE
.PP
.SH ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von
Helge Kreutzmann
erstellt.
.PP
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License Version 3
.UE
oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
.PP
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden,
schicken Sie bitte eine E-Mail an die
.MT debian-l10n-german@lists.debian.org
Mailingliste der Übersetzer
.ME .