ADMIN

2023

03

2023-02-28T12:00:00

Hybrid Cloud

PRAXIS

042

Patch-Management

Linux

Linux mit TopGrade updaten

Schneller Neuanstrich

von Tam Hanna

Veröffentlicht in Ausgabe 03/2023 - PRAXIS

Moderne Linux-Systeme bestehen aus Paketen, die aus verschiedenen Quellen stammen. Ein Upgrade-Befehl an den Paketmanager der Distribution reicht oft nicht aus, um umfassende Aktualität sicherzustellen. Mit TopGrade steht ein Werkzeug zur Verfügung, das unter Linux für ein frisches System sorgt. Wir zeigen, wie Sie das Tool kompilieren, einsetzen und – wenn auch leicht eingeschränkt – sogar unter Windows nutzen.

Das manuelle Erzeugen eines Updateskripts, das die verschiedenen Paketmanager aufruft und zur Aktualisierung der verwalteten Pakete auffordert, ist in der Praxis nicht sehr ergiebig. Erstens entsteht durch das Skript zusätzliche Arbeit, zweitens muss der Administrator den Änderungen im Verhalten der diversen Paketmanager "hinterherprogrammieren". TopGrade erledigt Aktualisierungen automatisiert und deckt dabei alle verbreiteten Paketmanager gleichermaßen ab.
TopGrade basiert auf Rust
TopGrade ist eine in der Programmiersprache Rust gehaltene Anwendung, die auf Zuruf verschiedene Paketmanager zur Aktualisierung aller von ihnen verwalteten Pakete auffordert. Das einst von Mozilla initiierte Rust ist eine systemnahe Sprache, die ein formal verifiziertes Typsystem aufweist. Das bedeutet, dass sich Speicherlecks im Regelfall schon während der Kompilation erkennen lassen.
Im unter [1] bereitstehenden Wiki findet sich eine Liste der angesprochenen Paketverwaltungen - neben der Aktivierung des zum jeweiligen Linux-System gehörenden Paketmanagers kümmert sich TopGrade um Docker-Container, Python-Pakete und sogar die .NET-Laufzeitumgebung.
Das manuelle Erzeugen eines Updateskripts, das die verschiedenen Paketmanager aufruft und zur Aktualisierung der verwalteten Pakete auffordert, ist in der Praxis nicht sehr ergiebig. Erstens entsteht durch das Skript zusätzliche Arbeit, zweitens muss der Administrator den Änderungen im Verhalten der diversen Paketmanager "hinterherprogrammieren". TopGrade erledigt Aktualisierungen automatisiert und deckt dabei alle verbreiteten Paketmanager gleichermaßen ab.
TopGrade basiert auf Rust
TopGrade ist eine in der Programmiersprache Rust gehaltene Anwendung, die auf Zuruf verschiedene Paketmanager zur Aktualisierung aller von ihnen verwalteten Pakete auffordert. Das einst von Mozilla initiierte Rust ist eine systemnahe Sprache, die ein formal verifiziertes Typsystem aufweist. Das bedeutet, dass sich Speicherlecks im Regelfall schon während der Kompilation erkennen lassen.
Im unter [1] bereitstehenden Wiki findet sich eine Liste der angesprochenen Paketverwaltungen - neben der Aktivierung des zum jeweiligen Linux-System gehörenden Paketmanagers kümmert sich TopGrade um Docker-Container, Python-Pakete und sogar die .NET-Laufzeitumgebung.
Sofern Sie TopGrade aus einem Paket-Repository beziehen, aktualisiert sich das Werkzeug bei Bedarf selbst. Die Nutzung dieser Funktion ist derzeit allerdings nur eingeschränkt empfehlenswert, weil die Wartung des Projekts aktuell eher stockt. Es wäre theoretisch möglich, dass Hacker die Paket-Repositories mit einem mit einer Backdoor ausgestatteten Kompilat angreifen. Es ist deshalb besser, das Tool von Hand aus dem Quellcode zu kompilieren.
Kompilation unter Ubuntu
In den folgenden Schritten dient eine unter Ubuntu 22.04 LTS betriebene virtuelle Maschine als Basis. Da TopGrade in Rust gehalten ist, ist zunächst das Herunterladen des Compilers erforderlich. Rust selbst ist zwar seit einiger Zeit Teil des Linux-Kernel-Quellcodes, die diesbezüglichen Werkzeuge sind allerdings nicht von Haus aus in jeder Linux-Installation enthalten. Für die Installation von Rust steht unter [2] ein Befehlsgenerator zur Verfügung. Er erkennt das Betriebssystem des Hostsystems und aktualisiert dann den ausgegebenen Kommandozeilenbefehl. Unter Ubuntu erfolgt die Installation durch ein per curl herunterzuladendes Skript:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Die vom Rust-Installationsprogramm angebotenen Standardeinstellungen aktivieren Sie durch Drücken der Taste "1". Diese Settings sind für unsere weiteren Schritte ausreichend.
Nun laden Sie den TopGrade-Quellcode aus dem GitHub-Repository herunter. Das Repositorium, das ursprünglich als Aufenthaltsort des Codes diente, ist vom Autor seit einiger Zeit als "deprecated" markiert. Unter [3] gibt es jedoch eine von der Community getragene Weiterentwicklung, die wir in den folgenden Schritten heranziehen. Der Download des Quellcodes erfolgt zunächst mit dem zum Versionskontrollsystem git gehörenden Kommandozeilenwerkzeug:
git clone https://github.com/topgrade-rs/topgrade.git
Nach dem Herunterladen des Quellcodes nutzt das Tool das Rust-eigene Buildsystem crate zur Kompilation. Mozilla stattete die hauseigene Programmiersprache einst mit einem an make erinnernden Werkzeug aus, das die Kompilation komplexen Codes automatisiert – das Utility hört auf den Namen "cargo". Grund für den Namen ist, dass Rust-Entwickler Bibliotheken als "crate" bezeichnen – die Auslieferung von Kisten wiederum erfolgt per Fracht – cargo.
Da Rust im Hintergrund den Linux-Standard-Compiler GCC verwendet, müssen wir auf einem frischen System vor den Aufruf von cargo GCC herunterladen und installieren:
sudo apt-get install gcc
Rust-Projekte bringen eine Abhängigkeitsverwaltung mit, die Entwicklern das Erzeugen von Beziehungen zu Drittanbieterbibliotheken ermöglicht. Nutzer des Quellcodes können diese mit einem Kommandozeilenbefehl aus dem Internet downloaden, was die Kompilation erleichtert. Die erstmalige Kompilation setzt das Herunterladen dieser Bibliotheken aus den Paketquellen voraus. Die Bandbreite ist nicht uneingeschränkt, weshalb etwas Wartezeit erforderlich ist:
cd topgrade/
 
