本文最后更新于 2024-06-23,文章内容可能已经过时。

前言

恩山论坛 上有很多用户编译好的现成固件,自己编译固件最大的优势是自定义的添加插件或者其他的特殊需求,强烈建议没有特别需求的用户还是直接选用现成的固件就好。编译固件也是一种乐趣,整个过程大约1-2小时左右如果是单线程大概在5小时左右,需要耐心等待。

环境及要求

  1. 系统版本:Debian 11 或者 Ubuntu LTS

  2. 最好是境外主机或者能够访问国际网络,大陆直连网络环境编译基本上不会成功,配置推荐 2H4G 以上

安装编译依赖

# 升级
sudo apt update -y
sudo apt full-upgrade -y

# 安装依赖
sudo apt install -y 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 libfuse-dev libglib2.0-dev libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libpython3-dev libreadline-dev libssl-dev libtool lrzsz mkisofs msmtp ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pyelftools python3-setuptools qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev

#清理
sudo apt autoremove --purge
sudo apt clean

创建编译账户并下载源码

useradd -m openwrt  # 新建一个名为 openwrt 的用户
 
# 修改用户默认的 Shell
apt install -y sudo
usermod -s /bin/bash openwrt
 
# 切换用户
su openwrt
cd ~

需要创建账户是因为我们不能直接使用root账户编译,会报错;如果你坚持使用root账户编译也不是不行,但是必须设置下面这个环境变量。这个环境变量设置好了之后只在当前的会话中生效。这个环境变量只需要在编译前执行即可。

export FORCE_UNSAFE_CONFIGURE=1

下载源码

git clone https://github.com/coolsnowwolf/lede
cd lede
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig

添加软件源,L大源码里默认有四个软件源里面包含了大部分常用插件,如果要添加其他没有的插件则需要自行添加软件源至 feeds.conf.default 文件,当然也可以单独添加某个插件

sed -i '1i src-git kenzo https://github.com/kenzok8/openwrt-packages' feeds.conf.default
sed -i '2i src-git small https://github.com/kenzok8/small' feeds.conf.default

更新并安装插件

git pull
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig

可选操作

# 修改默认IP为 10.1.1.2
sed -i 's/192.168.1.1/10.1.1.2/g' package/base-files/files/bin/config_generate
 
# 修改默认主机名
sed -i '/uci commit system/i\uci set system.@system[0].hostname='Soft_Router'' package/lean/default-settings/files/zzz-default-settings
 
# 加入编译者信息
sed -i "s/OpenWrt /Kinoko build $(TZ=UTC-8 date "+%Y.%m.%d") @ OpenWrt /g" package/lean/default-settings/files/zzz-default-settings
 
# 修改默认主题
sed -i "s/luci-theme-bootstrap/luci-theme-argon/g" feeds/luci/collections/luci/Makefile

下载 dl 库,编译固件 (-j 后面是线程数,第一次编译推荐用单线程)

# 预下载编译所需的软件包
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

二次编译

  1. 拉取最新 OpenWrt 源码和更新 feeds 源中的软件包源码

cd lede
git pull
./scripts/feeds update -a
./scripts/feeds install -a
  1. 清除旧的编译产物和目录(可选)

make clean
# 源码有大规模更新或者内核更新后执行,以保证编译质量
# 此操作会删除 /bin 和 /build_dir 目录中的文件
 
make dirclean
# 更换架构编译前必须执行
# 此操作会删除 /bin 和 /build_dir 目录的中的文件(make clean),以及 /staging_dir、/toolchain、/tmp 和 /logs 中的文件
  1. 同首次编译,多线程编译失败后自动进入单线程编译,失败则输出详细日志

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