Openwrt固件编译总结

网上有不少关于Openwrt固件编译的文章,包括本地编译、Github Action编译,中间夹杂编译环境、.config文件生成、diffconfig、defconfig、架构选择等等,缺少系统性的归纳总结。其实Openwrt官网已经有全面且详细的编译步骤,结合这些我们做个归纳总结,突出重点。

编译总体分文本地编译和云编译,云编译可以采用Github Action或者是VPS,其实Github Action编译也是一台VPS,只是操作方法有点不一样而已。云编译和本地编译大同小异,一个在本地使用shell命令操作,一个通过SSH使用shell命令操作,都是shell命令操作,操作的机器不同。编译步骤熟悉后本地编译和云编译是一样的,没有本质差别。所以建议一定要熟悉编译步骤,可以先从尝试本地编译或者SSH到VPS用shell命令编译,再来尝试Github Action的编译。

总体步骤

  1. 搭建编译服务器
  2. 安装编译依赖环境
  3. 编译固件

1.搭建编译服务器

选择Linux系统作为编译的操作系统,推荐Ubuntu系统。服务器可以是实体机器、虚拟机、WSL,其中WSL有一些注意事项,推荐性能好的实体机器或者虚拟机。OS的安装就不赘述了。

2.安装编译依赖环境

各系统详细的依赖包可以看Openwrt官网资料,这里还是以Ubuntu为例。

Ubuntu 24.04

sudo apt update
sudo apt install build-essential clang flex bison g++ gawk \
gcc-multilib g++-multilib gettext git libncurses5-dev libssl-dev \
python3-setuptools rsync swig unzip zlib1g-dev file wget

Ubuntu 22.04

sudo apt update
sudo apt install build-essential clang flex bison g++ gawk \
gcc-multilib g++-multilib gettext git libncurses-dev libssl-dev \
python3-distutils python3-setuptools rsync swig unzip zlib1g-dev file wget

3.编译固件

3.1 拉取源代码

这里以openwrt源代码为例,也可以根据需要拉取其他第三方的代码,注意代码拉取后要进入代码所在目录(默认为~/openwrt),后续也都是在这个目录操作。

# 下载更新源代码
git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt
git pull
 
# 选择特定版本
git branch -a
git tag
git checkout v23.05.5

上面的是全部拉取,如果要只拉取特定版本的可以用以下命令

git clone -b v23.05.5 --single-branch --depth=1 https://github.com/openwrt/openwrt.git
3.2(可选)自定义源

编辑 feeds.conf.default 文件,添加自己的需要的源

3.3(可选)自定义部分配置

修改默认IP,编辑 package/base-files/files/bin/config_generate 文件手动找到并修改,

或者用命令

sed -i 's/192.168.1.1/192.168.100.1/g' package/base-files/files/bin/config_generate

修改默认机器名、时区,编辑 package/base-files/files/bin/config_generate 文件手动找到并修改,

3.4 更新feeds
./scripts/feeds update -a
./scripts/feeds install -a
3.5 执行 make menuconfig 命令进入编译菜单

根据需要选择自己的各项参数。完成后会生成 .config 文件。

3.6 生成diff文件(本地编译可选,Github Aciton编译推荐)
./scripts/diffconfig.sh > diffconfig

diff文件是上一步生成的 .config 文件和默认文件之间的差别。本地编译的时候可以生成diff文件,也可以不用。熟悉后可直接手工编辑diff文件,做成自己需要的定制参数,然后通过 make defconfig 导入配置后进行编译,Github Action编译其实就是这么做的,所以本地编译这步可选,Github Action编译这步推荐(除非你自己能手工做.config文件或者有现成的文件)

本地编译继续以下步骤,Github Action编译可以上传diffconfig内容到github相应的文件,用Github Action进行编译,具体内容参照你fork或者使用的模板相应方法。
3.7 预下载编译所需的软件包
make download -j8 V=s
3.8 检查完整性
find dl -size -1024c -exec ls -l {} \;
# 此命令可以列出下载不完整的文件(根据经验得出小于1k的文件属于下载不完整),如果存在这样的文件可以使用命令
find dl -size -1024c -exec rm -f {} \;
# 将它们删除,然后重新执行make download下载并反复检查,确认所有文件完整可大大提高编译成功率,避免浪费时间。
3.9 编译固件
make -j1 V=s

建议用j1单线程编译,成功率高点,避免出现未知问题。

编译成功的固件在 bin/targets 目录下。

补充说明

二次编译

二次编译和第一次编译类似,只是在 make download 前需要清理前一次编译的旧文件:

make clean
make dirclean
Github Action编译

Github Action编译本质上也是通过上述本地编译方法来编译,shell命令也一样,只是Github Action有自己的代码格式,需要按他的格式来定义每一步的操作,但核心内容是一样的,网上的那些代码也都是这样的,并无什么新奇特。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注