Änderungen

Wechseln zu: Navigation, Suche

Paketmanager opkg

532 Bytes hinzugefügt, 14:13, 14. Jul. 2020
keine Bearbeitungszusammenfassung
''opkg '' ist ein Paketmanager, zugeschnitten auf die Bedürfnisse von Embedded Systemen. Die Aufgabe eines Paketmanagers ist, die auf einem System (z.B. unseren VU+ Boxen) installierte Software zu verwalten. Die Software wird dazu in Pakete gebündelt. Mit dem Paketmanager können solche Pakete installiert, deinstalliert und gelöscht werden. Der Paketmanager ermöglicht es, Software-Pakete zentral zusammenzustellen und auch zentral zu verteilen. Dafür greift der Paketmanager auf den '''[[FEED|Feed''' ]] zu - das ist das zentrale Repository, in dem alle Pakete zum Download für den Paketmanager bereitgestellt werden.
== Benutzung ==
Für die komplette Liste der Befehle, die ''opkg '' kennt, gibt man einfach <code>opkg</code> in der Shell ein.
Die wichtigsten Befehle hier auf einen Blick:
{|
| <code>opkg update </code> || Akualisiert die Liste der am Feed verfügbaren Pakete
|-
| <code>okpg list-upgradable </code> || Zeigt eine Liste aller Pakete an, für die es am Feed eine Aktualisierung gibt
|-
| <code>opkg upgrade </code> || Aktualisiert alle Pakete, für die es eine neuere Version am Feed gibt
|-
| <code>opkg list </code> || Zeigt eine Liste mit allen verfügbaren Paketen an
|-
| <code>opkg list-installed </code> || Zeigt eine Liste mit allen installierten Paketen an
|-
| <code>opkg install <paketliste></code> || Installiert ein oder mehrere Pakete
|-
| <code>opkg remove <paketliste></code> || Deinstalliert ein oder mehrere Pakete
|}
== Weiterführende Informationen ==
Für die Benutzung des Paketmanagers sind die jetzt folgenden Informationen nicht wichtig. Das wird sich schnell vermutlich ändern, wenn man selber Pakete bauen möchte.
''opkg '' benutzt drei Verzeichnisse für den Betrieb:
{|
| <code>/etc/opkg/ </code> || Konfiguration für ''opkg''; hier wird die Liste aller Feeds abgelegt und die Liste der benutzten Architekturen definiert.
|-
| <code>/var/lib/opkg/ </code> || Hier wird der Gesamt-Status der installierten Pakete gespeichert. Dies beinhaltet eine Liste aller Pakete, die am Feed verfügbar sind, als auch Listen mit allen Dateien, die von allen Paketen installiert wurden.
|- style="vertical-align:top;"
| /<code>usr/lib/opkg/ </code> || Im Verzeichnis <code>/usr/lib/opkg/alternatives /</code> werden informationen Informationen zu allen Programmen verwaltet, für die es mehrere Installations-Kandidaten gibt. Ein gutes Beispiel ist [[Busybox_und_deren_Befehle|busybox]], welches für eine Vielzahl von Standard-Unix-Programmen eine abgespeckte Variante zur Verfügung stellt. Wenn das Original-Programm ebenfalls installiert werden sollwird, soll natürlich nicht weiter die Busybox-Variante benutzt werden.
|}
=== Paket-Informationen ===
Informationen zu allen installierten Paketen legt ''opkg '' im Verzeichnis '''<code>/var/lib/opkg/info/''' </code> ab. In diesem Verzeichnis befindeen befinden sich zu jedem installierten Paket mehrere Dateien:
{|
| ''paketname''.list || Liste aller vom Paket installierten Dateien
|-
| optional ''paketname''.preinst || (optional) Script, welches vor Installation von ''paketname'' ausgeführt wurde
|-
| optional ''paketname''.postinst || (optional) Script, welches nach Installation von ''paketname'' ausgeführt wurde
|-
| optional ''paketname''.prerm || (optional) Script, welches vor Deinstallation von ''paketname'' ausgeführt wird
|-
| optional ''paketname''.postrm || (optional) Script. , welches nach Deinstallation von ''paketname'' ausgeführt wird
|-
| optional ''paketname''.conffiles || (optional) Liste aller vom Paket installierten Konfigurationsfiles, die beim Update nicht überschrieben werden sollen
|}
=== Pakete selber bauen ===
Ein Paket ist eine Sammlung von zu installierenden FilesDateien, Metainformationen sowie vor und nach Installation auszuführenden Scripten. Als Paket-Container-Format wurde wird dafür das unter Unix seit Ewigkeiten benutzte ar-Format benutztverwendet, mit dem auch Bibliotheken für statische Libraries (.a-Files) erstellt werden.
In einer .ipkgipk-Datei befinden sich immer drei Dateien: '''control.tar.gz''', '''data.tar.gz''', '''debian-binary'''. In der Datei '''control.tar.gz ''' befinden sich alle Meta-Daten zum Programm:
* <code>control </code> (diese Datei muss drin enthalten sein),* <code>conffiles </code> (optional für Datei mit einer Liste von Konfigurationsfiles, die nicht überschrieben werden sollen; pro Zeile ein Filename - wird z.B. im Paket "base-files" benutzt, siehe <code>/var/lib/opkg/info/base-files.* </code> auf der Box)* <code>preinst</code>, <code>prerm </code> (optional, Shellscripten, die vor dem installieren bzw. löschen ausgeführt werden)* <code>postinst</code>, <code>postrm </code> (optional, Shellscripten, die nach dem installieren bzw. löschen ausgeführt werden)
Die Datei '''data.tar.gz ''' beinhaltet die eigentlichen Paket-Daten, die installiert werden sollen. Die Datei '''data.tar.gz ''' wird von ''opkg '' im Root-Verzeichnis ausgepackt. ''opkg '' benutzt dafür seinen eigenen Entpacker, der - im Gegensatz zu ''tar'' pingelig ist, was fehlende Verzeichnisse im Tar-File angeht.
==== Das ''control'' File ====
Bleibt noch das ''control''-File zu erklären. Ein ''control''-File besteht aus einer Reihe von '''Feld: Wert'''-Paaren, mit nachfolgend beschriebener Bedeutung. Dabei sind lediglich die Felder '''Package:''' und '''Architecture:''' Pflichtfelder, es ist aber sinnvoll, wenigstens noch '''Version:''' und '''Description:''' mit anzugeben.
* '''Package:''' (Pflichtfeld) ist der Paket-Name ohne die Versions-Nummer* '''Architecture:''' (Pflichtfeld) bestimmt, unter welcher Architektur das Paket sinnvollerweise installiert werden kann. Hier nimmt man "all", wenn es unabhängig vom Prozessor ist, also z.B. ein Python-Script. Ansonsten z.B. armv7ahf-vfp-neon wenn es spezifisch für eine unserer 4k-Boxen ist, weil z.B. ein kompiliertes Binary enthalten ist. Gültige Werte für "Architecture" für deine Box stehen in der Datei /etc/opkg/arch.conf.* '''Version:''' (empfohlenes Feld) ist die Versionsnummer des Paketes. Hier fährt man sehr gut mit einer numerischen Versionsnummer (z.B. 1.2-r0), da opkg anhand der Versionsnummer alphanumerisch sortiert und entscheidet, ob ein Paket neuer als ein bereits installiertes ist. Versionsnummern a la "gitXXX" sind eher ungeeignet.* '''Description:''' (empfohlenes Feld) ausführliche Beschreibung des Pakets. Dieses Feld kann aus mehreren Zeilen bestehen, wobei nachfolgende Zeilen immer mit einem Leerzeichen beginnnen müssen, Absätze mit " .".
* '''Depends:''' beschreibt die Abhängigkeiten zu anderen Paketen. Diese Zeile kann eine Liste von Paketen enthalten, die installiert sein müssen bzw. installiert werden sollen, wenn das Paket installiert wird. Für jedes Paket kann weiter noch angeben werden, welche Version benötigt wird. Das kann man durch (>> Version), (>= Version), (= Version), (<= Version), (<< Version) hinter dem Paketnamen angeben. >>: neuer als, >=: mindestens, =: genau gleich, <=: höchstens, <<: älter als.
* '''Description:''' ausführliche Beschreibung des Pakets. Dieses Feld kann aus mehreren Zeilen bestehen, wobei nachfolgende Zeilen immer mit einem Leerzeichen beginnnen müssen, Absätze mit " .".
* '''Conflicts:''' wenn die Installation dieses Paketes sich mit einem anderen Paket beisst (z.B. wenn beide Pakete gleiche Files installieren), werden die Pakete durch Komma getrennt hier aufgeführt.
* '''Installed-Size:''' hier kann der vom installierten Paket in Anspruch genommene Speicherplatz in KB angegeben werden
* '''Suggests:''' Liste von Paketen, für die es vielleicht Sinn macht, zusätzlich zu diesem Paket installiert zu werden - eine noch weichere Depends: Klausel.
Als Beispiele kann man sich die tausenden von <code>*.control </code> im Verzeichnis <code>/var/lib/opkg/info/ </code> anschauen. Pro installiertes Paket steht dort die ''control''-Datei, die mit dem Paket ausgeliefert wurde.
==== Ein Script um Pakete zu erstellen ====
Mit folgendem Script kann aus einem Installations-Verzeichnis heraus ein fertiges Paket gebaut werden. Dafür ist es nur nötig, eine fertige ''control''-Datei und das fertige ''data.tar.gz '' im Verzeichnis abzulegen. Wenn man ein Programm fertig kompiliert hat, lässt es sich üblicherweise mit dem Kommando <code>make install</code> installieren. Man kann aber bei den meisten Programmen heute <code>make install DESTDIR=/media/hdd/install</code> angeben, um das Programm unter einem anderen Root-Verzeichnis, z.B. <code>/media/hdd/install/</code>, zu installieren. Von hier kann man noch einmal schauen, was alles installiert würde, und von hier das ''data.tar.gz''-File erstellen.
Das folgende Script wird im Installations-Root (z.B. <code>/media/hdd/install/</code>) ausgeführt:
#!/bin/bash
ar r $ipk debian-binary control.tar.gz data.tar.gz
Für Wichtig: für dieses Script wird das '''ar''' aus den Binutils benötigt, hier funktioniert das ''ar'' aus Busybox-ar nicht. Ein Binutils-Paket für die ARM-Architektur findet sich bei uns im Downloads-Bereich, für MIPSEL wird man fündig, wenn man im Netz nach Debian-Paketen sucht.
75
Bearbeitungen

Navigationsmenü