【第 2 回】 OpenWrt開発入門 ファームウェアイメージの作成とインストール
この記事に掲載しているOpenWrtの設定方法は執筆時点で最新のOpenWrt22.03に基づいています。 過去もしくは最新版のOpenWrtではこの記事の内容が当てはまらないかもしれません。予めご了承ください。
この記事ではOpenWrt入門のはじめとして、公式GitHubリポジトリからOpenWrt SDKをダウンロードし、 専用ビルドシステムであるbuildrootでファームウェアイメージを作成、インストールしてみます。
今回は例として、Raspberry Pi3B用のOpenWrtファームウェアイメージを作成します。
それでは、行ってみます。
目次
- 実施環境と補足事項について
- OpenWrt SDKの取得
- buildrootの使用準備
- ファームウェアイメージ作成
- Raspberry Pi Imagerによるファームウェア書き込み
- おわりに
- 参考文献
実施環境と補足事項について
この記事は以下の環境で実施した結果を元に作成しています。
※今回はOpenWrtをRaspberry Pi3Bにインストールしていますが、基本的な設定はどのデバイスでも共通です。
- #作業用PCの実行環境OS
- ubuntu 22.04 LTS 64bit
- #ターゲットデバイス
- 名称:Raspberry Pi3 Model B
- CPU:ARM Cortex-A53 (1.2GHz)
- SOC:Broadcom BCM2837
- RAM:1GB
- ストレージ(media):MicroSDカード
- #インストール対象OS
- OpenWrt 22.03
また、記事内で紹介するコンソール表記は次の通りです
- 作業用PCのコンソール表記
- ユーザー名とカレントディレクトリを色付けして表記します。
user:~/openwrt$ command
OpenWrt SDKの取得
OpenWrt SDKは公式のGitHubリポジトリにあります。
そのため、まずはGitコマンドでリポジトリをクローンするか、GitHubページ右上の緑ボタンからopenwrt-master.zipをダウンロードします。
今回はGitコマンドを使用してユーザーのホームディレクトリ直下にOpenWrtリポジトリをクローンします。
kamo@kamo:~$ git clone https://github.com/openwrt/openwrt.git
結果はこんな感じになりますね。
それではopenwrtディレクトリの中へ移動して中身を見てみましょう。
すると、たくさんのディレクトリやファイルが存在することが分かります。 これらはOpenWrtに必要なビルド設定やアプリケーションのパッケージ情報などを含んだものです。
主にOpenWrtのビルドシステムであるbuildrootが読み込んでファームウェアイメージを作成するために必要となります。 もちろん、buidroot本体もこの中にあります。
以上から、このディレクトリがbuildrootのルートディレクトリとなります。
この後説明するbuildrootへの操作は全てこの階層(openwrtディレクトリ直下)で実施する必要があります。
補足
今回はmasterリポジトリのSDKをそのまま使用していますので、作成されるファームウェアイメージのOpenWrtバージョンは現行最新の OpenWrt22.03.xです。しかし、人によっては旧バージョンを使用したい場合があるかもしれません。そのような場合は、上記のcloneコマンド の実行でopenwrtディレクトリを作成した後に、これをカレントディレクトリとした上で、次のcheckoutコマンドでブランチ切り替えをしてください。 (なお、現在のリポジトリがstableかnonstableかはgit hashを確認してください。明確にstableのものをビルドしたい方は、git hashの指定も必要です。)
- lede17.01
- openwrt18.06
- openwrt19.07
- openwrt21.02
- openwrt22.03
kamo@kamo:~/openwrt/$ git checkout lede-17.01
kamo@kamo:~/openwrt/$ git checkout openwrt-18.06
kamo@kamo:~/openwrt/$ git checkout openwrt-19.07
kamo@kamo:~/openwrt/$ git checkout openwrt-21.02
kamo@kamo:~/openwrt/$ git checkout openwrt-22.03
後は、次節に従ってファームウェアイメージを作成してください。
buildrootの使用準備
前節では、Gitコマンドを用いて公式GitHubリポジトリからユーザーのホームディレクトリにOpenWrt SDKリポジトリをクローンし、作成されたopenwrtディレクトリの中身を見てみました。
本来であれば、この後はbuidrootを実行させてRaspberry Pi3B用のファームウェアイメージを作りたいところですが、このままでは実行できません。
buildrootを実行するには、依存パッケージのインストールをする必要があります。
依存パッケージのインストールの組み合わせは実行環境OS(Linuxディストリビューション)によって異なります。 ご自身のLinux OSをご確認の上、こちらのページを参考にパッケージをインストールしてみてください。
この記事では実行環境OSとして、ubuntu 22.04 LTS 64bitを使用していますので下記のパッケージをインストールします。 (以下のパッケージインストール例は、2022年時点のものです。最新のパッケージ更新などの影響で必須パッケージの名前や構成が変更されている可能性があります。 上手く行かない場合は公式サイトの最新情報(上記の青字リンク「こちら」)を確認してください。)
kamo@kamo:~$ sudo apt update kamo@kamo:~$ sudo apt install build-essential gawk gcc-multilib flex git gettext \ libncurses5-dev libssl-dev python3-distutils rsync unzip zlib1g-dev clang
また、ビルドツールも必要ですので、次のコマンドでGNU Makeもインストールします。
kamo@kamo:~$ sudo apt install make
これでbuildrootに必要な準備が整ったはずです。
さっそく、実行してみましょう。
openwrtディレクトリ直下に移動して、ユーザー権限で次のコマンドを実行してください。
※つまり、root権限(sudo付き)で実行しないでください。これ以降も同様です。
kamo@kamo:~/openwrt$ ./scripts/feeds update -a kamo@kamo:~/openwrt$ ./scripts/feeds install -a kamo@kamo:~/openwrt$ make menuconfig
注意
上記の./scripts/feeds update -a
はgitリポジトリから関連するパッケージ情報(feed)をダウンロード
する処理ですが、失敗するときがあります。
コンソールにunnable to access ~
と表示されたら該当パッケージ情報のダウンロードに失敗しています。
この場合、後に続くこの記事の手順が正常にできない可能性があります。
unnable to access ~
という表示があったら、もう一度./scripts/feeds update -a
を
実行してパッケージ情報のダウンロードを完了しましょう。(何回か実施する or 時間を置いてトライすれば行けるはずです。)
正常に実行されると下図のコンフィグ画面のTOPが表示されます。これでbuildrootの実行は成功です。
※ここで「Prerequisite check failed. Use FORCE=1 to override.」と表示されたら、buildrootに必要なパッケージが不足しています。 もう一度、こちらのページを参考にトライしてみてください。
次節では、このbuildrootのコンフィグ画面からターゲットとなるRaspberry Pi3B用の設定をしてファームウェアイメージを作成します。
ファームウェアイメージ作成
buildrootのコンフィグ画面ではファームウェアイメージのターゲット設定が出来ます。
今回はRaspberry Pi3B用のファームウェアイメージを作りたいので、そのようにターゲット設定をします。
OpenWrtのサポートページを見ると、 Raspberry PiのターゲットシステムはBCM27xxとしてサポートされているようです。 そして、モデル別のターゲット名(ターゲットファミリ)は以下の表の通りになっています。
モデル | ターゲット名 |
---|---|
Raspberry Pi1 | BCM2708 |
Raspberry Pi2 | BCM2709 |
Raspberry Pi3 | BCM2710 |
Raspberry Pi4 | BCM2711 |
Raspberry Pi5 | BCM2712 |
今回はRasbbery Pi 3Bがターゲットですのでbcm2710を指定する必要があります。
それでは、実際に設定をしていきましょう。
はじめに、先ほど掲載したコンフィグ画面TOPの最上部にあるTarget Systemを選択します。
すると、次の画面が表示されますので、今回のターゲットシステム(BCM27xx)を選択します。
選択が終わったらTOP画面に戻り、次はSubtargetを開きます。 ここでは、Raspberry Pi3Bのターゲットファミリであるbcm2710を指定します。
これで、ファームウェアイメージを作るための最低限の設定はできたはずです。
確認のため、Target Profile画面を開きましょう。
今までの設定が正常に反映されていれば、Raspberry Piのプロファイルにチェックが入っています。
以上により、buildrootのターゲットデバイス設定は終了です。最後に、WebUIのLuCIを選択して設定を完了しましょう。
LuCIはコンフィグ画面TOPに表示されている項目からLuCI > Collections > luciで指定できます。
「luci」にチェックを入れたら、Exitボタンでコンフィグ画面を閉じましょう。 設定をセーブしていない場合は、セーブ確認のダイアログが表示されますのでYESを選択してください。
これで、ターミナルコンソールにユーザー操作が戻ってきます。
後は下記のMakeコマンドを実行すればファームウェアイメージのビルドが開始されます。
さっそくやってみましょう。
注意その1:初回ビルドは以下のように、makeコマンドのオプションを-j1としてください。2回目以降のビルドは下の補足に従って変更してもOKです。
注意その2:お使いのPC環境により、初回ビルドは長時間(1~2h)掛かる場合があります。
kamo@kamo:~/openwrt$ make -j1 V=s
補足:上記コマンドの-jオプションは、ビルド処理の並列化で使用するコア数の指定です。私は4コアのCPUを搭載したパソコンを持っていますので、最大で-j4(コア数:4)まで指定できます。 一般的に、並列処理させるコア数が多ければ、短時間でビルド作業が完了します。最近のハイエンドPCなら-j24とかも指定できると思います。うらやましい。
ファームウェアイメージのビルドが完了すると、openwrtディレクトリに新たなディレクトリ・ファイルが追加されます。
そして、これら追加ディレクトリの1つであるbinディレクトリに作成したファームウェアイメージが格納されます。
今回の場合では、bin/targets/BCM27xx/bcm2710の中にファーウェアイメージがあるので見てます。
すると、4つのファームウェアイメージが格納されていることが確認できます。
これらは次の表に示す形式のファームウェアイメージです。
イメージファイル名 | フォーマット | 用途 |
---|---|---|
openwrt-BCM27xx-bcm2710-rpi-3-ext4-factory.img.gz | ext4 | フルインストール用 |
openwrt-BCM27xx-bcm2710-rpi-3-ext4-sysupgrade.img.gz | ext4 | アップデート用 |
openwrt-BCM27xx-bcm2710-rpi-3-squashfs-factory.img.gz | squashfs | フルインストール用 |
openwrt-BCM27xx-bcm2710-rpi-squashfs-sysupgrade.img.gz | squashfs | アップデート用 |
- フルインストール用
-
ファームウェアをメディアにゼロから書き込む際に使用するイメージファイルです。
製品製造時などで工場で書き込まれることにちなんでfactoryという名称が良く付きます。 - アップデート用
-
既にファームウェアがインストールされている場合に使用されるアップデート用イメージファイルです。
一般的に、インストールされているファームウェアのアップデート機能から使用します。
つまり、今回は2つのファイルフォーマット(ext4、squashfs)別にフルインストール用とアップデート用のイメージファイルができたことになります。
イメージファイルのフォーマット指定はbuildrootのコンフィグ<Target Image>から変更が可能です。 今回はデフォルト設定のままビルドしたので、結果として上記4つのイメージファイルが出来ました。
ということで、ファームウェアイメージが無事作れましたので、後はメディアに書き込めばOKです。
今回はopenwrt-BCM27xx-bcm2710-rpi-3-ext4-factory.img.gzをMicroSDカードに書き込んでみます。
【補足】その他デバイスへのOpenWrtインストールについて
Rasberry PiはMicro SDカードなどのリムバーブルメディアにファームウェアイメージを書き込むことでOpenWrtをインストールできます。そのため、次節で紹介するRasberry Pi Imagerやrufusを使用することで、 今回はRaspberry Pi3Bに差し込むMicro SDカードにOpenWrtファームウェアイメージを書き込む(インストールする)ことができます。しかし、OpenWrtをインストールしたい対象デバイスによっては、そのような 書き込み方法が通用しない場合があります。その場合は、そのデバイスに予めインストールされているファームウェアのアップデート機能または、そのブートローダーの インストール機能(例:uboot tftpブート)でファームウェアイメージを書き込める可能性があります。いずれにしても、どの方法でファームウェアイメージを書き込めるかは、そのデバイスの対応によります。デバイスのOpenWrtインストール実績とその方法を各自確認してください。Raspberry Pi Imagerによるファームウェア書き込み
ファームウェアイメージをメディアに書き込むツールとして今回はRaspberry Pi Imagerを使用します。
これはRaspberry Pi公式サイトが配布しているRaspberry Pi専用書き込みツールです。
ubuntu・Mac OS・windows版があります。
今回はubuntu版のRaspberry Pi Imagerを使ってみましょう。
次のコマンドでインストールして起動します。
kamo@kamo:~$ sudo apt install rpi-imager kamo@kamo:~$ rpi-imager
Raspberry Pi Imagerのメイン画面が表示されるはずです。
CHOOSE OSボタン->USE CUSTOMボタンを押して、openwrt-BCM27xx-bcm2710-rpi-3-ext4-factory.img.gzを選択しましょう。
こんな感じですね。
後は、CHOOSE STORAGEボタンでメディアを選択します。
今回はMicroSDカードを選択します。
最後にWRITEボタンを押して、書き込みを開始しましょう。
書き込みが完了したら、MicroSDカードをRaspberry Pi3Bに差し込んで起動します。
OpenWrtのIPアドレス・ユーザーID/パスワードの初期設定は下記のようになっています。
IPアドレス | ユーザーID | パスワード |
---|---|---|
192.168.1.1 | root | なし |
作業用PCとRaspberry Pi3BをLANケーブルで繋ぎ、次のコマンドでSSH接続を試みます。
kamo@kamo:~$ ssh 192.168.1.1 -l root
成功するとOpenWrtのコンソール画面が表示されます。
これで、Raspberry Pi3BへのOpenWrtインストールは完了です。
おわりに
今回はOpenWrt SDKのダウンロードからファームウェアイメージの作成、そしてインストールまでをやってみました。
結果として、Raspberry Pi3B(OpenWrtデバイス)を動かすところまで行けましたが、無線LANアクセスポイント(AP)やルーターとして運用するには追加設定が必要です。
ということで、次回はOpenWrtのUCIコンフィグレーションファイルをUCIコマンドによって変更し、ネットワーク・Wi-Fi通信ができるようにしてみます。
おまけ:UART接続によるコンソールログインについて
絶対ではありませんが、OpenWrtデバイスを弄る際に便利なのがホストPCとのUART接続によるコンソールログインです。
UART接続でOpenWrtのコンソールにログインできれば、ネットワーク設定などをミスってもOpenWrtデバイスに対する操作を続行できます。 (通常、OpenWrtはユーザーインタフェースをネットワーク通信のみで提供しますので、ネットワークに問題が発生すると操作できなくなります)
UART接続にはシリアルコンバーター(USB to TTL)と呼ばれる機材が必要ですが、OpenWrtの中身を深く弄りたい場合は利用をおススメします。 特にネットワーク設定を試行錯誤で弄りたいときはなおさらです。
UART接続の方法は【第9回】OpenWrt開発入門 UART接続によるコンソールログイン方法の紹介を参照してみてください。
- 第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 Wiki] Welcome to the OpenWrt Project: https://openwrt.org/start
- [OpenWrt Wiki] Build system setup: https://openwrt.org/docs/guide-developer/toolchain/install-buildsystem
- [OpenWrt Wiki] Raspberry Pi: https://openwrt.org/toh/raspberry_pi_foundation/raspberry_pi
- [OpenWrt Wiki] Using the SDK: https://openwrt.org/docs/guide-developer/toolchain/using_the_sdk