0
0

OpenWRTをDockerでビルドしてみよう ①ビルド環境構築編

Last updated at Posted at 2024-09-08

OpenWRTとは

初心者向けでは無いので、この辺は他の方が解説されていますので、それを参照してください。
OpenWRTで検索すれば、いっぱいヒットします。
Wikipediaにも解説があります。https://ja.wikipedia.org/wiki/OpenWrt

OpenWRTの不満な点

  • サイトからOpenWRTファームをダウンロードして、ルーターにインストールする訳ですが、標準の状態ではサポートされない機能が多々あります
    {6FB53AF2-1BC3-4C4C-A03F-0F6090045776}.png
    上の画面から検索してインストールしますが結構面倒で、どれをインストールするかメモしておかないと、ほぼ確実に忘れます。またルーターを初期化すると、せっかく追加した機能が消えてしまうんです。
    そうすると、また同じ手順でインストールし直さないといけない。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ですね。

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ユーザを作ったりしています。

Dockerfile
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側で使うシェルスクリプトをコピーしています。
それで、そのシェルスクリプトが以下です。

get-dockerbuild.sh
#!/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 で見ることができます。
{5E10D269-8ED4-4CC5-95F1-EBC861465ACA}.png
タグ付きの安定版を指定したいなら
{003F1209-27C8-4DCA-8C8E-7AA59D1F15AD}.png
あと、Windows版ですが、cmdファイルも用意しましたので参考にしてください。

DockerBuild.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
DockerRun.cmd
docker container exec -it openwrt-build sudo -iu openwrt bash

DockerBuild.cmd はDockerイメージとコンテナを生成するコマンド。
DockerRun.cmd は作成したコンテナを起動するコマンドです。
一度生成してしまえば、2回目からはDockerのイメージビルドは必要ないので、DockerRun.cmd で起動することができます。

これらの4つのファイルをどこか適当な場所にフォルダを作って置きます。
{90B4D29F-6327-4057-8781-F02F3CDC51FF}.png
自分の場合は、DockerBuild というフォルダを作りました。
ここで ./DockerBuild.cmd を実行すると、イメージのビルドが始まります。
イメージのビルドが終わると、コンテナ化して実行するので、Docker内のLinuxのシェルスクリプトが起動した状態になります。{A247D9EB-0E53-4BD7-B2D3-2EC0118FABDE}.png
この状態で、openwrt masterのsnapshotを取得した状態です。
ビルドするブランチを変更する場合は
./get-dockerbuild.sh [ブランチ名]
としてブランチを切り替えてください。

これでビルド環境は整いました。あとは実際にビルドする訳ですが、それは次回
②OpenWRTビルド編 で解説します。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0