前言

恩山论坛上有很多用户编译好的现成固件,自己编译固件最大的优势是可以根据需求更好的自定义,建议没有特别需求的用户还是直接选用现成的固件即可。编译固件也是一种乐趣,整个过程大约1-3小时左右,需要耐心等待。

环境要求

  1. 系统版本

    Debian 11 或者 Ubuntu LTS

  2. 网络要求

    最好是境外主机或者能够访问国际网络,大陆网络环境编译失败率较高,配置推荐 2H4G 以上

  3. 编译依赖

    # 升级
    sudo apt update -y
    sudo apt full-upgrade -y
    # 安装依赖
    sudo apt install -y ack antlr3 aria2 asciidoc autoconf automake autopoint binutils bison build-essential \
    bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \
    git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \
    libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \
    mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip libpython3-dev qemu-utils \
    rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev
    # 清理
    sudo apt autoremove --purge
    sudo apt clean
    

开始编译

  1. 新建一个用户,用于编译固件
    useradd -m openwrt  # 新建一个名为 openwrt 的用户
    
    # 修改用户默认的 Shell
    apt install -y sudo
    usermod -s /bin/bash openwrt
    
    # 切换用户
    su openwrt
    cd ~
    
  2. 拉取源码,这里用的是 Lean 大佬的 LEDE 分支源码
    git clone https://github.com/coolsnowwolf/lede
    cd lede
    
  3. 添加软件源,L大源码里默认有四个软件源里面包含了大部分常用插件,如果要添加其他没有的插件则需要自行添加软件源至 feeds.conf.default 文件,当然也可以单独添加某个插件
    vim feeds.conf.default
    
    # 添加软件源(打开下方仓库链接可以查看包含的插件列表,一般选前两个源就行)
    src-git kenzo https://github.com/kenzok8/openwrt-packages
    src-git small https://github.com/kenzok8/small
    src-git haibo https://github.com/haiibo/openwrt-packages
    src-git liuran001 https://github.com/liuran001/openwrt-packages
    
    # 单独添加(在更新并安装插件之前执行)
    ## 插件
    git clone https://github.com/esirplayground/luci-app-poweroff.git package/luci-app-poweroff
    
    # 更新并安装插件
    ./scripts/feeds clean
    ./scripts/feeds update -a
    ./scripts/feeds install -a
    

  4. 自定义配置

    # 修改默认IP为 10.0.0.2
    sed -i 's/192.168.1.1/10.0.0.2/g' package/base-files/files/bin/config_generate
    
    # 修改默认主机名
    sed -i '/uci commit system/i\uci set system.@system[0].hostname='Soft_Router'' package/lean/default-settings/files/zzz-default-settings
    
    # 加入编译者信息
    sed -i "s/OpenWrt /Kinoko build $(TZ=UTC-8 date "+%Y.%m.%d") @ OpenWrt /g" package/lean/default-settings/files/zzz-default-settings
    
    # 修改默认主题
    sed -i "s/luci-theme-bootstrap/luci-theme-argon/g" feeds/luci/collections/luci/Makefile
    
  5. 执行 make menuconfig 命令进入编译菜单

    菜单选项简要说明:

    # 选择 CPU 类型
    Target System (x86) --> # 软路由选择 x86,硬路由根据型号厂家自行选择
    Subtarget (x86_64) --> # CPU 子选项
    Target Profile (Generic x86/64) --> # 厂家具体型号
    
    # 设置镜像编译的格式(squashfs,ext4)
    Target Images --> # 默认 squashfs
    
    # 添加较多插件时,为了避免空间不足,建议修改下面两项默认大小(x86/64)
    Target Images --> (16) Kernel partition size (in MB) # 默认是16,建议修改为256
    Target Images --> (400) Root filesystem partition size (in MB) # 默认是400,建议修改为1024
    
    # 开启 IPv6 支持
    Extra packages --> ipv6helper(选定这个后,下面几项会自动选择)
    Network --> odhcp6c
    Network --> odhcpd-ipv6only
    LuCI --> Protocols --> luci-proto-ipv6
    LuCI --> Protocols --> luci-proto-ppp
    
    # 开启适用于 VMware 的 VMware Tools
    Utilities --> open-vm-tools
    Utilities --> open-vm-tools-fuse
    
    # 选择插件
    LuCI --> Applications # 根据需要选择,* 代表编入固件,M 表示编译成模块或者IPK包,为空表示不编译
    
    # 选择主题
    LuCI --> Themes # 选择喜欢的主题,可以选多个
    
    # 其他选项一般不需要调整,如感兴趣可以自行了解
    

    插件中文说明对照表:https://www.right.com.cn/forum/thread-3682029-1-1.html

  6. 配置完成后使用编译菜单底部的 Save 保存,然后退出菜单 Exit,开始下载软件包

    # 预下载编译所需的软件包
    make download -j8
    # 检查文件完整性
    find dl -size -1024c -exec ls -l {} \;
    # 检查文件完整性命令可以列出下载不完整的文件,小于1k的文件属于下载不完整,如果存在则用下面的命令删除,然后重新下载编译所需的软件包,再次检查
    # 确认所有文件完整可大大提高编译成功率,避免浪费时间
    find dl -size -1024c -exec rm -f {} \;
    
  7. 最后编译固件,编译完成后输出路径是 bin/targets,默认密码是 password
    # 编译固件(-j 后面是线程数,首次编译推荐用单线程)
    make V=s -j1
    

二次编译

  1. 拉取最新 OpenWrt 源码和更新 feeds 源中的软件包源码
    cd lede
    git pull
    ./scripts/feeds update -a
    ./scripts/feeds install -a
    
  2. 清除旧的编译产物和目录(可选)
    make clean
    # 源码有大规模更新或者内核更新后执行,以保证编译质量
    # 此操作会删除 /bin 和 /build_dir 目录中的文件
    
    make dirclean
    # 更换架构编译前必须执行
    # 此操作会删除 /bin 和 /build_dir 目录的中的文件(make clean),以及 /staging_dir、/toolchain、/tmp 和 /logs 中的文件
    
  3. 同首次编译,多线程编译失败后自动进入单线程编译,失败则输出详细日志
    make defconfig
    make download -j8
    find dl -size -1024c -exec ls -l {} \;
    make -j$(nproc) || make -j1 || make -j1 V=s
    
    # 如果需要重新配置
    rm -rf ./tmp && rm -rf .config # 清除临时文件和编译配置文件
    make menuconfig
    make download -j8
    find dl -size -1024c -exec ls -l {} \;
    make -j$(nproc) || make -j1 || make -j1 V=s
    

参考文档


Never give up your dreams.