Tech Note Plus

PC から Azure まで幅広い伝道を目指してます

ゼロベースビルドで x86 用の OpenWrt のイメージを作成する

この記事ではゼロから OpenWrt のインストールイメージを作成する手法を記載しています。OpenWrt のアップデートに関する概論説明は以下の記事にて完了しています。 cube309b.hatenablog.com

ゼロベースビルドに求める要件

やりたいこと

OS を初回起動する時点で IPIP6 のパッケージがインストール済みな状態にしたい。

なぜゼロベースビルドを採用せずに Image Builder 方式を採用したか

いくつか理由はあります。

  • ビルドに CPU の性能が必要 (私の家では、最低 30 分以上ビルドに時間がかかる)
  • Linux カーネルを変更するほどの使い方をしていない
  • ディスク容量がそれなりに必要 (50GB ぐらい用意しても 70% 程度は使ってしまう)
  • オプション増やすと時間かけた挙句にビルドに失敗する

ゼロベースビルドによるイメージ作成手順

フロー

全体の流れは以下の通りです。環境はすぐに OS を戻せる仮想環境が推奨です。

Ubuntu Server をインストール

別に Ubuntu でなくても大丈夫で、画面最下部のリンク先に対応 OS の記載があります。なお、OS は既定値のインストールで特に問題ありません。 あえて言えば、SSH は利用するのでインストールウィザードの中で OpenSSH server はインストールしておきましょう。

あと、SSHUbuntu に接続し、以下のコマンドを実行してマシンの HDD 容量をきっちり LVM に割り当て切らないと容量不足でエラーになります。 デフォルトでマシンの HDD の半分ぐらいしか OS 側に与えず残りは空き容量として確保してしまうみたいです。

sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
sudo resize2fs /dev/ubuntu-vg/ubuntu-lv

なお、ビルドコマンドは特権昇格について内部で処理される仕組みのようで、sudo であらかじめ昇格してしまうとエラーが発生します。 そのため、明確に sudo を記載していないコマンドについてはそのまま一般ユーザーで実行してください。

Ubuntu Server にビルド用ツールをインストール

こちらも画面最下部のリンク先に対応 OS とビルドツールの準備手順が記載されています。SSHUbuntu に接続し、以下のコマンドを実行します。

sudo apt update
sudo apt install build-essential clang flex bison g++ gawk gcc-multilib g++-multilib gettext git libncurses5-dev libssl-dev python3-distutils rsync unzip zlib1g-dev file wget
sudo apt install qemu-utils

qemu-utils は .img を .vmdk に変換するツールです。私の場合、検証で VMware 上に OpenWrt を構築することがあるので、変換ツールが必要でした。 ビルドの中で .vmdk ファイルを作るオプションがあるのですが指定するとビルドに 100% 失敗するようなので止めました。

GitHub からソースコードをフルクローン

SSHUbuntu に接続し、以下のコマンドを実行してフルクローンを取得します。

git clone https://git.openwrt.org/openwrt/openwrt.git

Ubuntu Server のバックアップを取得

次回に備えてきれいな環境でビルドできるように、ここで基となる全体バックアップを取得しておきます。 イメージの取り出しが終わったらこの時点のバックアップに戻して次回以降に備えます。

GitHub からソースコードを Pull クローン

SSHUbuntu に接続し、以下のコマンドを実行して差分でクローンを取得した上で目的のバージョンをチェックアウトします。

cd openwrt
git pull
git tag
git checkout v22.03.5
git branch -a

コメント
git tag チェックアウト可能なバージョンを表示するコマンド
git branch -a 実際にチェックアウトされたかを確認するコマンド
IPIP6 用の feed の修正と、インストール

このあとビルド用の設定を行いビルドするわけですが、公式なモジュールではない IPIP6 パッケージはそのままでは選択できません。 そのため、作成者の指示に従って IPIP6 のパッケージも Github から追加でダウンロードできるようにします。SSHUbuntu に接続し、以下のコマンドを実行します。

cp feeds.conf.default feeds.conf
cat << EOF >> feeds.conf
src-git ipip6 https://github.com/HiraokaHyperTools/openwrt-ipip6.git
EOF
./scripts/feeds update -a
./scripts/feeds install -a

イメージのビルド

