2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

2
Last updated at Posted at 2024-09-08

OpenWRTとは

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

OpenWRTの不満な点

  • サイトからOpenWRTファームをダウンロードして、ルーターにインストールする訳ですが、標準の状態ではサポートされない機能が多々あります
    {6FB53AF2-1BC3-4C4C-A03F-0F6090045776}.png
    上の画面から検索してインストールしますが結構面倒で、どれをインストールするかメモしておかないと、ほぼ確実に忘れます。またルーターを初期化すると、せっかく追加した機能が消えてしまうんです。
    そうすると、また同じ手順でインストールし直さないといけない。1つ2つならいいですが、5つ6つとなるとちょっと面倒と感じるようになります。また、フラッシュの空き容量も心配になってきます。(容量は機種によるのでなんとも言えません)
    自分でビルドすれば、初期状態ですでに使いたい機能が含まれた状態になっています。初期化しても元に戻ることはありません。
  • 最新の機能を使ってみたい。具体的にはメッシュWifiとか
    古いバージョンのOpenWRTでは、最新の機能が使えなかったりします。でも公開されているのは古いバージョンのものしか無い。そんな時には、自分でビルドしてしまおう。

自分でビルドして、自分だけのファームを作ってみよう

そんな理由で、自分でビルドしてみようというのが、この記事の目的です。
ビルドする環境はLinux環境が必要ですが、ほらDockerという便利な環境があるじゃないですか。まずは、Dockerを準備する必要があります。
そのDocker Desktop for Windowsですが、1年くらい前と比べて動作が遅くなった気がします。ライセンスも変更になり、商用利用だと有料サブスクとなりました。ということで、WSL版Dockerに乗り換えます。紹介記事はこちらです。

  • 失敗したときのために、メーカー標準ファームで最低限の設定を済ませたルーターを用意しておく
    OpenWRTのビルドに失敗して、やり直すときにはインターネットに繋ぐ必要があります。しかし、ルーターが起動しないことにはインターネットに繋がりません。こんなときのために、安いルーターで構わないので、最低限の接続設定を済ませたルーターを1台用意しておきましょう。スマホでテザリングでも良いですが、スマホの料金がすごいことになってしまいます。

Docker内でビルド環境構築

まずは、Dockerと言えばDockerfileですね。

Dockerfile
FROM ubuntu:22.04

WORKDIR /workdir

# ユーザー/グループ指定
ARG USERNAME="openwrt"
ARG GROUPNAME="openwrt"
ARG UID="1200"
ARG GID="1200"
# GET_OPENWRT_SH シェルスクリプト
ARG GET_OPENWRT_SH="get-dockerbuild.sh"
# OpenWRTのGitHub URL
ARG OPENWRT_GITHUB_URL="https://github.com/openwrt/openwrt.git"
# 環境変数
ENV TZ="Asia/Tokyo"
RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo "${TZ}" > /etc/timezone

# ツール等インストール
RUN apt-get update \
 && apt-get dist-upgrade -y \
 && apt-get install -y \
    bison build-essential clang coreutils curl fakeroot file flex g++ g++-multilib gawk gcc-multilib gdb gettext libgl1 libglx-mesa0 \
    git git-core htop libdrm-amdgpu1 libev-dev libpam-dev libgl1-mesa-dev libgraphene-1.0-0 libgraphene-1.0-dev libncurses5-dev libncurses-dev \
    libpcre3 libpcre3-dev libreadline-dev libssl-dev libwayland-bin libwayland-dev libz-dev lzma man-db patch \
    python2.7 python3 python3-distutils python3-pip rsync sharutils subversion sudo swig tzdata \
    unzip vim wayland-protocols wget wget2 xorg-dev xterm zip zlib1g-dev \
    qemu-system qemu-system-common qemu-utils \
    openssh-server nkf
# SSHのインストールと設定
# SSHの設定を変更
RUN cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak \
 && sed -i "s/^#PermitRootLogin prohibit-password/PermitRootLogin yes/" /etc/ssh/sshd_config \
 && sed -i "s/^AuthorizedKeysFile/#AuthorizedKeysFile/" /etc/ssh/sshd_config \
 && sed -i "s/^HostKey/#HostKey/g" /etc/ssh/sshd_config \
 && sed -i "s/^#Port/Port/" /etc/ssh/sshd_config \
 && sed -i "s/^#Banner none/Banner none/" /etc/ssh/sshd_config \
 && sed -i "s/^#PasswordAuthentication yes/PasswordAuthentication yes/" /etc/ssh/sshd_config \
 && /usr/bin/ssh-keygen -A \
 && echo "root:asdf" | chpasswd

# ユーザー追加
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

 # GitからOpenWRTを取得してくるシェルスクリプト
 # ヒアドキュメントで作成する