cargo install --path
Läuft die Kompilation des Quellcodes erfolgreich durch, installiert cargo TopGrade in den Paketquellen der Maschine. Dies lässt sich durch die Eingabe von which topgrade überprüfen.
Möchten Sie Ihre Version nicht von Hand kompilieren, so findet sich auf GitHub unter [4] eine Gruppe von fertigen Paketen mit Binärdateien. Diese lassen sich herunterladen und wie jede andere Applikation durch Kopieren an den korrekten bin-Pfad zur Ausführung aus der Kommandozeile freigeben.
Bild 1: Trotz Stillstands seitens des Entwicklers pflegt die Community das TopGrade-Repositorium weiter.
Aktualisierung des lokalen Systems
Nach der Installation des Kommandozeilenwerkzeugs ist TopGrade zur Durchführung einer lokalen Aktualisierung der Maschine bereit. Ein parameterloser Aufruf mittels topgrade weist das Werkzeug zur Suche nach allen aktualisierbaren Paketen an. Von Haus aus arbeitet das Tool interaktiv. Weist die Maschine beispielsweise veraltete Pakete auf, die apt-get aktualisiert, so erscheint eine entsprechende Eingabeaufforderung.
TopGrade überprüft die erfolgreiche Ausführung der Kommandos permanent. Wer "n" drückt und die Zustimmung zur Aktualisierung verweigert, bekommt vom Werkzeug einen Hinweis angezeigt, dass der Updatevorgang fehlgeschlagen ist. Die Software blendet diese Information nicht nur im Kommandozeilenfenster ein, sondern nutzt notify-send, um ein Desktop-Popup zu erzeugen. Dies lässt sich jedoch deaktivieren. Der Aufruf topgrade --skip-notify weist das Programm dazu an, sich auf die Ausgabe von Statusinformationen in der Kommandozeile zu beschränken und keine Desktop-Ereignisse zu produzieren.
Das Werkzeug führt im Rahmen der Aktualisierung Prozesse durch, die das Vorhandensein zusätzlicher Utilities oder den Zugriff auf das UEFI-BIOS voraussetzen. TopGrade informiert dabei über das Fehlen von Hardwarekomponenten und über Softwaremodule, die vor dem erfolgreichen Durchlaufen installiert sein müssen. Nach dem Durchlauf informiert das Tool über Erfolg und Misserfolg.
Obwohl sich die Kommandozeilenausgabe von TopGrade umfangreich zeigt, sind manchmal mehr Informationen erforderlich. Im verbose-Modus liefert das Werkzeug mit dem Aufruf von topgrade -v mehr Details zu den durchgeführten Operationen. Zwecks einfacherer Analysierbarkeit der Ausgabe werden die Statuszeilen mit an das Android-Berichterstattungsprogramm LogCat erinnernden Tags qualifiziert. Diese lassen sich per grep oder mit anderen Kommandozeilenwerkzeugen filtrieren.
Nicht ausführbare Module überspringt das Programm während seiner Ausführung. Der Kommandozeilenparameter "--show-skipped" weist TopGrade dazu an, die Ursache für das Überspringen der Module während ihrer Ausführung genau auszugeben.
Am Ende des Durchlaufs erscheint dann noch eine Liste aller übersprungenen Module samt der Ursache für den jeweiligen Fehlschlag:
topgrade --show-skipped
 