実際のビルドは ImageBuilder のようにコマンドを直接実行するわけではなく、.config ファイルにオプションを記載してコマンド実行する形になります。 この .config を作成するために GUI のようなインターフェースが用意されていて、それが make menuconfig コマンドとなります。

  1. SSHUbuntu に接続し、以下のコマンドを実行します。

    make menuconfig
  2. 以下のような画面が起動しますので、設定をすべて行って、Exit → Save で終了してください。これで .config に内容が反映されます

    コメント
    Target System x86
    Subtarget x86_64
    Target Images tar.gz/squashfs/Build GRUB images の選択を外す
    LuCI -> 1. Collections luci
    Network ipip6

    ※ パッケージ追加ぐらいなら大丈夫だと思いますが、オプション追加はこける可能性もあるのでほどほどに (減らす分には問題なさそう)
    ※ ダウンロードページの config.buildinfo はオリジナルのビルドオプションで、これをダウロードして .config と差し替えることも可能。ただ、すごい数のオプションが選択済みでうんざり。。。
    ※ モジュール選択は、M と * を選択できますが、* を選択すること
    ※ 任意ではありますが、https 接続用の luci-ssl の設定箇所を失念しました・・・

  3. ビルドのために以下のコマンドを実行します。数字は並列で利用する CPU の数となり、オプション数とこの CPU の数で処理時間が変わります。一説には 6 時間かかる方も・・・。

    make -j 8 V=s
イメージの取り出し

ビルドが完了すると、~/openwrt/bin/targets/x86/64 ディレクトリ内に openwrt-x86-64-generic-ext4-combined-efi.img.gz というファイルが出来上がっているのでこのファイルを取り出します。

あとは、rufus アプリケーションなどで USB メモリに img.gz ファイルを焼きこんでミニ PC に挿入して起動します。万が一アップデート後に問題が出ても切り戻せるように、それまで使ってたのではない別の USB メモリを使ってください。

VMware 用のイメージの取り出し (おまけ)
  1. SSHUbuntu に接続し、以下のコマンドを実行します。 出来上がった .img.gz をコピーしてから qemu-img コマンドで VMware で利用可能な .vmdk ファイルに変換しています。

    cd ~/openwrt/bin/targets/x86/64
    cp openwrt-x86-64-generic-ext4-combined-efi.img.gz openwrt-x86-64-generic-ext4-combined-efi-vmdk.img.gz
    gunzip openwrt-x86-64-generic-ext4-combined-efi-vmdk.img.gz
    qemu-img convert -f raw -O vmdk openwrt-x86-64-generic-ext4-combined-efi-vmdk.img OpenWrt.vmdk
  2. 変換が完了すると、~/openwrt/bin/targets/x86/64 ディレクトリ内に OpenWrt.vmdk というファイルが出来上がっているのでこのファイルを取り出します。

  3. なお、ESXi 上ではこの .vmdk ファイルをそのまま仮想マシンにアタッチしても起動しないようなので、以下のコマンドで一度変換させてから既存の HDD としてアタッチする必要があります。

    vmkfstools -i OpenWrt.vmdk OpenWrt-cv.vmdk -d thin

    ※ このコマンド、データストアに .vmdk ファイルをアップロードして、カレントディレクトを移動した上で実行します。(ESXi 上で実行するのでお間違えなく)

OpenWrt の設定

今回は設定ファイルは戻していないため、起動した OS にはパッケージこそ必要なものが入っていますが設定がありません。 設定ファイルを戻すかコマンドで設定してください。私は、設定をコマンドに残しているので、5 分もあればインターネット接続まで完了できるようにしました。

Ubuntu Server のリストアを実行

OS 内にゴミが残らないように、OS ごときれいにリストアして次回以降に備えます。

設定のための参考サイト

設定に当たっては、以下の情報を参考にしました。

openwrt.org openwrt.org github.com

OpenWrt のアップデートイメージ作成を終えて

こうして OpenWrt 公式側がバージョンアップしても追従できるようになりました。ルーターをアップデートするのに一時的とはいえ別のルーターが必要なんてやっぱりないですよね。


Note
・ 当ブログは個人主催であり、ブログ中のすべての情報は個人的な観点となります。
・ 情報については正確な内容となるよう努めますが、完全性や正確性、有用性、安全性、最新性について一切保証できかねます。