利用 Docker 编译 OpenWrt

2023-05-16

原文链接:利用 Docker 编译 OpenWrt |五十风的个人博客

由于网络原因编译openwrt时经常下载失败,搭建编译环境也很复杂,
因此想到利用阿里云、Github action等远程构建docker镜像,将编译的下载步骤放在远程进行。

目前还有一个方法就是利用Github action直接远程编译,但这样做有3个问题:

  1. 编译需要config文件,生成这个文件又需要下载一些库,这就造成了循环=。=。而通过docker你拉下来的镜像中已经下好了所有库,不需要下载。
  2. 如果你要对config进行一些小的改动,通过Github action就需要从头开始编译。而利用docker镜像可以直接进入docker容器修改文件后编译,不需从头开始。
  3. Github action有一定学习成本,而dockerfile和shell差不多,就算没接触过过也能快速上手

开始之前

本教程所有代码在:

  • https://github.com/gojuukaze/openwrt-build
  • https://gitee.com/gojuukaze/openwrt-build

关于Docker的一些概念,以及如何使用阿里云、Github action等来构建docker镜像不在本教程范围,你可以自行学习。

编译步骤

首选说明下,我是分成了4个镜像来编译的,base , v1 , v2 , v3 ,你完全可以只构建一个镜像。

这样的好处是有些镜像可以重复利用,编译有问题时可以使用上一步的镜像来再次构建,避免从头开始。

每个镜像说明:

tagDockerfile说明
baseDockerfile基础镜像,包含编译所需的包。
v1Dockerfile_1编译准备1,clone代码,并执行基础的update与install
v2Dockerfile_2编译准备2,修改源码,增加功能,再次执行update与install应用修改
v3Dockerfile_3编译,执行download并编译

1. 构建 base

使用 Dockerfile 构建 base 镜像,此镜像是基于 immortalwrt/opde:base 在此基础上通过immortalwrt的脚本更新了一些包。

# base
FROM immortalwrt/opde:base
USER opde:opde
ENV HOME /home/opde
WORKDIR /home/opde
RUN wget https://build-scripts.immortalwrt.eu.org/init_build_environment.sh
RUN chmod +x /home/opde/init_build_environment.sh
RUN sudo /home/opde/init_build_environment.sh

理论上来说,这个镜像能用于编译其他openwrt系统,不过建议在dockerfile的最后再安装一次你系统所需的包

2. 构建 v1

使用 Dockerfile_1 构建 v1 镜像,这个镜像主要clone代码,执行update与install。

如果你不用immortalwrt系统,修改代码的地址。

# v1
FROM xx/openwrt-build:base
USER opde:opde
ENV HOME /home/opde
WORKDIR /openwrt
# 修改代码的地址
RUN git clone -b v21.02.3 --single-branch https://github.com/immortalwrt/immortalwrt
WORKDIR /openwrt/immortalwrt
RUN ./scripts/feeds update -a 
RUN ./scripts/feeds install -a

2. 构建 v2

使用 Dockerfile_2 构建 v2 镜像,这个镜像主要进行make前的最终准备修改(修改源码,添加功能,再次执行update与install)。

# v2
FROM xx/openwrt-build:v1
USER opde:opde
ENV HOME /home/opde
WORKDIR /openwrt/immortalwrt

COPY imm_patch /openwrt/immortalwrt/imm_patch
RUN sudo chown -R opde:opde /openwrt/immortalwrt/imm_patch
# 修改代码,增加一些功能。可以根据你的需求添加
RUN git apply imm_patch/wan_ACCEPT.patch

# 软件包
RUN sed -i '$a src-git kenzo https://github.com/kenzok8/openwrt-packages' feeds.conf.default
RUN sed -i '$a src-git small https://github.com/kenzok8/small' feeds.conf.default
# 修改默认ip为 192.168.2.1
RUN sed -i 's/192.168.1.1/192.168.2.1/g' package/base-files/files/bin/config_generate
# 时区
RUN sed -i "s/'UTC'/'CST-8'\n   set system.@system[-1].zonename='Asia\/Shanghai'/g" package/base-files/files/bin/config_generate

RUN rm -rf /openwrt/immortalwrt/imm_patch
RUN ./scripts/feeds update -a 
RUN ./scripts/feeds install -a

