OpenWrt 系统编译与救砖指南

一、引言

OpenWrt 作为一个高度灵活且开源的嵌入式 Linux 操作系统,广泛应用于路由器、智能家居网关等网络设备。它打破了传统路由器固件功能单一的局限,允许用户根据自身需求定制系统,添加诸如科学上网、广告过滤、多设备管理等丰富功能。然而,在编译 OpenWrt 系统或刷写固件的过程中,稍有不慎就可能导致设备变砖,无法正常使用。本文将详细介绍 OpenWrt 系统的编译流程以及救砖方法,帮助读者安全、顺利地使用 OpenWrt 系统。

二、OpenWrt 编译环境准备

2.1 硬件要求

  • 处理器:建议使用双核及以上处理器,如 Intel Core i3 或 AMD Ryzen 3 系列,以保证编译过程的效率。若处理器性能过低,可能导致编译时间过长甚至编译失败。

  • 内存:至少 4GB 内存,推荐 8GB 或更高。编译过程中,系统会占用大量内存来处理源码和依赖项,内存不足容易引发编译中断。

  • 存储:预留 50GB 以上的空闲磁盘空间。OpenWrt 源码及编译过程产生的文件会占用较多磁盘,确保有足够空间避免编译出错。

  • 网络:稳定的互联网连接必不可少,用于下载 OpenWrt 源码、依赖包和软件库。

2.2 软件要求

2.2.1 操作系统选择

  • Linux 系统:推荐使用 Ubuntu 20.04 LTS 或更高版本、Debian 11 或更高版本。这些系统具有良好的兼容性和稳定性,且软件包管理方便,便于安装编译所需的依赖项。

  • Windows 系统:可通过 Windows Subsystem for Linux 2(WSL2)安装 Ubuntu 等 Linux 发行版,在 Windows 环境中模拟 Linux 编译环境,但部分功能可能存在限制。

2.2.2 安装必要软件包

在 Ubuntu 或 Debian 系统中,打开终端,依次执行以下命令安装编译所需的软件包:

sudo apt-get update

sudo apt-get install -y build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch 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 python3 python3-pip python3-setuptools python3-wheel python3-cryptography python3-pyparsing python3-pyelftools libelf-dev automake libtool

这些软件包涵盖了编译工具、文本处理、版本控制、库文件等编译 OpenWrt 所需的基础组件。

2.3 获取 OpenWrt 源码

2.3.1 使用 Git 克隆源码

打开终端,执行以下命令克隆 OpenWrt 官方源码仓库:

git clone https://git.openwrt.org/openwrt/openwrt.git

cd openwrt

上述命令会将 OpenWrt 源码下载到当前目录下的openwrt文件夹,并进入该文件夹。

2.3.2 选择合适的分支

查看可用分支:

git branch -a

通常,稳定版本的分支适合大多数用户。以 OpenWrt 22.03 版本为例,切换到该分支:

git checkout openwrt-22.03

稳定分支经过大量测试,相对更稳定,能减少编译和使用过程中出现问题的概率。

2.3.3 更新 feeds

feeds 是 OpenWrt 的软件包管理系统,包含了丰富的软件包和配置文件。执行以下命令更新 feeds:

./scripts/feeds update -a

./scripts/feeds install -a

update -a命令用于更新所有可用的 feeds 源,install -a命令则安装所有更新后的软件包和配置。

三、OpenWrt 编译配置

3.1 配置目标设备

3.1.1 启动配置界面

在 OpenWrt 源码目录下,执行以下命令启动图形化配置界面:

make menuconfig

这将打开一个基于文本的菜单配置界面,用户可在其中进行各种编译配置。

3.1.2 选择目标系统和设备

在配置界面中,通过方向键依次选择:

  • Target System:根据路由器硬件平台选择对应的目标系统,如 MediaTek Ralink MIPS、Qualcomm Atheros 等。

  • Subtarget:进一步选择具体的硬件子目标,以匹配设备的硬件细节。

  • Target Profile:选择与路由器型号完全对应的配置文件,确保编译出的固件与设备兼容。

3.2 软件包选择

3.2.1 基础软件包

  • base-files:提供 OpenWrt 系统的基础文件系统和配置文件,是系统运行的基础。

  • kernel:Linux 内核是系统的核心,负责管理硬件资源和提供基本的系统服务。

  • luci:Lightweight Utility for Configuration Interface,即轻量级配置界面。通过 luci,用户可以方便地在 Web 浏览器中对 OpenWrt 系统进行配置和管理。

3.2.2 常用扩展软件包

  • network:包含各类网络工具,如 iptables(用于网络流量控制和防火墙设置)、wireguard(一种快速、现代的 VPN 协议)、openvpn(老牌 VPN 解决方案)等,满足用户不同的网络需求。

  • security:如 fail2ban,可自动检测并阻止恶意 IP 地址的登录尝试,增强系统安全性。

  • utils:实用工具软件包,如 htop(交互式系统监控工具)、screen(终端复用器)等,方便用户在终端中进行系统管理和操作。

  • python:Python 环境及相关库,为运行基于 Python 的脚本和应用提供支持。

