OpenWrt 编译

一、准备编译环境

  1. 一个Linux发行版,这里以Ubuntu 24.04.3 LTS为例

  2. 安装工具链,详情参考OpenWrt官网

    1
    2
    3
    4
    sudo apt update
    sudo apt install build-essential clang flex bison g++ gawk \
    gcc-multilib g++-multilib gettext git libncurses5-dev libssl-dev \
    python3-setuptools rsync swig unzip zlib1g-dev file wget

二、下载源码并配置

  1. 使用普通用户完成下面所有操作,不要使用root
  2. 下面的操作不涉及第三方feeds的添加,这些工具应该在安装完OpenWrt系统后手动安装,不应该编译到固件里面,以免造成编译错误或者固件不稳定
  1. 下载源码

    1
    2
    3
    4
    # 下载源码(-b 指定分支/标签、 --single-branch 仅下载单个分支/标签、 --depth=1 只下载最新的一次提交 )
    git clone -b v24.10.5 --single-branch --depth=1 https://github.com/openwrt/openwrt.git
    # 进入该目录
    cd openwrt
  2. 修改默认时区和网络

    1
    2
    # 编辑配置文件
    vim package/base-files/files/bin/config_generate
    • 修改时区

      1
      2
      3
      4
      # 修改时区为 CST-8
      set system.@system[-1].timezone='CST-8'
      # 修改地区为 Asia/Shanghai
      set system.@system[-1].zonename='Asia/Shanghai'
    • 修改NTP服务器,推荐下面几个服务器,从上至下,依次是

      • 中国科学院国家授时中心
      • Apple NTP服务器
      • NTP授时快速域名服务
      • 开源NTP服务器
      1
      2
      3
      4
      add_list system.ntp.server='ntp.ntsc.ac.cn'
      add_list system.ntp.server='time.apple.com'
      add_list system.ntp.server='cn.ntp.org.cn'
      add_list system.ntp.server='cn.pool.ntp.org'
    • 修改IP、网关和DNS

      1
      lan) ipad=${ipaddr:-"192.168.1.1"} ;;

      在uci -q batch <<-EOF部分添加下面的内容

      1
      2
      set network.$1.gateway='192.168.1.1'
      set network.$1.dns='114.114.114.114 8.8.8.8'
  3. 更新并安装插件

    1
    2
    3
    4
    cd ~/openwrt
    ./scripts/feeds clean
    ./scripts/feeds update -a
    ./scripts/feeds install -a
  4. 配置

    首先替换.config为官方版本,这里以24.10.5版本,x86/64架构为例

    1
    2
    3
    4
    cd ~/openwrt
    wget https://downloads.openwrt.org/releases/24.10.5/targets/x86/64/config.buildinfo
    rm -rf .config
    mv config.buildinfo .config

    接着进入配置菜单

    1
    make menuconfig

    该界面有如下操作

    • ↑ ↓ 键:上下切换
    • PgUp PgDn 键:上下翻页
    • Enter 回车键:
      • 进入子菜单
      • 选择/确认
    • Y 键:选中,在 < > 上进行操作,操作后变为 <*>
    • N 键:取消选中,在 <*> 上进行操作,操作后变为 < >
    • Esc 键:连击两下,返回上层菜单,如果在主菜单则为退出配置
    • /键:调出搜索功能

    建议按照下面的清单配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    - Target System -> x86
    - Subtarget -> x86_64
    - Target Profile -> Generic x86/64
    - Target Images
    - (0) Seconds to wait before booting the default entry // 尽可能快的重启OpenWrt
    - (2048) Root filesystem partition size (in MB) // 尽可能多的分配存储空间
    - Base system
    - <*> block-mount
    - < > dnsmasq // 不选,使用下面
    - <*> dnsmasq-full // dnsmasq完整版本
    - LuCI
    - Collections
    - <*> luci
    - <*> luci-ssl
    - Modules
    - Translations
    - <*> Simplified Chinese (zh_Hans)
    - <*> luci-compat
    - Applications
    - 这里不动,安装好OpenWrt系统后手动安装最新版本即可
    - Network
    - File Transfer
    - <*> curl
    - <*> wget-ssl

    注意,如果配置错误,可以执行下面的命令重新配置

    1
    rm -rf ./tmp && rm -rf .config

三、编译固件

  1. 预下载

    会先下载大部分编译所需文件,后面编译阶段还会下载

    1
    make download -j8 V=s
  2. 编译

    • 全核编译

      1
      make V=s -j$(nproc)
    • 单线程编译

      如果全核编译报错,需要使用单线程编译,排查错误

      1
      make V=s -j1

    编译过程非常漫长,以Intel Core i5-10400为例,需要2个小时

    如果实在无法找出错误,建议执行下面的命令后从二、下载源码并配置重新开始

    1
    rm -rf ~/openwrt

四、获取结果(以x86/64为例)

1
2
cd ~/openwrt/bin/targets/x86/64/
ls -all

五、安装系统

以下操作在路由器的OpenWrt系统中进行

  1. 先确定系统盘

    1
    df -h
  2. dd写盘重装

    假设镜像在当前目录中,系统盘是/dev/sda

    1
    gzip -dc ./openwrt-24.10.5-x86-64-generic-squashfs-combined-efi.img.gz | dd of=/dev/sda bs=4M

    等待几分钟后,显示

    1
    2
    0+94391 records in
    0+94391 records out

    即为写盘成功

  3. 重启进入新的OpenWrt系统

    这里执行重启命令可能不起作用,可以直接拔掉电源手动重启

    1
    reboot