前言

最近入了 OpenWrt 编译的坑,在经历过各种不顺利的编译体验后,我决定使用 Docker 去构建一个专门用于 OpenWrt 编译的系统环境容器。这样的好处是编译的过程始终在容器内进行,可以保持编译环境的高度一致性,基本上杜绝了因编译环境不同导致的编译失败的情况,同时省去了对编译环境的配置,有助于提高效率和编译成功率。而且比起虚拟机,编译的效率更高。

配置 Docker

安装Docker

首先需要安装 Docker ,具体方法可以参考这里

配置编译环境的容器

  1. 拉取镜像或本地构建镜像

    # 拉取镜像
    docker pull p3terx/openwrt-build-env
    # 本地构建镜像
    docker build -t p3terx/openwrt-build-env github.com/P3TERX/openwrt-build-env

    如果你配置了镜像加速器,推荐拉取镜像,速度会比本地构建快。

  2. 使用镜像建立容器并后台运行:

    docker run -itd -v ~/openwrt:/home/admin/openwrt --name openwrt-build-env p3terx/openwrt-build-env

    -v ~/lede:/home/admin/openwrt 表示将文件夹 ~/openwrt 挂载到容器中的 /home/admin/openwrt文件夹中(若文件夹不存在则会新建)
    --name openwrt-build-env 表示新建的容器名为 openwrt-build-env
    p3terx/openwrt-build-env表示将使用 p3terx/openwrt-build-env 镜像创建容器

  3. 进入容器

    docker exec -it openwrt-build-env zsh
  4. 更新

    sudo apt-get update
    sudo apt-get upgrade -y
  5. 赋予文件夹权限

    sudo chown -R admin:admin /home/admin/openwrt

首次编译

  1. 克隆源码

    git clone https://github.com/coolsnowwolf/lede
  2. 进入源码目录

    cd lede
  3. 更新 Feeds

    ./scripts/feeds update -a
    ./scripts/feeds install -a
  4. 调整系统组件

    make menuconfig
  5. 预下载编译所需的文件

    make download V=s
  6. 开始编译

    make -j1 V=s

    编译成功后在宿主机的~/openwrt/lede/bin目录下可以找到编译出的产物。

输入exit命令可以退出容器操作界面,但容器会一直后台持续运行。如果你不想占用资源,可以输入docker container stop openwrt-build-env命令让容器停止运行。

再次编译

进入编译环境

如果你已经退出了编译环境,则需要进行以下操作进入编译环境的容器中。

  • 启动编译环境的容器
    docker container start openwrt-build-env
  • 进入容器
    docker exec -it openwrt-build-env zsh

继续进行编译

  1. 进入源码目录

    cd lede
  2. 删除临时文件

    rm -rf ./tmp
  3. 删除编译出的文件(可选)

    make clean

    清除bin目录下的文件

  4. 更新源码

    git pull
  5. 更新 Feeds

    ./scripts/feeds update -a
    ./scripts/feeds install -a
  6. 清除配置文件(可选)

    rm -rf .config

    建议多次编译失败的情况下清除配置文件,然后手动去调整系统组件,而不要拿旧的配置文件去覆盖。

  7. 调整系统组件

    make menuconfig
  8. 预下载编译所需的文件

    make download V=s
  9. 开始编译

    make -j1 V=s

编译错误的解决方案

如果遇到编译错误,可以参考下面的文章去解决。

参考

自编译树莓派 OpenWrt 完全指南 (一) : 环境搭建

openwrt编译笔记,有些技巧是自己试验出来的,很多人死也不肯说