OpenWrt开发环境搭建全攻略:从交叉编译到固件烧写
1. 项目概述为什么需要搭建OpenWrt开发环境刚接触OpenWrt开发的朋友可能一开始会有点懵不就是给路由器刷个系统吗怎么还要搞什么“交叉编译”、“开发环境”这和我们平时在Windows上写个Python脚本直接双击运行完全是两码事。我刚开始折腾MT7621、MT7981这些路由器开发板的时候也踩过不少坑今天就把这些年积累的搭建OpenWrt开发环境的经验掰开揉碎了讲清楚。简单来说OpenWrt开发环境的核心就是一套“在强大的电脑上为弱小的路由器板子制造软件”的流水线。你的开发主机比如你的笔记本电脑就像是设备齐全的现代化汽车工厂而目标板比如一个MT7621开发板就像是一个只有基本框架的汽车底盘。你不可能在底盘上直接锻造发动机、生产轮胎你必须先在工厂里把所有零件造好、组装成整车再运到底盘上安装。在嵌入式开发里这个过程就叫“交叉编译”在你的x86电脑上使用一套特殊的工具链交叉编译工具链生成能在ARM或MIPS架构的路由器CPU上运行的二进制程序。所以搭建这个环境的目的非常明确获得编译能力能够从源代码编译出整个OpenWrt固件、独立的软件包ipk、甚至是Bootloader。建立调试通道通过串口和网络你能在开发板上执行命令、查看日志、传输文件就像直接操作它一样。提高开发效率在主机上修改代码、编译、通过虚拟网络测试远比在资源受限的设备上直接操作要快得多、方便得多。无论你是想深度定制路由器功能开发新的网络应用还是单纯学习嵌入式Linux一个稳定、高效的OpenWrt开发环境都是第一步也是最重要的一步。下面我就带你从硬件连接到软件配置一步步把这个“工厂”建起来。2. 硬件环境构建连接你的“工厂”与“车间”2.1 理解交叉开发模式主机与目标板的角色在桌面开发中你写代码的机器主机和运行代码的机器目标机是同一台设备。编译器生成的是本地指令集如x86-64的程序编译完直接就能跑。但嵌入式世界是分裂的你的开发主机很可能是Intel或AMD的x86_64架构而你的目标板如MT7621是MIPS架构MT7986是ARM架构。它们的指令集互不兼容一个在x86上编译好的程序直接扔到MIPS板子上是根本无法执行的。这就是交叉开发模式的由来。你需要一套运行在x86主机上但能生成MIPS/ARM指令程序的编译器这就是交叉编译工具链。OpenWrt的构建系统已经集成了这个工具链我们搭建环境本质上就是准备好让这个构建系统能顺利运行起来的所有条件。对于一块全新的开发板典型的开发流程分为三步这与你的开发阶段紧密相关第一步BootloaderU-Boot的烧录与引导Bootloader是设备上电后运行的第一段代码它的职责是初始化最基础的硬件如DDR内存、串口然后从存储设备SPI Flash上加载并启动主操作系统OpenWrt。对于MT7621这类公版方案厂家通常已经预烧了可用的U-Boot。这里有一个非常重要的经验除非你非常清楚自己在做什么并且有SPI Flash编程器这种“救砖”工具否则绝对不要轻易尝试重新编译和烧写U-Boot。一个错误的U-Boot会直接让设备变“砖”无法通过常规手段启动。我们开发环境搭建默认基于一个已经正常工作的U-Boot。第二步OpenWrt系统固件的编译与烧写这是我们的主要工作。我们在主机上配置、编译完整的OpenWrt系统生成一个.bin或.img格式的固件文件。然后通过U-Boot提供的网络TFTP或存储设备USB更新功能将这个固件烧写到开发板的Flash中。有了一个能启动的OpenWrt基础系统后续的应用开发才有了平台。第三步应用程序的编译与部署在有了OpenWrt基础系统后我们更多的开发工作是编写或移植具体的应用程序如一个网络监控服务、一个自定义的LuCI界面插件。我们在主机上利用OpenWrt SDK软件开发工具包交叉编译这些应用生成.ipk安装包然后通过SCP传到设备上用opkg install命令安装运行。要实现这个流程主机和目标板之间需要两条关键的物理连接串口Serial Console这是调试的“生命线”。用于在设备启动初期U-Boot阶段和系统启动后接收内核打印信息、提供命令行交互界面。没有串口设备启动失败时你将是“睁眼瞎”。网络Ethernet这是数据传输的“高速公路”。用于通过TFTP下载固件、通过SCP/SFTP传输文件、通过SSH登录系统进行配置。它让开发过程变得高效。2.2 硬件准备清单与连接实操主机要求你的“工厂”CPU与内存建议使用近5年内的x86_64架构处理器。编译OpenWrt尤其是首次编译需要下载和编译大量工具链和软件包是一个CPU和内存密集型任务。内存至少8GB强烈推荐16GB或以上。4GB内存编译较大系统时极易因内存不足而失败。硬盘空间至少预留50GB的可用空间。一个完整的OpenWrt编译目录包含下载的源码、编译缓存、编译输出轻松占用30GB以上。使用SSD能显著提升编译速度。操作系统Linux是首选。Ubuntu LTS版本如20.04 22.04是社区支持最好的软件包齐全问题也最容易搜索到解决方案。本文将以Ubuntu为例。关键接口一个可用的USB接口用于连接串口调试器一个有线网口用于与开发板直连避免复杂的网络配置问题。目标板要求你的“车间”推荐配置如原文所述为了有更流畅的开发体验和容纳更多功能建议选择RAM不小于512MBFlash不小于32MB的开发板或路由器。市面上很多MT7621256MB RAM16MB Flash的“矿渣”设备作为最终产品可能够用但作为开发板在编译大型软件包时会比较吃力调试空间也小。必备接口一个串口调试接口通常是排针需要USB转TTL模块连接至少一个有线LAN/WAN口。硬件连接步骤连接串口将USB转TTL模块如CH340、CP2102、FT232的TX线接开发板的RX针RX线接开发板的TX针GND接GND。切勿连接VCC3.3V/5V除非你确认开发板需要外部供电。将USB转TTL模块插入主机USB口。连接网络用一根网线一端连接主机的有线网口另一端连接开发板的任意一个LAN口。建议使用这种“主机-开发板”直连的方式而不是都接入路由器。这能简化网络配置避免IP地址冲突和路由问题。上电给开发板接通电源。串口终端软件配置 在Ubuntu主机上安装并配置一个串口终端工具如minicom或picocom。sudo apt-get install picocom # 安装picocom它比minicom更简洁连接串口假设你的串口设备是/dev/ttyUSB0sudo picocom -b 115200 /dev/ttyUSB0常见的串口参数是波特率115200数据位8停止位1无校验位无流控。连接成功后给开发板上电你应该能在终端里看到U-Boot和内核的启动日志。注意如果ls /dev/ttyUSB*找不到设备可能是当前用户没有权限。可以尝试sudo或者将用户加入dialout组sudo usermod -aG dialout $USER然后注销重新登录。3. 软件环境构建在Ubuntu中搭建编译“流水线”虽然可以在物理机上直接安装Ubuntu但对于大多数开发者尤其是Windows用户使用虚拟机是更灵活、安全的选择。它方便快照和回滚避免搞乱宿主机系统。3.1 虚拟机与Ubuntu系统安装详解这里我以VMware Workstation 17 Player免费版和Ubuntu 22.04 LTS为例。选择更新的LTS版本能获得更长的支持周期和更好的硬件兼容性。下载资源VMware Workstation Player: 从VMware官网下载。Ubuntu 22.04 LTS ISO镜像: 从Ubuntu官网或国内镜像站如阿里云镜像、清华镜像下载。创建虚拟机打开VMware点击“创建新虚拟机”。选择“自定义高级”以便更精细控制配置。硬件兼容性选择默认的“Workstation 17.x”。安装来源选择“安装程序光盘映像文件(iso)”并指向你下载的Ubuntu 22.04 ISO文件。客户机操作系统选择“Linux”版本选择“Ubuntu 64位”。虚拟机命名与位置给虚拟机起个名字如OpenWrt-Build并选择一个剩余空间大于80GB的磁盘位置。处理器配置根据宿主机性能分配至少2个核心4个更佳。内存这是关键分配给虚拟机至少8GB8192 MB。如果宿主机有16GB分配10-12GB给虚拟机会极大提升编译速度。网络类型选择“桥接模式”。这会让虚拟机像一台真实设备一样接入你的局域网拥有独立的IP方便后续与开发板直连和网络调试。I/O控制器和磁盘类型默认推荐即可LSI Logic, NVMe。磁盘选择“创建新虚拟磁盘”。磁盘容量至少分配80GB。选择“将虚拟磁盘拆分成多个文件”。完成创建。安装Ubuntu启动虚拟机它会从ISO镜像引导进入Ubuntu安装界面。语言选择“中文简体”点击“安装Ubuntu”。键盘布局选择“Chinese”。网络可以暂时不连。安装类型选择“最小安装”以节省空间和安装时间。务必勾选“为图形或无线硬件以及其它媒体格式安装第三方软件”这会包含一些重要的驱动和编解码器。安装类型磁盘选择“清除整个磁盘并安装Ubuntu”因为这是虚拟磁盘可以放心操作。设置你的时区上海。创建用户输入你的姓名、计算机名如openwrt-builder、用户名和密码。记住这个用户名和密码。等待安装完成重启虚拟机。3.2 基础系统配置与开发依赖安装系统安装好后第一件事是更新软件源并安装编译OpenWrt所必需的工具和库。更新系统并安装基础工具 打开终端CtrlAltT执行以下命令sudo apt update sudo apt upgrade -y sudo apt install -y build-essential ccache ecj fastjar file g gawk \ gettext git java-propose-classpath libelf-dev libncurses5-dev \ libncursesw5-dev libssl-dev python3 python3-distutils python3-setuptools \ python3-venv rsync subversion swig time unzip wget xsltproc zlib1g-dev \ zstd这是一组非常全面的依赖包涵盖了从C/C编译、内核模块构建、到各种脚本解释器和压缩工具。一次性安装可以避免后续编译过程中因缺少依赖而频繁中断。配置Git可选但推荐git config --global user.name Your Name git config --global user.email your.emailexample.com3.3 主机网络与服务配置为了让主机和开发板之间能顺畅通信我们需要配置网络并确保必要的服务可用。网络配置桥接模式 在虚拟机设置中确认网络适配器为“桥接模式”。在Ubuntu桌面右上角点击网络图标确保已连接到网络并获取到IP地址如192.168.1.100。记住这个IP它是开发板要连接的主机地址。配置SSH服务方便远程登录 Ubuntu桌面版默认可能未安装SSH服务器。sudo apt install -y openssh-server sudo systemctl enable ssh sudo systemctl start ssh现在你可以从宿主机Windows使用PuTTY或MobaXterm等工具通过上面获取的IP地址和用户名密码SSH登录到Ubuntu虚拟机进行无界面的命令行操作这通常更方便。配置TFTP服务器用于U-Boot网络烧写 当需要通过U-Boot的tftp命令下载固件时需要主机运行TFTP服务器。sudo apt install -y tftpd-hpa编辑TFTP配置文件sudo vim /etc/default/tftpd-hpa修改为以下内容其中TFTP_DIRECTORY是存放固件的目录你可以自定义TFTP_USERNAMEtftp TFTP_DIRECTORY/var/lib/tftpboot TFTP_ADDRESS:69 TFTP_OPTIONS--secure --create创建目录并设置权限然后重启服务sudo mkdir -p /var/lib/tftpboot sudo chown -R tftp:tftp /var/lib/tftpboot sudo chmod -R 777 /var/lib/tftpboot # 为了方便这里给最大权限生产环境应收紧 sudo systemctl restart tftpd-hpa以后编译好的固件如openwrt-ramips-mt7621-xxx-squashfs-sysupgrade.bin就可以放到/var/lib/tftpboot/目录下供U-Boot下载。3.4 宿主机与虚拟机文件共享在开发过程中经常需要在Windows宿主机和Ubuntu虚拟机之间传递文件如文档、脚本、下载的源码包。VMware的“共享文件夹”功能非常方便。在VMware中确保虚拟机已关机。右键点击虚拟机 - “设置” - “选项”选项卡 - “共享文件夹”。选择“总是启用”然后点击“添加”按照向导选择一个Windows上的文件夹如D:\VM_Share作为共享文件夹。启动Ubuntu虚拟机。共享文件夹通常会自动挂载在/mnt/hgfs/目录下。你可以创建一个软链接到你的家目录方便访问ln -s /mnt/hgfs/VM_Share ~/share现在在Ubuntu的~/share目录下就能看到和操作Windows上D:\VM_Share里的所有文件了。实操心得对于源码这类需要保持Linux文件权限如可执行权限的数据建议直接在虚拟机内通过git下载。对于文档、图片等不关心权限的文件可以使用共享文件夹传递。避免通过共享文件夹直接进行git操作可能会遇到换行符CRLF/LF问题。4. 获取OpenWrt源码与首次编译环境搭好了现在让我们动手获取代码并完成第一次编译这是检验环境是否正确的终极测试。4.1 获取OpenWrt源码OpenWrt源码通过Git管理。官方源码仓库非常大我们通常使用git clone的--depth1选项只克隆最新的一次提交以节省时间和空间。打开终端进入你准备存放源码的目录例如~/workspace。cd ~ mkdir -p workspace/openwrt cd workspace/openwrt克隆OpenWrt官方主分支源码git clone https://git.openwrt.org/openwrt/openwrt.git --depth1或者使用GitHub镜像速度可能更快git clone https://github.com/openwrt/openwrt.git --depth1进入源码目录并更新/安装所有可用的feeds软件包集合cd openwrt ./scripts/feeds update -a ./scripts/feeds install -afeeds是OpenWrt扩展软件包的方式官方核心源码只包含最基本的部分大量的软件包如LuCI网页管理界面、各种代理工具、下载工具等都在不同的feed中。这一步会将所有可用软件包的索引和Makefile拉取到本地。4.2 配置编译选项Menuconfig这是定制化固件的核心步骤。OpenWrt使用与Linux内核类似的menuconfig界面进行配置。运行配置界面make menuconfig如果提示缺少libncurses等请确认前面依赖安装步骤已正确执行。在menuconfig中你需要重点关注以下几项Target System选择你的CPU架构。例如对于MT7621选择MediaTek Ralink MIPS-MT7621 based boards。Subtarget选择具体的子类型或开发板型号。例如Default (all boards)或MT7621 EVB。Target Profile选择具体的设备型号。如果你使用的是某款特定路由器如“小米路由器4A千兆版”这里可能会有对应选项如果是通用开发板可能选择Default或Generic。LuCI这是网页管理界面。在LuCI-Collections下可以选择luci选中会编译进固件或luci-ssl带HTTPS支持。在LuCI-Modules下可以选择具体的功能模块如状态页、网络设置、软件包管理等。Network选择你需要的网络相关软件包如防火墙、DHCP服务器、PPPoE等。Utilities选择常用的工具如bash,vim,htop,curl等。Kernel modules如果需要特殊的硬件驱动如USB网卡、SATA控制器需要在这里选择对应的内核模块。一个快速上手的配置策略首次编译为了确保成功可以先做最小化配置。只选择正确的Target System和Subtarget在LuCI里选中luci其他全部默认。等第一次编译成功后再根据需求添加功能。配置完成后选择Save保存为默认的.config文件然后退出。4.3 执行编译这是最耗时的一步取决于你的主机性能和网络速度需要下载大量软件包源码。开始编译。使用-j参数指定并行编译的作业数通常设置为你的CPU核心数1。例如4核CPU可以用-j5。make -j$(nproc) Vs-j$(nproc)nproc命令会获取CPU核心数自动设置最优的并行任务数。Vs表示输出详细的编译信息Verbose。首次编译强烈建议加上这样如果出错你能看到完整的错误日志。后续成功编译后可以不加Vs以获取更简洁的输出。编译过程会持续数十分钟到数小时。它会自动完成以下步骤下载交叉编译工具链和软件包源码。编译工具链。编译Linux内核。编译根文件系统。编译选中的软件包。将所有组件打包成最终的固件文件。编译成功后输出文件位于bin/targets/架构/子类型/目录下。例如对于MT7621路径可能是bin/targets/ramips/mt7621/。里面最重要的文件是openwrt-ramips-mt7621-xxx-squashfs-sysupgrade.bin系统升级固件用于在已有OpenWrt的系统上更新。openwrt-ramips-mt7621-xxx-squashfs-factory.bin工厂固件通常用于从原厂系统直接刷入OpenWrt。核心注意事项保持网络通畅编译过程需要从网络下载大量数据工具链、软件包源码总下载量可能超过5GB。中断可能导致编译失败。耐心等待首次编译不要中途中断。即使遇到错误也先仔细阅读错误信息大部分是网络超时或缺少依赖修复后可以继续执行make -j$(nproc) Vs构建系统会从中断处继续。空间监控编译过程中openwrt目录会膨胀到30GB以上确保你的磁盘空间充足。5. 烧写固件与基础调试编译出固件后下一步就是把它“烧”到开发板上运行。5.1 通过U-Boot和TFTP网络刷机推荐这是最常用、最安全的刷机方式前提是你的U-Boot支持网络功能且环境已配置好。准备TFTP服务器将编译好的sysupgrade.bin固件复制到之前配置的TFTP目录/var/lib/tftpboot/并重命名为一个简单的名字如openwrt.bin方便在U-Boot命令行输入。cp bin/targets/ramips/mt7621/openwrt-ramips-mt7621-xxx-squashfs-sysupgrade.bin /var/lib/tftpboot/openwrt.bin配置主机网络确保主机Ubuntu虚拟机的有线网卡IP设置为静态地址例如192.168.1.100子网掩码255.255.255.0。开发板U-Boot的默认服务器IPserverip通常也是192.168.1.x网段。进入U-Boot命令行开发板断电。用串口线连接好打开串口终端如picocom。给开发板上电在串口终端显示U-Boot启动信息的瞬间快速按下键盘上的某个键通常是空格键、回车键或tpl中断自动启动进入U-Boot的命令行提示符通常是或ar7240。设置U-Boot环境变量并刷机在U-Boot命令行中依次输入以下命令以MT7621常见环境为例具体命令可能因U-Boot版本而异setenv serverip 192.168.1.100 # 设置TFTP服务器IP为主机IP setenv ipaddr 192.168.1.1 # 设置开发板自身的IP tftpboot 0x80000000 openwrt.bin # 从TFTP服务器下载固件到内存地址0x80000000如果tftpboot成功会显示下载的文件大小和校验和。erase 0xbc050000 0x7a0000 # 擦除Flash上存放固件的区域起始地址和长度需根据具体Flash布局调整这是危险操作 cp.b 0x80000000 0xbc050000 0x7a0000 # 将内存中的固件写入Flash警告erase和cp.b命令的参数起始地址、长度必须绝对准确否则会擦除U-Boot本身导致变砖。最安全的方法是查阅开发板的具体文档或者使用U-Boot自带的更安全的更新命令如run lxl_boot # 某些U-Boot用这个命令自动完成tftp和烧写或者使用sysupgrade兼容的更新方式如果U-Boot支持setenv bootcmd tftpboot 0x80000000 openwrt.bin; bootm 0x80000000 # 设置临时从网络启动 saveenv # 保存环境变量可选 boot # 启动如果网络启动成功系统运行正常再通过系统内的sysupgrade命令进行永久刷写。启动新系统刷写完成后执行reset或断电重启。如果一切顺利串口终端将显示OpenWrt内核启动日志最终出现OpenWrt的登录提示符rootOpenWrt:~#。5.2 系统启动后的基础配置首次登录默认情况下OpenWrt没有设置root密码。首次启动后你需要通过串口终端使用passwd命令为root用户设置一个密码。配置网络开发板启动后其LAN口通常是某个或多个以太网口会运行一个DHCP服务器。你可以用网线将开发板的LAN口连接到你的家用路由器电脑从路由器获取IP后就能通过浏览器访问http://192.168.1.1OpenWrt的默认IP进入LuCI管理界面。或者如果你按照之前“主机-开发板”直连的方式需要配置主机的网络。将主机有线网卡设置为静态IP例如192.168.1.2网关和DNS指向192.168.1.1。然后就可以通过ssh root192.168.1.1登录或者访问http://192.168.1.1。安装中文LuCI界面可选通过SSH登录后可以安装中文语言包。opkg update opkg install luci-i18n-base-zh-cn刷新LuCI网页即可在System-Language and Style中选择中文界面。6. 常见问题与排查技巧实录即使按照步骤操作也难免会遇到问题。这里记录一些我踩过的坑和解决方法。6.1 编译阶段常见错误问题1下载软件包失败提示wget返回错误码4或8。现象编译在Downloading某个软件包源码时卡住很久最后失败。原因网络连接超时或被墙。OpenWrt默认下载源是国外的。解决更换下载镜像源。在编译前可以创建一个dl目录的软链接到某个已有缓存的目录但更通用的方法是修改feeds.conf.default或使用第三方脚本。一个更直接的方法是在编译目录下创建download文件的重定向但这需要修改构建系统配置较复杂。推荐方案使用代理。在Ubuntu中设置全局代理如果宿主机有科学上网环境或者在编译命令前加上代理环境变量假设代理是http://127.0.0.1:7890export http_proxyhttp://127.0.0.1:7890 export https_proxyhttp://127.0.0.1:7890 make -j$(nproc) Vs手动下载。根据错误日志中的URL用浏览器或其他下载工具手动下载文件放到dl/目录下然后重新编译。问题2编译错误提示No rule to make target ...或某个头文件找不到。现象编译某个软件包时中断报错指向缺失的文件或规则。原因通常是依赖关系没有正确安装或feeds没有完整更新/安装。解决确保执行了./scripts/feeds update -a和./scripts/feeds install -a。检查是否安装了所有必要的开发库。回顾本文“基础系统配置”一节确保所有apt install命令都成功执行。尝试清理并重新配置make clean # 清理编译产物但保留下载的dl和.config make menuconfig # 再次确认配置保存退出 make -j$(nproc) Vs如果错误集中在某个特定软件包可以尝试在menuconfig中取消选择该包或者查找该包的编译依赖。问题3编译因内存不足OOM被杀死。现象编译进程突然终止终端提示Killed或系统变得极其卡顿。原因并行编译任务过多内存耗尽。尤其是在编译大型包如GCC、Qt时。解决减少并行编译任务数。将-j$(nproc)改为-j2或-j1。增加虚拟机的内存分配。关闭虚拟机在VMware设置中增加内存到12GB或更多。增加系统的交换空间Swap。在Ubuntu中可以创建一个交换文件sudo fallocate -l 4G /swapfile # 创建4G交换文件 sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile要永久生效需要将/swapfile none swap sw 0 0添加到/etc/fstab。6.2 烧写与启动阶段常见问题问题1串口无任何输出。排查检查硬件连接确认USB转TTL模块的TX/RX线与开发板是否交叉连接TX接RXRX接TXGND是否连接。检查串口设备与权限在Ubuntu中执行ls /dev/ttyUSB*查看设备是否存在。尝试使用sudo运行串口工具。将用户加入dialout组。检查串口参数确认波特率通常是115200、数据位8、停止位1、校验位None、流控None设置正确。检查开发板供电确保电源适配器功率足够且已通电。问题2U-Boot能启动但tftpboot失败提示TIMEOUT或ARP Retry count exceeded。排查确认IP设置在U-Boot中用printenv命令查看serverip和ipaddr是否正确是否与主机IP在同一网段。确认TFTP服务在主机上测试TFTP服务是否正常。可以在主机另一个终端执行tftp localhost然后get openwrt.bin看能否下载。关闭防火墙Ubuntu的UFW防火墙或宿主机的防火墙可能阻止了TFTP端口69/UDP。在Ubuntu中临时关闭sudo ufw disable。检查网络连接模式确保虚拟机网络是“桥接模式”并且桥接到了主机连接开发板的那个物理网卡上。问题3刷机后系统不断重启或卡在某个启动阶段。排查检查固件兼容性确认编译时选择的Target Profile与你的硬件完全匹配。对于不常见的设备可能需要手动调整设备树DTS文件。检查串口日志仔细查看卡住位置之前的最后几条内核信息这通常是问题的关键。可能是某个驱动初始化失败、文件系统挂载失败等。尝试最小化配置在menuconfig中取消所有非必要的软件包和内核模块编译一个最精简的固件看是否能启动。如果能再逐步添加功能定位问题包。复位出厂设置有些开发板有“恢复模式”或“救援模式”通常是通过按住复位键上电进入。在此模式下可以通过TFTP或Web界面重新刷写固件。搭建OpenWrt开发环境是一个系统工程涉及硬件、系统、网络和编译工具链多个层面。第一次成功编译并启动自己的固件时那种成就感是无与伦比的。这个环境一旦搭建稳定就会成为你进行后续应用开发、内核调试的坚实基地。记住遇到问题多查日志串口输出、编译错误信息善用搜索引擎和OpenWrt官方论坛、Wiki大部分坑前人都已经踩过并提供了解决方案。

相关新闻

最新新闻

日新闻

周新闻

月新闻