41.3. Werkzeuge

41.3.1. Offline-Verwaltung mit apt-get und wget

In diesem Szenario kombinieren wir die Werkzeuge apt-get, awk und wget miteinander. Diese wunderbare Idee und Beschreibung ist entlehnt aus Frank Ronneburgs Debian-Anwenderhandbuch [Debian-Anwenderhandbuch-apt-offline] sowie dem Beitrag von Samuel Suter [Suter-apt-offline], hier jedoch nur für ausgewählte Pakete.

awk ist ein Analyse- und Filterprogramm für Textdaten [Debian-Paket-gawk]. Mit wget beziehen Sie hingegen Dateien über das Netzwerk [Debian-Paket-wget] auf der Basis von HTTP, HTTPS und FTP. Während awk zu den essentiellen Programmen zählt, ist wget optional und daher ihrerseits vor dessen Verwendung noch zu installieren, falls es noch nicht auf ihrem System vorhanden ist.

Benötigt wird ein Rechner ohne Internetzugang (genannt rechner-offline) und ein Rechner mit Internetzugang (nachfolgend rechner-online genannt). Beide Rechner verfügen über den gleichen Paketbestand.

Auf rechner-online ist im Verzeichnis /usbplatte ein externer, mobiler Datenträger eingebunden, um darauf die Anweisungen zum nachfolgenden Bezug der Pakete und die Pakete selbst zu speichern. Diese spielen Sie dann auf rechner-offline ein. Der Ablauf zum Bezug der Pakete umfasst zunächst die nachfolgenden Schritte und beginnt auf rechner-online:

  1. Aktualisieren der lokalen Paketdatenbank mittels apt-get update oder apt update
  2. Erzeugen der URLs zum Bezug der aktualisierten Pakete mittels apt-get. Umleitung der Ausgabe von apt-get in die lokale Datei uris
  3. Generieren der passenden wget-Aufrufe aus den zuvor gespeicherten URLs mittels awk. Die Ausgabe von awk leiten Sie in die Datei /usbplatte/wget-script um.
  4. Ausführung der Skriptdatei wget-script zum Bezug der bezeichneten Pakete vom Paketmirror. Damit speichern Sie die bezogenen Pakete auf dem eingebundenen, mobilen Datenträger.

Hier sehen Sie alle Anweisungen auf der Basis von apt-get. Der Schalter -qq von apt-get ist die verschärfte Form von -q (Langform: --quiet) und sorgt dafür, dass apt-get eine „vollkommen stille“ Ausgabe erzeugt, die für unsere Automatisierung geeignet ist. Der Schalter --print-uris gibt die URLs aus, mit deren Hilfe wget die Pakete herunterladen kann.

Aufrufreihenfolge mittels apt-get, awk und wget

# apt-get update
# apt-get -qq --print-uris upgrade > uris
# awk '{print "wget -O " $2 " " $1}' < uris > /usbplatte/wget-script
# cd /usbplatte
# sh -x ./wget-script

Die Datei uris enthält Einträge in folgender Form, hier beispielhaft für ImageMagick und GCC 4.9, die von einem Freexian-Mirror für eine LTS-Version bezogen werden. In der ersten Spalte befindet sich die URL, danach folgt der Name der Paketdatei und die MD5-Summe zum Paket.

URLs von bezogenen Paketen. 

'http://deb.freexian.com/extended-lts/pool/main/i/imagemagick/libmagickcore-6.q16-2-extra_6.8.9.9-5+deb8u26_amd64.deb' libmagickcore-6.q16-2-extra_8%3a6.8.9.9-5+deb8u26_amd64.deb 177540 MD5Sum:8757d67ecdb5da92129e13e9b46fdc1f
'http://deb.freexian.com/extended-lts/pool/main/l/linux/linux-compiler-gcc-4.9-x86_3.16.84-1_amd64.deb' linux-compiler-gcc-4.9-x86_3.16.84-1_amd64.deb 463996 MD5Sum:21bd9aea54e20e0bfefa0cf993c270a2

Das Skript für wget enthält dann Aufrufe in folgender Form:

Pakete per wget beziehen. 