3.2.3 自定义软件包添加

如果官方 feeds 中没有所需的软件包,用户可以自行添加:

  1. 将软件包源码放入package/目录。

  2. package/目录下创建对应的 Makefile 文件,定义软件包的编译规则和依赖关系。

  3. 重新执行make menuconfig,在配置界面中选择并启用自定义软件包。

3.3 内核配置

3.3.1 进入内核配置

make menuconfig的配置界面中,选择Kernel configuration进入内核配置选项。

3.3.2 常用内核配置选项

  • Networking support:配置网络功能支持,如 VLAN(虚拟局域网)划分、QoS(服务质量)设置等,优化网络性能。

  • Device Drivers:选择设备驱动支持,确保路由器的无线网卡、USB 设备等硬件能够正常工作。

  • File systems:设置文件系统支持,如 ext4、f2fs 等,根据需求选择合适的文件系统格式。

3.4 保存配置

完成所有配置后,在make menuconfig界面中选择Save,将配置保存到.config文件中。该文件记录了编译所需的所有配置信息,后续编译将基于此文件进行。

四、OpenWrt 编译过程

4.1 开始编译

在 OpenWrt 源码目录下,执行以下命令开始编译:

make -j\$(nproc) download

make -j\$(nproc) V=s
  • -j$(nproc):利用多核处理器并行编译,$(nproc)表示当前系统的 CPU 核心数,可显著加快编译速度。

  • V=s:显示详细的编译日志,便于在编译过程中排查问题。如果编译过程中出现错误,通过日志可以快速定位问题所在。

4.2 编译过程常见问题及解决方法

4.2.1 依赖包缺失

问题现象:编译过程中提示缺少某个依赖包,导致编译中断。

解决方法:根据错误提示,在终端中执行sudo apt-get install 缺失的包名命令,安装缺失的依赖包,然后重新执行编译命令。

4.2.2 编译内存不足

问题现象:编译过程中出现 “Out of memory”(内存不足)错误,系统自动终止编译进程。

解决方法

  1. 增加交换空间:
fallocate -l 4G /swapfile

chmod 600 /swapfile

mkswap /swapfile

swapon /swapfile

上述命令创建了一个 4GB 的交换文件,并启用该交换空间。

2. 将交换空间设置为永久生效,编辑/etc/fstab文件,添加以下内容:

/swapfile none swap sw 0 0

保存文件后,系统重启时将自动启用交换空间。

4.2.3 源码编译错误

问题现象:编译某个软件包时出现错误,如代码语法错误、链接错误等。

解决方法

  1. 查看详细的编译日志,定位错误发生的具体位置和原因。

  2. 检查软件包的 Makefile 文件是否正确,确保编译规则和依赖关系定义无误。

  3. 尝试更新软件包源码或查找对应的补丁文件,修复源码中的错误后重新编译。

4.3 编译完成

编译成功后,生成的固件文件位于bin/目录下。根据目标设备的不同,固件文件可能具有不同的扩展名,如.bin.img等。这些固件文件就是可用于刷写路由器的 OpenWrt 系统镜像。

五、OpenWrt 固件刷写

5.1 通过 Web 界面刷写

5.1.1 登录原路由器管理界面

打开 Web 浏览器,在地址栏中输入原路由器的管理地址(通常为 192.168.1.1 或 192.168.0.1),按下回车键后,输入路由器的用户名和密码登录管理界面。

5.1.2 进入固件升级页面

在路由器管理界面中,找到并点击系统 -> 固件升级选项,进入固件升级页面。

5.1.3 选择 OpenWrt 固件

在固件升级页面中,点击浏览按钮,从本地文件系统中选择编译好的 OpenWrt 固件文件,然后点击升级按钮。

5.1.4 等待升级完成

固件升级过程中,路由器会自动进行操作,请勿断电或关闭浏览器。升级完成后,路由器会自动重启,此时 OpenWrt 系统将开始运行。

5.2 通过命令行刷写(适用于 Linux 系统)

5.2.1 安装必要工具

在 Linux 系统中,执行以下命令安装刷写所需的工具:

sudo apt-get install mtd-utils

mtd-utils工具集提供了对路由器闪存设备的操作功能,用于刷写固件。

5.2.2 连接到路由器 SSH

使用 SSH 工具连接到路由器,命令格式为:

ssh root@路由器IP地址

输入路由器的 root 密码,登录到路由器的命令行界面。

5.2.3 备份原固件(重要)

在刷写新固件之前,务必备份原固件,以防刷写失败导致设备无法使用。执行以下命令备份原固件:

mtd read /dev/mtd0 original-firmware.bin

其中,/dev/mtd0为固件分区,根据路由器实际情况可能有所不同。备份的原固件将保存为original-firmware.bin文件。

5.2.4 刷写 OpenWrt 固件

执行以下命令刷写 OpenWrt 固件:

mtd write openwrt-firmware.bin firmware

openwrt-firmware.bin替换为实际的 OpenWrt 固件文件名,firmware为固件分区名称,根据实际情况填写。

5.2.5 重启路由器

刷写完成后,执行reboot命令重启路由器,使新固件生效。

