前言
一开始在玩软路由时,需要下载安装别人编译好的固件,但别人的固件有很多的插件,如果自己的硬件性能强大还可以,如果硬件性能不行,那只能退而求次选择精简版的固件,但精简版可能又没有自己需要的功能。而有些人则有强迫症,不需要一些自己用不到的固件存在在系统里很碍眼。虽然可以自己卸载,但只是在界面去除了,就像系统还原一样,重置系统还会恢复到原来的样子很难爱……总之各种样的问题吧,这样的情况博主之前也有这样的焦虑,只能走上自编译固件这条路。自编译固件可以完美契合自己的需要,还可以为OpenWrt支持的各品牌路由器刷入固件。
但是博主本地编译过几次,都是以失败告终,博主不推荐本地编译,一是本地机器配置不强的话,编译时间太长,我记的第一次编译用了一上午,后面有一次编译用了一白天,啥也不敢动怕给机器增加负担,增加编译时长。二是网络不行,虽然挂了全局梯子,但也不能完全保证网络连通性,就放弃了。后来用了一段时间别人制作的固件,当时也看了别人写自己编译的教程文章,但是博主是小白一个,也没敢想,后来因为强迫症,抱着试试看的心情鼓捣了几天就成功了。
本教程以x86架构为例,由于楼主没有其他可以刷OpenWrt系统的品牌路由器,需要的自己试。
准备
windows10电脑、github账号、梯子。
搭建编译环境
● 系统安装
你可以使用虚拟机、物理机安装ubuntu,如果不会部署虚拟机那就直接在win10应用商店里下载ubuntu系统。
● 创建用户
Enter new UNIXusername 用户名
New password 密码
Retype new password 再输入一次密码
● 配置编译环境
依次执行以下命令。
sudo apt update -y
sudo apt full-upgrade -y
sudo apt install -y ack antlr3 aria2 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \
git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \
libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \
mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip libpython3-dev qemu-utils \
rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev
下载源代码。
git clone https://github.com/coolsnowwolf/lede
更新 feeds 并选择配置,依次执行以下代码。
git clone https://github.com/coolsnowwolf/lede
./scripts/feeds update -a
./scripts/feeds install -a
配置openwrt
● X86
make menuconfig
选择配置。
最上面的一行即代表的X86平台。如果编译X86,只要第一个选择X86第二项和第三项就不用变更。
● 为其他平台编译固件
第一行选择所属芯片,第二行看情况选择,我没有编译过品牌路由器的固件就没试过。第三行为选择路由器型号。比如我这里选择的是博通BCM47XX/53XX(ARM),在第三行里选择是使用这个架构的路由器型号斐讯K3。即可为斐讯K3编译固件。
然后是输出镜像格式,有ISO、和VM和VirtualBox等虚拟机支持的格式镜像等。一般X86不需要变动。
然后就是最激动人心的插件,在Applications菜单下。
按方上下键选择插件,空格键选择:“*”代表选中,会编译到固件里,M代表只编译成IPK格式的插件。尖括号代表插件,中括号代表插件可选功能。
选择完后返回到最开始选择X86的的界面,使用左右方向键选择”Sava”保存配置。
然后在电脑里找到以下路径C:\Users\Administrator\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc\LocalState\rootfs\home\lulu\lede
把.config文件里的内容复制出来备用。
至此我们的目的完成了,忙碌这么多就是为了得到这个.config文件。
编译
进入 P3TERX/Actions-OpenWrt 项目页面,点击页面中的 Use this template (使用这个模版)按钮。
填写仓库名称,然后点击Create repository from template(从模版创建储存库)按钮。
经过几秒钟的等待,页面会跳转到新建的仓库,内容和我的项目是相同的。然后点击Create new file(创建新文件)按钮。
文件名填写为.config,把生成的.config文件的内容复制粘贴到下面的文本框中。
翻到页面最下方,点击Commit new file(提交新文件)按钮。
开始编译。
不出意外,根据你配置等一到四个小时左右就会看到编译好的固件。
默认用户名为:root,密码为Password,IP为192.168.1.1。
进阶使用
● SSH 连接到 Actions(不需要第一步本地搭建环境,在线选择配置)
通过 tmate 连接到 GitHub Actions 虚拟服务器环境,可直接进行 make menuconfig 操作生成编译配置,或者任意的客制化操作。也就是说,你不需要再自己搭建编译环境了。这可能改变之前所有使用 GitHub Actions 的编译 OpenWrt 方式。
在Run Workflow时把SSH connection to Actions的值改为true。
在触发工作流程后,在 Actions 日志页面等待执行到SSH connection to Actions步骤,会出现类似下面的信息:
复制 SSH 连接命令粘贴到终端内执行,或者点击网址打开网页终端操作。(网页终端可能会遇到黑屏的情况,按 Ctrl+C 即可)。然后复制粘贴以下命令来进行配置。
cd openwrt && make menuconfig
然后就和本地一样选择配置即可。
完成后按Ctrl+D组合键或执行exit命令退出,后续编译工作将自动进行。
● 自定义环境变量与功能
打开 workflow 文件(.github/workflows/build-openwrt.yml),你会看到有如下一些环境变量,可按照自己的需求对这些变量进行定义。
env:
REPO_URL: https://github.com/coolsnowwolf/lede
REPO_BRANCH: master
FEEDS_CONF: feeds.conf.default
CONFIG_FILE: .config
DIY_P1_SH: diy-part1.sh
DIY_P2_SH: diy-part2.sh
UPLOAD_BIN_DIR: false
UPLOAD_FIRMWARE: true
UPLOAD_COWTRANSFER: false
UPLOAD_WETRANSFER: false
UPLOAD_RELEASE: false
TZ: Asia/Shanghai
环境变量 | 功能说明 |
---|---|
REPO_URL | 源码仓库地址 |
REPO_BRANCH | 源码分支 |
FEEDS_CONF | 自定义feeds.conf.default文件名 |
CONFIG_FILE | 自定义.config文件名 |
DIY_P1_SH | 自定义diy-part1.sh文件名 |
DIY_P2_SH | 自定义diy-part2.sh文件名 |
UPLOAD_BIN_DIR | 上传 bin 目录。即包含所有 ipk 文件和固件的目录。默认false |
UPLOAD_FIRMWARE | 上传固件目录。默认true |
UPLOAD_COWTRANSFER | 上传固件到奶牛快传。默认false |
UPLOAD_WERANSFER | 上传固件到 WeTransfer 。默认false |
UPLOAD_RELEASE | 上传固件到 releases 。默认false |
TZ | 时区设置 |
● 自定义脚本
仓库根目录目前有两个 DIY 脚本:diy-part1.sh 和 diy-part2.sh,它们分别在更新与安装 feeds 的前后执行,你可以把对源码修改的指令写到脚本中,比如修改默认 IP、主机名、主题、添加 / 删除软件包等操作。但不仅限于这些操作,发挥你强大的想象力,可做出更强大的功能。
● 添加额外的软件包
在自定义脚本中加入对指定软件包源码的远程仓库的克隆指令。就像下面这样:
git clone https://github.com/P3TERX/xxx package/xxx
原理是把软件包源码放到 package 目录下,编译时会自动历遍,与本地编译是一样的。
● 自定义 feeds 配置文件
把 feeds.conf.default 文件放入仓库根目录即可,它会覆盖 OpenWrt 源码目录下的相关文件。
● 自定义源码
默认引用的是 Lean 的源码,如果你有编译其它源码的需求可以进行替换。
编辑 workflow 文件,修改下面的相关环境变量字段。
REPO_URL: https://github.com/coolsnowwolf/lede
REPO_BRANCH: master
● 多编译方案
基于 Github Actions 可同时运行多个工作流程的特性,最多可以同时进行至少 20 个编译任务。也可以单独选择其中一个进行编译,这充分的利用到了 GitHub Actions 为每个账户免费提供的 20 个 Ubuntu 虚拟服务器环境。
假设有三台路由器的固件需要编译,比如 K2P、x86_64 软路由、新路由 3。
生成它们的.config文件
分别将它们重命名为k2p.config、x64.config、d2.config放入本地仓库根目录。
复制多个 workflow 文件(.github/workflows/build-openwrt.yml)。为了更好的区分可以对它进行重命名,比如k2p.yml、x64.yml、d2.yml。此外第一行name字段也可以进行相应的修改。然后分别用上面修改的文件名替换对应 workflow 文件中下面两个位置的.config,不同的机型同样可以使用不同的 DIY 脚本。
...
paths:
- '.config'
...
CONFIG_FILE: '.config'
DIY_SH: 'diy.sh'
...
二次编译
进入lede目录
cd lede
拉取更新
git pull
升级feeds
./scripts/feeds update -a
安装feeds更新
./scripts/feeds install -a
配置固件
make defconfig