Openwrt - Image Builder によるイメージの作成

2024年8月25日日曜日

Openwrt

t f B! P L

Openwrtとは

OpenWrtは、組み込みシステム、特にゲートウェイやルーターなどのネットワーク機器向けに開発されたLinuxディストリビューションです。ルーターのソフトウェアを、より柔軟かつ高度にカスタマイズできるよう設計されたものです。 ただし、無線機器のシステムソフトウェアを置き換えてしまうため技適違反となる可能性が指摘されており使用には注意が必要です。

Image Builder によるイメージ作成について

Openwrtを手元のルーターに適用する際、通常はビルド済みイメージを公式サイトからイメージファイルをダウンロードして行います。 Openwrtは必要なパッケージをインストールして機能を追加削除できますが、Image Buildderを使用すると予め必要なパッケージを追加もしくは不要なものを除いた状態でインストール用イメージを作成できます。以下のメリットがあります。

  • ソースコードからビルドする作業とは異なり、ビルド済みパッケージ等を元にファイルを作成するため、必要なリソースが少なくかつ短時間で実行できる 
  • 予め必要な機能を選んでイメージを作成できるため、必要最小限なファイルサイズにできる
  •  追加パッケージに依存した環境をバックアップ/リストアする際パッケージの追加後にバックアップを適用しないといけませんが、イメージビルダーで必要なパッケージを入れておけばFactory Reset後に容易にバックアップが適用できる

[参考]
Image Builder とは OpenWrt Project が公式配布しているパッケージングツールです。 各機種用install imageファイルに、任意のopkgファイルを最初から含めたり、...

前準備 - ビルド環境の構築

OpenwrtのビルドやImage Builderの使用にはLinux環境にて行います。必要なLinuxパッケージをインストールして環境を構築しますが、試行錯誤でいろいろと混乱しないよう、LXDのコンテナで作業したほうが便利だと思います。

LXDのインストール

私はKubuntu24.04を使用していますが、LXDは入っていないのでインストールします。

sudo snap install
lxd lxd init

“lxd init”による初期設定の各項目は全てデフォルトで設定しました。

今回はOpenwrt19.07のイメージを作成したいと思います。 Ubuntu18.04のコンテナを作成しました。

lxc launch ubuntu:18.04 ubuntu1804
lxc exec ubuntu1804 bash

”lxc exec 〜 bash”を実行すると、ターミナルの操作対象がホストからコンテナに変ります。

Linux(Ubuntu)パッケージのインストール

ビルド環境に必要なLinuxパッケージをインストールします。
Linuxディストリビューションによって必要なLinuxパッケージが異なります。公式ページの内容をコピーして実行しました。今回は以下のパッケージをインストールしました。

sudo apt update
sudo apt install build-essential libncurses-dev zlib1g-dev gawk git \
gettext libssl-dev xsltproc rsync wget unzip python3 python3-distutils

ビルド用ファイルのダウンロード

ビルド用ファイルを公式からwgetでダウンロードします。
必要なファイルを探す際はインストール対象ルーターのメーカー、SoCの種類を手がかりにします。
今回はBuffalo WSR-1166DHP2のイメージを作成します。これは”WSR-1166DHP”と内部的に同じとされています。このルーターのSoCはMediaTek社のMT7621ですが、”ramips”という種類に分類されるようです。
ramipsとは ※”ramips”とはMediaTekが買収した”Ralink”に由来するらしいです??

ブラウザで「Openwrt Download」とググって公式ページを表示。「Release Archive」で作成したいバージョンを選択。「ramips/」→「mt7621/」を選択。
ページ冒頭「Image Files」にはビルド済みイメージファイルのリンクが並んでいます。ページ下部「Supplementary Files」に目的の”Image Builder”用ファイルのリンクがあります。今回は”openwrt-imagebuilder-19.07.10-ramips-mt7621.Linux-86_64.tar.xz”の文字列を右クリックしてURLをコピーしました。

次にターミナル(操作対象はLXDコンテナ)でwgetコマンドでファイルをダウンロードします。

wget https://archive.openwrt.org/releases/19.07.10/targets/ramips/mt7621/openwrt-imagebuilder-19.07.10-ramips-mt7621.Linux-x86_64.tar.xz

ダウンロードした圧縮ファイルを展開します。 

tar xJf openwrt-imagebuilder-19.07.10-ramips-mt7621.Linux-x86_64.tar.xz 

展開したディレクトリ名の視認性を良くするため名称を変更しておきました。

