うたカモ技術ブログ

Linux OpenWrt ネットワーク

【第 2 回】 OpenWrt開発入門   ファームウェアイメージの作成とインストール

post:     update: 

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

この記事ではOpenWrt入門のはじめとして、公式GitHubリポジトリからOpenWrt SDKをダウンロードし、 専用ビルドシステムであるbuildrootでファームウェアイメージを作成、インストールしてみます。

今回は例として、Raspberry Pi3B用のOpenWrtファームウェアイメージを作成します。

それでは、行ってみます。

目次

  1. 実施環境と補足事項について
  2. OpenWrt SDKの取得
  3. buildrootの使用準備
  4. ファームウェアイメージ作成
  5. Raspberry Pi Imagerによるファームウェア書き込み
  6. おわりに
  7. 参考文献

実施環境と補足事項について

この記事は以下の環境で実施した結果を元に作成しています。
※今回は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
  • kamo@kamo:~/openwrt/$ git checkout lede-17.01 
  • openwrt18.06
  • kamo@kamo:~/openwrt/$ git checkout openwrt-18.06 
  • openwrt19.07
  • kamo@kamo:~/openwrt/$ git checkout openwrt-19.07 
  • openwrt21.02
  • kamo@kamo:~/openwrt/$ git checkout openwrt-21.02 
  • openwrt22.03
  • 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を使用していますので下記のパッケージをインストールします。

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

今回は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接続によるコンソールログイン方法の紹介を参照してみてください。

参考文献