RUN ./scripts/feeds install lm-sensors
RUN ./scripts/feeds install luci-app-samba4
RUN ./scripts/feeds install wsdd2
RUN ./scripts/feeds install luci-lib-base
RUN ./scripts/feeds install luci-proto-ipv6
RUN ./scripts/feeds install wget-ssl
RUN ./scripts/feeds install liblzma
RUN ./scripts/feeds install libnetsnmp
RUN ./scripts/feeds install libcap
RUN ./scripts/feeds install libpam
# 检查下是否还有报错
RUN ./scripts/feeds install -a
  • 这里有的代码我是通过 git patch 来修改的,你也可以通过sed或其他方式来修改,或者最后一步编译前拉取镜像本地修改。

  • 如果你要使用我的patch,请注意:我的patch是基于Orange Pi - R1 Plus LTS以及immortalwrt 21.02修改的,这些patch不一定适用于你,请甄别后使用。

    每个patch说明如下:

    • add_pwm_fan.sh.patch : 风扇脚本。我的板子用这个脚本风扇会滋滋响,如果你有同样问题,取消这个试试。
    • resizing_filesystem_at_first_boot.patch : 首次启动时扩展分区。注意这个依赖bash、f2fsck等命令,需要在config中添加。这个我测试有问题,因此我采用的是开机后手动执行一次 resize_rootfs.sh (这个脚本在仓库里)
    • wan_ACCEPT.patch : 允许通过wan的ip口登录。immortalwrt默认只能通过lan口登录。
    • swap_wan_and_lan.patch : wan lan口互换
    • 1.5g.patch : cpu超频至1.5g

    这些path是从 R1-Plus-LTS 复制的,有问题请向他反馈

  • Dockerfile_2 最后单独install了几个包,这是因为我在执行./scripts/feeds install -a 会出现这个warning 287#9 2.046 WARNING: Makefile 'package/utils/busybox/Makefile' has a dependency on 'libpam', which does not exist
    如果你的没报错可以删除这几个install。

3. 创建config

docker run xxx/openwrt-build:v2 zsh

make menuconfig

创建完后通过docker cp.config复制到本地并上传仓库

4. 构建 v3,编译系统

使用 Dockerfile_3 构建 v3 镜像,这个镜像就是执行最终的编译了。

# v3 复制config,并下载依赖
FROM xx/openwrt-build:v2
USER opde:opde
ENV HOME /home/opde
WORKDIR /openwrt/immortalwrt

COPY config_1 /openwrt/immortalwrt/.config
RUN sudo chown opde:opde /openwrt/immortalwrt/.config
RUN make defconfig
RUN make download -j$(nproc)
# 这里我是本地编译
# RUN make V=s -j$(nproc)
  • 由于远程编译可能会因时间太久而被判断为超时,且我本地性能更好。因此这里我选择只执行make download,构建镜像后拉取到本地编译的,你可以根据需要自行选择。

  • 如果你选择本地编译,需要注意:

    1. 这一步仍然可能需要下载一些包,这取决于你的config文件。不过一般这些下载一般不会太慢,如果你这一步卡了,可以ctrl-c后再编译,一般都能下载成功。

    2. 建议你修改下go以及npm的源,你config中有的选项可能依赖它们。

      export GOSUMDB=off
      export GO111MODULE=on
      export GOPROXY=https://goproxy.cn
      
      npm config set registry http://registry.npmmirror.com
      

执行make V=s时有的教程建议首次编译时添加-j 1,这是为了更好的发现编译错误。
但如果你满足下面条件,首次完全可以多线程编译的。

  1. 对源码改动不是更大。
  2. 你的硬件之前有人编译成功或受官方支持。
  3. config中没有选择太多或偏门选项。

多线程编译时,若这一步需要下载文件,下载进度条可能无法正确显示。如果你看到一直卡主不动,或是有数字一直闪烁且没有变化那多半是下载卡主了,直接终止后重新编译。

5. 从docker中取出镜像

全文见:利用 Docker 编译 OpenWrt |五十风的个人博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用 Docker 编译 OpenWrt 的相关文章

