从零开始自定义编译 OpenWrt 固件
环境要求
系统版本
Debian 11 或者 Ubuntu LTS,本次编译使用的是 Ubuntu20 LTS
网络要求
最好是境外主机或者能够访问国际网络,大陆网络环境编译失败率较高
编译依赖
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 \
libboost-dev libpam0g-dev xsltproc liblzma-dev libfreetype-dev
开始编译
- 新建一个用户(非必需,但不能使用 root 用户编译),用于编译固件
sudo useradd -m openwrt # 新建一个名为 openwrt 的用户
# 修改用户默认的 Shell
sudo apt install -y sudo
sudo usermod -s /bin/bash openwrt
# 切换用户
su openwrt
cd ~
- 拉取源码,这里用的是 Lean 大佬的 LEDE 分支源码
#本次编译的版本是 v23.05
git clone https://github.com/openwrt/openwrt.git
cd openwrt
- 根据需要修改或新增软件源,如果要添加其他没有的插件则需要自行添加软件源至 feeds.conf.default 文件,当然也可以单独添加某个插件
src-git packages https://github.com/openwrt/packages.git;openwrt-23.05
src-git luci https://github.com/openwrt/luci.git;openwrt-23.05
src-git routing https://github.com/openwrt/routing.git;openwrt-23.05
src-git telephony https://github.com/openwrt/telephony.git;openwrt-23.05
#单独添加(在更新并安装插件之前执行)
##插件
git clone https://github.com/esirplayground/luci-app-poweroff.git package/luci-app-poweroff
#更新并安装插件
./scripts/feeds clean
./scripts/feeds update -a
./scripts/feeds install -a
- 执行 make menuconfig 命令进入编译菜单
菜单选项简要说明:
“`shell
#选择 CPU 类型
Target System (x86) –> #软路由选择 x86,硬路由根据型号厂家自行选择
Subtarget (x86_64) –> #CPU 子选项
Target Profile (Generic x86/64) –> #厂家具体型号
#设置镜像编译的格式(squashfs,ext4)
Target Images –> # 默认 squashfs
#添加较多插件时,为了避免空间不足,建议修改下面两项默认大小(x86/64)
Target Images –> (16) Kernel partition size (in MB) # 默认是16,建议修改为256
Target Images –> (400) Root filesystem partition size (in MB) # 默认是400,建议修改为1024
#开启 IPv6 支持
Extra packages –> ipv6helper(选定这个后,下面几项会自动选择)
Network –> odhcp6c
Network –> odhcpd-ipv6only
LuCI –> Protocols –> luci-proto-ipv6
LuCI –> Protocols –> luci-proto-ppp
#开启适用于 VMware 的 VMware Tools
Utilities –> open-vm-tools
Utilities –> open-vm-tools-fuse
#选择插件
LuCI –> Applications # 根据需要选择,* 代表编入固件,M 表示编译成模块或者IPK包,为空表示不编译
#选择主题
LuCI –> Themes # 选择喜欢的主题,可以选多个
#其他选项一般不需要调整,如感兴趣可以自行了解</p></li>
</ol><pre><code class="line-numbers"><br />5. 配置完成后使用编译菜单底部的 Save 保存,然后退出菜单 Exit,开始下载软件包
“`shell
#预下载编译所需的软件包
make download -j8
#检查文件完整性
find dl -size -1024c -exec ls -l {} \;
#检查文件完整性命令可以列出下载不完整的文件,小于1k的文件属于下载不完整,如果存在则用下面的命令删除,然后重新下载编译所需的软件包,再次检查
#确认所有文件完整可大大提高编译成功率,避免浪费时间
find dl -size -1024c -exec rm -f {} \;- 最后编译固件,编译完成后输出路径是 bin/targets,默认密码是 password
#编译固件(-j 后面是线程数,首次编译推荐用单线程) make V=s -j1
二次编译
- 拉取最新 OpenWrt 源码和更新 feeds 源中的软件包源码
cd openwrt git pull ./scripts/feeds update -a ./scripts/feeds install -a
- 清除旧的编译产物和目录(可选)
make clean #源码有大规模更新或者内核更新后执行,以保证编译质量 #此操作会删除 /bin 和 /build_dir 目录中的文件 make dirclean #更换架构编译前必须执行 #此操作会删除 /bin 和 /build_dir 目录的中的文件(make clean),以及 /staging_dir、/toolchain、/tmp 和 /logs 中的文件
- 同首次编译,多线程编译失败后自动进入单线程编译,失败则输出详细日志
make defconfig make download -j8 find dl -size -1024c -exec ls -l {} \; make -j$(nproc) || make -j1 || make -j1 V=s #如果需要重新配置 rm -rf ./tmp && rm -rf .config #清除临时文件和编译配置文件 make menuconfig make download -j8 find dl -size -1024c -exec ls -l {} \; make -j$(nproc) || make -j1 || make -j1 V=s
参考文档:
https://fairysen.com/819.html