【第 7 回】 OpenWrt開発入門 パッケージマネージャーソフト(opkg)の使い方とリポジトリ設定
この記事に掲載しているOpenWrtの設定方法は執筆時点で最新のOpenWrt22.03に基づいています。 過去もしくは最新版のOpenWrtではこの記事の内容が当てはまらないかもしれません。予めご了承ください。
この記事では、OpenWrt専用パッケージマネージャーソフト(opkg)の基本的な使い方と自作パッケージ用リポジトリの設定方法について紹介します。
自作パッケージ用リポジトリの設定では、前回記事で作成したduckdump用にリポジトリを設定します。 これによって、opkgが管理するパッケージリスト情報に自作パッケージのduckdumpを登録します。
リポジトリを介することで、自作パッケージのインストールだけでなく、アップグレードも可能になります。
それでは行ってみましょう。
目次
- 実施環境と補足事項
- 基本的なopkgの使い方
- opkgの設定ファイル
- リポジトリを介した自作パッケージインストール
- 自作パッケージのアップグレード
- おわりに
- [追記] このブログサイトにリポジトリを設置してみた
- 連載記事のおわり
- 参考文献
実施環境と補足事項
この記事は以下の環境で実施した結果を元に作成しています。
- #開発用PCの実行環境OS
- ubuntu 22.04 LTS 64bit
- #OpenWrtデバイス
- 名称:Raspberry Pi3 Model B
- CPU:ARM Cortex-A53 (1.2GHz)
- SOC:Broadcom BCM2837
- RAM:1GB
- ストレージ(media):MicroSDカード
- #OpenWrt
- OpenWrt 22.03
また、記事内で紹介するコンソール表記は次の通りです。
- 開発用PCのコンソール表記
- ユーザー名とカレントディレクトリを色付けして表記します。
- OpenWrtのコンソール表記
- ユーザー名はroot@OpenWrtです。
user:~/openwrt$ command
root@OpenWrt:~# command
なお、前提環境として、開発用PCからOpenWrtデバイスにSSH接続できる必要があります。予め確認しておきましょう。 ※SSH接続の仕方が不明な方は連載記事の第3回を参考にしてください。
基本的なopkgの使い方
ここでは、opkgの主なコマンドについて紹介します。
- updateコマンド
- リポジトリからパッケージリストを取得・更新します。
- 新たにopkgに認識させたいリポジトリがあるときや、パッケージの最新バージョンが配信されたときに実行します。 これによって、opkgのパッケージリストは最新に保たれ、次に紹介するinstallコマンドで指定パッケージの最新版をインストールすることができます。 ※パッケージリストは/tmp/opkg-listsで管理されます。
- installコマンド
- パッケージまたはipkファイル指定で対象のアプリケーションをインストールします。
- 指定パッケージによるインストールでは、opkgが管理するパッケージリストに対象パッケージ情報が予め登録されている必要があります。 updateコマンドを実行することで、リポジトリから最新のパッケージ情報を取得できます。
- removeコマンド
- 指定パッケージをアンインストールします。
- アンインストール時に対象アプリケーションが実行中の場合、初期化スクリプト(/etc/init.d/~)の停止処理(stop)が実行された 上でアンインストールが開始されます。
- upgradeコマンド
- 指定パッケージの最新版が存在する場合に限り、アップグレードが実行可能です。
- listコマンド
- opkgが管理するパッケージリストを表示します。
- 引数なしで全てのパッケージリストを表示します。また、パッケージ名を引数として指定すると対象パッケージ情報のみを表示します。
-
なお、既にインストール済みパッケージ情報のみを表示させたい場合は、
opkg list-installed [<package>]
で実行します。
root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg install <package> or <ipk file>
root@OpenWrt:~# opkg remove <package>
root@OpenWrt:~# opkg upgrade
アップグレードをするには予め、updateコマンドでパッケージリストを最新のものに更新しておく必要があります。
root@OpenWrt:~# opkg list [<package>]
他にもたくさんのコマンドがありますので、ヘルプ画面を確認して各コマンド・オプションについて理解しましょう。
opkgの設定ファイル
opkgでは、ターゲットデバイス用のリポジトリ設定とパッケージ取得時に使用する公開鍵をファイル別に次の階層に分け、管理しています。 各設定ファイルとディレクトリについて説明します。
distfeeds.confとcustomfeeds.conf
リポジトリURLを管理する設定ファイルです。
updateコマンドやinstallコマンドを実行したときに、これらの設定ファイルに記載されたリポジトリから指定パッケージリスト情報やパッケージ本体をダウンロードします。 設定ファイルは2つ存在しますので、それぞれのファイルについて説明します。
①distfeeds.conf
デフォルトリポジトリのURLを記載したファイルです。
次はRaspberry Pi3Bのdistfeeds.confの記載例です。
root@OpenWrt:/etc/opkg# cat distfeeds.conf src/gz openwrt_core https://downloads.openwrt.org/snapshots/targets/bcm27xx/bcm2710/packages src/gz openwrt_base https://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/base
ターゲットデバイス用のリポジトリURLが記載されています。このファイルの内容はファームウェアイメージ作成時におけるbuildrootのターゲットデバイス設定で自動決定されます。
②customfeeds.conf
ユーザー指定のカスタムリポジトリURLを記載する設定ファイルです。
root@OpenWrt:/etc/opkg# cat customfeeds.conf # add your custom package feeds here # # src/gz example_feed_name http://www.example.com/path/to/files
この設定ファイルはデフォルトでは空です。
次節では、このcustomfeeds.confに対して、開発用PC上に構築した簡易WebサーバーのURLを記載します。
簡易Webサーバーのドキュメントルートをローカルリポジトリとして設定することで、そのドキュメントルートに存在する自作パッケージのダウンロードを可能にします。
keysディレクトリ
パッケージダウンロードに使用する公開鍵ファイル(Ed25519鍵)を管理するディレクトリです。
公開鍵ファイル(と署名鍵ファイル)は第2回記事で紹介した「make -j1 V=s」(と次節で紹介する「make package/index」)によって作成されます。OpenWrtデバイスはリポジトリにアクセスしたときに
公開鍵と署名鍵の照合により、パッケージをダウンロードします。これによって、パッケージ改ざんなどに対する対策を図っています。
このように、opkgの設定はとても単純です。
次節ではcustomfeeds.confにローカルリポジトリURLを追記して、そこからパッケージをダウンロード・インストール・アップグレード
してみます。
リポジトリを介した自作パッケージのインストール
開発用PC上に構築した簡易Webサーバーのドキュメントルートをローカルリポジトリとしてopkgに認識させ、そこから対象パッケージをダウンロード・インストール・ アップグレードする方法について紹介します。※アップグレードは次節で紹介します。
パッケージ情報の作成と更新
第6回記事では、開発用PCのopenwrtディレクトリ直下で「make package/duckdump/compile」を実行することにより、duckdumpパッケージ(ipkファイル)を作成しました。
しかし、このときの処理は自作アプリ(duckdump)のパッケージ本体であるipkファイルを作成するのみです。 opkgがパッケージ情報を認識するためにはパッケージ本体だけでなく、パッケージ情報(Packagesファイル)も必要です。
パッケージ情報は、次のコマンドをopenwrtディレクトリ直下で実行することで作成可能です。
kamo@kamo:~/openwrt$ make package/index
これにより、OpenWrt SDKが管理する全てのパッケージ情報が作成・更新されます。
パッケージを管理するディレクトリ(補足)を見てみると、Packagesと呼ばれるファイルに次のようなパッケージ情報が記載されているのが確認できます。
補足:第6回のパッケージ作成により、duckdumpパッケージは~/openwrt/bin/packages/aarch64_cortex-a53/utakamoに存在します。ちなみにaarch64_cortex-a53ディレクトリは Raspberry Pi3Bに搭載されるプロセッサの名前です。このディレクトリはbuildrootのターゲットデバイス設定で自動生成されるものです。また、その配下のutakamoは前回記事のMakefileを基に自動生成されたものです。
なお、上記コマンド(make package/index)によって、Packagesファイルと同階層に存在するPackages.sigにダウンロード用の署名情報も作成されます。この署名はopkgがリポジトリからパッケージ情報(Packagesファイル)を取得する際に、改ざんデータ チェックをするために使用されるものです。今回の例では、Packages.sigは公開鍵ファイル「b9f20e769269373c」によって署名付けされたことが分かります。
公開鍵はOpenWrtディレクトリのbuild_dir(もしくは、staging_dir)内に存在します。今回のターゲットデバイス(Raspberry Pi3B)では「~/openwrt/build_dir/target-aarch64_cortex-a53_musl/root-bcm27xx/etc/opkg/keys/b9f20e769269373c」 がPackages.sigの作成に使用されました。このOpenWrtディレクトリに対して「make V=s」を実行して作成したファームウェアイメージは、この公開鍵「b9f20e769269373c」をOpenWrtデバイス環境の/etc/opkg/keysに記録するように設定しています。
今回は第2回記事により、自分でOpenWrtのファームウェアイメージを作成してRaspberry Pi3Bにインストールしています。そのため、OpenWrtの/etc/opkg/keysには、私の開発用PCが管理する OpenWrt SDKのbuildrootが使用するパッケージの公開鍵情報(b9f20e769269373c)が予め入っています。
これで後はリポジトリを介して、opkgにこのパッケージ情報をロードすることで、インストール可能パッケージとして自作アプリ(duckdump)の存在を認識させることが出来ます。
ということで、次はリポジトリを設定してみましょう。
リポジトリ設定とパッケージインストール
まず最初に、duckdumpパッケージ本体を持つ、開発用PC上のディレクトリをドキュメントルートとする簡易Webサーバーを次のコマンドで構築します。
※このコマンドを実行するときのカレントディレクトリはパッケージが存在するディレクトリである必要があります。
kamo@kamo:~/openwrt/bin/packages/aarch64_cortex-a53/utakamo$ sudo python3 -m http.server 80
上記コマンドは第6回記事で取り上げたものと同じです。
python3でカレントディレクトリをドキュメントルートとする簡易Webサーバーを80番ポートで立てています。
開発用PC上にWebサーバーを立てたら、次はOpenWrt側の/etc/opkg/customfeeds.confに開発用PCのIPアドレス(URL)を指定します。 今回、私の開発用PCのIPアドレスは192.168.4.203/24でしたので、次のように記載します。
root@OpenWrt:/etc/opkg# vi customfeeds.conf # add your custom package feeds here # src/gz utakamo http://192.168.4.203
customfeeds.confへの記載が終わったら、さっそく次のコマンドでopkgにduckdumpパッケージ情報をロードさせましょう。
root@OpenWrt:~# opkg update
これによって、duckdumpがopkgのパッケージリストに追加されます。
続いて次のコマンドにより、duckdumpをインストールすることができます。
root@OpenWrt:~# opkg install duckdump
一連の操作をまとめると次のようになります。
左の開発用PCコンソール側で簡易Webサーバーを動作させつつ、右のOpenWrtコンソール側でupdateコマンドによりパッケージ情報を取得した後、 installコマンドを実行してduckdumpパッケージをインストールします。
自作パッケージのアップグレード
前節で紹介したリポジトリ設定とパッケージのインストールが出来れば、アップグレードは簡単です。
今回の記事で題材にした自作アプリのduckdumpに何らかの修正が加わり、バージョンアップした場合は前節で紹介した「make package/index」を バージョンアップ版のdudckdumpパッケージ作成後にOpenWrtディレクトリ直下で再実行してください。
※なお、パッケージのバージョン番号を変更するには第6回記事で紹介したMakeファイルのPKG_VERSIONの値を変更するだけです。
これにより、前節で紹介したPackagesの記載内容が更新されます。
後は、開発用PC上に簡易Webサーバーを立て、customfeeds.confにURLを設定後、次のコマンドを実行することでOpenWrtにインストール済みの対象アプリケーション
(今回の例ではduckdump)がアップグレードできます。
root@OpenWrt:~# opkg update root@OpenWrt:~# opkg upgrade duckdump
一連の操作をまとめると次のようになります。
左の開発用PCコンソール側で簡易Webサーバーを動作させつつ、右のOpenWrtコンソール側でupdateコマンドにより最新パッケージ情報を取得した後、 upgradeコマンドでduckdumpをアップグレードしています。
おわりに
今回はOpenWrt専用パッケージマネージャーソフト(opkg)の基本的な使い方とリポジトリの設定方法について紹介しました。
基本的なコマンドの使用方法を解説し、リポジトリを設定してパッケージのダウンロード・インストール・アップグレードなんかもやってみました。
今回は開発PC上の簡易Webサーバーが管理するディレクトリを(ローカル)リポジトリとして設定しましたが、もちろんインターネット上に配置したWebサーバーの特定ディレクトリをリポジトリとして設定することも可能です。
そのときは、リポジトリとするディレクトリパスを含めたWebサーバーのURLをopkgのcustomfeeds.confに記載すればOKです。
個人レベルでそこまでする人は少ないと思われますが、もし、試してみたい方はこの記事の内容をご参考ください。 ※追記:このブログにリポジトリを設置してみました。詳細は次節を参照してください。
- 第1回 OpenWrt開発入門 イントロダクション
- 第2回 OpenWrt開発入門 ファームウェアイメージの作成とインストール
- 第3回 OpenWrt開発入門 UCIコマンドによるネットワーク・Wi-Fi設定
- 第4回 OpenWrt開発入門 LuCI(WebUI)によるネットワーク・Wi-Fi設定
- 第5回 OpenWrt開発入門 作ってみようパケットキャプチャソフト
- 第6回 OpenWrt開発入門 自作アプリのパッケージ作成とインストール
- 第7回 OpenWrt開発入門 パッケージマネージャーソフト(opkg)の使い方とリポジトリ設定
- 第8回 OpenWrt開発入門 Coffee Break
- 第9回 OpenWrt開発入門 UART接続によるコンソールログイン方法の紹介
[追記] このブログサイトにリポジトリを設置してみた
せっかくなので、OpenWrt用自作アプリのリポジトリをこのブログサイトのサーバー上に設置してみました。
以下にリポジトリURLと公開鍵、パッケージリストを掲載します。
一応、Raspberry Piの全シリーズ別にリポジトリを用意しましたが、3以外はインストール確認をしていません。 大丈夫だと思いますが、念のため。
①リポジトリURL情報
ターゲットデバイス | リポジトリURL |
---|---|
Raspberry Pi1 | https://utakamo.com/repo/openwrt/raspi1/uci |
Raspberry Pi2 | https://utakamo.com/repo/openwrt/raspi2/uci |
Raspberry Pi3 | https://utakamo.com/repo/openwrt/raspi3/uci |
Raspberry Pi4 | https://utakamo.com/repo/openwrt/raspi4/uci |
②公開鍵情報
以下に、Raspberry Pi用リポジトリの公開鍵情報を掲載します。
Raspberry Pi1
Key-ID:af3a2f5c8960d37c
Key-Data:RWSvOi9ciWDTfGBeRyhLiz2aAXvuPDLQ7U/AAozOEpkEogknVpmSF8Lq
ダウンロード (https://utakamo.com/repo/openwrt/raspi1-pub-key/af3a2f5c8960d37c)
Raspberry Pi2
Key-ID:c330562967f97fa4
Key-Data:RWTDMFYpZ/l/pEFdyvHT5YU3WYgVuWF9g9rcBigaydFnp10HNM+RfOZz
ダウンロード (https://utakamo.com/repo/openwrt/raspi2-pub-key/c330562967f97fa4)
Raspberry Pi3
Key-ID:9acc38ae4227c445
Key-Data:RWSazDiuQifERVGu0omjRfQPT6B1YTIRDj0hrNLRN1rqqUlr6oSxY8an
ダウンロード (https://utakamo.com/repo/openwrt/raspi3-pub-key/9acc38ae4227c445)
Raspberry Pi4
Key-ID:9766b87701122436
Key-Data:RWSXZrh3ARIkNrxG/dzqRk4bQgbZRm02NvW+uRRmzPnCCgz3u0GrCUme
ダウンロード (https://utakamo.com/repo/openwrt/raspi4-pub-key/9766b87701122436)
③パッケージリスト情報
リポジトリに入っているパッケージは以下の通りです。
アプリケーション | 説明 | 最新バージョン |
---|---|---|
duckdump | OpenWrt開発学習用パケットキャプチャソフト(IPv4対応) | 1.0-1 |
uci-sample01 | C言語ライブラリlibuciのサンプルプログラム(uci_alloc_context関数確認用) | 1.0-1 |
uci-sample02 | C言語ライブラリlibuciのサンプルプログラム(uci_lookup_ptr関数確認用その1) | 1.0-1 |
uci-sample03 | C言語ライブラリlibuciのサンプルプログラム(uci_lookup_ptr関数確認用その2) | 1.0-1 |
uci-sample04 | C言語ライブラリlibuciのサンプルプログラム(uci_foreach_element関数確認用) ※uci showコマンドと同等のソフトウェアです。 | 1.0-1 |
uci-sample05 | C言語ライブラリlibuciのサンプルプログラム(uci_set関数確認用) ※uci setコマンドと同等のソフトウェアです。 | 1.0-1 |
uci-sample06 | C言語ライブラリlibuciのサンプルプログラム(uci_add_section関数確認用) ※uci addコマンドと同等のソフトウェアです。 | 1.0-1 |
uci-sample07 | C言語ライブラリlibuciのサンプルプログラム(uci_add_list関数確認用) ※uci add_listコマンドと同等のソフトウェアです。 | 1.0-1 |
uci-sample08 | C言語ライブラリlibuciのサンプルプログラム(uci_del_list関数確認用) ※uci del_listコマンドと同等のソフトウェアです。 | 1.0-1 |
uci-sample09 | C言語ライブラリlibuciのサンプルプログラム(uci_reorder_section関数確認用) ※uci reorderコマンドと同等のソフトウェアです。 | 1.0-1 |
uci-sample10 | C言語ライブラリlibuciのサンプルプログラム(uci_rename関数確認用) ※uci renameコマンドと同等なソフトウェアです。 | 1.0-1 |
uci-sample11 | C言語ライブラリlibuciのサンプルプログラム(uci_delete関数確認用) ※uci deleteコマンドと同等なソフトウェアです。 | 1.0-1 |
uci-sample12 | C言語ライブラリlibuciのサンプルプログラム(uci_commit関数確認用) ※uci commitコマンドと同等なソフトウェアです。 | 1.0-1 |
■上記リポジトリから特定パッケージをインストールする手順
ここではopkgに対して、Raspberry Pi3(B)用リポジトリを設定してduckdumpをインストールする例を紹介します。
手順1:customfeeds.confの編集
/etc/opkg/customfeeds.confを次のように記述します。
root@OpenWrt:/etc/opkg# vi customfeeds.conf # add your custom package feeds here # src/gz utakamo https://utakamo.com/repo/openwrt/raspi3/uci
手順2:公開鍵情報の登録
上記に掲載したRaspberry Pi3用の公開鍵情報を/etc/opkg/keysにダウンロードします。
root@OpenWrt:/etc/opkg/keys# wget https://utakamo.com/repo/openwrt/raspi3-pub-key/9acc38ae4227c445
手順3:opkg updateコマンドの実行
updateコマンドでリポジトリの各パッケージ情報を認識させ、installコマンドでパッケージを指定して実行すれば完了です。
root@OpenWrt:~# opkg update root@OpenWrt:~# opkg install duckdump
コマンドが通ると、次のようなコンソール画面が表示され、duckdumpが起動します。
root@OpenWrt:~# opkg install duckdump Installing duckdump (1.0-1) to root... Downloading https://utakamo.com/repo/openwrt/raspi3/uci/duckdump_1.0-1_aarch64_cortex-a53.ipk Installing libpcap1 (1.10.1-4) to root... Downloading https://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/base/libpcap1_1.10.1-4_aarch64_cortex-a53.ipk Configuring libpcap1. Configuring duckdump. duckdump start [target: wlan0]
以上で、リポジトリ設定からパッケージのインストールまで全て紹介できました。
おまけ:duckdumpの使い方と今後の展望
ここでインストールしたduckdumpは指定インタフェース上に流れるパケットのキャプチャログを/tmp/duckdump/cap.logに記録するアプリです。
デフォルトのキャプチャターゲットNICはwlan0なので、変更したい場合は次のコマンドを実行してください。 これはキャプチャターゲットNICをeth0に変更する例です。
root@OpenWrt:~# uci set duckdump.target.nic=eth0 root@OpenWrt:~# /etc/init.d/duckdump restart
2022年12月現在、このduckdumpはパケットキャプチャソフトとして基礎的な処理しかできません。 そのため、今後はキャプチャ対象のパケットを増やすと共に、ubusやrpcdの連携実装やLuCI用ページを設けるなどの改良を施すかもしれません。 24時間帯別の各端末通信量をグラフ表示したり、firewallのように特定端末に対してフィルタリング処理を掛けるのも 楽しそうです。
duckdumpの開発を継続する場合は、その度に仕組みや実装方法を記事にしていきたいと思います。
連載記事のおわり
7回に渡って紹介したOpenWrt開発入門はこの記事で終わりになります。
少しでも、OpenWrtについて理解してもらえたら幸いです。 (今後も既存記事のプチリライトをちょくちょくやっていきますので、見直しみると分かりやすくなっているかもしれません。)
ちなみに、今回は実験的に連載形式の記事を作りましたが、結構な時間と労力が掛かりました。
今後はライトな記事も混ぜながら、プログラミングやネットワークなどについて投稿していきたいと思います。 もちろん、OpenWrtについても投稿していきますのでよろしくお願いします。
参考文献
- Release Signing: https://openwrt.org/docs/guide-user/security/release_signatures
- エドワーズ曲線デジタル署名アルゴリズム: https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%89%E3%83%AF%E3%83%BC%E3%82%BA%E6%9B%B2%E7%B7%9A%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
- Building a single package: https://openwrt.org/docs/guide-developer/toolchain/single.package