
OpenWrtは、パッケージマネージャー、または独自のフォークとしてopkgを使用します。Debianエンジニアは、同様のコマンド、同様のリポジトリ、パッケージ形式など、さまざまな点で使い慣れていることに気付くでしょう。
LUCIにパッチを適用したかったのですが(これは記事には含まれません)、適切な簡単な紹介が見つかりませんでした。散在するドキュメント、記事、例から情報の断片を個別に収集し、コードと作業の結果を確認する必要がありました。ボーナスとして、まだリポジトリにないプリミティブな(しかし実際には役に立たない)パッケージを収集しました。収集した教育プログラムを以下に共有します。
リポジトリデバイス
OpenWrtファイルシステムに
/etc/opkg/distfeeds.conf
は、リポジトリのシステム(OpenWrtおよびopkg開発者によって提供される)リストを指定するファイルがあります。自社およびサードパーティのリポジトリは、で指定できます
/etc/opkg/customfeeds.conf
。形式は1行で、次の3つの単語で構成されます。
src
またはsrc/gz
、ファイルをダウンロードするPackages
かどうかによって異なりますPackages.gz
。コードから判断すると、最初の単語には他のオプションがありますが、これに関連するリポジトリは見つかりませんでした。src
名前にもかかわらず、これはバイナリパッケージのリポジトリです。Opkgには、Debian / APTで使用されるものと同様のソースパッケージ用の特別なリポジトリ形式はありません。- opkg / OpenWrt用語でのリポジトリまたは「フィード」の名前。
Packages
/を含むURLPackages.gz
。
実行されるか
opkg update
、URLに
/
追加されると、パッケージと署名のリストがに保存され、ファイルはリポジトリのリストの2番目の単語に従って名前が付けられます。これから2つの重要な結論があります:
Packages
Packages.gz
/tmp/opkg-lists
- 再起動時に、キャッシュはクリアされます。ルーターのような組み込みシステムでは、これは完全に理にかなっています。
/etc/opkg/customfeeds.conf
システムフィードを独自のもので上書きして、同じ名前を付けることができます。opkgは誓いますが、オーバーライドを飲み込み、以前にロードされたファイルの代わりに目的のファイルを追加します。
同時に、ロードされ
Packages.sig
ます。これには、解凍されたパッケージのリストのハッシュが含まれている必要があります。リスト自体は単にパッケージをリストし、各パッケージにはいくつかの値があり、異なるパッケージの値は空の行で区切られています。各パッケージの最も重要なフィールドは次のとおりです。
Package
、 パッケージ名;Version
、バージョン、同じ名前のパッケージが複数ある場合は、バージョンを選択できます。デフォルトで最新のものがインストールされます。Depends
、他のパッケージによっては、パッケージマネージャーは、リストされているパッケージがシステムに存在しない場合、それらをインストールします。Filename
、ファイルへのパスはリポジトリのベースURLを基準にしています。通常、リポジトリはフラットで、すべてが `Packages.gz`と同じ場所にあります。SHA256sum
リポジトリによって宣言されたパッケージハッシュ。
詳細が必要な場合は、ブラウザでこれらのリストの1つを読むことができます。
バイナリパッケージ
バイナリパッケージは、Debianパッケージとほぼ同じです。違いは次のとおりです。
- の
.ipk
代わりに拡張子.deb
。 - `tar`
gzip
, . Debianar
,.tar.xz
, .
OpenWrtのパッケージ拡張子をに変更し
.tar.gz
て解凍すると、2つのアーカイブと1つのテキストファイル内にあります。このファイルには名前が付けられ
debian-version
ており、バイナリファイル形式のバージョンが含まれているため、あまり興味がありません
2.0
。最近のシステムでは、このバージョンは常にと同じです。
アーカイブに
data.tar.gz
は、実行可能ファイル、構成ファイル、およびパッケージがインストールされているすべてのものが含まれています。ファイルシステムのルートに解凍すると、期待されるすべてのファイルが適切な場所
/usr/bin/
、
/etc/
などに表示されます。
そして
control.tar.gz
、パッケージマネージャー用の補助ファイルがあります。インストールと削除の前または後に実行する必要があります。このスクリプト(
preinst
、
postinst
、
prerm
、
postrm
)、構成であるファイルに関する情報、およびパッケージに関するメタ情報。。に含まれているものとほぼ同じ
Packages
です。
パッケージビルドシステム
アセンブリシステム(別名SDK)は、Makeフレームワークの形式で作成されます。フレームワークは、パッケージを個別にビルドすることを意味するものではなく、その主なタスクはリポジトリ全体をビルドすることです。
SDK
x86_64
はgitにあります。組み立てのためにツールチェーンをコンパイルする時間を節約できるアーカイブがあります(リンクはまもなく古くなりますが、新しいものを見つけるのは難しくありません)。内部では、ファイルが特に重要
feeds.conf.default
です。形式は単純で、スペースで区切られています。
- キーワード
src-git
。gitがサポートされているだけでなく、他のVCSにはリポジトリがありません。 - フィード名。
- コミットまたはタグを指定できるgitリポジトリURL。そのような仕様の名前を知っているなら、教えてください。
パッケージ自体を含むリポジトリは可能な限りシンプルです。リポジトリのルートにはパッケージカテゴリがあり、第2レベルにはパッケージ名のディレクトリがあり、その中には
Makefile
オプションで、実行中の追加オプション用の `Config.in`と、対応するコンテンツの
make menuconfig
あるサブディレクトリ
patches
があります。最も単純なパッケージの場合、のみ
Makefile
。たとえば、メインリポジトリのミラーを見ることができます。
テストビルド
SDKがどのように機能するかをテストするために、GNUFelloをビルドしてみました。これは比較的巨大なHelloWorldであり、GNUプロジェクトのガイドラインに厳密に従って記述されています。その唯一の目的は、これらのガイドラインを説明することです。個別のリポジトリを作成しませんでしたが、代わりに基本的なSDKパッケージに「スリップ」し、そこからコンパイルしました。
必要Debianパッケージ囲まSDKの動作のための
libncurses-dev
(メニューの組み立てのために)、
build-essential
(Cに応じGCCおよび他の標準的なプログラムの、)、 、
gawk
、、および。また、収集したパッケージからリポジトリを作成するには、キーを生成するためのユーティリティが必要になります。リポジトリにはないので、ビルドにはさらに `cmake`が必要になります。このツールは、GPGと
unzip
file
rsync
python3
usign
signify-openbsd
ただし、OpenWrtプロジェクトによって推奨および開発されており、はるかに使いやすくなっています。
コンパイルしてインストール
usign
:
git clone https://git.openwrt.org/project/usign.git
cd usign
cmake .
make
sudo make install
(
sudo make install
)を設定する代わりに、手でさらに引っ張るために、バイナリがどこにあるかを簡単に覚えることができます。
次に、基本的なSDKのセットアップ:
git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a
gitからクローンを作成する代わりに、プリコンパイルされたツールチェーンを使用してアーカイブをダウンロードして解凍できることを思い出してください。最新バージョンをダウンロードすることを忘れないでください!
実行時に
./scripts/feeds update -a
、feeds.conf(.default)からすべてのリポジトリを複製/更新し、依存関係を確認
staging_dir/host/bin
して、実行可能ファイルを含むディレクトリを準備します(これらは主にシステムユーティリティへのシンボリックリンクです)。次のコマンドは
./scripts/feeds install -a
、シンボリックリンクをに押し込み
package/feeds
、そこからコンパイルに使用されます。これらの2つのコマンドは、カスタムパッケージのビルドには必要ありません。
次が実行されます
make menuconfig
..。スキップすることもできますが、パッケージをコンパイルするときに、適切なウィンドウが表示されます。その中で、すべてがx86_64でコンパイルされて終了し、構成を保存することに同意するように、ターゲットとサブターゲットを変更するだけで十分です。また、補助アセンブリツール(
make tools/install
)とツールチェーン(
make toolchain/install
)を収集する必要があります。アーカイブからSDKをダウンロードした場合
make menuconfig
、ターゲットを選択するためのオプションは表示されず、ツールキットとツールチェーンを組み立てる必要はありません。すべてがすでに整っています。
次に
package/devel/hello
、
Makefile
次のコンテンツを配置するディレクトリを作成します。
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))
基本的に、説明なしですべてが明確でなければなりません。フレームワークファイルが接続され、パッケージの主要なパラメータが記述
@GNU
され、GNUプロジェクトのミラー(フレームワークで定義されている)に置き換えられます。パスは2つの部分で構成
PKG_SOURCE_URL
されます。これは、すべてのバージョンのベースURLを指定し、ファイル名を
PKG_SOURCE
スラッシュで連結することによって展開されます。これは、
Package/hello/install
アーカイブにバイナリを組み立てるための手順が記載されてい
data.tar.gz
。必要に応じて、追加のビルドオプションがドキュメントで利用可能です。ちなみに、makeはインデントについて非常にうるさいことを忘れないでください。先頭のスペースの代わりに単一のタブがありました。
もう一度電話してください
make menuconfig
、指定されたセクション(私の場合は開発)でhelloパッケージがマークされていることを確認し、構成の保存を終了します。最後に、3つのステップでパッケージを組み立てます。ダウンロード、解凍、実際のコンパイル:
make package/hello/download make package/hello/prepare make package/hello/compile
その結果、パッケージを受け取りました
bin/packages/x86_64/base/hello_2.9-1_x86_64.ipk
。リポジトリを構築できます。キーペアを生成し(
usign -G -c 'openwrt test repo' -s key-build -p key-build.pub
、秘密キーは `key-build`と呼ばれる必要があります)、リポジトリを収集します
make package/index
。この段階で、アセンブリは
usign
補助ツールを使用してディレクトリに存在しないことを誓うことができます。私は問題をシンボリックリンクすることにしました
ln -s `which usign` staging_dir/host/bin/usign
。パッケージの隣には、リポジトリに必要な完全なセットがあります。
パッケージと一緒にリポジトリをチェックする
実際のルーターですべてをチェックできますが(正しいターゲットを選択することを忘れないでください)、私はDockerを使用しました。Dokerhabeには、x86_84用のOpenWrtイメージがあります。これは、SDKを使用してコンテナーディレクトリ内でアイシングして実行できます
sudo docker run -it --name openwrt_test -v $PWD:/opt openwrtorg/rootfs
。Bashプロンプトが表示されるまで、Enterボタンを押します。
転送されたディレクトリからキーをコピーし(キーの
cp /opt/key-build.pub /etc/opkg/keys/usign -F -p /opt/key-build.pub
名前は必ず識別子と一致する必要があります)、ローカルリポジトリを追加し(
echo src/gz local file:///opt/bin/packages/x86_64/base >> /etc/opkg/customfeeds.conf
)、リポジトリを更新します(
opkg update
)。結論は励ましのテキストから始まり、すべてが正しく署名されています。
# 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.
インストールして確認するだけです。
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!
やあ、終わった!記事全体にドキュメントが散在しているにもかかわらず、パッケージ構築プロセスはかなり簡単です。
