一、引言
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 中没有所需的软件包,用户可以自行添加:
-
将软件包源码放入
package/
目录。 -
在
package/
目录下创建对应的 Makefile 文件,定义软件包的编译规则和依赖关系。 -
重新执行
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”(内存不足)错误,系统自动终止编译进程。
解决方法:
- 增加交换空间:
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
上述命令创建了一个 4GB 的交换文件,并启用该交换空间。
2. 将交换空间设置为永久生效,编辑/etc/fstab
文件,添加以下内容:
/swapfile none swap sw 0 0
保存文件后,系统重启时将自动启用交换空间。
4.2.3 源码编译错误
问题现象:编译某个软件包时出现错误,如代码语法错误、链接错误等。
解决方法:
-
查看详细的编译日志,定位错误发生的具体位置和原因。
-
检查软件包的 Makefile 文件是否正确,确保编译规则和依赖关系定义无误。
-
尝试更新软件包源码或查找对应的补丁文件,修复源码中的错误后重新编译。
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 准备工作
-
将一台电脑通过网线连接到路由器的 LAN 口。
-
将电脑 IP 地址设置为与路由器同一网段(如 192.168.1.2,子网掩码 255.255.255.0)。
-
在电脑上安装 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 界面恢复
部分路由器在刷写失败后,会自动进入恢复模式。用户可尝试以下操作:
-
将电脑连接到路由器的 LAN 口。
-
打开 Web 浏览器,输入恢复模式地址(通常为 192.168.1.1 或 192.168.0.1)。
-
在恢复模式界面中,按照提示上传正确的 OpenWrt 固件文件或原厂固件文件,进行恢复操作。
6.2.2 通过 SSH 修复
如果路由器仍能通过 SSH 连接,可以尝试以下修复方法:
-
使用 SSH 工具登录到路由器。
-
检查系统文件是否损坏,执行文件系统检查命令,如
fsck
。 -
重新安装缺失或损坏的软件包:
opkg update
opkg install 缺失的软件包
- 如果系统配置被破坏,尝试恢复默认配置:
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 模块
-
将 TTL 模块的 GND 与路由器的 GND 连接。
-
将 TTL 模块的 RX 与路由器的 TX 连接。
-
将 TTL 模块的 TX 与路由器的 RX 连接。
注意:不要连接 VCC,路由器通过自身电源供电,避免因电压不匹配损坏设备。注意:不要连接 VCC,路由器通过自身电源供电,避免因电压不匹配损坏设备。
6.3.3 配置串口工具
-
在电脑上安装 TTL 模块对应的串口驱动(如 CH340、CP2102 等驱动)。
-
打开串口工具(如 Putty、SecureCRT、Minicom)。
-
配置串口参数:
-
波特率:通常设置为 115200。
-
数据位:8。
-
停止位:1。
原创文章,作者:OXIDA,如若转载,请注明出处:https://www.lifeto.fun/archives/347