热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:用Docker编译Openwrt

本文由编程笔记#小编为大家整理,主要介绍了用Docker编译Openwrt相关的知识,希望对你有一定的参考价值。前言家里的斐讯K2
本文由编程笔记#小编为大家整理,主要介绍了用 Docker 编译 Openwrt相关的知识,希望对你有一定的参考价值。



前言

家里的 斐讯 K2P 路由器已经使用了3年了,一直用别人的固件,后来想自己编译固件。

我打算编译和使用 Lean's OpenWrt ,Lean 的这个固件非常完善,对 K2P 的无线支持的非常好(开源的 Openwrt K2P 的无线没办法 2.4G5G 同时使用)。

采用 Docker 进行编译有很多好处,避免在宿主机上安装杂七杂八的软件。网上有许多 lede-builder ,我尝试过使用 hanxi的lede-docker-builder ,用了几天,发现有一些问题:



  1. Docker 底包用的是 Ubuntu 18.04 ,里面的包都比较老了,尤其是 Openwrt 19.07 发布之后,有些需要 Python 3.5 以上版本的包都没办法编译;


  2. 镜像文件比较大,解压之后足足有 1.82G 下载下来非常慢。


折腾了一天,我终于把设置和流程弄好了。


建立 Docker 镜像

我在 github 上新建了一个仓库 lll9p/docker-lede-builder ,要点主要有:



  1. 使用 debian:buster-slim 容器,比较新,而且比完整的 debian:buster 有所精简;


  2. 预安装 proxychains4 和 sudo proxychains 当处于网络环境不好的时候使用代理进行文件下载或提高网速;sudo 可以进行一些 root 用户操作;


  3. 使用 apt-get --no-install-recommends 命令进行安装,大幅精简镜像体积;


  4. 新建 build 用户,免于直接使用 root 编译。


Dockerfile 如下:



FROM debian:buster-slim
MAINTAINER lll9p
ARG DEBIAN_FROnTEND=noninteractive
RUN apt-get update \
&& apt-get install -y locales curl wget \
&& apt-get install -y --no-install-recommends build-essential \
asciidoc binutils bzip2 gawk gettext git libncurses5-dev \
libz-dev patch python3 unzip zlib1g-dev lib32gcc1 \
libc6-dev-i386 subversion flex uglifyjs git-core \
gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo \
libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf \
automake libtool autopoint device-tree-compiler \
proxychains4 sudo vim \
&& groupadd -r build && useradd -r -u 1000 -g build build \
&& passwd -d root \
&& passwd -d build \
&& echo '%build ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
ENV LANG en_US.utf8
USER build
WORKDIR /home/build
ENV FORCE_UNSAFE_COnFIGURE=1
CMD ["/bin/bash"]

pushgithub 上之后,再在 Docker 上新建一个 repo : lll9p/docker-lede-builder@dockerhub ,在 Build configurations `` 那里设置好指向就自动进行 ``build 了,经过几次修改提交之后,最后一个 build 用了11min的样子。pull 镜像下来,大小也才 650MB ,精简的不错。


一些编译辅助脚本

利用脚本可以方便地编译或实现自动化:



  1. 目录结构初始化 - 将 /home/\`whoami\`/data/docker 挂载到 docker 的启动目录 /home/build



    • data/docker 目录下 git clone Lean's OpenWrt 。


    • 由于我使用了 server酱 ,顺便也 git 一份到 docker 下。



  2. 脚本:



    该脚本作用是


    #!/bin/bash
    BUILD_PATH="/home/build"
    PROXYCHAINS="proxychains4 -q "
    echo 'Start build script.'
    echo ''
    echo '--- Modify proxychains configs. ---'
    sudo sed -i '$ d' /etc/proxychains4.conf
    sudo sed -i '$ d' /etc/proxychains4.conf
    echo 'socks5 172.17.0.1 1081' | sudo tee -a /etc/proxychains4.conf
    echo '' | sudo tee -a /etc/proxychains4.conf
    echo '--- Pull from git server. ---'
    echo ''
    echo '--- Pull from lede. ---'
    cd ${BUILD_PATH}/lede
    ${PROXYCHAINS} git pull
    echo '--- Pull from luci-app-serverchan. ---'
    cd ${BUILD_PATH}/luci-app-serverchan
    ${PROXYCHAINS} git pull
    echo ''
    echo '--- Add luci-app-serverchan to package. ---'
    echo ''
    cd ${BUILD_PATH}/lede
    rm ${BUILD_PATH}/lede/package/feeds/luci/luci-app-serverchan
    ln -s ${BUILD_PATH}/luci-app-serverchan ${BUILD_PATH}/lede/package/feeds/luci/luci-app-serverchan
    ${PROXYCHAINS} ${BUILD_PATH}/lede/scripts/feeds update -a && ${BUILD_PATH}/lede/scripts/feeds install -a
    echo '--- Remove tmp files. ---'
    rm -rf ${BUILD_PATH}/lede/tmp
    echo '--- Remove tmp old config. ---'
    rm -rf ${BUILD_PATH}/lede/.config
    echo '--- Using diff config file. ---'
    cp ${BUILD_PATH}/diffconfig ${BUILD_PATH}/lede/.config
    echo '--- Expand to full config file. ---'
    make defconfig
    echo '--- Download needed files. ---'
    ${PROXYCHAINS} make download
    echo '--- Start build. ---'
    make -j5 V=s



    用于自动更新编译好的固件,具体目录和 Openwrt 的密码请自行更换,依赖 sshpass


    #! /bin/bash
    sshpass -p 我的密码 ssh root@192.168.1.1 'rm /tmp/update.bin'
    sshpass -p 我的密码 scp /home/u/data/docker/lede/bin/targets/ramips/mt7621/openwrt-ramips-mt7621-phicomm_k2p-squashfs-sysupgrade.bin root@192.168.1.1:/tmp/update.bin
    sshpass -p 我的密码 ssh root@192.168.1.1 'sysupgrade -v /tmp/update.bin'



    • flash.sh




    • comple.sh




    1. 进行 proxychans 设置(需要提前在宿主机上开启代理)


    2. 更新 lede 和 server酱


    3. 更新 feeds


    4. 由于在之前使用 data/docker/lede/scripts/diffconfig.sh > data/diffconfig 所以可以用它来更新 .config ,不必每次都 make menuconfig


    5. 最后是 downloadmake 编译,采用 5 个进程


    6. 如果不希望使用代理进行下载,可以将 PROXYCHAINS 注释掉




使用方法


启动 docker



  1. 先使用 sudo systemctl start docker 启动 docker daemon ,然后将 lede 克隆到 data/docker 目录下;


  2. 再执行 sudo docker pull lll9p/docker-lede-builder 安装所需镜像;


  3. 执行 sudo docker run --rm -it -v /home/u/data/docker:/home/build lll9p/docker-lede-builder 即可进入编译环境,可以进行手动编译或者使用之前提供的 compile.sh 脚本进行自动编译;


  4. 可以使用 sudo docker run --rm=true -v /home/lao/data/docker:/home/build lll9p/docker-lede-builder /bin/bash /home/build/compile.sh 进行自动编译。




推荐阅读
  • docker安装到基本使用
    记录docker概念,安装及入门日常使用Docker安装查看官方文档,在"Debian上安装Docker",其他平台在"这里查 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • python3.7 安装pip3_python3的pip3安装
    ---恢复内容开始---pip3的安装需要对应一整套python的编译工具库,所以安装好的pip3是这个样子:inearAi:~$pip3-Vpi ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • Ubuntu 用户安装 Linux Kernel 3.15 RC1
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
  • 用ESP32与Python实现物联网(IoT)火焰检测报警系统
    下图是本案例除硬件连线外的3步导学开发过程,每个步骤中实现的功能请参考图中的说明。在硬件连线完成之后我们建议您先使用“一分钟上云体验”功能预先体验本案例的实际运行效果 ... [详细]
  • 开发板:FL2440内核:linux3.0无线网卡:RT3070RT3070的工作模式分为STA(station)模式、SoftAP(AccessPoint)模式两种。STA ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
author-avatar
mobiledu2502928311
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有