随机推荐

  • CMAKE 环境变量

    CMAKE CXX FLAGS CMAKE C FLAGS 在cmake脚本中 xff0c 设置编译选项有两种方式 xff1a 1 1 add compile options命令 add compile options命令添加的编译选项是针
  • Gstreamer常见pipeline命令 - 持续更新中

    解码 xff1a xff08 根据码流类型自适应创建相应解码器 xff09 gst launch 1 0 filesrc location 61 home user DCIM Camera VID 20201001 103749 mov q
  • ubuntu18.04 安装包提示没有可安装候选

    sudo apt get install gcc 正在读取软件包列表 完成 正在分析软件包的依赖关系树 正在读取状态信息 完成 没有可用的软件包 gcc xff0c 但是它被其它的软件包引用了 这可能意味着这个缺失的软件包可能已被废弃 xf
  • D435在ROS下的使用

    本人电脑Ubuntu16 04 Ros 为kinetic D435可以用的ros源码下载地址 https github com intel ros realsense releases一定要仔细查看每一个版本基于的sdk的版本号 D435的
  • 在ros下使用D435出现问题ResourceNotFound: realsense2_camera

    在launch的文件内运行roslaunch rs rgbd launch出现错误 xff1a ResourceNotFound realsense2 camera 或运行 roslaunch realsense2 camera rs rg
  • 在ROS中发布IMU数据

    本文主要是来发布sensor msgs Imu类型的消息 xff0c 其中 xff29 xff2d xff55 的数据为虚拟的 xff11 xff0e 在自己的工作空间中创建ros程序包 这个包依靠std msgs roscpp rospy
  • 控制理论学习资料

    DR CAN 傅里叶分析之掐死教程 xff08 完整版 xff09 更新于2014 06 06
  • 卡尔曼滤波原理二:扩展卡尔曼

    1 理论部分 上一篇介绍了线性卡尔曼滤波器 xff0c 当系统为线性高斯模型时 xff0c 滤波器能给出最优的估计 xff0c 但是实际系统总是存在不同程度的非线性 xff0c 如平方 三角关系 开方等 对于非线性系统 xff0c 可以采用
  • PIXHAWK添加自定义消息存储到SD卡

    四旋翼调试阶段总会出现很多难以预见的现象 xff0c 这时为了找到所出问题的原因 xff0c 就需要获得原始相关数据进行分析 xff0c pixhawk代码提供了记录飞行日志的功能 xff0c 能够将飞行中的重要数据存入SD卡中 xff0c
  • reStructuredText介绍

    文档格式编辑 xff0c 目前主流最强大的要是latex xff0c 但是语法太复杂 xff0c 环境要求也多 xff0c 有的时候也是写文档往往选择markdown xff0c 常常怀疑文档编辑的markdown不是亲生的 xff0c 很
  • ROS2—自定义话题及服务消息类型

    1 source ROS 2 环境 source ROS 2的基础工作空间可以使用下面的命令 xff1a source opt ros foxy setup bash 2 创建一个新的文件夹 执行类似下面的命令 xff1a mkdir p
  • 用VSCode编译运行C++(2022最新教程)以及会遇到的两个问题

    这玩意我弄了一下午 xff0c 发现网上很多教程都过时了 xff0c 现在自己整理一下造福后人 目录 第一步 xff0c 下载和配置mingw64 xff0c 即C C 43 43 编译器GCC的Windows版本 第二步 xff0c 下载
  • 从零开始学USB(一、基础知识1)

    1 什么是USB USB是Universal Serial Bus的缩写 xff0c 中文译为通用串行总线 正如USB的第一个单词表述的那样 xff0c 为了通用 那么我们看一下 xff0c 还有哪些总线不是串行的 xff0c 哪些是不通用
  • 5,树莓派3B+ 使用 Frp 实现内网穿透,公网访问web服务器,设置自动启动,后台运行。 (新人向)

    内网穿透 就是让没有固定公网 ip 的内网的服务器 xff0c 暴露在公网之上 xff0c 从而在外网可以访问 基于这个工具 xff0c 不但可以让外部网络访问内网的web服务器 xff0c 也可以访问我们自建的NAS服务器 xff08 私
  • 关于编程学习上的一些感悟——不忘初心

    序 今天无意中看到以前一起开发过的同学写的技术文章 xff0c 了解到了更多在blog和github以及一些技术交流论坛上面非常活跃 回过头来看看自己 xff0c 好像依然停留在以前的样子 xff0c 似乎与真正在踏实学技术差距好像很大了
  • uORB笔记整理

    其实是对自己看过的文章中讲uORB的部分进行了记录 uORB Micro Object Request Broker 微对象请求代理器 是PX4 Pixhawk系统中非常重要且关键的一个模块 xff0c 它肩负了整个系统的数据传输任务 xf
  • 因子图-gtsam

    闲着写下关于gtsam的内容 更新中
  • 1+11+111+1111+11111+……+11……11(2009个1)的和有多少个1?

    直接贴代码了 lt span style 61 34 font family Courier New 34 gt include lt stdio h gt define SIZE 10 int main void int i int co
  • uC/OS-ii 学习步骤及书籍推荐

    第一步 嵌入式实时操作系统 COS II原理及应用 任哲编著 首选任哲的这本书 我建议先把这本书看一遍 xff0c 弄清楚ucos是怎么回事 xff0c 至于操作系统里面的具体代码实现 xff0c 大概了解就行 xff0c 可以暂且不去细究
  • 利用 Docker 编译 OpenWrt

    原文链接 xff1a 利用 Docker 编译 OpenWrt 五十风的个人博客 由于网络原因编译openwrt时经常下载失败 xff0c 搭建编译环境也很复杂 xff0c 因此想到利用阿里云 Github action等远程构建docke