OpenWrtバッチシステムデバイス

OpenWrtオペレーティングシステムは、ルーターのファームウェアとして一般的に使用されています。典型的なアプリケーションは、設定して忘れることです。しかし、突然何かがあなたにとって十分でない場合、あなたは配布キットを理解する必要があります。











OpenWrtは、パッケージマネージャー、または独自のフォークとしてopkgを使用しますDebianエンジニアは、同様のコマンド、同様のリポジトリ、パッケージ形式など、さまざまな点で使い慣れていることに気付くでしょう。



LUCIにパッチを適用したかったのですが(これは記事には含まれません)、適切な簡単な紹介が見つかりませんでした。散在するドキュメント、記事、例から情報の断片を個別に収集し、コードと作業の結果を確認する必要がありました。ボーナスとして、まだリポジトリにないプリミティブな(しかし実際には役に立たない)パッケージを収集しました。収集した教育プログラムを以下に共有します。



リポジトリデバイス



OpenWrtファイルシステムに/etc/opkg/distfeeds.conf



は、リポジトリのシステム(OpenWrtおよびopkg開発者によって提供される)リストを指定するファイルがあります。自社およびサードパーティのリポジトリは、で指定できます/etc/opkg/customfeeds.conf



形式は1行で、次の3つの単語で構成されます。



  1. src



    またはsrc/gz



    、ファイルをダウンロードするPackages



    かどうかによって異なりますPackages.gz



    コードから判断すると、最初の単語には他のオプションがありますが、これに関連するリポジトリは見つかりませんでした。src



    名前にもかかわらず、これはバイナリパッケージのリポジトリです。Opkgには、Debian / APTで使用されるものと同様のソースパッケージ用の特別なリポジトリ形式はありません。
  2. opkg / OpenWrt用語でのリポジトリまたは「フィード」の名前。
  3. Packages



    /を含むURL Packages.gz





実行されるopkg update



、URL/



追加されると、パッケージと署名のリストがに保存され、ファイルはリポジトリのリストの2番目の単語に従って名前が付けられます。これから2つの重要な結論があります:Packages



Packages.gz



/tmp/opkg-lists







  1. 再起動時に、キャッシュはクリアされます。ルーターのような組み込みシステムでは、これは完全に理にかなっています。
  2. /etc/opkg/customfeeds.conf



    システムフィードを独自のもので上書きして、同じ名前を付けることができます。opkgは誓いますが、オーバーライドを飲み込み、以前にロードされたファイルの代わりに目的のファイルを追加します。


同時に、ロードされPackages.sig



ます。これには、解凍されたパッケージのリストのハッシュが含まれている必要があります。リスト自体は単にパッケージをリストし、各パッケージにはいくつかの値があり、異なるパッケージの値は空の行で区切られています。各パッケージの最も重要なフィールドは次のとおりです。



  • Package



    、 パッケージ名;
  • Version



    、バージョン、同じ名前のパッケージが複数ある場合は、バージョンを選択できます。デフォルトで最新のものがインストールされます。
  • Depends



    、他のパッケージによっては、パッケージマネージャーは、リストされているパッケージがシステムに存在しない場合、それらをインストールします。
  • Filename



    、ファイルへのパスはリポジトリのベースURLを基準にしています。通常、リポジトリはフラットで、すべてが `Packages.gz`と同じ場所にあります。
  • SHA256sum



    リポジトリによって宣言されたパッケージハッシュ。


詳細が必要な場合は、ブラウザでこれらのリストの1つを読むことができます



バイナリパッケージ



バイナリパッケージは、Debianパッケージとほぼ同じです。違いは次のとおりです。



  1. .ipk



    代わりに拡張子.deb



  2. `tar` gzip



    , . Debian ar



    , .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フレームワークの形式で作成されます。フレームワークは、パッケージを個別にビルドすることを意味するものではなく、その主なタスクはリポジトリ全体をビルドすることです。



SDKx86_64



gitにあります。組み立てのためにツールチェーンをコンパイルする時間を節約できるアーカイブがあります(リンクはまもなく古くなりますが、新しいものを見つけるのは難しくありません)。内部では、ファイルが特に重要feeds.conf.default



です。形式は単純で、スペースで区切られています。



  1. キーワードsrc-git



    gitがサポートされているだけでなく、他のVCSにはリポジトリがありません。
  2. フィード名。
  3. コミットまたはタグを指定できる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!
      
      





やあ、終わった!記事全体にドキュメントが散在しているにもかかわらず、パッケージ構築プロセスはかなり簡単です。










All Articles