OpenWrt utilise opkg comme gestionnaire de paquets, ou plutÎt comme son propre fork . Les ingénieurs Debian le trouveront familier à bien des égards: commandes similaires, format similaire du référentiel et des paquets.
Je voulais patcher LUCI (cela ne sera pas dans l'article), mais je n'ai pas trouvé d'introduction rapide adéquate, j'ai dû collecter indépendamment des fragments d'informations à partir de documentation dispersée, d'articles et d'exemples, en regardant le code et les résultats du travail. En prime, j'ai collecté un package primitif (mais inutile en pratique) qui n'est pas encore dans le référentiel. Je partage le programme éducatif collecté ci-dessous.
Dispositif de référentiel
Il existe un fichier dans le systĂšme de fichiers OpenWrt
/etc/opkg/distfeeds.conf
qui spĂ©cifie la liste systĂšme (fournie par les dĂ©veloppeurs OpenWrt et opkg) des rĂ©fĂ©rentiels. Les rĂ©fĂ©rentiels propres et tiers peuvent ĂȘtre spĂ©cifiĂ©s dans
/etc/opkg/customfeeds.conf
. Le format est une ligne, se compose de trois mots:
src
ousrc/gz
, cela dépendPackages
si le fichier sera téléchargé ouPackages.gz
. A en juger par le code, il existe d'autres options pour le premier mot, mais je n'ai trouvé aucun référentiel pour lequel cela serait pertinent. Malgré lesrc
nom, c'est un référentiel pour les paquets binaires. L'opkg n'a pas de format de référentiel spécial pour les paquets source similaire à celui utilisé dans Debian / APT.- Le nom du référentiel ou "feed" dans la terminologie opkg / OpenWrt.
- L'URL qui contient le
Packages
/Packages.gz
.
Lorsqu'il est exécuté ou ajouté
opkg update
à l'URL , la liste des packages et des signatures est enregistrée , le fichier est nommé en fonction du deuxiÚme mot de la liste des référentiels. Il en résulte deux conclusions importantes:
/
Packages
Packages.gz
/tmp/opkg-lists
- Au redémarrage, le cache sera effacé. Sur les systÚmes embarqués tels que les routeurs, cela est parfaitement logique.
- Vous
/etc/opkg/customfeeds.conf
pouvez remplacer les flux systĂšme par les vĂŽtres, en leur donnant le mĂȘme nom. opkg jurera, mais avalera le remplacement, ajoutant le fichier dĂ©sirĂ© au lieu de celui chargĂ© prĂ©cĂ©demment.
En mĂȘme temps, il sera chargĂ©
Packages.sig
, ce qui devrait contenir le hachage de la liste des paquets dĂ©compressĂ©s. La liste elle-mĂȘme rĂ©pertorie simplement les packages, il y a plusieurs valeurs pour chaque package, les valeurs des diffĂ©rents packages sont sĂ©parĂ©es par une ligne vide. Voici les champs les plus importants pour chaque package:
Package
, nom du paquet;Version
, version, s'il existe plusieurs packages avec le mĂȘme nom, vous pouvez sĂ©lectionner la version, la derniĂšre sera installĂ©e par dĂ©faut;Depends
, en fonction des autres packages, le gestionnaire de packages installera les packages listés s'ils ne sont pas présents dans le systÚme;Filename
, le chemin d'accĂšs au fichier est relatif Ă l'URL de base du rĂ©fĂ©rentiel, gĂ©nĂ©ralement le rĂ©fĂ©rentiel est plat et tout est au mĂȘme endroit que `Packages.gz`;SHA256sum
le hachage du package déclaré par le référentiel.
Si vous voulez plus de détails, vous pouvez simplement lire l'une de ces listes directement dans votre navigateur .
Paquets binaires
Les paquets binaires sont presque identiques aux paquets Debian. La différence est la suivante:
- Extension
.ipk
au lieu de.deb
. - `tar`
gzip
, . Debianar
,.tar.xz
, .
Si vous changez l'extension de package pour OpenWrt
.tar.gz
et la décompressez, vous trouverez à l'intérieur deux archives et un fichier texte. Le fichier est nommé
debian-version
, il contient la version du format de fichier binaire et n'est pas trĂšs intĂ©ressant pour nous, dans les systĂšmes modernes cette version est toujours Ă©gale Ă
2.0
.
L'archive
data.tar.gz
contient des fichiers exécutables, des fichiers de configuration et tout ce pour quoi le package est installé. Si vous le décompressez à la racine du FS, vous obtiendrez tous les fichiers attendus aux bons endroits, dans
/usr/bin/
,
/etc/
et ainsi de suite.
Et il
control.tar.gz
y a des fichiers auxiliaires pour le gestionnaire de paquets. Ce script qui doit ĂȘtre exĂ©cutĂ© avant ou aprĂšs l'installation et l' enlĂšvement (
preinst
,
postinst
,
prerm
,
postrm
), des informations sur les fichiers qui sont des fichiers de configuration et des mĂ©ta-informations sur le package, qui sont en grande partie les mĂȘmes que celles contenues dans
Packages
.
SystÚme de création de paquet
Le systÚme d'assemblage (aka SDK) est réalisé sous la forme d'un Make-framework. Le framework n'implique pas que vous construirez des packages séparément, sa tùche principale est de construire des référentiels entiers.
Le SDK
x86_64
est dans git . Il existe une archive (le lien sera bientĂŽt obsolĂšte, mais il n'est pas difficile d'en trouver une nouvelle) qui vous fera gagner du temps lors de la compilation de la chaĂźne d'outils pour l'assemblage. A l'intĂ©rieur, le dossier prĂ©sente un intĂ©rĂȘt particulier
feeds.conf.default
. Le format est simple, séparé par un espace:
- Mot-clé
src-git
. Non seulement git est pris en charge , mais il n'y a plus de référentiels dans les autres VCS. - Nom du flux.
- Une URL de rĂ©fĂ©rentiel git oĂč vous pouvez spĂ©cifier un commit ou une balise. Si vous connaissez le nom d'une telle spĂ©cification, veuillez me le dire.
Le rĂ©fĂ©rentiel avec les packages lui-mĂȘme est conçu aussi simplement que possible: Ă la racine du rĂ©fĂ©rentiel il y a une catĂ©gorie de package, au deuxiĂšme niveau il y a un rĂ©pertoire avec le nom du package, et Ă l'intĂ©rieur se trouve
Makefile
, facultativement, `Config.in` pour des options supplémentaires lors de l'exécution
make menuconfig
et un sous-répertoire
patches
avec le contenu correspondant. Pour le package le plus simple, uniquement
Makefile
. Par exemple, vous pouvez regarder le miroir du référentiel principal .
Tester la construction
J'ai essayĂ© de crĂ©er GNU Hello pour tester le fonctionnement du SDK. C'est un Hello World relativement monstrueux, Ă©crit en stricte conformitĂ© avec les directives du projet GNU, son seul but est d'illustrer ces directives. Je n'ai pas crĂ©Ă© de rĂ©fĂ©rentiel sĂ©parĂ© pour cela, mais je l'ai plutĂŽt "glissĂ©" dans les packages SDK de base, d'oĂč je l'ai compilĂ©.
Pour le fonctionnement du SDK Entouré par les paquets Debian nécessaires
libncurses-dev
(pour l'assemblage du menu),
build-essential
(de GCC et d' autres programmes standards, en fonction du C),
gawk
,
unzip
,
file
,
rsync
et
python3
. De plus, pour créer un référentiel à partir des packages collectés, vous aurez besoin d'un utilitaire de génération de clés
usign
. Il n'est pas dans le rĂ©fĂ©rentiel, vous aurez donc en plus besoin de `cmake` pour la construction. Cet outil peut ĂȘtre remplacĂ© par GPG et
signify-openbsd
mais il est recommandé et développé par le projet OpenWrt et est beaucoup plus agréable à utiliser.
Compilez et installez
usign
:
git clone https://git.openwrt.org/project/usign.git
cd usign
cmake .
make
sudo make install
Au lieu de définir (
sudo make install
), vous pouvez simplement vous rappeler oĂč se trouve le binar afin de le tirer davantage avec vos mains.
Maintenant, la configuration de base du SDK:
git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a
Permettez-moi de vous rappeler qu'au lieu de cloner depuis git, vous pouvez télécharger et décompresser l'archive avec la chaßne d'outils précompilée. N'oubliez pas de télécharger la derniÚre version!
Lors de l'exécution,
./scripts/feeds update -a
nous clonons / mettons à jour tous les référentiels à partir de feeds.conf (.default), vérifions les dépendances et préparons un répertoire
staging_dir/host/bin
avec des fichiers exécutables (ce sont principalement des liens symboliques vers des utilitaires systÚme). La commande suivante
./scripts/feeds install -a
,, pousse les liens symboliques dans
package/feeds
, d'oĂč ils seront extraits pour la compilation. Ces deux commandes ne sont pas nĂ©cessaires pour crĂ©er mon package personnalisĂ©.
Le suivant est exécuté
make menuconfig
... Vous pouvez l'ignorer, mais lors de la compilation du package, il affichera toujours la fenĂȘtre appropriĂ©e. Dans celui-ci, il suffit de changer la cible et le sous-objectif pour que tout soit compilĂ© sous x86_64 et quitter, en acceptant de sauvegarder la configuration. Vous devrez Ă©galement collecter des outils d'assemblage auxiliaires (
make tools/install
) et une chaĂźne d'outils (
make toolchain/install
). Si vous avez téléchargé le SDK à partir de l'archive, les
make menuconfig
options de choix d'une cible ne s'afficheront pas et l'assemblage de la boßte à outils et de la chaßne d'outils n'est pas nécessaire - tout est déjà en place.
Maintenant, je crée un répertoire
package/devel/hello
dans lequel je place le
Makefile
contenu suivant:
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))
Fondamentalement, tout doit ĂȘtre clair sans explication. Les fichiers du framework sont connectĂ©s, les principaux paramĂštres du package sont dĂ©crits,
@GNU
remplacés par les miroirs du projet GNU (définis dans le framework), et le chemin se compose de deux parties:
PKG_SOURCE_URL
qui spécifie l'URL de base pour toutes les versions et est développé par concaténation avec le nom de fichier d'
PKG_SOURCE
une barre oblique. Il
Package/hello/install
contient des instructions pour assembler des binaires dans une archive
data.tar.gz
. Des options de construction supplémentaires, si nécessaire, sont disponibles dans la documentation . Au fait, n'oubliez pas que make est trÚs pointilleux sur l'indentation, j'avais des onglets simples au lieu d'espaces de début.
Appelle encore une fois
make menuconfig
, vérifiez que le paquet hello est marqué dans la section indiquée (Développement dans mon cas) et quittez en sauvegardant la configuration. Enfin, nous assemblons le package en trois étapes; télécharger, décompresser et compiler:
make package/hello/download make package/hello/prepare make package/hello/compile
En conséquence, j'ai reçu un colis
bin/packages/x86_64/base/hello_2.9-1_x86_64.ipk
. Vous pouvez créer un référentiel. Nous générons une paire de clés (
usign -G -c 'openwrt test repo' -s key-build -p key-build.pub
la clĂ© privĂ©e doit ĂȘtre appelĂ©e `clĂ© build`) et recueillez le dĂ©pĂŽt:
make package/index
. A ce stade, l'assemblée peut jurer de l'absence
usign
dans le répertoire avec des outils auxiliaires, j'ai décidé de problÚme symlink:
ln -s `which usign` staging_dir/host/bin/usign
. Maintenant, à cÎté du package se trouve l'ensemble complet requis pour le référentiel.
Vérification du référentiel avec le package
Vous pouvez tout vĂ©rifier sur un vrai routeur (n'oubliez pas de choisir la bonne cible), mais j'ai utilisĂ© Docker. En Dokerhabe ont l' image OpenWrt pour x86_84, qui peut ĂȘtre exĂ©cutĂ©, cerise dans le rĂ©pertoire conteneur avec le SDK:
sudo docker run -it --name openwrt_test -v $PWD:/opt openwrtorg/rootfs
. Appuyez sur le bouton Entrée jusqu'à ce que l'invite Bash apparaisse.
Je copie la clé du répertoire transmis (le
cp /opt/key-build.pub /etc/opkg/keys/usign -F -p /opt/key-build.pub
nom de la clé doit nécessairement correspondre à l'identifiant), ajoute mon référentiel local (
echo src/gz local file:///opt/bin/packages/x86_64/base >> /etc/opkg/customfeeds.conf
), mets à jour le référentiel (
opkg update
). La conclusion commence par un texte encourageant, tout est signé correctement:
# 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.
Il ne reste plus qu'à installer et vérifier:
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!
Hourra, c'est fait! Malgré la documentation dispersée dans les articles, le processus de création de packages est assez simple.