OpenWRTとは
初心者向けでは無いので、この辺は他の方が解説されていますので、それを参照してください。
OpenWRTで検索すれば、いっぱいヒットします。
Wikipediaにも解説があります。https://ja.wikipedia.org/wiki/OpenWrt
OpenWRTの不満な点
- サイトからOpenWRTファームをダウンロードして、ルーターにインストールする訳ですが、標準の状態ではサポートされない機能が多々あります
上の画面から検索してインストールしますが結構面倒で、どれをインストールするかメモしておかないと、ほぼ確実に忘れます。またルーターを初期化すると、せっかく追加した機能が消えてしまうんです。
そうすると、また同じ手順でインストールし直さないといけない。1つ2つならいいですが、5つ6つとなるとちょっと面倒と感じるようになります。また、フラッシュの空き容量も心配になってきます。(容量は機種によるのでなんとも言えません)
自分でビルドすれば、初期状態ですでに使いたい機能が含まれた状態になっています。初期化しても元に戻ることはありません。 - 最新の機能を使ってみたい。具体的にはメッシュWifiとか
古いバージョンのOpenWRTでは、最新の機能が使えなかったりします。でも公開されているのは古いバージョンのものしか無い。そんな時には、自分でビルドしてしまおう。
自分でビルドして、自分だけのファームを作ってみよう
そんな理由で、自分でビルドしてみようというのが、この記事の目的です。
ビルドする環境はLinux環境が必要ですが、ほらDockerという便利な環境があるじゃないですか。まずは、Dockerを準備する必要があります。
- Dockerのインストール方法などは、他の方が解説されていますので、それを参照してください
Docker インストール方法 で検索すれば、いっぱいヒットします。マック、Windows それぞれ方法が違いますので、自分の環境に合わせてセットアップしてください。Dockerを触るのは、Windows ならPowerShellとかありますが、VS Codeをおすすめします。VS CodeとDockerの連携も、他の方が解説されていますので、そちらを参考にしてください。 - 失敗したときのために、メーカー標準ファームで最低限の設定を済ませたルーターを用意しておく
OpenWRTのビルドに失敗して、やり直すときにはインターネットに繋ぐ必要があります。しかし、ルーターが起動しないことにはインターネットに繋がりません。こんなときのために、安いルーターで構わないので、最低限の接続設定を済ませたルーターを1台用意しておきましょう。スマホでテザリングでも良いですが、スマホの料金がすごいことになってしまいます。
Docker内でビルド環境構築
まずは、Dockerと言えばDockerfileですね。
FROM ubuntu:22.04
# ユーザー/グループ指定
ARG USERNAME=openwrt
ARG GROUPNAME=openwrt
ARG UID=1000
ARG GID=1000
# BRANCH 指定
#ARG BRANCH=openwrt-23.05
ARG BRANCH=master
# GET_OPENWRT シェルスクリプト
ARG GET_OPENWRT_SH=get-dockerbuild.sh
# 環境変数
ENV PASSWORD=password
ENV TZ=Asia/Tokyo
# ツール等インストール
RUN apt-get update && \
apt-get install -y build-essential clang flex bison g++ gawk gdb \
gcc-multilib g++-multilib gettext git libncurses-dev libssl-dev libpcre3-dev \
python3-distutils rsync zip unzip zlib1g-dev file wget \
git-core subversion man-db \
libncurses5-dev libreadline-dev \
coreutils sudo sharutils libz-dev patch fakeroot lzma && \
apt-get clean
# ユーザー追加
RUN groupadd -g $GID $GROUPNAME && useradd -m -s /bin/bash -u $UID -g $GID -G sudo $USERNAME && \
sudo echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# openwrt Git取得
COPY $GET_OPENWRT_SH /home/$USERNAME/
RUN chown $USERNAME /home/$USERNAME/$GET_OPENWRT_SH && \
chgrp $GROUPNAME /home/$USERNAME/$GET_OPENWRT_SH && \
chmod +x /home/$USERNAME/$GET_OPENWRT_SH
RUN sudo -iu $USERNAME /home/$USERNAME/$GET_OPENWRT_SH $BRANCH
# VOLUME は Windowsでは下記の場所に存在
# \\wsl$\docker-desktop-data\data\docker\volumes\
VOLUME ["/home/$USERNAME"]
CMD ["/bin/sh"]
# config を行う場合 ~/openwrt/.config ファイルを削除した後 make menuconfig
# ビルドは Linux上で以下を実行
# make -j10 詳細を表示させたい場合 make -j10 V=sc
# 完成したイメージは bin/targets 配下に作成される
ubuntu 22.04をベースで使用します。他のバージョンだとうまくビルドできません。
ビルドに必要なツール類をインストールしたり、rootでビルドするのは嫌なので、openwrtユーザを作ったりしています。
COPY $GET_OPENWRT_SH /home/$USERNAME/
RUN chown $USERNAME /home/$USERNAME/$GET_OPENWRT_SH && \
chgrp $GROUPNAME /home/$USERNAME/$GET_OPENWRT_SH && \
chmod +x /home/$USERNAME/$GET_OPENWRT_SH
上記で、Linux側で使うシェルスクリプトをコピーしています。
それで、そのシェルスクリプトが以下です。
#!/bin/sh
# 使い方
# get-dockerbuild.sh [ブランチ名]
# openwrt Git取得
cd ~/
rm -rf ./openwrt
git clone --branch $1 https://github.com/openwrt/openwrt.git
cp ./openwrt/feeds.conf.default ./openwrt/feeds.conf
./openwrt/scripts/feeds update -a && ./openwrt/scripts/feeds install -a
# ビルドは Linux上で以下を実行
# make -j10 詳細を表示させたい場合 make -j10 V=sc
# 完成したイメージは bin/targets 配下に作成される
exit 0
Linuxシェル上で ./get-dockerbuild.sh master とやると、最新のmasterのSnapshotを取得してきます。安定バージョンをビルドする場合は
./get-dockerbuild.sh openwrt-23.05 などお好みで変更してください。
この辺のブランチ一覧は、https://github.com/openwrt/openwrt で見ることができます。
タグ付きの安定版を指定したいなら
あと、Windows版ですが、cmdファイルも用意しましたので参考にしてください。
docker builder prune -a --force
rd /S/Q docker-openwrt-buildroot\
md docker-openwrt-buildroot\
copy Dockerfile .\docker-openwrt-buildroot\
copy get-dockerbuild.sh .\docker-openwrt-buildroot\
cd .\docker-openwrt-buildroot
docker build --tag openwrt-buildroot --no-cache=true .
docker container run --name openwrt-build -it openwrt-buildroot sudo -iu openwrt bash
docker container exec -it openwrt-build sudo -iu openwrt bash
DockerBuild.cmd はDockerイメージとコンテナを生成するコマンド。
DockerRun.cmd は作成したコンテナを起動するコマンドです。
一度生成してしまえば、2回目からはDockerのイメージビルドは必要ないので、DockerRun.cmd で起動することができます。
これらの4つのファイルをどこか適当な場所にフォルダを作って置きます。
自分の場合は、DockerBuild というフォルダを作りました。
ここで ./DockerBuild.cmd を実行すると、イメージのビルドが始まります。
イメージのビルドが終わると、コンテナ化して実行するので、Docker内のLinuxのシェルスクリプトが起動した状態になります。
この状態で、openwrt masterのsnapshotを取得した状態です。
ビルドするブランチを変更する場合は
./get-dockerbuild.sh [ブランチ名]
としてブランチを切り替えてください。
これでビルド環境は整いました。あとは実際にビルドする訳ですが、それは次回
②OpenWRTビルド編で解説します。