
OpenWrt verwendet opkg als Paketmanager bzw. als eigenen Fork . Debian-Ingenieure werden es in vielerlei Hinsicht kennen: ähnliche Befehle, ähnliches Format des Repositorys und der Pakete.
Ich wollte LUCI patchen (dies wird nicht im Artikel enthalten sein), fand jedoch keine angemessene schnelle Einführung. Ich musste unabhängig Informationsfragmente aus verstreuten Dokumentationen, Artikeln und Beispielen sammeln und dabei den Code und die Ergebnisse der Arbeit betrachten. Als Bonus habe ich ein primitives (aber in der Praxis nutzloses) Paket gesammelt, das sich noch nicht im Repository befindet. Ich teile das gesammelte Bildungsprogramm unten.
Repository-Gerät
Im OpenWrt-Dateisystem befindet sich eine Datei, die die Systemliste
/etc/opkg/distfeeds.conf
(bereitgestellt von den OpenWrt- und opkg-Entwicklern) der Repositorys angibt. Eigene Repositorys und Repositorys von Drittanbietern können in angegeben werden
/etc/opkg/customfeeds.conf
. Das Format ist einzeilig und besteht aus drei Wörtern:
src
odersrc/gz
es hängt davon ab,Packages
ob die Datei heruntergeladen wird oderPackages.gz
. Dem Code nach zu urteilen, gibt es andere Optionen für das erste Wort, aber ich habe keine Repositories gefunden, für die dies relevant wäre. Trotz dessrc
Namens ist dies ein Repository für Binärpakete. Das opkg hat kein spezielles Repository-Format für Quellpakete, das dem in Debian / APT verwendeten ähnelt.- Der Name des Repositorys oder "Feeds" in der opkg / OpenWrt-Terminologie.
- Die URL, die das
Packages
/ enthältPackages.gz
.
Wenn die Liste der Pakete und Signaturen ausgeführt oder
opkg update
zur URL
/
hinzugefügt wird , wird sie gespeichert . Die Datei wird nach dem zweiten Wort in der Liste der Repositorys benannt. Daraus ergeben sich zwei wichtige Schlussfolgerungen:
Packages
Packages.gz
/tmp/opkg-lists
- Beim Neustart wird der Cache geleert. Auf eingebetteten Systemen wie Routern ist dies absolut sinnvoll.
- Sie
/etc/opkg/customfeeds.conf
können System-Feeds mit Ihren eigenen überschreiben und ihnen denselben Namen geben. opkg wird schwören, aber die Überschreibung schlucken und die gewünschte Datei anstelle der zuvor geladenen hinzufügen.
Gleichzeitig wird es geladen
Packages.sig
, das den Hash der entpackten Paketliste enthalten sollte. Die Liste selbst listet einfach die Pakete auf, es gibt mehrere Werte für jedes Paket, die Werte für verschiedene Pakete sind durch eine leere Zeile getrennt. Hier sind die wichtigsten Felder für jedes Paket:
Package
, Paketnamen;Version
Wenn es mehrere Pakete mit demselben Namen gibt, können Sie die Version auswählen. Die neueste Version wird standardmäßig installiert.Depends
Abhängig von anderen Paketen installiert der Paketmanager die aufgelisteten Pakete, wenn sie nicht im System vorhanden sind.Filename
ist der Pfad zur Datei relativ zur Basis-URL des Repositorys, normalerweise ist das Repository flach und alles befindet sich an derselben Stelle wie "Packages.gz";SHA256sum
Der vom Repository deklarierte Paket-Hash.
Wenn Sie weitere Informationen wünschen, können Sie einfach eine dieser Listen direkt in Ihrem Browser lesen .
Binärpakete
Binärpakete sind fast identisch mit Debian-Paketen. Der Unterschied ist wie folgt:
- Erweiterung
.ipk
statt.deb
. - `tar`
gzip
, . Debianar
,.tar.xz
, .
Wenn Sie die Paketerweiterung für OpenWrt in ändern
.tar.gz
und entpacken, finden Sie zwei Archive und eine Textdatei. Die Datei heißt
debian-version
, sie enthält die Version des Binärdateiformats und ist für uns nicht sehr interessant. In modernen Systemen ist diese Version immer gleich
2.0
.
Das Archiv
data.tar.gz
enthält ausführbare Dateien, Konfigurationsdateien und alles, wofür das Paket installiert ist. Wenn Sie es an die Wurzel der FS entpacken, erhalten Sie alle die erwarteten Dateien an den richtigen Stellen bekommen, in
/usr/bin/
,
/etc/
und so weiter.
Und darin gibt
control.tar.gz
es Zusatzdateien für den Paketmanager. Das Skript , das vor oder nach der Installation und Deinstallation (ausgeführt werden soll
preinst
,
postinst
,
prerm
,
postrm
), Informationen zu Dateien, bei denen es sich um Konfigurationsdateien handelt, und Metainformationen zum Paket, die weitgehend mit denen in übereinstimmen
Packages
.
Paket-Build-System
Das Assemblierungssystem (auch bekannt als SDK) besteht aus einem Make-Framework. Das Framework bedeutet nicht, dass Sie Pakete separat erstellen. Die Hauptaufgabe besteht darin, ganze Repositorys zu erstellen.
Das SDK
x86_64
ist in Git . Es gibt ein Archiv (der Link wird bald veraltet sein, aber es ist nicht schwer, ein neues zu finden), mit dem Sie Zeit beim Kompilieren der Toolchain für die Montage sparen. Im Inneren ist die Datei von besonderem Interesse
feeds.conf.default
. Das Format ist einfach und durch ein Leerzeichen getrennt:
- Schlüsselwort
src-git
. Es wird nicht nur Git unterstützt , sondern es gibt auch keine Repositorys in anderen VCS. - Feed-Name.
- Eine Git-Repository-URL, unter der Sie ein Commit oder Tag angeben können. Wenn Sie den Namen einer solchen Spezifikation kennen, sagen Sie es mir bitte.
Das Repository mit den Paketen selbst ist so einfach wie möglich: Im Stammverzeichnis des Repositorys befindet sich eine Paketkategorie, auf der zweiten Ebene ein Verzeichnis mit dem Paketnamen und
Makefile
optional "Config.in" für zusätzliche Optionen während der Ausführung
make menuconfig
sowie ein Unterverzeichnis
patches
mit dem entsprechenden Inhalt. Nur für das einfachste Paket
Makefile
. Sie können beispielsweise den Spiegel des Hauptrepositorys betrachten .
Testaufbau
Ich habe versucht, GNU Hello zu erstellen, um zu testen, wie das SDK funktioniert. Dies ist eine relativ monströse Hello World, die in strikter Übereinstimmung mit den GNU-Projektrichtlinien geschrieben wurde und deren einziger Zweck darin besteht, diese Richtlinien zu veranschaulichen. Ich habe kein separates Repository dafür erstellt, sondern es in die grundlegenden SDK-Pakete "verschoben", von wo aus ich es kompiliert habe.
Für den Betrieb des SDK von den benötigten Debian Umgeben Pakete
libncurses-dev
(für die Montage des Menüs),
build-essential
(von GCC und anderen Standardprogrammen auf dem C abhängig)
gawk
,
unzip
,
file
,
rsync
und
python3
. Um ein Repository aus den gesammelten Paketen zu erstellen, benötigen Sie ein Dienstprogramm zum Generieren von Schlüsseln
usign
. Es befindet sich nicht im Repository, daher benötigen Sie zum Erstellen zusätzlich "cmake". Dieses Tool kann sowohl durch GPG als auch durch GPG ersetzt werden
signify-openbsd
Es wird jedoch vom OpenWrt-Projekt empfohlen und entwickelt und ist viel besser zu verwenden.
Kompilieren und installieren
usign
:
git clone https://git.openwrt.org/project/usign.git
cd usign
cmake .
make
sudo make install
Anstatt set (
sudo make install
) zu setzen, können Sie sich einfach merken, wo sich das Binar befindet, um es mit Ihren Händen weiter zu ziehen.
Nun das grundlegende SDK-Setup:
git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a
Ich möchte Sie daran erinnern, dass Sie das Archiv nicht von git klonen, sondern mit der vorkompilierten Toolchain herunterladen und entpacken können. Vergessen Sie nicht, einfach die neueste Version herunterzuladen!
Bei der Ausführung
./scripts/feeds update -a
klonen / aktualisieren wir alle Repositorys aus feeds.conf (.default), überprüfen Abhängigkeiten und bereiten ein Verzeichnis
staging_dir/host/bin
mit ausführbaren Dateien vor (dies sind hauptsächlich Symlinks zu Systemdienstprogrammen). Mit dem folgenden Befehl
./scripts/feeds install -a
werden Symlinks verschoben
package/feeds
, von wo aus sie zur Kompilierung verwendet werden. Diese beiden Befehle sind nicht erforderlich, um mein benutzerdefiniertes Paket zu erstellen.
Weiter wird ausgeführt
make menuconfig
... Sie können es überspringen, aber beim Kompilieren des Pakets wird weiterhin das entsprechende Fenster angezeigt. Darin reicht es aus, das Ziel und das Unterziel zu ändern, damit alles unter x86_64 kompiliert und beendet wird, um die Konfiguration zu speichern. Sie müssen auch zusätzliche Montagewerkzeuge (
make tools/install
) und Werkzeugketten ( ) sammeln
make toolchain/install
. Wenn Sie das SDK aus dem Archiv heruntergeladen haben, werden
make menuconfig
Ihnen keine Optionen zur Auswahl eines Ziels angezeigt, und das Zusammenstellen des Toolkits und der Toolchain ist nicht erforderlich - alles ist bereits vorhanden.
Jetzt erstelle ich ein Verzeichnis,
package/devel/hello
in das ich
Makefile
folgenden Inhalt lege:
Makefile
include $(TOPDIR)/rules.mk
PKG_NAME:=hello
PKG_VERSION:=2.9
PKG_RELEASE:=1
PKG_LICENSE:=GPL-3.0-or-later
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=@GNU/hello/
PKG_HASH:=ecbb7a2214196c57ff9340aa71458e1559abd38f6d8d169666846935df191ea7
include $(INCLUDE_DIR)/package.mk
define Package/hello
SECTION:=devel
CATEGORY:=Development
TITLE:=GNU Hello
URL:=https://www.gnu.org/software/hello/
endef
define Package/hello/description
The GNU Hello program produces a familiar, friendly greeting. Yes,
this is another implementation of the classic program that prints
“Hello, world!” when you run it. However, unlike the minimal version
often seen, GNU Hello processes its argument list to modify its
behavior, supports greetings in many languages, and so on. The primary
purpose of GNU Hello is to demonstrate how to write other programs that
do these things; it serves as a model for GNU coding standards and GNU
maintainer practices.
endef
define Package/hello/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/hello $(1)/usr/bin/
endef
$(eval $(call BuildPackage,hello))
Grundsätzlich sollte alles ohne Erklärung klar sein. Die Framework-Dateien werden verbunden, die Hauptparameter des Pakets werden beschrieben,
@GNU
durch die Spiegel des GNU-Projekts (im Framework definiert) ersetzt, und der Pfad besteht aus zwei Teilen: Er
PKG_SOURCE_URL
gibt die Basis-URL für alle Versionen an und wird durch Verketten des Dateinamens
PKG_SOURCE
mit einem Schrägstrich erweitert. Es
Package/hello/install
enthält Anweisungen zum Zusammenstellen von Binärdateien zu einem Archiv
data.tar.gz
. Weitere Build-Optionen finden Sie bei Bedarf in der Dokumentation . Vergessen Sie übrigens nicht, dass make beim Einrücken sehr wählerisch ist. Ich hatte einzelne Tabulatoren anstelle von führenden Leerzeichen.
Erneut aufrufen
make menuconfig
Überprüfen Sie, ob das Hallo-Paket im angegebenen Abschnitt markiert ist (Entwicklung in meinem Fall), und beenden Sie das Speichern der Konfiguration. Schließlich bauen wir das Paket in drei Schritten zusammen; herunterladen, entpacken und tatsächlich kompilieren:
make package/hello/download make package/hello/prepare make package/hello/compile
Als Ergebnis erhielt ich ein Paket
bin/packages/x86_64/base/hello_2.9-1_x86_64.ipk
. Sie können ein Repository erstellen. Wir generieren ein Schlüsselpaar (
usign -G -c 'openwrt test repo' -s key-build -p key-build.pub
der private Schlüssel muss "key-build" heißen) und sammeln das Repository :
make package/index
. In diesem Stadium kann die Baugruppe auf die Abwesenheit
usign
im Verzeichnis mit Hilfstools schwören , ich entschied mich, Symlink-Problem :
ln -s `which usign` staging_dir/host/bin/usign
. Neben dem Paket befindet sich nun der vollständige Satz, der für das Repository erforderlich ist.
Überprüfen des Repositorys zusammen mit dem Paket
Sie können alles auf einem echten Router überprüfen (denken Sie daran, das richtige Ziel auszuwählen), aber ich habe Docker verwendet. In Dokerhabe gibt es ein OpenWrt-Image für x86_84, das ausgeführt werden kann und mit dem SDK im Containerverzeichnis vereist :
sudo docker run -it --name openwrt_test -v $PWD:/opt openwrtorg/rootfs
. Drücken Sie die Eingabetaste, bis die Bash-Eingabeaufforderung angezeigt wird.
Ich kopiere den Schlüssel aus dem weitergeleiteten Verzeichnis (der
cp /opt/key-build.pub /etc/opkg/keys/usign -F -p /opt/key-build.pub
Name des Schlüssels muss mit dem Bezeichner übereinstimmen), füge mein lokales Repository hinzu (
echo src/gz local file:///opt/bin/packages/x86_64/base >> /etc/opkg/customfeeds.conf
) und aktualisiere das Repository (
opkg update
). Die Schlussfolgerung beginnt mit ermutigendem Text, alles ist korrekt signiert:
# opkg update
Downloading file:///opt/bin/packages/x86_64/base/Packages.gz
Updated list of available packages in /var/opkg-lists/local
Downloading file:///opt/bin/packages/x86_64/base/Packages.sig
Signature check passed.
Es bleibt nur zu installieren und zu überprüfen:
root@34af2f6e849b:/# opkg install hello
Installing hello (2.9-1) to root...
Downloading file:///opt/bin/packages/x86_64/base/hello_2.9-1_x86_64.ipk
Configuring hello.
root@34af2f6e849b:/# hello
Hello, world!
Hurra, es ist geschafft! Trotz der in den Artikeln verteilten Dokumentation ist das Erstellen von Paketen ziemlich einfach.