5.3 通过 TFTP 刷写(适用于紧急情况)

5.3.1 准备工作

  1. 将一台电脑通过网线连接到路由器的 LAN 口。

  2. 将电脑 IP 地址设置为与路由器同一网段(如 192.168.1.2,子网掩码 255.255.255.0)。

  3. 在电脑上安装 TFTP 服务器:

sudo apt-get install tftpd-hpa

5.3.2 配置 TFTP 服务器

编辑/etc/default/tftpd-hpa文件,设置 TFTP 服务器参数:

TFTP\_USERNAME="tftp"

TFTP\_DIRECTORY="/var/lib/tftpboot"

TFTP\_ADDRESS="0.0.0.0:69"

TFTP\_OPTIONS="-l -c -s"

创建 TFTP 目录并设置权限:

sudo mkdir -p /var/lib/tftpboot

sudo chmod -R 777 /var/lib/tftpboot

重启 TFTP 服务:

sudo systemctl restart tftpd-hpa

5.3.3 将固件文件复制到 TFTP 目录

将编译好的 OpenWrt 固件文件复制到 TFTP 服务器目录:

sudo cp openwrt-firmware.bin /var/lib/tftpboot/firmware.bin

5.3.4 进入路由器 TFTP 恢复模式

不同路由器进入 TFTP 恢复模式的方法不同,通常是在路由器开机时按住 Reset 按钮,持续数秒后松开,路由器将进入 TFTP 恢复模式,并自动通过 TFTP 协议请求固件文件。

5.3.5 等待刷写完成

路由器会自动从 TFTP 服务器下载固件并刷写,刷写完成后会自动重启。此时,路由器将运行新刷入的 OpenWrt 固件。

六、OpenWrt 系统救砖指南

6.1 砖机的定义与原因

6.1.1 砖机定义

  • 软砖:路由器能够通电,部分硬件功能正常,但无法正常进入 OpenWrt 系统,或者无法通过 Web 界面、SSH 等正常方式访问。例如,路由器启动后停留在开机画面,或者可以 ping 通但无法登录管理界面。

  • 硬砖:路由器无法通电,或通电后无任何反应,指示灯不亮,风扇不转,设备完全无法工作。

6.1.2 砖机常见原因

  • 固件刷写过程中意外断电,导致固件写入不完整。

  • 刷写了与路由器硬件不兼容的固件,如将其他型号路由器的固件刷入当前设备。

  • 编译的固件存在严重错误,如内核配置错误、软件包冲突等,导致系统无法启动。

  • 用户在使用过程中错误修改系统文件或配置,破坏了系统的正常运行环境。

6.2 软砖救砖方法

6.2.1 通过 Web 界面恢复

部分路由器在刷写失败后,会自动进入恢复模式。用户可尝试以下操作:

  1. 将电脑连接到路由器的 LAN 口。

  2. 打开 Web 浏览器,输入恢复模式地址(通常为 192.168.1.1 或 192.168.0.1)。

  3. 在恢复模式界面中,按照提示上传正确的 OpenWrt 固件文件或原厂固件文件,进行恢复操作。

6.2.2 通过 SSH 修复

如果路由器仍能通过 SSH 连接,可以尝试以下修复方法:

  1. 使用 SSH 工具登录到路由器。

  2. 检查系统文件是否损坏,执行文件系统检查命令,如fsck

  3. 重新安装缺失或损坏的软件包:

opkg update

opkg install 缺失的软件包
  1. 如果系统配置被破坏,尝试恢复默认配置:
firstboot

reboot

6.2.3 通过 TFTP 恢复

若路由器无法进入系统,但能通过 TFTP 协议通信,可以使用 TFTP 方法刷写正确的固件。具体步骤参考前文 “5.3 通过 TFTP 刷写(适用于紧急情况)”。

6.3 硬砖救砖方法

6.3.1 硬件连接准备

  • 所需工具:烙铁、焊锡、TTL 转 USB 模块、杜邦线。

  • TTL 引脚定义

    • VCC:电源正极(通常 3.3V 或 5V,根据路由器型号确定)。

    • GND:接地。

    • RX:接收数据。

    • TX:发送数据。

6.3.2 连接 TTL 模块

  1. 将 TTL 模块的 GND 与路由器的 GND 连接。

  2. 将 TTL 模块的 RX 与路由器的 TX 连接。

  3. 将 TTL 模块的 TX 与路由器的 RX 连接。
    注意:不要连接 VCC,路由器通过自身电源供电,避免因电压不匹配损坏设备。

    注意:不要连接 VCC,路由器通过自身电源供电,避免因电压不匹配损坏设备。

6.3.3 配置串口工具

  1. 在电脑上安装 TTL 模块对应的串口驱动(如 CH340、CP2102 等驱动)。

  2. 打开串口工具(如 Putty、SecureCRT、Minicom)。

  3. 配置串口参数:

  • 波特率:通常设置为 115200。

  • 数据位:8。

  • 停止位:1。

原创文章,作者:OXIDA,如若转载,请注明出处:https://www.lifeto.fun/archives/347

Like (0)
Previous 2天前
Next 2025年3月29日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注