うたカモ技術ブログ

Linux OpenWrt ネットワーク

【第 7 回】 OpenWrt開発入門   パッケージマネージャーソフト(opkg)の使い方とリポジトリ設定

post:     update: 

この記事に掲載しているOpenWrtの設定方法は執筆時点で最新のOpenWrt22.03に基づいています。 過去もしくは最新版のOpenWrtではこの記事の内容が当てはまらないかもしれません。予めご了承ください。

この記事では、OpenWrt専用パッケージマネージャーソフト(opkg)の基本的な使い方と自作パッケージ用リポジトリの設定方法について紹介します。

自作パッケージ用リポジトリの設定では、前回記事で作成したduckdump用にリポジトリを設定します。 これによって、opkgが管理するパッケージリスト情報に自作パッケージのduckdumpを登録します。

リポジトリを介することで、自作パッケージのインストールだけでなく、アップグレードも可能になります。

それでは行ってみましょう。

目次

  1. 実施環境と補足事項
  2. 基本的なopkgの使い方
  3. opkgの設定ファイル
  4. リポジトリを介した自作パッケージインストール
  5. 自作パッケージのアップグレード
  6. おわりに
  7. [追記] このブログサイトにリポジトリを設置してみた
  8. 連載記事のおわり
  9. 参考文献

実施環境と補足事項

この記事は以下の環境で実施した結果を元に作成しています。

#開発用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のコンソール表記
ユーザー名とカレントディレクトリを色付けして表記します。
user:~/openwrt$ command
OpenWrtのコンソール表記
ユーザー名はroot@OpenWrtです。
root@OpenWrt:~# command

なお、前提環境として、開発用PCからOpenWrtデバイスにSSH接続できる必要があります。予め確認しておきましょう。 ※SSH接続の仕方が不明な方は連載記事の第3回を参考にしてください。

基本的なopkgの使い方

ここでは、opkgの主なコマンドについて紹介します。

updateコマンド
リポジトリからパッケージリストを取得・更新します。
root@OpenWrt:~# opkg update
新たにopkgに認識させたいリポジトリがあるときや、パッケージの最新バージョンが配信されたときに実行します。 これによって、opkgのパッケージリストは最新に保たれ、次に紹介するinstallコマンドで指定パッケージの最新版をインストールすることができます。 ※パッケージリストは/tmp/opkg-listsで管理されます。
installコマンド
パッケージまたはipkファイル指定で対象のアプリケーションをインストールします。
root@OpenWrt:~# opkg install <package> or <ipk file>
指定パッケージによるインストールでは、opkgが管理するパッケージリストに対象パッケージ情報が予め登録されている必要があります。 updateコマンドを実行することで、リポジトリから最新のパッケージ情報を取得できます。
removeコマンド
指定パッケージをアンインストールします。
root@OpenWrt:~# opkg remove <package>
アンインストール時に対象アプリケーションが実行中の場合、初期化スクリプト(/etc/init.d/~)の停止処理(stop)が実行された 上でアンインストールが開始されます。
upgradeコマンド
指定パッケージの最新版が存在する場合に限り、アップグレードが実行可能です。
root@OpenWrt:~# opkg upgrade アップグレードをするには予め、updateコマンドでパッケージリストを最新のものに更新しておく必要があります。
listコマンド
opkgが管理するパッケージリストを表示します。
root@OpenWrt:~# opkg list [<package>]
引数なしで全てのパッケージリストを表示します。また、パッケージ名を引数として指定すると対象パッケージ情報のみを表示します。
なお、既にインストール済みパッケージ情報のみを表示させたい場合は、opkg list-installed [<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です。

個人レベルでそこまでする人は少ないと思われますが、もし、試してみたい方はこの記事の内容をご参考ください。 ※追記:このブログにリポジトリを設置してみました。詳細は次節を参照してください。

[追記] このブログサイトにリポジトリを設置してみた

せっかくなので、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についても投稿していきますのでよろしくお願いします。

参考文献