wget -O libmagickcore-6.q16-2_8%3a6.8.9.9-5+deb8u26_amd64.deb 'http://deb.freexian.com/extended-lts/pool/main/i/imagemagick/libmagickcore-6.q16-2_6.8.9.9-5+deb8u26_amd64.deb'
wget -O linux-compiler-gcc-4.9-x86_3.16.84-1_amd64.deb 'http://deb.freexian.com/extended-lts/pool/main/l/linux/linux-compiler-gcc-4.9-x86_3.16.84-1_amd64.deb'

Rufen Sie das Skript auf, holt wget ein Paket nach dem anderen von der angegebenen URL. Als Ergebnis dieser Aufrufe finden Sie auf dem mobilen Datenträger alle deb-Pakete, die zur Aktualisierung mittels apt-get upgrade erforderlich sind. Hängen Sie nun den mobilen Datenträger auf rechner-online aus und binden Sie diesen nun auf rechner-offline ein.

Nun spielen Sie die zuvor bezogenen Pakete ein. Dabei hilft Ihnen der Aufruf apt-get upgrade mit dem Paketcache auf dem mobilen Datenträger. Damit apt-get diesen Paketcache auch verwendet, benötigt es noch einen Hinweis von Ihnen. Ins Spiel kommt der Schalter -o mit der APT-Direktive dir::cache::archives und dem passenden Pfad zum Paketcache. Hier heißt dieser beispielhaft /usbplatte.

Eine Aktualisierung mit einem externen Paketcache. 

# apt-get -o dir::cache::archives="/usbplatte/" upgrade

Ab jetzt verfügt der Rechner ohne Internetzugang wieder über einen aktuellen Paketbestand.

41.3.2. Das Projekt apt-offline

Projektidee

Nicht immer hängt ein Computer am Netzwerk und hat Zugang zu dem hinterlegten Paketmirror. Das Projekt apt-offline (Projektseite [apt-offline-Projektseite]) baut Ihnen eine Brücke, um mit Hilfe eines anderen Rechners Änderungen am Paketbestand möglich zu machen. Es steht in Form der beiden Pakete apt-offline [Debian-Paket-apt-offline] für die Kommandozeile und apt-offline-gui [Debian-Paket-apt-offline-gui] mit graphischer Bedienoberfläche zur Verfügung. Beide Pakete setzen auf der Programmiersprache Python auf. Seit der Version 11 Bullseye sind die beiden Pakete fester Bestandteil der stabilen Veröffentlichung.

Die Idee hinter apt-offline ist das Erzeugen einer Beschreibungsdatei mit allen Informationen für die Abfrage der Paketdatenbank. Damit weiß der Paketmirror, welche Pakete er bereitstellen muß. Diese bezogenen Pakete übertragen Sie auf das eigentliche System — bspw. mit einem USB-Stick oder einer externen Festplatte — und spielen diese wie gewohnt über die Paketverwaltung ein. Wie das genau funktioniert, erklären wir Ihnen gleich. Als Basis dafür benutzten wir eine Reihe von Anleitungen zum Thema Offline Package Management for APT (siehe [Ritesh-apt-offline], [xubuntu-apt-offline] und [Damienoh-apt-offline])

Benutzung im Detail

In Schritt 1 erzeugen Sie eine Signatur für die Maschine, die aktualisierte Paketinformationen und die Pakete bekommen soll. Das erfolgt auf der Maschine, die offline ist. Dazu benutzen Sie das nachfolgende Kommando mittelt apt-offline. Der verwendete Schalter set erzeugt die Signaturdatei, welchen Sie im Aufruf nach dem Schalter benennen. Bezüglich des Dateinamens gibt keine Vorgabe — hier haben wir beispielhaft die Datei /tmp/apt-offline.sig gewählt.

# apt-offline set /tmp/apt-offline.sig

Alternativ kennt apt-offline noch die folgenden Schalter für andere Aktionen:

--bug-reports
hole auch die Bugreports für die Pakete
--bundle
erzeuge ein Archiv mit allen benötigten Paketen
get
beziehe die Paketinformationen
--install-packages
installiere das Paket
--threads
Anzahl paralleler Threads, die bei der Ausführung benutzt werden sollen
--update
nur Updates (Einspielen aktualisierter, fehlerbereinigter Pakete mit der gleichen Versionsnummer)
--upgrade
nur Upgrades (Einspielen aktualisierter, fehlerbereinigter Pakete mit einer neueren Version)
ohne Optionen
alles auf den allerneuesten Stand bringen (entspricht einem dist-upgrade)

Das folgende Beispiel zeigt, wie Sie die Paketinformationen für die offline-Maschine holen, die auch Bugreports enthält. Die Ausführung erfolgt über 5 parallele Threads. Diese Kommando führen Sie als Schritt 2 noch auf der Maschine aus, die nicht über eine Netzanbindung verfügt.

# apt-offline get apt-offline.sig --bug-reports --threads 5

Ergebnis obigen Aufrufs sind Zusatzinformationen in der Datei apt-offline.sig, die Sie nun auf einen Datenträger kopieren.

Für ein einzelnes Paket sieht der Aufruf etwas anders aus. Um die Installation des Pakets approx [Debian-Paket-approx] vorzubereiten, benutzen Sie diesen Aufruf:

# apt-offline set --install-packages approx apt-offline.sig

Nun beziehen Sie die gewünschten Pakete. Als Schritt 3 führen Sie den nachfolgenden Aufruf auf dem Rechner mit Netzanbindung aus:

# apt-offline get --bundle bundle.zip apt-offline.sig

Die notwendigen Pakete befinden sich in dem ZIP-Archiv bundle.zip. In Schritt 4 spielen Sie dieses Archiv auf der Offline-Maschine ein. Hier sehen Sie das beispielhaft als Datei von einem Speichermedium, welches über USB unter dem Pfad /media/USB/bundle.zip eingehängt ist (USB-Stick oder USB-Festplatte).

# apt-offline install /media/USB/bundle.zip

Die Pakete landen im lokalen Paketcache und wirken für APT jetzt so, als wenn sie vorher schonmal bezogen wurden. Mittels apt-get install Paketname spielen Sie jetzt das gewünsche Paket ein.

41.3.3. Pakete mit dpkg-split aufteilen

Möchten Sie nicht mit den Schaltern von tar, rar, zip oder hoz hantieren, bietet sich hier das Werkzeug dpkg-split aus dem Paket dpkg [Debian-Paket-dpkg] an. Es zerlegt eine deb-Datei in kleinere Stücke und setzt diese Stücke dann auch wieder zusammen. Dieses Werkzeug ist nützlich, um Binärpakete auf mehrere Medien mit geringer Kapazität zu verteilen, bspw. wenn Sie gerade nichts anderes zur Hand haben.

dpkg-split kommt mit einer ganzen Reihe von nützlichen Schaltern:

-? (Langform: --help)
Zeigt die Hilfeseite zu dpkg-split an.
-a (Langform: --auto)
Reiht die Stücke automatisch in die Warteschlange und setzt, falls möglich, das Paket wieder zusammen.
-d (Langform: --discard)
Löscht Einträge aus der Warteschlange derer, die auf die verbleibenden Stücke ihrer Pakete warten.
-I (Langform: --info)
Gibt Informationen zu einem Stück aus, welches zuvor von dpkg-split erzeugt wurde.
-j (Langform: --join)
Vereinigt einzelne Stücke zu einer .deb-Datei. Standardmäßig folgt der Name der Ausgabedatei basierend auf dem Paketnamen, der Version und der Architektur (Paket-Version_Architektur.deb).
-l (Langform: --listq)
Listet den Inhalt der Warteschlange der wieder zusammenzubauenden Pakete auf.
-o (Langform: --output)
Gibt den Ausgabedateinamen für ein Paket an, welches zusammengebaut werden soll. Ohne diesen Schalter erzeugt dpkg-split eine Ausgabedatei mit dem Namen basierend auf dem Paketnamen, der Version und der Architektur (Paket-Version_Architektur.deb).
-Q (Langform: --npquiet)
Führen Sie ein automatisches Einreihen oder Wiederzusammensetzen durch, gibt dpkg-split normalerweise eine Meldung aus, falls ein übergebener Teil kein Binärpaketteil ist. Dieser Schalter unterdrückt diese Meldung, um Programmen wie dpkg zu erlauben, sowohl mit geteilten als auch ungeteilten Paketen umzugehen, ohne störende Meldungen zu erzeugen.
-S (Langform: --partsize)
Legt die Größe der Stücke fest. Die Angabe erfolgt in Kilobytes zur Basis 1024 Byte. Die Standardgröße beträgt 450 KB.
-s (Langform: --split)