COPY <<-EOF /home/${USERNAME}/${GET_OPENWRT_SH}
#!/bin/bash
# 使い方
# get-dockerbuild.sh [ブランチ名]
# openwrt Git取得
cd ~/
rm -rf ./openwrt
git clone --branch \$1 ${OPENWRT_GITHUB_URL}
# feed設定ファイルをバックアップ
cp ./openwrt/feeds.conf.default ./openwrt/feeds.conf.default.org
# feedを最新化
./openwrt/scripts/feeds update -a | sed -e 's/\r$//' -e '/^[[:space:]]*$/d' > feed_update.log
cat feed_update.log
# feedをインストール
./openwrt/scripts/feeds install -a | sed -e 's/\r$//' -e '/^[[:space:]]*$/d' > feed_install.log
cat feed_install.log
# ビルドはDocker Linux上で以下を実行
# make -j10 詳細を表示させたい場合 make -j10 V=sc
# 完成したイメージは bin/targets 配下に作成される
EOF
RUN nkf -Lu -w --overwrite /home/${USERNAME}/${GET_OPENWRT_SH} \
 && chown ${USERNAME}:${GROUPNAME} /home/${USERNAME}/${GET_OPENWRT_SH} \
 && chmod +x /home/${USERNAME}/${GET_OPENWRT_SH}

# 後片付け
RUN apt-get clean \
 && apt-get autoclean \
 && apt-get -y --purge autoremove \
 && rm -rf /var/lib/apt/lists/* > log.txt

# config を行う場合 ~/openwrt/.config ファイルを削除した後 make menuconfig

# ビルドはDocker Linux上で以下を実行
# make -j10 詳細を表示させたい場合 make -j10 V=sc

# 完成したイメージは bin/targets 配下に作成される
# bin/targets/<ターゲット>/<サブターゲット>/ 以下にイメージが作成される

compose.yaml も用意しました。

compose.yaml
# version: '3.8'
services:
  openwrt:
    image: openwrt-buildroot
    container_name: openwrt-build
    build:
      context: ./
      dockerfile: ./Dockerfile
    environment:
      TZ: 'Asia/Tokyo'
      LANG: 'ja_JP.UTF-8'
    ports:
      - '22:22'           # SSH
    tty: true
    stdin_open: true
    privileged: true
    command: /usr/sbin/init

SSHをDocker Image内にインストールして、作成したROMイメージを取り出しやすくしています。WinSCPなどのツールで簡単にコピーできます。
ログインID:root パスワード:asdf で入れます。


GitHubからOpenWRTを取得してくるシェルスクリプトは、ヒアドキュメントでシェルスクリプト化しています。

#!/bin/bash
# 使い方
# get-dockerbuild.sh [ブランチ名]
# openwrt Git取得
cd ~/
rm -rf ./openwrt
git clone --branch \$1 ${OPENWRT_GITHUB_URL}
# feed設定ファイルをバックアップ
cp ./openwrt/feeds.conf.default ./openwrt/feeds.conf.default.org
# feedを最新化
./openwrt/scripts/feeds update -a | sed -e 's/\r$//' -e '/^[[:space:]]*$/d' > feed_update.log
cat feed_update.log
# feedをインストール
./openwrt/scripts/feeds install -a | sed -e 's/\r$//' -e '/^[[:space:]]*$/d' > feed_install.log
cat feed_install.log
# ビルドはDocker Linux上で以下を実行
# make -j10 詳細を表示させたい場合 make -j10 V=sc
# 完成したイメージは bin/targets 配下に作成される

Docker Linux シェル上で ./get-dockerbuild.sh main とやると、最新mainのSnapshotを取得してきます。安定バージョンをビルドする場合は
./get-dockerbuild.sh openwrt-24.10 などお好みで変更してください。
この辺のブランチ一覧は OpenWRT GitHub で見ることができます。
image.png
タグ付きの安定版を指定したいなら
image.png
WSL用ですが、Dockerイメージビルド用シェルスクリプトも用意しましたので参考にしてください。

DockerBuild.sh
#!/bin/bash
docker builder prune --all --force
docker compose -f compose.yaml up -d --build

/bin/bash ./DockerRun.sh
DockerRun.sh
docker container exec -it openwrt-build sudo -iu openwrt bash

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


これらの4つのファイルをどこか適当な場所にディレクトリを作って置きます。
自分は、ホームディレクトリにDockerBuildというディレクトリを作って置いています。
image.png
GoogleDriveに置いたので、ここから取得してください。
※共有のやり方が悪かったようで、ダウンロードできない状態でした。ご迷惑おかけしました。
ここで ./DockerBuild.sh を実行すると、イメージのビルドが始まります。
イメージのビルドが終わると、コンテナ化して実行するので、Docker内のLinuxのシェルスクリプトが起動した状態になります。
image.png
この状態ではDocker Linuxが起動しただけの状態です。ここから、OpenWRTのソースを取得してビルドする手順となります。


ビルドするブランチを取得するには
./get-dockerbuild.sh [ブランチ名]
として取得してください。
feedを実行するときに、うまくいかないことがあります。
feed_update.log feed_install.logにログを残すようにしたので、エラーがあった場合は何度かトライしください。
more feed_update.log more feed_install.logコマンドでログを見ることができます。
これでビルド環境は整いました。あとは実際にビルドする訳ですが、それは次回
②OpenWRTビルド編で解説します。

2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?