Tech Note Plus

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

Image Builder で x86 用の OpenWrt のイメージを作成する

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

Image Builder に求める要件

やりたいこと

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

なぜ Image Builder 方式を採用したか

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

  • ビルドに CPU の性能が不要 (ダウンロード時間にもよるが、慣れると 15 分以内)
  • Linux カーネルを変更するほどの使い方をしていない
  • ディスク容量もそんなにいらない (全部で 25GB でもかなり余裕あり)

Image Builder を用いたイメージ作成手順

フロー

全体の流れは以下の通りです。環境はすぐに OS を戻せる仮想環境が推奨です。 ビルド状態をリストアするコマンドなどもあるようですがゴミが残るケースもあるようなので、OS ごと戻した方がよいです。

Ubuntu Server をインストール

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

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

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

こちらも画面最下部のリンク先に対応 OS とビルドツールの準備手順が記載されています。あえて言えば、Ubuntu 22.04 の場合 python3 が含まれているため、python のインストールは不要でした。
SSHUbuntu に接続し、以下のコマンドを実行します。

sudo apt update
sudo apt install build-essential libncurses5-dev libncursesw5-dev zlib1g-dev gawk git gettext libssl-dev xsltproc rsync wget unzip
sudo apt install qemu-utils

qemu-utils は .img を .vmdk に変換するツールです。私の場合、検証で VMware 上に OpenWrt を構築することがあるので、変換ツールが必要でした。

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

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

イメージのビルド
  1. SSHUbuntu に接続し、以下のコマンドを実行します。x86 における当該バージョン用の Image Builder をダウンロードして解凍しています。

    ovirsion="22.03.5"
    wget https://downloads.openwrt.org/releases/$ovirsion/targets/x86/64/openwrt-imagebuilder-$ovirsion-x86-64.Linux-x86_64.tar.xz
    tar -J -x -f openwrt-imagebuilder-$ovirsion-x86-64.Linux-x86_64.tar.xz
    コメント
    ovirsion アップデートするバージョンを指定します
  2. ovirsion 変数が消えないように SSH のセッションを切らずに以下のコマンドを実行します。外部から持ち込む必要がある .ipk ファイルを packages フォルダに配置します。

    cd openwrt-imagebuilder-$ovirsion-x86-64.Linux-x86_64/packages
    wget https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-app-temp-status_0.3-5_all.ipk
    コメント
    luci-app-temp-status_0.3-5_all.ipk 温度表示を概要ページに表示させるモジュール
  3. また、以下を参考にして ipip6_0.1_all.ipk を作成して同じように packages フォルダに配置します。 cube309b.hatenablog.com

  4. ovirsion 変数が消えないように SSH のセッションを切らずに以下のコマンドでビルドします。

    cd ..
    make image PROFILE="generic" PACKAGES="uhttpd luci luci-ssl luci-i18n-base-ja luci-i18n-opkg-ja luci-i18n-firewall-ja openvpn-openssl luci-app-openvpn luci-i18n-openvpn-ja ip-full kmod-ip-vti kmod-crypto-gcm strongswan-minimal adblock luci-app-adblock luci-i18n-adblock-ja tcpdump-mini ipip6 luci-app-temp-status"
    コメント
    uhttpd Web サーバー。指定しないと Web 接続不可
    luci Web 表示機能。指定しないと Web 接続不可
    luci-ssl Web 表示時に https での接続を受け付ける機能。任意
    ipip6 V6 プラス固定 IP でインターネット接続する機能。一番大事
    luci-app-temp-status 温度表示を概要ページに表示させる機能

    ※ ほかのモジュールは過去の連載の中で私が導入してきたモジュールなので説明は割愛します。

ビルドのパラメーターや機能にまつわる余談
  1. Image Builder の .tar.xz を解凍したルートフォルダで make info を実行すると既定の情報がわかる

    1. make image の PROFILE 引数に与えるプロファイル名
    2. 既定でインストールされるパッケージ名の一覧
    3. 既定でインストールされるファームウェアの一覧
    Current Target: "x86/64"
    Current Architecture: "x86_64"
    Current Revision: "r20134-5f15225c1e"
    Default Packages: base-files ca-bundle dropbear fstools libc libgcc libustream-wolfssl logd mtd netifd opkg uci uclient-fetch urandom-seed urngd busybox procd procd-ujail procd-seccomp partx-utils mkf2fs e2fsprogs kmod-button-hotplug dnsmasq firewall4 nftables kmod-nft-offload odhcp6c odhcpd-ipv6only ppp ppp-mod-pppoe
    Available Profiles:   
    
    generic:
        Generic x86/64
        Packages: kmod-amazon-ena kmod-amd-xgbe kmod-bnx2 kmod-e1000e kmod-e1000 kmod-forcedeth kmod-fs-vfat kmod-igb kmod-igc kmod-ixgbe kmod-r8169 kmod-tg3
        hasImageMetadata: 0
  2. PACKAGES 引数内でパッケージ名の前に「-」をつけると、そのパッケージを現在のビルド予定のイメージから削除可能 (-ppp-mod-pppoe のような表記)

  3. パッケージ≠ .ipk ファイル名なので、あらかじめ現行機で echo $(opkg list-installed | sed -e "s/\s.*$//") を実行すると PACKAGES 引数内で定義可能な文字列が取得可能 (例:パッケージ名:ipip6、ファイル名:ipip6_0.1_all.ipk)
  4. make image に FILE 引数を用いると任意のコンフィグファイルを OS インストール時に配置可能
イメージの取り出し

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

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

VMware 用のイメージの取り出し (おまけ)
  1. ovirsion 変数が消えないように SSH のセッションを切らずに以下のコマンドを実行します。出来上がった .img.gz をコピーしてから qemu-img コマンドで VMware で利用可能な .vmdk ファイルに変換しています。

    cd ~/openwrt-imagebuilder-$ovirsion-x86-64.Linux-x86_64/bin/targets/x86/64
    cp openwrt-$ovirsion-x86-64-generic-ext4-combined-efi.img.gz openwrt-$ovirsion-x86-64-generic-ext4-combined-efi-vmdk.img.gz
    gunzip openwrt-$ovirsion-x86-64-generic-ext4-combined-efi-vmdk.img.gz
    qemu-img convert -f raw -O vmdk openwrt-$ovirsion-x86-64-generic-ext4-combined-efi-vmdk.img OpenWrt.vmdk
  2. 変換が完了すると、~/openwrt-imagebuilder-$ovirsion-x86-64.Linux-x86_64/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 のアップデートイメージ作成を終えて

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


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