Teilt ein einzelnes Debian-Binärpaket in mehrere Stücke. Die Benennung der Ausgabedateien folgt Paketname.nofm.deb mit n als Stücknummer und m als Anzahl der Stücke.

Geben Sie im Aufruf kein Präfix an, wird der Dateiname vom Komplettarchiv entnommen, einschließlich Verzeichnis, wobei das abschließende .deb entfernt wird.

--depotdir
Spezifiziert ein alternatives Verzeichnis für die Warteschlange von den Stücken, die auf automatisches Wiederzusammenführen warten. Standardmäßig ist dies das Verzeichnis /var/lib/dpkg.
--msdos

Erzwingt, dass die von -s erzeugten Ausgabedateinamen MSDOS-kompatibel sind.

Dies verstümmelt das Präfix — entweder den voreingestellten aus dem Eingabedateinamen abgeleiteten oder den als Argument übergebenen. Dabei werden alphanummerische Zeichen durch Kleinbuchstaben und Pluszeichen durch x ersetzt sowie alle anderen Zeichen entfernt. Das Ergebnis wird dann soweit wie nötig abgeschnitten. Ergebnis ist ein Dateiname der Form Präfixnofm.deb mit n als Stücknummer und m als Anzahl der Stücke.

--version
Gibt die verwendete Version von dpkg-split aus.

Nachfolgend erklären wir anhand des Paketes xsnow, wie Sie dpkg-split benutzen.

Beispiel 1 ist das Zerlegen des Pakets xsnow in Stücke mit einer Größe von 10 KB. Zum Einsatz kommen im Aufruf die beiden Schalter -s (zerlegen) und -S 10. Letzteres bestimmt die Größe der Ausgabedatei von maximal 10 KB.

Als Ergebnis erhalten Sie vier Stücke. Diese werden in der Form Paketname.nofm.deb mit n als Stücknummer (im Beispiel die Werte 1 bis 4) und m als Anzahl der Stücke (im Beispiel 4) benannt.

Zerlegen des Debianpakets xsnow in Stücke zu 10 KB. 

$ dpkg-split -s -S 10 xsnow_1%3a1.42-9_amd64.deb
Paket xsnow wird in 4 Teile aufgeteilt: 1 2 3 4 fertig
$ ls -lh
insgesamt 136K
-rw-r--r--  1 frank frank 9,2K Jan  7 11:09 xsnow_1%3a1.42-9_amd64.1of4.deb
-rw-r--r--  1 frank frank 9,2K Jan  7 11:09 xsnow_1%3a1.42-9_amd64.2of4.deb
-rw-r--r--  1 frank frank 9,2K Jan  7 11:09 xsnow_1%3a1.42-9_amd64.3of4.deb
-rw-r--r--  1 frank frank 8,2K Jan  7 11:09 xsnow_1%3a1.42-9_amd64.4of4.deb
$

In Beispiel 2 zeigen Sie die Informationen zu einem Stück eines mittels dpkg-split zerlegten deb-Pakets an. Dazu benutzen Sie den Schalter -I gefolgt von einem Dateiname als Parameter, hier: xsnow_1%3a1.42-9_amd64.3of4.deb. Die Ausgabe umfasst die Formatversion, die Paketinformationen, die Nummer des Stücks (hier 3 von 4), die Größe ("Teil-Länge") sowie den Offset im Originalpaket ("Teil-Offset").

Informationen zum Teil xsnow_1%3a1.42-9_amd64.3of4.deb erhalten. 

