SYSTEMD.OFFLINE-UPDATES(7) systemd.offline-updates SYSTEMD.OFFLINE-UPDATES(7) 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 ausgefuhrt 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) herunterladt. 2. Wenn der Benutzer die Aktualisierung bestatigt hat, wird der Symlink /system-update oder /etc/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 fruh im Systemstartprozess gepruft werden muss, zu einem Zeitpunkt, an dem /var/ noch nicht verfugbar ist. 3. Sehr fruh im Systemstartprozess pruft systemd-system-update-generator(8) ob /system-update oder /etc/system-update existiert. Falls das der Fall ist, wird (temporar und nur fur 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 eingehangt sind, aber nicht viel mehr) und die Systemaktualisierungs-Units hereinzieht. 4. Das System fahrt 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 durchfuhren (siehe den nachsten Punkt) und alle anderen sollten sich sauber mit einem Ruckgabecode >>success<< und ohne etwas weiteres durchzufuhren beenden. Aktualisierungsdienste sollten nach sysinit.target angeordnet sein, so dass die Aktualisierung beginnt, nachdem alle Dateisysteme eingehangt wurden. 5. Im ersten Schritt sollte ein Aktualisierungsdienst prufen, ob der Symlink /system-update oder /etc/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 moglich, 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 durchfuhren. Es ist nicht sicher, mehrere Aktualisierungen parallel durchzufuhren. 6. Der Aktualisierungsdienst sollte jetzt seine Aufgabe erledigen. Falls zutreffend und moglich, sollte er einen Dateisystemschnappschuss erstellen, dann alle Pakete installieren. Nach dem Abschluss (unabhangig 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 zusatzlich auf den alten Dateisystemschnappschuss (ohne den Symlink) zuruckkehren. 7. Das Upgrade-Skript sollte sich nur beenden, wenn die Aktualisierung abgeschlossen ist. Es wird erwartet, dass der Dienst, der das Upgrade durchfuhrt, einen Systemneustart auslost, nachdem er fertig ist. Falls das system-update.target erfolgreich erreicht wurde, d.h. alle Aktualisierungsdienste ausgefuhrt wurden und der Symlink /system-update oder /etc/system-update immer noch existiert, wird dieser entfernt und als Sicherheitsmassnahme die Maschine neu gestartet. 8. Nach einem Neustart, nun dass der Symlink /system-update und /etc/system-update verschwunden ist, wird der Generator default.target nicht mehr umleiten und das System nun wieder in das Standardziel starten. EMPFEHLUNGEN 1. Um fur mehr Robustheit zu sorgen, empfehlen wir, das Aktualisierungsskript mittels eines Symlinks .wants/ in dem Distributionspaket in system-update.target einzuhangen, statt in Postinst-Skriptstucken im Paket von systemctl enable abzuhangen. Fur Ihre Aktualisierungsskripte sollten Sie konkreter eine Datei .service ohne Abschnitt >>[Install]<< erstellen und dann einen Symlink der Art /usr/lib/systemd/system/system-update.target.wants/foobar.service -> ../foobar.service zu Ihrem Paket hinzufugen. 2. Stellen Sie sicher, dass der Symlink /system-update und /etc/system-update in Ihrem Aktualisierungsskript so fruh wie moglich entfernt wird, um im Fehlerfall Neustartschleifen zu vermeiden. 3. Verwenden Sie FailureAction=reboot in der Dienstedatei Ihres Aktualisierungsskriptes, um sicherzustellen, dass automatisch ein Neustart ausgelost wird, falls die Aktualisierung fehlschlagt. 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 auslosen, beispielsweise durch den Aufruf Reboot() von logind oder dem Aufruf von systemctl reboot. Siehe org.freedesktop.login1(5) fur Details uber 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 benotigten Dienste hereinziehen. 5. Es kann wunschenswert 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 fugen Sie einen Symlink auf diese Datei unter /usr/lib/systemd/system-update.target.wants hinzu.. SIEHE AUCH systemd(1), systemd.generator(7), systemd-system-update-generator(8), dnf.plugin.system-upgrade(8) ANMERKUNGEN 1. GNOME Design-Whiteboard https://wiki.gnome.org/Design/OS/SoftwareUpdates UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . systemd 255 SYSTEMD.OFFLINE-UPDATES(7)