自编译 openwrt

发布于 2023-07-16  3 次阅读


前言

最近入手了个 R2S 的小玩具,主要想着做个网关,给家里电视盒子去去广告什么的,用了 openwrt 官方的固件,折腾的时候每次刷完都要先进行一些设置和安装都比较麻烦,索性就尝试自己编固件了~

准备环境

我这里用了 ubuntu 22.04.2 的 server 环境,由于手头没其他好的设备,就装在了 NAS 的虚拟机里面(估计单核编译可以到天荒地老~)

创建用户

装完后,不要用 root 用户编译,可能会出现一些奇奇怪怪的问题,可以新建个自己的账号(由于安装 Ubuntu 的时候,顺带一并创建了,这步就跳过了),否则按照下面的步骤进行即可:

# 创建 test 用户
adduser test
# 为 test 用户设置密码
passwd test
# 从 root 切换到 test 用户
su test
之后的所有操作都在非 root 账户下进行!

更新 Ubuntu 的环境

sudo apt update && sudo apt upgrade -y
每个终端中,首次使用 sudo 命令时,会要求你输入密码,输入回车即可!

安装编译依赖

sudo apt -y install ack antlr3 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-pyelftools libpython3-dev qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev python3-setuptools

首次编译

拉取官方源

目前最新官方源 main 分支,可以直接使用如下命令:

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

当然,如果想要拉取某个其他 tag,可以加上 -b 参数:

git clone -b v23.05.0-rc2 https://github.com/openwrt/openwrt.git

或者 clone 之后再切换:

# 克隆
git clone https://github.com/openwrt/openwrt.git && cd openwrt
# 查看所有标签
git tag
# 检出指定标签
git check v23.05.0-rc2

更新源并安装软件包

cd openwrt
./scripts/feeds update -a && ./scripts/feeds install -a

手动添加软件包

如果某些软件在 openwrt 官方源中没有,可以手动添加进去:

# 进入 openwrt 下的 package 目录
cd package
# 添加要的软件包
git clone xxx.git # 要下载的 git 包

更改默认 IP/时区/主机名等

虽然这些之后固件安装完成以后也可以改,但是直接编译进固件也省去了后面还要修改的麻烦!所有配置都在 config_generate 文件里面:

nano package/base-files/files/bin/config_generate
修改 IP 地址~
修改主机名和时区(比如 Asia/Shanghai)~

修改后,按 Ctrl+O 保存,Ctrl+X 退出。

定制固件

使用默认配置:

make defconfig

使用自定义配置:

make menuconfig

稍等片刻,会进入固件配置页面,再次可以进行固件自定义:

简要操作:按 方向键 选择,按 回车 进入,按 空格 选定([ ] 不选择,[M] 编译但不包含进固件内,[*] 编译且包含进固件内),按 2 次 ESC 返回上一菜单!

下载编译所需软件包

# 使用 8 线程下载
make download -j8 V=s

正式编译固件

make -j1 V=s
首次编译建议使用单线程(方便定位错误),-j1 就是使用单线程进行编译!此时间可能非常漫长,请耐心等待😂

二次及后续编译

更新本地环境

# 更新系统环境
sudo apt update && sudo apt upgrade -y
# 拉取最新源码
cd openwrt && git pull
# 更新下载安装订阅源包含的软件包
./scripts/feeds update -a && ./scripts/feeds install -a

清理旧文件

# 删除/bin和/build_dir目录中的文件
make clean
如果更换架构,例如从 x86 更换成 arm,建议直接使用 make dirclean 深度清理。

make dirclean :清理 /bin 和 /build_dir 目录的中的文件 (make clean) 以及 /staging_dir、/toolchain、/tmp 和 /logs 中的文件。

需要重新调整组件配置的,则先删除旧配置文件:

rm -rf ./tmp && rm -rf .config

然后再执行 make menuconfig 生成新配置,以及 make download -j8 V=s 下载所需软件包。

正式编译固件

make -j$(nproc) || make -j1 || make -j1 V=s
此时编译可以使用多线程来进行了,上面命令是优先使用多线程,报错会自动使用单线程,仍然报错会单线程执行编译并输出详细日志。

最后,感谢这位大佬的文章,写的很详细了!