$ dpkg-split -I xsnow_1%3a1.42-9_amd64.3of4.deb
xsnow_1%3a1.42-9_amd64.3of4.deb:
    Teil-Formatversion:            2.1
    Teil des Paketes:               xsnow
        ... Version:                1:1.42-9
        ... Architektur:            amd64
        ... MD5-Prüfsumme:          3ddeabaec77416662e45de36d9960a2a
        ... Länge:                  35836 Byte
        ... geteilt alle:           9216 Byte
    Teil-Nummer:                    3/4
    Teil-Länge:                     9216 Byte
    Teil-Offset:                    18432 Byte
    Teil-Dateigröße (ben. Anteil):  9418 Byte

$

Das Beispiel 3 zeigt, wie Sie ein Paket wieder aus einzelnen Stücken zusammensetzen. Dazu benutzen Sie den Schalter -j für die Aktion "Zusammensetzen".

Nun erzeugt dpkg-split als Ausgabedatei xsnow_1:1.42-9_amd64.deb, da die Benennung den Angaben zum Paketnamen, der Paketversion sowie der Architektur (Paket-Version_Architektur.deb) folgt. Am Ende des Aufrufs geben Sie noch die Dateinamen der Stücke an, die Sie wieder zusammensetzen möchten.

Einfaches Zusammenfügen der Paketstücke. 

$ dpkg-split -j xsnow_1%3a1.42-9_amd64.*
Paket xsnow wird aus 4 Teilen zusammengesetzt: 1 2 3 4 fertig
$

Um eine Ausgabedatei mit einem spezifischen Dateinamen zu erhalten, kommt nun noch der Schalter -o für die Angabe der Ausgabedatei zum Einsatz. Bitte beachten Sie dabei, dass Sie im Aufruf zuerst den Schalter -o und erst danach den Schalter -j angeben. Nachfolgend sehen den vollständigen Aufruf, der als Ergebnis die Datei xsnow_1%3a1.42-9_amd64.deb liefert.

Zusammenfügen der Paketstücke mit Ausgabedatei. 

$ dpkg-split -o xsnow_1%3a1.42-9_amd64.deb -j xsnow_1%3a1.42-9_amd64.*
Paket xsnow wird aus 4 Teilen zusammengesetzt: 1 2 3 4 fertig
$

Anschließend raten wir Ihnen, zu überprüfen, ober alles beim Zusammenbau geklappt hat. Mittels md5sum vergleichen Sie die Hashwerte der beiden Pakete wie folgt:

Vergleichen zweier Dateien mittels md5sum

$ md5sum xsnow_1%3a1.42-9_amd64.deb /var/cache/apt/archives/xsnow_1%3a1.42-9_amd64.deb
3ddeabaec77416662e45de36d9960a2a  xsnow_1%3a1.42-9_amd64.deb
3ddeabaec77416662e45de36d9960a2a  /var/cache/apt/archives/xsnow_1%3a1.42-9_amd64.deb
$

41.3.4. Keryx

Das Projekt Keryx [Keryx] beschreibt sich als eine freie, plattformunabhängige Softwareanwendung, um Linuxsysteme ohne Internetanbindung zu aktualisieren. Es hat den Fokus auf Benutzer mit Einwahlverbindungen und Systeme, die nur über eine dünne Leitung an das Internet verfügen.

Ursprünglich nur für Ubuntu entwickelt, erlaubt es mittlerweile das Auswählen und Herunterladen von Paketen auf Debian-basierten Systemen und auch anderen Betriebssystemen wie bspw. Microsoft Windows. Die bezogenen Pakete werden auf einem mobilen Speichermedium abgelegt und können von da aus auf dem eigentlichen System eingespielt werden. Es ist für die Anwendung an einzelnen Systemen gedacht, geschieht das in einem größeren Rahmen, ist für das Vorgehen der Begriff „Turnschuhnetzwerk“ [Turnschuhnetzwerk] gebräuchlich.

Keryx basiert auf dem Gimp Tool Kit. Die letzte Veröffentlichung als Ubuntu-PPA erfolgte 2011 (Version 1), 2017 wurde die Version 0.92.5 freigegeben. Aktuellere Veröffentlichungen sind nicht bekannt.

Es existiert zudem eine Erweiterung um eine graphische Bedienoberfläche, die auf wxPython (Paket python-wxversion) aufsetzt.