一、速览:这个仓库是做什么的?

入门

OpenWrt 是一套可以运行在路由器上的操作系统,你可以把它理解成路由器的“安卓系统”:官方固件像手机出厂系统,功能固定;OpenWrt 则允许你自由安装插件、调整网络功能。coolsnowwolf/openwrt 是基于 OpenWrt 的稳定版源码集合,国内很多软路由玩家用它来编译自定义固件。

这个仓库解决了一个具体痛点:厂商路由器固件往往功能少、更新慢,甚至内置广告或收集数据。通过编译 Lean 提供的源码,你可以得到一个干净、可定制的路由器系统,只保留自己需要的功能,比如去广告、科学上网、流量监控等。

OpenWrt 项目概览

编译好的固件适合刷入 x86/x64 软路由,也就是一台小体积、低功耗、专门用来跑网络系统的电脑主机。下图是常见的软路由硬件形态,铝合金外壳,带多个千兆网口。

x86 软路由铝合金外壳正面

x86 软路由背面接口

二、准备工作:编译前必须满足的条件

入门

开始编译前,你需要准备一台安装了 Ubuntu 18 LTS x64 系统的机器。Ubuntu 是一种常见的 Linux 桌面/服务器系统,编译 OpenWrt 需要它提供的完整开发工具链。这台机器可以是物理机,也可以是虚拟机(如 VMware、VirtualBox 中安装的 Ubuntu)。

机器最好具备至少 4GB 内存和 20GB 以上可用磁盘空间,因为编译过程中会下载大量源码依赖,产生很多中间文件。另外,整个编译过程不能用 root 用户进行,必须使用普通用户;root 权限只用于安装依赖包。

国内用户还需要准备一个稳定的“梯子”,也就是科学上网工具,因为下载源码和依赖库时可能访问境外服务器,网络不稳定会导致编译失败。

先在终端里更新软件包列表:

sudo apt-get update

然后安装编译所需的全部依赖。下面这条命令较长,但可以一次性完成:

sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3.5 python2.7 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 upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget

注意:Ubuntu 18 官方源可能已停止维护,如果安装依赖时提示找不到包,建议更换为可用的 Ubuntu 旧版镜像源或使用更新版本的系统,但兼容性可能略有差异。

三、获取源码并初始化 feeds

入门

依赖装好后,用 git clone 把 Lean 的源码仓库下载到本地。git 是一个版本管理工具,clone 相当于把整个项目的完整代码复制一份到你的电脑上。

git clone https://github.com/coolsnowwolf/openwrt
cd openwrt

进入 openwrt 目录后,需要初始化 feeds。你可以把 feeds 理解成 OpenWrt 的“软件源索引”,里面记录了各种插件和软件包的下载位置。先更新索引,再安装到本地源码树中:

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

重要:这里再次提醒,执行 git 和后续编译命令时,请确保你当前登录的是普通用户,不要用 root。用 root 会导致部分脚本权限判断异常,直接报错。

四、用 menuconfig 选择你的固件功能

进阶 · 推荐细读

接下来进入配置界面。输入:

make menuconfig

这会打开一个蓝底黄字的终端图形界面,操作方式有点像自助餐选菜:用键盘上下键移动,用空格键勾选或取消,用左右键选择底部操作项。如果只想编译一个基础、能跑起来的固件,直接选择保存退出即可,不用修改任何项。

在这个界面里,你需要重点关注三个配置:

  • Target System:目标硬件平台,比如 x86、ramips、ipq40xx 等。要根据你的路由器或软路由 CPU 架构选择。
  • SubtargetTarget Profile:更细分的硬件型号。选错型号会导致固件无法启动。
  • LuCI 相关选项:LuCI 是 OpenWrt 的网页管理后台,建议勾选,否则装好后只能用命令行管理。

第一次编译建议不要勾选太多第三方插件,先确保基础固件能编译通过。修改完选择 Save 保存,系统会在源码根目录生成一个 .config 文件,里面记录你刚才的所有选择。

五、编译:真正开始生成固件

进阶 · 推荐细读

在正式编译前,先下载第三方源码包,OpenWrt 内部称之为 dl 库。很多插件依赖的外部项目源码需要提前拉取到本地:

make -j8 download V=s

-j8 表示同时用 8 个线程下载,加快速度;V=s 表示输出详细日志,方便排查。国内网络环境下这一步很容易卡住,建议全程开启全局科学上网。

下载完成后,开始正式编译:

make -j1 V=s

-j1 代表只用一个线程编译。第一次编译强烈建议单线程,因为多线程虽然快,可一旦出错,日志会交错在一起,新手很难看懂。编译耗时可能从半小时到数小时不等,取决于机器性能和勾选功能。

编译成功后,固件文件输出在:

openwrt/bin/targets

你可以在这个目录下按硬件平台路径找到类似 .img.gz.bin 的固件文件,把它刷入路由器即可。

六、二次编译与重新配置

深入 · 老手可选

当 Lean 仓库更新了源码,或者你想同步最新插件时,不需要重新克隆整个仓库,直接更新即可:

cd openwrt
git pull
./scripts/feeds update -a && ./scripts/feeds install -a
make defconfig
make -j8 download
make -j$(($(nproc) + 1)) V=s

git pull 拉取上游代码变更;make defconfig 会根据现有 .config 补齐新增选项的默认值,避免手动配置遗漏。最后一行中的 $(($(nproc) + 1)) 是自动计算 CPU 核心数并加 1 的写法,能充分利用机器性能。

如果你想推翻当前配置,重新选一遍功能:

rm -rf ./tmp && rm -rf .config
make menuconfig
make -j$(($(nproc) + 1)) V=s

rm -rf 会删除临时文件和旧配置,让编译环境回到干净状态。请谨慎执行,确认自己确实需要重新配置。

七、踩坑与注意事项

入门

根据源码仓库的说明和常见实践,下面这些点值得关注:

  • 千万不能用 root 编译:很多兄弟第一次用 root 登录 Ubuntu 直接编译,结果脚本报权限错。正确做法是创建普通用户,只有装依赖时用 sudo
  • 国内网络必须备好梯子make download 阶段会访问 GitHub 和各类开源站点,网络不通会反复重试甚至中断。
  • 第一次不要盲目多线程-j8 下载没问题,但编译阶段用 -j1 更稳。等成功一次后再尝试多线程。
  • 编译失败先看日志末尾:不要立刻重跑,打开终端往上翻,通常最后几行会指出具体错误。
  • 默认登录信息:编译出来的固件默认管理地址是 192.168.1.1,用户名 root,密码 password。首次登录后建议立刻修改。
  • 二次发布需注明来源:Lean 的源码允许自由使用,但如果编译后二次发布固件,请保留 GitHub 仓库链接,这是基本的开源礼仪。

OpenWrt 编译的难点不在命令本身,而在于环境准备和网络稳定性。把前置条件做扎实,后面按顺序执行命令即可。

项目信息

项目
仓库 coolsnowwolf/openwrt
语言 C
Star 854
Fork 680
主页

参考链接

延伸阅读

想继续探索?这些同领域的教程可能也适合你: