• okass 在版块 软件平台 中回复了话题 openwrt编译固件详细步骤及常见问题汇总 2年, 10个月前

    一、基础环境准备

    1. Linux系统,建议Ubuntu或Linuxmint,这里是Mint 20.3版本

    2. 出国留学环境准备(网络环境十分重要,不然后面下载一些dl依赖文件可能会缺失最终导致编译失败)

    3.  SSH或者Putty 等其他远程登录工具,本地开发者可忽略

     

    二、编译具体步骤

    Openwrt 的编译过程含基础软件包的更新和Menuconfig参数的详细配置

    2.1 编译详细过程记录

    1>. 首先装好 Ubuntu 64bit,推荐 Ubuntu 18 LTS x64 / 本地使用的是linuxmint 20
    2>. 更新软件源及安装依赖

    # sudo apt-get update

    # sudo apt-get -y install build-essential asciidoc binutils bzip2 curl gawk gettext git libncurses5-dev libz-dev patch python3.5 python2.7 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 g++-multilib antlr3 gperf  ninja-build

     

    sudo apt-get install gcc g++ build-essential asciidoc  binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch flex bison make autoconf texinfo unzip sharutils subversion ncurses-term zlib1g-dev ccache upx lib32gcc1 libc6-dev-i386 uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev libglib2.0-dev xmlto qemu-utils automake libtool  -y

    3>. 下载固件源码

    本地创建openwrt目录
    # mkdir openwrt
    # cd openwrt
    # git clone https://git.openwrt.org/openwrt/openwrt.git

    (非必选) passwall 版本的源如下

    #git clone -b 19.07 –single-branch https://github.com/Lienol/openwrt openwrt19

    以非root用户进行后续编译操作,将openwrt文件夹改为当前用户权限
    # sudo chown -R $USER:$USER openwrt (推荐)
    # sudo chmod 777 -R openwrt(修改权限,重要!!)

     

    4>. 如果发现某些插件链接失效,则可以在本地进行修改更新。具体的源可以自己到github寻找
    # vim feeds.conf.default

    在文件后添加一行仓库地址
    src-git laohu https://github.com/xxxxx

    5>. 更新feeds 软件包集合
    # ./scripts/feeds clean
    # ./scripts/feeds update -a
    # ./scripts/feeds install -a

     

    6> 配置编译参数

    # make menuconfig

    如果出现文件权限提示: xxxx overriding mode 0644 (rw-r–r–)?  直接输入  -f  进行强制执行即可

     

    • 基本的CPU型号配置,和生成固件格式

    Target System:可以选择路由器的CPU品牌、架构等信息。
    Subtarget:进一步精确选择,一般可以精确到CPU型号(部分路由器可能不显示此项)。
    Target Profile:可以选择具体的路由器型号。
    Target Image: 编译输出的固件格式

     

    动态

     

    • LUCI  –>Collections –[*]LUCI, 即开启Uhttpd。这部分一定要配置好,不然编译成功后无法进入web 后台

    动态

     

    • LUCI常用的插件配置,LuCI –> Applications –>[]luci-app-xxx 这个根据自己的需求适当选择;也可以在后续手动安装插件包

    动态

     

    • LUCI 主题配置, LuCI –> Themes –> []luci-theme-xxx 当然也可以后续使用其他的主题进行安装

    动态

     

    • LuCI 中文语言包,LuCI –>Modules–> Translations –> [*] chinese simplified 根据自己需求选择即可。

    动态

    一般选择好这几项参数后就可以编译了

     

    如果不打算调整组件则输入make defconfig,它会检测编译环境并生成默认的编译配置文件。

    #make defconfig

     

    7>选好CPU/路由器型号后,进入Luci——Application菜单项,即可找到相应的插件。

    如果你需要安装插件,那么上下键移动选中此项,按Y键即可添加。

    8>.各项功能设置完毕后,左右键选择save并回车保存设置,保存过程中一路OK回车即可。

    9>.保存完毕后,左右键选择exit并回车,一路退出配置界面。

     

    10>.运行以下命令预下载编译所需的软件包(国内请尽量全局出国留学),这一步非常重要,如果包下载不完整,后面的编译大概率会失败!!!

    #make -j8 download V=s
    ps:这里的j8,后面的8代表的是CPU的核心数,如果是4核,写成j4 替代
    如果遇到包下载失败,可以尝试使用root用户下载
    #sudo make -j8 download V=s
    下载完毕后会有部分包恢复到root权限,再使用chwon命令将包改为当前用户权限
    #cd dl
    # sudo chown -R $USER:$USER *

    # sudo chmod 777 -R openwrt(修改权限,重要!!)

    -j8是指使用8个线程下载,理论上是数字越大下载越快,但似乎有个上限,实测5线程以上其实速度相差不了多少,在网络好的情况下,基本在5分钟以内能下载完。

     

    11> 检查文件的完整性

    #find dl -size -1024c -exec ls -l {} ;

    此命令可以列出下载不完整的文件(根据经验得出小于1k的文件属于下载不完整),如果存在这样的文件可以使用命令

    find dl -size -1024c -exec rm -f {} ;

    将它们删除,然后重新执行make download下载并反复检查,确认所有文件完整可大大提高编译成功率,避免浪费时间。

     

    12>.运行以下命令开始编译固件,

    第一次编译可能耗时较长,耐心等待2—3个小时。

    第二次编译大概时间为30分钟(非root账户编译,openwrt不建议root账户编译)

    make -j1 V=s

    -j 后面是线程数,这里使用单线程编译。第一次编译推荐用单线程, 即可开始编译你要的固件了,新手推荐单线程编译,一是因为玄学问题可能成功率高,二是方便查看错误日志。

    比如电脑时4核CPU,编译可以选择 make -j5 V=99,其它cpu可以使用内核数量N+1来相应修改

     

    13>.编译完成后镜像输出路径:

    openwrt19/bin/targets

     

    编译成功后,登录系统后台如下

    动态

     

    第二次编译或者需要更新包(长期未编译的环境建议更新下,短期多次编译的可以不用操作):

    更新编译系统组件

    #sudo apt update && sudo apt upgrade

    #cd openwrt

    拉取最新的openwrt版本源码

    #sudo  git pull

    更新 feeds 源中的软件包源码

    # ./scripts/feeds update -a

    安装feeds 源中的软件包源码

    # ./scripts/feeds install -a

     

    如果之前编译过,第二次可以采取多线程快速编译,可以节省很多时间

    # make V=s -j$(nproc)

     

    启用多线程编译后的效果,可以看到4核心CPU全速运行

    动态

     

     

    三、编译环境文件清理

    1.清除旧的编译产物(可选)

    make clean
    在源码有大规模更新或者内核更新后执行,以保证编译质量。此操作会删除/bin和/build_dir目录中的文件。

     

    2.清除旧的编译产物、交叉编译工具及工具链等目录(可选)

    make dirclean
    更换架构编译前必须执行。此操作会删除/bin和/build_dir目录的中的文件(make clean)以及/staging_dir、/toolchain、/tmp和/logs中的文件。

     

    3.清除 Open­Wrt 源码以外的文件(可选)

    make distclean
    除非是做开发,并打算 push 到 GitHub 这样的远程仓库,否则几乎用不到。此操作相当于make dirclean外加删除/dl、/feeds目录和.config文件。

     

    4.还原 Open­Wrt 源码到初始状态(可选)

    git clean -xdf
    如果把源码改坏了,或者长时间没有进行编译时使用。

     

    5.清除临时文件

    rm -rf tmp
    删除执行make menuconfig后产生的一些临时文件,包括一些软件包的检索信息,删除后会重新加载package目录下的软件包。若不删除会导致一些新加入的软件包不显示。

     

    6.删除编译配置文件

    rm -f .config
    在不删除的情况下如果取消选择某些组件它的依赖组件不会自动取消,所以对于需要调整组件的情况下建议删除。

     

    四、编译参考指令文件

     

    1.调整 Open­Wrt 系统组件

    make menuconfig
    如果不打算调整组件则输入make defconfig,它会检测编译环境并根据更新自动调整编译配置文件。

     

    2.预下载编译所需的软件包

    make download -j8 V=s

     

    3.检查文件完整性

    find dl -size -1024c -exec ls -l {} ;
    此命令可以列出下载不完整的文件(根据我多次编译的经验得出小于1k的文件属于下载不完整),如果存在这样的文件可以使用find dl -size -1024c -exec rm -f {} ;命令将它们删除,然后重新执行make download下载并反复检查,确认所有文件完整可大大提高编译成功率,避免浪费时间。

     

    4.开始编译

    make -j$(nproc) || make -j1 || make -j1 V=s
    多线程编译失败后自动进入单线程编译,失败则输出详细日志。

     

    五、如果需要重新配置menuconfig , 请执行如下动作:

    # make menuconfig

    涉及到包的更新配置请重新download并改权限

    #sudo make -j8 download V=s
    下载完毕后会有部分包恢复到root权限,再使用chwon命令将包改为当前用户权限
    #cd dl
    # sudo chown -R $USER:$USER *

    #cd ..

    #make clean

    # make -j$(($(nproc) + 1)) V=s

     

    如果遇到编译失败,一些玄学问题无法解决。可以尝试使用root用户重复第五部分: 如果需要重新配置menuconfig , 重新来一遍

     

     

WirelessLink
Logo