distrobox: SKIPPED: Cannot find "distrobox" in PATH
pihole: SKIPPED: Cannot find "pihole" in PATH
Firmware upgrades: OK
Mit Parametern anpassen
Bei direktem Aufruf ohne weitere Parameter führt TopGrade eine Aktualisierung aller ihm bekannten Komponenten durch. Dies ist nicht immer wünschenswert – auf einem System ohne Python-Runtime lässt sich etwa durch Überspringen der Python-bezogenen Tasks Rechenzeit einsparen.
Zur Aktualisierung einer einzelnen Paketquelle dient der Kommandozeilenparameter "--only", dem Sie den Namen eines TopGrade-Moduls übergeben:
topgrade --only dotnet
Die Parametrierung weist eine Aktualisierung des .NET-Frameworks und der diversen dazugehörigen Komponenten und Bibliotheken an. TopGrade erlaubt außerdem die Aktualisierung mehrerer Komponenten. In diesem Fall sind die einzelnen Modulnamen durch Leerzeichen zu trennen:
topgrade --only pip3 dotnet
Die Ermittlung der Modulnamen erfolgt idealerweise über den Befehl topgrade –help. Die Liste an Modulen bleibt während der Lebensdauer einer TopGrade-Installation konstant.
Einzelne nicht benötigte Module lassen sich durch Übergabe des Kommandozeilenparameters "--disable" deaktivieren. Möchten wir auf die Aktualisierung des snap-Paketsystems verzichten, sieht der Aufruf folgendermaßen aus:
topgrade --disable snap
TopGrade kann die Nachfragen der diversen Paketmanager mit topgrade --yes automatisch bejahen. Der Parameter lässt sich dabei durch Übergeben einer Qualifikation einschränken, um nur bestimmten Operationen automatisch zuzustimmen.
Der folgende Aufruf würde nur jene Anfragen beantworten, die von der PowerShell ausgehen:
topgrade --yes powershell
Bild 2: Ein erster Testlauf von TopGrade unter Windows verläuft erfolgreich.
TopGrade unbeaufsichtigt nutzen
Die Zentralisierung mehrerer Kommandozeilenbefehle in TopGrade spart Tipparbeit. Angesichts der Möglichkeit zur gezielten Konfiguration ist das Werkzeug zur Nutzung in Cron-Jobs und ähnlichen automatisierten Aufgaben prädestiniert. Problematisch ist jedoch das Übergeben langer Parameter-Listen – schöner wäre es, stammten die diversen Settings zentralisiert aus einer Einstellungsdatei.
Ein unparametrierter Lauf des Kommandozeilenprogramms greift auf die Standard-Einstellungsdatei zurück, die unter Linux normalerweise im Pfad "<XDG_ CONFIG_HOME:-~/.config>/topgrade. toml" liegt. Unter Windows – dazu gleich noch mehr – findet sich die Datei unter "%APPDATA%/topgrade.toml", deren Format "Toms Obvious Minimal Language" ist unter [5] dokumentiert.
Ein schneller Weg zu ihrer Bearbeitung ist der Edit-Befehl. Geben Sie das nachfolgende Kommando ein, öffnet sich die Konfigurationsdatei im Linux-Standardeditor vi:
topgrade --edit-config
TopGrade bietet von Haus aus eine komplette Konfigurationsdatei an, die fast alle einstellbaren Optionen zeigt. Die meisten sind – siehe die folgende Sequenz – durch Voranstellen des #-Symbols deaktiviert:
# Don't ask for confirmations
# assume_yes = true
 
# Disable specific steps - same options as the command line flag
# disable = ["system", "emacs"]
 