mv openwrt-imagebuilder-19.07.10-ramips-mt7621.Linux-x86_64 openwrt

※ディレクトリの名称変更はビルド手順に必須な操作ではありません。

ビルドコマンドを実行するディレクトリに移動します。

cd openwrt

以上でビルド環境の構築は完了です。

ビルド操作

PROFILE名を調べる

ビルドをする際PROFILE名に対象ルーターに該当するプロファイル名を指定しなくてはなりません。”make info”コマンドを実行するとダウンロードした環境で設定できるプロファイルの一覧が表示されます。一覧は長い行数で必要な情報が探すのは大変なので以下のようにコマンドを実行しました。

make info | grep wsr-1166 -A3
wsr-1166:
    Buffalo WSR-1166
    Packages:kmod-mt7603 kmod-mt76x2 wpad-basic iwinfo
    hasImageMetadata: 1
    SupportedDevices: wsr-1166

WSR-1166DHP2ではプロファイル名は”wsr-1166”となります。

カスタムイメージに追加/削除するパッケージの選定

ビルドコマンド”make image”の引数”PACKAGES”にパッケージ名を記載することで予めそのパッケージが含まれたイメージを作成することができます。 除外したいパッケージがある場合は「-」(マイナス)をパッケージ名の前に付加することで除外指定となります。例:「PPPパッケージの除外」⇛”-ppp”
引数に指定できるパッケージ名のリストはどこにあるのか不明でした。公式のページではすでにOpenwrtがインストールされたデバイスで”opkg list-installed”を実行しろ的な記載がありました。私はすでにOpenwrtがインストールされたデバイスのLuCI Web画面のSOFTWAREの画面からパッケージ名を確認しました。

make image コマンドによるビルドの実行

一番最初のビルド操作には必要ありませんが、試行錯誤で”make image”コマンドを実行する前にはテンポラリファイル等を削除する”make clean”コマンドを実行します。

make clean

私の使用する「WSR-1166DHP2」の用途に合わせて以下のようにコマンドを実行しました。

make image PROFILE=“wsr-1166” PACKAGES=“-kmod-ppp -kmod-pppoe-kmod-pppox -luci-proto-ppp -ppp -ppp-mod-pppoe -iw-full iw uclibcxx relayd luci-proto-relay uhttpd luci”
  • 使用するルーターは上流にインターネットゲートウェイとなるルーターがあり、PPPoEは使用しないので関連パッケージは除外としました。
    -kmod-ppp,-kmod-pppoe,-kmod-pppox,-luci-proto-ppp,-ppp,-ppp-mod-pppoe(以上を除外)
  • 公式ビルドでは”iw”パッケージが使用されていますが、Image Builderでは何も指定しないと”iw-full”が追加されていたため公式ビルドに合わせました。
    -iw-full(除外),iw(追加)
  • 標準ビルドでは追加されていた”uclibcxx”がImage Builderで何も指定しないビルドには含まれなかったため追加しました。
  • ルーターのWANをLANにブリッジする”relayd”関連パッケージを追加しました。私の用途として必要なもので、カスタムビルドを作成する動機となったものです。
    relayd,luci-proto-relay(2個追加)
  • Image Builder で何も指定しないとLuCI Web GUIがない状態でビルドされます。必要なので以下を追加しました。
    uhttpd,luci

成果物の取得

”mke image”コマンドが成功すると、ビルド環境ディレクトリ以下にある”bin/target/”ディレクトリ配下にファイルが作成されます。今回は以下のように目的のファイルが作成されていることを確認しました。
「/root/openwrt/bin/targets/ramips/mt7621/openwrt-19.07.10-ramips-mt7621-wsr-1166-squashfs-sysupgrade.bin」

これまでの操作はLXDコンテナ内での作業でした。成果物もコンテナ内に生成されているのでこれ以後の作業では不便な状態です。コンテナマシンからホストマシンへファイルを取り出す必要があります。 まず、コンテナマシンが操作対象となっているターミナルで”exit”を実行してコンテナマシンの操作を終了し、ホストマシンへ操作を移します。

exit
この操作で操作対象がホストマシンへ移行します。

先に確認していた成果物のコンテナマシン内のパスを指定し、ホストマシンへファイルを”PULL”します。

lxc file pull ubuntu1804/root/openwrt/bin/targets/ramips/mt7621/openwrt-19.07.10-ramips-mt7621-wsr-1166-squashfs-sysupgrade.bin ./

以上の手順でImage BuilderによるOpenwrtのカスタムイメージを作成することができました。

Translate

QooQ