docker编译openwrt

Dockerfile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
FROM debian:buster

RUN apt-get update &&\
    apt-get install -y \
        sudo time git-core subversion build-essential g++ bash make \
        libssl-dev patch libncurses5 libncurses5-dev zlib1g-dev gawk \
        flex gettext wget unzip xz-utils python python-distutils-extra \
        python3 python3-distutils-extra rsync curl libsnmp-dev liblzma-dev \
        libpam0g-dev cpio rsync gcc-multilib && \
    apt-get clean && \
    useradd -m user && \
    echo 'user ALL=NOPASSWD: ALL' > /etc/sudoers.d/user

# set system wide dummy git config
RUN git config --system user.name "user" && git config --system user.email "user@example.com"

USER user
WORKDIR /home/user

为了不让编译环境污染宿主机,采用docker的方式编译,由docker为我们创建一个专门用于编译openwrt的系统,执行docker build的时候会自动下载编译工具所需要的依赖。

1
2
3
git clone https://github.com/mwarning/docker-openwrt-builder.git
cd docker-openwrt-builder
docker build -t openwrt_builder .

创建编译系统的容器

1
2
mkdir ~/mybuild
docker run -v ~/mybuild:/home/user --name openwrt_builder -it openwrt_builder /bin/bash

经过上面的步骤,我们进入了一个已经准备好编译环境的系统,此时可以开始跟着官方的步骤开始编译了。

1
2
3
4
# Download and update the sources
git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt
git pull

最好使用稳定版 git checkout 指定版本,而不是默认使用HEAD分支,如果你不使用稳定版,会带来两个问题

  • 不包含web界面(当然,你可以手动在menuconfig中勾选)
  • opkg安装程序会报错内核版本不匹配
1
2
3
4
# Select a specific code revision
git branch -a
git tag
git checkout v23.05.2 # 指定稳定版
1
2
3
# Update the feeds
./scripts/feeds update -a
./scripts/feeds install -a
1
2
# Configure the firmware image
make menuconfig

openwrt编译默认不带luci的web界面,你需要手动勾选安装luci

/docker%E7%BC%96%E8%AF%91openwrt/Pasted%20image%2020240126162948.png

如果想要在docker中运行openwrt,请勾选tar.gz

/docker%E7%BC%96%E8%AF%91openwrt/Pasted%20image%2020240127153010.png

可选项

1
2
3
# Optional: configure the kernel (usually not required)
# Don't, unless have a strong reason to
make -j$(nproc) kernel_menuconfig
1
2
# Build the firmware image
make download -j8
  • -j$(nproc), 其中nproc会返回你系统的最大核心数量,例如-j8表示8线程编译
  • V=s: 打印详细信息
1
make -j$(nproc) V=s

例如,自定义ip地址,我们可以在编译根目录下创建files目录,相当于路由器的根目录。此时我们往files/etc/uci-defaults/添加脚本,等同于往路由器的/etc/uci-defaults/中添加脚本。

  • 在uci/defaults/99-custom添加内容
1
2
3
4
5
uci -q batch << EOI
set network.lan.ipaddr='192.168.30.99'
set network.lan.dns='192.168.30.1'
set network.lan.gateway='192.168.30.1'
EOI

其实就是仿造 https://github.com/mwarning/docker-openwrt-build-env 这个编写了一个linux环境,然后在这个环境里面执行编译

编写一个Dockerfile文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
FROM debian:buster
# 使用国内镜像
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

RUN apt-get update &&\
    apt-get install -y \
        sudo time git-core subversion build-essential g++ bash make \
        libssl-dev patch libncurses5 libncurses5-dev zlib1g-dev gawk \
        flex gettext wget unzip xz-utils python python-distutils-extra \
        python3 python3-distutils-extra rsync curl libsnmp-dev liblzma-dev \
        libpam0g-dev cpio rsync gcc-multilib && \
    apt-get clean && \
    useradd -m user && \
    echo 'user ALL=NOPASSWD: ALL' > /etc/sudoers.d/user

# set system wide dummy git config
RUN git config --system user.name "user" && git config --system user.email "user@example.com"

USER user
WORKDIR /home/user           

构建镜像

1
docker build -t lede_builder .

运行镜像

1
docker run  -v ./mybild:home/user lede_builder /bin/bash
1
2
3
4
5
git clone https://github.com/coolsnowwolf/lede
cd lede
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig

自定义ip地址,我们可以在编译根目录下创建files目录,相当于路由器的根目录。此时我们往files/etc/uci-defaults/添加脚本,等同于往路由器的/etc/uci-defaults/中添加脚本。

  • 在uci/defaults/99-custom添加内容
  • 注意到我这里设置了uhttpd的https监听地址修改成了空字符串,原因是默认没有安装luci-app-openssl,如果不关闭https监听会无法启动web界面
1
2
3
4
5
6
7
uci -q batch << EOI
set network.lan.ipaddr='192.168.30.101'
set network.lan.dns='192.168.30.1'
set network.lan.gateway='192.168.30.1'
set network.lan.ipaddr='192.168.30.101'
delete uhttpd.main.listen_https
EOI

Target-System选择x86后保存,接着下载 dl 库,编译固件 (-j 后面是线程数,第一次编译推荐用单线程)

1
2
make download -j8
make V=s -j$(nproc)

如果需要重新配置:

1
2
3
rm -rf .config
make menuconfig
make V=s -j$(nproc)

https://github.com/tignioj/Actions-OpenWrt/tree/main

相关内容

openwrt编译passwall到固件里面
编译openwrt单独的包
docker中运行自己编译的openwrt镜像
docker使用镜像网站
小米路由器BE7000将docker命令添加到环境变量