【教程】从零开始编译合适自己的OpneWrt固件
0. 前言
个人使用 OpenWrt 多年,固件大多用的都是恩山论坛几位大佬编译好的现成固件,什么高大全,骷髅头,suninggegeg。其实用大佬编译好的固件挺好的,但是因为每个人的需求不一样。导致使用高大全固件又是总觉得太臃肿,使用一些精简版的固件又没有自己需要的插件。最后还是萌生了自己根据自己的需求去编译 OpenWrt。经过一番折腾下来也是把固件给编译出来了,这个编译过程大概需要 1-3 小时左右。
1. 环境要求
1.1 系统版本
- 推荐是 Debian11 或者是 Ubuntu LTS 18.x 或者 20.x 、22.x
1.2 网络和配置要求
- 编译的主机最好是境外美区的 VPS,如果要本地编译需要给编译主机配置全局国际网络环境。
- 编译主机至少需要预留 50G 以上的硬盘空间。在编译的过程中会下载大量的依赖文件,如果硬盘空间不足或网络不稳定都可能会编译失败。
- 编译主机配置推荐 2H4G 以上,这会减少编译等待时间。
- 这边推荐使用腾讯或阿里按量付费港区或美区的云主机,编译完成就可以销掉云主机,可以选到较高的配置同时支出的费用也不会太多。
1.3 编译依赖安装
1 | # 升级 |
2. 开始编译
2.1 创建普通用户
编译的过程一定要使用 “普通用户!” “普通用户!” “普通用户!”
我这边以 Ubuntu 系统为示例,其他系统可自行百度
打开终端输入下面命令,创建一个名为
opwrt
的普通用户
1 | adduser opwrt |
2.2 拉取源码,这里使用的是 Lean 大佬的 LEDE 分支
1 | git clone https://github.com/coolsnowwolf/lede |
2.3 添加软件源
- L 大源码里默认有四个软件源里面包含了大部分常用插件,如果要添加其他没有的插件则需要自行添加软件源至
feeds.conf.default
文件,当然也可以单独添加某个插件。 - 如果选择插件的时候没有某 s*p 请检查一下这个配置文件的
Hello Word
字样代码是不是被注释了。
1 | vim feeds.conf.default |
2.4 自定义配置
- 这边建议和我一起执行下面的命令,可以避免出现奇奇怪怪的错误。
1 | # 修改默认IP为 10.1.1.252 |
2.5 配置设备和添加插件
- 执行
make menuconfig
命令进入编译菜单
1 | make menuconfig |
- 请本着不懂不要乱动的原则,选择自己需要的插件。有些插件与其他插件是有冲突的,一起选中编译是一定会报错的!
- 菜单选项简要说明:
1 | # 选择 CPU 类型 |
2.6 下载软件包
- 配置完成之后按键盘左右方向键移动光标到
Save
保存,然后退出菜单Exit
,开始下载软件包
1 | # 预下载编译所需的软件包 |
2.7 开始编译固件
- 编译完成后输出路径是
bin/targets
,默认密码是password
- 很多教程都教大家使用单线程处理首次编译,我的建议是第一次直接最大线程编译,如果出错了再使用单线程编译。
- 已经编译成功的插件系统是不会二次编译的,最大线程编译可以减少等待的时间。
1 | # 编译固件(-j 后面是线程数,单线程) |
2.8 OpenWrt编译成功说明
文件名 | 描述 |
---|---|
sha256sums | 固件完整性校验文件 |
packages-server.zip | IPK 软件包归档 |
openwrt-x86-64-generic.manifest | 固件内已集成软件包列表 |
openwrt-x86-64-generic-generic-rootfs.tar.gz | RootFS 文件 |
openwrt-x86-64-generic-rootfs-ext4.img.gz | 不带引导的 RootFS 镜像 |
openwrt-toolchain-x86-64_gcc-8.4.0_musl.Linux-x86_64.tar.bz2 | OpenWrt 工具链 |
openwrt-sdk-x86-64_gcc-8.4.0_musl.Linux-x86_64.tar.xz | OpenWrt SDK |
openwrt-imagebuilder-x86-64.Linux-x86_64.tar.xz | OpenWrt Image Builder |
openwrt-x86-64-generic-squashfs-combined.vdi | VDI 虚拟磁盘映像 (Legacy 引导) |
openwrt-x86-64-generic-squashfs-combined.vmdk | VMDK 虚拟磁盘映像 (Legacy 引导) |
openwrt-x86-64-generic-squashfs-combined-efi.vdi | VDI 虚拟磁盘映像 (UEFI 引导) |
openwrt-x86-64-generic-squashfs-combined-efi.vmdk | VMDK 虚拟磁盘映像 (UEFI 引导) |
openwrt-x86-64-generic-squashfs-combined.img.gz | Squashfs 格式安装 / 升级固件 (Legacy 引导) |
openwrt-x86-64-generic-squashfs-combined-efi.img.gz | Squashfs 格式安装 / 升级固件 (UEFI 引导) |
3. 二次编译
- 拉取最新 OpenWrt 源码和更新 feeds 源中的软件包源码
1 | cd lede |
- 清除旧的编译产物和目录(可选)
1 | make clean |
- 同首次编译,多线程编译失败后自动进入单线程编译,失败则输出详细日志
1 | make defconfig |
4.OpenWrt 编译的奇技淫巧——编译指定版本Op
lede
这个库一直都是走在 openwrt 官方前面的,如果直接拉去代码编译都是 Openwrt 的最新版。新的版本往往可能存在一些奇怪的问题,比如下载插件时候自己编译的版本高于官方版本导致安装失败、新版有些特性对于一些插件存在奇怪的兼容性问题的时候,就需要编译几乎和官方同稳定版的 OpenWrt 了。
一下方法都是参考 Github 和恩山论坛的内容:
拉取
lede
仓库指定提交记录这里需要查看官方最新稳定版的发布时间和内核版本,根据官方的更新时间和内核版本去定位到
lede
提交版本。例如,官方最新的稳定版是
OpenWrt 23.05.0-rc4
内核版本5.15.134
发布时间是 2023-10-13 OpenWrt 23.05.0。那么就去lede
仓库中找到内核版本相差不多的那条提交记录。使用 git 命令根据提交记录创建一个编译分支
1
2# 创建并切换到 byop 分支上
git checkout -b byop 21c3e8e4a1d391a6244ebc854e41d07654ea5e80修改
lede/target/linux/x86/Makefile
1
2# 这个值为你想要的内核大版本 x.xx.x 中最后一个x最好让系统来决定;这能尽量避免报错
KERNEL_PATCHVER:=6.15 改成 5.15接下来就是正常的编译环节了,这个编译指定版本的方法并不保证一定有效,请自行尝试。
5. 参考文档
- Lean 的源码仓库
- OpenWrt 编译 LuCI -> Applications 添加插件应用说明-L 大
- 从零开始自定义编译 OpenWrt(LEDE) 固件
- OpenWrt编译成功文件说明
- 编译openwrt怎样更换内核为5.4
- Github issues · 编译OpenWRT如何更换内核小版本
- openwrt编译笔记,有些技巧是自己试验出来的,很多人死也不肯说
6. 碎碎念
- 这里需要特别提醒,就现在这个时间点来说不要想着去嫖 Github 的 Actions 来编译了。GitHub 提供的机器存储完全不够用来编译加了很多软件源的 OpenWrt。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 戴某人的博客!