BEZEICHNUNG¶
systemd.offline-updates - Implementierung von
Offline-Aktualisierungen in Systemd
OFFLINE SYSTEM-AKTUALISIERUNGEN IMPLEMENTIEREN¶
Diese Handbuchseite beschreibt, wie die »offline«
Systemaktualisierungen mit Systemd realisiert werden. Unter dem Begriff
»offline« Betriebssystemaktualisierungen verstehen wir
Paketinstallationen und -aktualisierungen, die ausgeführt werden,
ohne dass das System in einen besonderen Systemaktualisierungsmodus
gestartet wurde, um Probleme in Bezug auf Konflikte bei Bibliotheken und
Diensten, die derzeit laufen, mit denen auf der Platte zu vermeiden. Dieses
Dokument wurde vom GNOME Design-Whiteboard[1] inspiriert.
Die Logik:
1.Der Paketverwalter bereitet Systemaktualisierungen
vor, indem er alle offline zu aktualisierenden (.rpm- oder .deb- oder was auch
immer) Pakete in ein spezielles Verzeichnis /var/lib/system-update (oder ein
anderes Verzeichnis nach Wahl des Paket-/Upgrade-Verwalters)
herunterlädt.
2.Wenn der Benutzer die Aktualisierung bestätigt
hat, wird der Symlink /system-update, der auf /var/lib/system-update (oder wo
auch immer das Verzeichnis mit den Upgrade-Dateien sich befindet) zeigt,
erstellt, und das System wird neu gestartet. Dieser Symlink ist im
Wurzelverzeichnis, da er sehr früh im Systemstartprozess geprüft
werden muss, zu einem Zeitpunkt, an dem /var/ noch nicht verfügbar
ist.
3.Sehr früh im Systemstartprozess prüft
systemd-system-update-generator(8) ob /system-update existiert. Falls
das der Fall ist, wird (temporär und nur für diesen Systemstart)
default.target auf system-update.target umgelenkt (d.h. ein Symlink angelegt).
Letzteres ist ein besonderes Ziel, das das Basissystem (d.h. sysinit.target,
so dass alle Dateisysteme eingehängt sind, aber nicht viel mehr) und
die Systemaktualisierungs-Units hereinzieht.
4.Das System fährt jetzt fort, in default.target
und damit in system-update.target zu starten. Dieses Ziel zieht alle
Systemaktualisierungs-Units herein. Nur ein Dienst sollte Aktualisierungen
durchführen (siehe den nächsten Punkt) und alle anderen sollten
sich sauber mit einem Rückgabecode »success« und ohne
etwas weiteres durchzuführen beenden. Aktualisierungsdienste sollten
nach sysinit.target angeordnet sein, so dass die Aktualisierung beginnt,
nachdem alle Dateisysteme eingehängt wurden.
5.Im ersten Schritt sollte ein Aktualisierungsdienst
prüfen, ob der Symlink /system-update auf dem vom Aktualisierungsdienst
verwandten Ort zeigt. Falls er nicht existiert oder an einen anderen Ort
zeigt, muss sich der Dienst fehlerfrei beenden. Es ist möglich, dass
mehrere Aktualisierungsdienste installiert sind und mehrere
Aktualisierungsdienste parallel gestartet sind und nur derjenige, der dem
Werkzeug entspricht, das den Symlink vor dem Neustart erstellte, sollte
irgendwelche Aktionen durchführen. Es ist nicht sicher, mehrere
Aktualisierungen parallel durchzuführen.
6.Der Aktualisierungsdienst sollte jetzt seine Aufgabe
erledigen. Falls zutreffend und möglich, sollte er einen
Dateisystemschnappschuss erstellen, dann alle Pakete installieren. Nach dem
Abschluss (unabhängig davon, ob die Aktualisierung gelungen oder
fehlgeschlagen ist) muss die Maschine neu gestartet werden, beispielsweise
durch Aufruf von systemctl reboot. Im Fehlerfall sollte das Skript
zusätzlich auf den alten Dateisystemschnappschuss (ohne den Symlink)
zurückkehren.
7.Das Upgrade-Skript sollte sich nur beenden, wenn die
Aktualisierung abgeschlossen ist. Es wird erwartet, dass der Dienst, der das
Upgrade durchführt, einen Systemneustart auslöst, nachdem er
fertig ist. Falls das system-update.target erfolgreich erreicht wurde, d.h.
alle Aktualisierungsdienste ausgeführt wurden und der Symlink
/system-update immer noch existiert, wird dieser entfernt und als
Sicherheitsmaßnahme die Maschine neu gestartet.
8.Nach einem Neustart, nun dass der Symlink
/system-update verschwunden ist, wird der Generator default.target nicht mehr
umleiten und das System nun wieder in das Standardziel starten.
EMPFEHLUNGEN¶
1.Um für mehr Robustheit zu sorgen, empfehlen
wir, das Aktualisierungsskript mittels eines Symlinks .wants/ in dem
Distributionspaket in system-update.target einzuhängen, statt in
Postinst-Skriptstücken im Paket von systemctl enable
abzuhängen. Für Ihre Aktualisierungsskripte sollten Sie
konkreter eine Datei .service ohne Abschnitt »[Install]«
erstellen und dann einen Symlink der Art
/lib/systemd/system/system-update.target.wants/foobar.service →
../foobar.service zu Ihrem Paket hinzufügen.
2.Stellen Sie sicher, dass der Symlink /system-update in
Ihrem Aktualisierungsskript so früh wie möglich entfernt wird,
um im Fehlerfall Neustartschleifen zu vermeiden.
3.Verwenden Sie
FailureAction=reboot in der
Dienstedatei Ihres Aktualisierungsskriptes, um sicherzustellen, dass
automatisch ein Neustart ausgelöst wird, falls die Aktualisierung
fehlschlägt.
FailureAction= stellt sicher, dass die festgelegte
Unit aktiviert ist, falls Ihr Skript sich unsauber beendet (mit einem von Null
verschiedenen Fehler-Code oder einem Signal/Speicherauszug). Falls Ihr Skript
sich erfolgreich beendet, sollten Sie den Systemneustart in Ihrem Code
auslösen, beispielsweise durch den Aufruf
Reboot() von logind
oder dem Aufruf von
systemctl reboot. Siehe
org.freedesktop.login1(5) für Details über das
Logind-D-Bus-API.
4.Der Aktualisierungsdienst sollte
DefaultDependencies=no, Requires=sysinit.target,
After=sysinit.target, After=system-update-pre.target,
Before=system-update.target und explizit alle benötigten Dienste
hereinziehen.
5.Es kann wünschenswert sein, immer eine
Hilfs-Unit beim Starten in den offline-updates-Modus zu betreiben, die selbst
keine Aktualisierungen installiert. Um dies zu erledigen, erstellen Sie eine
.service-Datei mit Wants=system-update-pre.target und
Before=system-update-pre.target und fügen Sie einen Symlink auf
diese Datei unter /lib/systemd/system-update.target.wants hinzu..
ANMERKUNGEN¶
- 1.
- GNOME Design-Whiteboard
ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von
Helge Kreutzmann <debian@helgefjell.de> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU General
Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite
finden, schicken Sie bitte eine E-Mail an die
Mailingliste
der Übersetzer.