# Ignore failures for these steps
# ignore_failures = ["powershell"]
Möchten wir eine der Optionen nutzen, so müssen wir diese im ersten Schritt durch Entfernen des Kommentarsymbols als aktiv markieren.
TopGrade-Sessions nehmen mitunter einige Zeit in Anspruch. Verbindungsabbrüche während der Aktualisierung kritischer Pakete können zu nicht mehr ausführbaren Systemen führen. Um hier vorzubeugen, können Sie den Aktualisierungslauf mittels topgrade --tmux in einer tmux-Sitzung ausführen. Darin lässt sich im Fall eines Verbindungsabbruchs die Verbindung wiederherstellen. tmux gehört heute leider nicht mehr zur Standardausstattung von Linux-Distributionen. Sie müssen es deshalb erst mit sudo apt-get install tmux aufspielen.
Systembereinigung mit TopGrade
Paketmanager legen im Rahmen ihrer täglichen Arbeit verschiedene Caches an, die meist nicht mehr benötigt werden. Das manuelle Aufräumen der Speicher ist arbeitsintensiv – aber gerade im Fall von Backup in die Cloud gilt, dass eine Reduktion der Datenmenge Kosten einspart. TopGrade bietet deshalb einen Bereinigungsmodus an, der den Großteil der verwalteten Module mithilfe des Befehls topgrade --cleanup zur Beseitigung von nicht mehr benötigten Dateien animiert.
TopGrade bereinigt von Haus aus auch die Docker-Ausführungsumgebung. Das ist einerseits hilfreich, denn Container-Images können mehrere GByte an Speicher belegen. Problematisch ist diese Option aber insofern, als dass das Werkzeug der Ausführung auf einer Maschine ohne Docker-Runtime Probleme bekommt. Docker wirft dann eine Fehlermeldung aus, die Sie manuell quittieren müssen.
Zur Umgehung des Problems bietet es sich an, docker vom Bereinigungsprozess auszunehmen. Der cleanup-Modus beachtet die weiter oben vorgestellten Kommandozeilenoptionen. Problematisch ist, dass die Deaktivierung von docker nicht einfach durch Übergabe der Parameter "--cleanup --disable docker" erfolgt. Vielmehr hat das Entwicklerteam die verschiedenen Container-Runtimes im Modul "containers" zusammengefasst, das Sie folgendermaßen deaktivieren:
topgrade --cleanup --disable containers
TopGrade unter Windows
Spätestens seit der Verfügbarkeit des Windows-Subsystems für Linux (WSL) gilt, dass sich Windows grundsätzlich als Zielsystem für unixoide Produkte wie Python-Bibliotheken eignet. Die meisten Linux-Systemwerkzeuge stehen unter Windows aber nur eingeschränkt zur Verfügung – das TopGrade-Entwicklerteam hingegen verspricht in der Dokumentation explizit Unterstützung für Windows.
Als letzte Workshopvariante wollen wir deshalb auf eine unter Windows 10 21H2 arbeitende VM zurückgreifen. Laden Sie die Datei "topgrade-v10.1.2-x86_64-pc-windows-msvc.zip" von der Release-Seite auf GitHub herunter, um den Aufwand für die manuelle Kompilation einzusparen. Extrahieren Sie das Paket danach an eine bequem zugängliche Stelle im Dateisystem. Die eigentliche Ausführung erfolgt dann wie erwartet. Bild 2 zeigt, dass TopGrade dazu in der Lage ist, Windows Update zum Herunterladen von Aktualisierungen des Betriebssystems zu animieren. Gegenüber Linux ist aber eine Besonderheit zu beachten: Das Werkzeug ist nicht in der Lage, sich selbst oder die für seine Ausführung verantwortliche Applikation zu aktualisieren. In der Praxis ist es außerdem empfehlenswert, das Programm immer mit Administratorrechten auszuführen.
Fazit
TopGrade ermöglicht Administratoren unixoider Systeme die zentralisierte Aktualisierung der auf der Maschine befindlichen Software. Aufrufe der verschiedenen Paketmanager – beispielsweise pip für Python-Bibliotheken – entfallen, an ihre Stelle tritt ein einzelner Kommandozeilenbefehl. Das Tool ist unter dem Strich ein zeitsparendes Werkzeug, denn der Aufwand für die Kompilation sollte sich schon nach wenigen automatisierten Aktualisierungen gelohnt haben.
(ln)
Link-Codes
[1] TopGrade im Zusammenspiel mit Paketverwaltungen: https://github.com/r-darwish/topgrade/wiki/Step-list
[2] Rust-Installer rustup: https://rustup.rs/
[3] Aktueller TopGrade-Code: https://github.com/topgrade-rs/topgrade/
[5] Dokumentation des Dateiformats TOML: https://toml.io/en/