OpenWRT 编译从源码到固件

接触 OpenWRT 一年多, 大部分时间都在进行固件编译和刷机。在这个过程中遇到过不少问题, 下面记录下编译过程的详细步骤, 供以后参考

操作步骤

准备工具:

  • 系统环境: Ubuntu 16.04 LTS 64 位
  • 路由器型号: ZBT-WA05
  • OpenWRT 版本: CC

编译过程建议使用非 root 用户

安装编译所需的工具

打开终端, 输入以下命令安装所需的编译工具

sudo apt-get update
sudo apt-get install git-core build-essential libssl-dev libncurses5-dev unzip
sudo apt-get install subversion mercurial
sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev

下载 OpenWRT 源码

下载 OpenWRT 源码前, 请确保有足够的磁盘空间 (至少 12GB)。源码体积约为几百 MB, 但编译过程中会产生大量文件。由于大部分 SVN 仓库都是失效的, 所以一些老的教程就不能参考了, 要使用 Git 下载源码。

要下载哪个版本, 可以参考 OpenWRT 的 wiki。以 CC 版本为例, 在主文件夹下执行以下命令

git clone git://git.openwrt.org/15.05/openwrt.git

安装可用的 feeds

进入 OpenWRT 源码目录, 更新并安装依赖

cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a

等待下载完成

配置编译选项

执行以下命令进行编译配置

make menuconfig

在弹出的配置界面中, 可以通过方向键选择、空格键进行选项勾选 (出现 M 表示编译但不打包进固件, * 表示编译并打包进固件)。根据 ZBT-WA05 路由器的配置, 选择硬件平台、CPU 型号等选项

ZBT-WA05_1.png

建议勾选以下选项 (前面出现 * 号)

  • LuCI (Web 界面的控制台)
    • LuCI -> 1.Collections -> luci
    • LuCI -> 2.Modules -> Translations -> Chinese(zh-cn) (中文语言包)
  • 勾选 Package the OpenWrt-base Toolchain, OpenWRT 的交叉编译工具链

完成后, 选 Save 保存更改, 退出

以上是基本的固件编译, 如果需要其他功能, 需要再勾选添加

编译固件

执行以下命令开始编译

make V=s -j
  • V=s 用于显示编译信息, 一定要勾选, 否则出错的话无法看到错误信息
  • -j 代表使用全部的 CPU 线程数, 后面跟数字表示并行编译线程数 (例如: 4C8T 的 CPU 可以使用 -j8 代表使用 8 个线程)。可以根据自己 CPU 核心数选择线程数, 但请确保系统内存足够, 若不确定可以省略 -j 参数或使用 -j1

编译完成后, 显示如下信息并且终端上没有 error 时, 表示编译成功

Signing package index...
make[2]: Leaving directory '/home/goldmoon/openwrt'
make[1]: Leaving directory '/home/goldmoon/openwrt'

/home/goldmoon/openwrt/bin/ramips/openwrt-ramips-mt7620-zbt-wa05-squashfs-sysupgrade.bin

结尾的文件路径即为编译出的固件文件

常见错误排查

在编译过程中, 可能会遇到一些错误, 大部分都是文件下载错误 (OpenWRT 源码仓库通常在国外, 最好自备梯子), 有时候需要科学上网才行。或手动下载缺失的文件放到 dl 目录中。

网络配置

LAN (Local Area Network, 局域网): 指的是一个局限在较小范围内 (如家庭、公司等) 的网络, 通常用于连接在同一地理位置内的设备。我们计算机和路由器之间的连接通常就是通过这个口进行

AN (Wide Area Network, 广域网): 指的是覆盖较大地理范围的网络, 通常指的是通过运营商提供的互联网连接。运营商拉进来的网线通常连接到路由器的 WAN 口

VLAN (Virtual Local Area Network, 虚拟局域网): VLAN 是一种将局域网划分为多个虚拟网段的技术。通过 VLAN, 一个物理网络可以被逻辑划分为多个独立的子网, 使得不同 VLAN 之间的设备通常不能直接通信。这样做的目的是为了提高网络的安全性和管理性。VLAN 可以在同一局域网内创建多个独立的网络段, 而 LAN 和 WAN 也可以在 VLAN 中划分

配置 WAN 口和 LAN 口

在 OpenWRT 中, 网络配置文件位于 /etc/config/ 目录下。特别是 WAN 和 LAN 口的配置在 /etc/config/network 文件中。以下是基本的配置示例

ZBT-WA05_2.png

配置文件的参数注释

config interface 'lan'          # 配置 LAN 口
    option type 'bridge'        # 桥接方式
    option ifname 'eth0.1'      # 代表 VLAN1, 这个很重要, 必须与下文的 switch 配置一致
    option proto 'static'       # 静态 IP

config device 'lan_dev'                  # 配置 LAN 硬件信息
    option macaddr 'XX:XX:XX:XX:XX:XX'   # 设置 MAC 地址

config interface 'wan'          # 配置 WAN 口
    option type 'dhcp'          # 使用 DHCP 获取 IP 地址

config switch                   # 交换机
    option enable_vlan '1'      # 启用 VLAN

config switch_vlan
    option vlan '1'             # VLAN1, 配置 LAN 口。和上面的 option ifname 'eth0.1' 相匹配
    option ports '0 1 2 3 6t'   # 0-3 是 LAN 口, 6t 为 CPU 端口, RT5350 有 5 个端口

config switch_vlan
    option vlan '2'             # VLAN2, 配置 WAN 口。和上面的 option ifname 'eth0.2' 相匹配
    option ports '4 6t'         # 4 是 WAN 口, 6t 为 CPU 端口

配置解释:

  • config interface 'lan': 配置 LAN 口, eth0.1 对应的是 VLAN1
  • config interface 'wan': 配置 WAN 口, 使用 DHCP 自动获取 IP 地址
  • config switch: 启用 VLAN 功能
  • config switch_vlan: 配置 VLAN1 和 VLAN2, 分别对应 LAN 和 WAN 口

原文

官方文档: Build system – Installation
OpenWRT编译——从源码到固件
OpenWRT(二)配置WAN口和LAN口

最后更新于 2020-03-03
使用 Hugo 构建
主题 StackJimmy 设计