Offline Installationen mit Linux

Bei Produktinstallationen für Kunden melden diese oft:

Wir haben ein XYZ Linux Version 9.8.7 ohne Internetanbindung. Senden Sie uns alle notwendigen Installationspakete zu.

Und dann fängt das große Weinen an, wenn man bei Python3 angefangen eine halbe Linux-Distribution “nachliefern” soll.


Windows stammt aus der Offline-Zeit weshalb alles als einzelne Installationsdatei (.msi, .msu, .cab und andere) ausgeliefert werden kann. Heute ist das ein unguter Fluch, weil man die Fülle an Dateifragmenten nicht mehr verwaltet bekommt und erst seit kurzem wird versucht mit winget verspätet ins 21. Jahrhundert zu wechseln.

Linux Distributionen hatten früh erkannt, wie wichtig ein einheitliches Paket-Management ist und nutzten es. Allerdings spalteten sich schnell verfeindete Sekten ab und gründeten ihre eigene Paket-Religion.

Im Embedded-Bereich schmerzt das sehr, wenn man neben dem eigenen Produkt auch noch auf viele Geschmacksrichtungen von Linux-Varianten eingehen muss, denn dort ist ein System “offline” und stets veraltet für 10 Jahre in Betrieb.

Wenn wir Entwickler also ein tolles Feature implementieren, das auf der lib_superduper aufbaut, müssen wir dann auch einen Weg finden, wie diese fehlende lib_superduper beim Kunden integriert wird.

Aber wie findet man jetzt heraus, welche Pakete sonst noch fehlen, und wo kann man die dann herunterladen?

Debian (Kali, Ubuntu, Raspbian)

Wir brauchen also eine Liste der fehlenden .deb Dateien, die apt für uns herunterladen und dann installieren würde.

Folgender Trick hat da bei mir funktioniert:

  • Eine VM (oder ein Docker Container) wird so aufgesetzt wie das Zielsystem.
  • Man löscht die Inhalte von Verzeichnis /var/cache/apt/archives.
  • Anschließend startet man sudo apt install --download-only PACKNAME.
  • Und schon liegen alle notwendigen .deb Dateien in /var/cache/apt/archives

Von dort kopiert man sie dann zum Zielsystem und führt folgendes Kommando aus:
sudo dpkg -i *.deb, welches die .deb Dateien installiert. Nachdem die Reihenfolge der Installation nicht definiert ist, kann es aber auch zu Problemen oder Scriptfehler kommen, die man dann mit
sudo apt-get install --fix-broken wieder hinbekommen kann.

RedHat, Alma, CentOS

Distributionen, die mit dem dnf Tool ihre .rpm Pakete verwalten, benötigen das Kommando:
dnf download PACKNAME --resolve
und schon liegen alle korrekt aufgelösten Abhängigkeiten als .rpm Dateien im aktuellen Verzeichnis.

Installieren kann man die Softwarepakete aus dem Verzeichnis dann mit
sudo rpm -ihv *.rpm

Fazit

Ich als Entwickler brauche immer wieder mal einen gdb auf einer Zielmaschine. Und wenn ich weiß, dass mein Kunde eine Debian 9 oder Alma 8 Variante im Einsatz hat, dann kann ich bei mir lokal genau die Bibliotheken vorbereiten und dann per SSH installieren, die zur Distribution passen.

Schwerer haben es da meine Dev-Ops Kollegen, die Datenbanken, Monitoring-Tools und Deployment-Werkzeuge auf unterschiedliche Kundenhardware verteilen müssen.

Zumindest gibt es für die gängigen Linux Varianten Hilfsmittel um solche Offline-Updates vorzubereiten.

Mein gutes (Update-) Werk ist für heute getan und somit kann ich beruhigt auf der Konsole exit eintippen.