教程进度说明:首次编译成功了,target文件夹里好多我看不懂的垃圾!被自己蠢哭了
接着慢慢完善这篇非百分百正确的教程吧

我的编译环境

位置选择的系统编译结果
本地wsl子系统[ubuntu]未尝试编译
云端VPS[Netcup-Rs2000] - Debian11/12已尝试编译(出结果了)
云端Github Action未尝试编译(听说SSH连上去后会封号,只能改config来自动跑)

固件编译部分

首次编译

第一部分:基础操作

# 更新软件列表、升级软件包
sudo apt update -y
sudo apt full-upgrade -y
# 安装程序screen(分离窗口避免断线)
sudo apt install screen -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
# 清理
sudo apt autoremove --purge
sudo apt clean
# 新建非根用户(编译时不能用根用户)
useradd -m openwrt
 
# 修改用户默认的 Shell
apt install -y sudo
usermod -s /bin/bash openwrt
 
# 切换用户
su openwrt
cd ~
# 拉取源码 (选取Lean-LEDE分支源码)
git clone https://github.com/coolsnowwolf/lede
cd lede
# Vim 编辑软件源文件
vim feeds.conf.default

# 添加软件源(打开下方仓库链接可以查看包含的插件列表,一般选前两个源就行)
src-git kenzo https://github.com/kenzok8/openwrt-packages
src-git small https://github.com/kenzok8/small
src-git haibo https://github.com/haiibo/openwrt-packages
src-git liuran001 https://github.com/liuran001/openwrt-packages

# 执行保存退出
Esc
:wq
----------------------------------------------
# 单独添加插件(在更新并安装插件之前执行)
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

第二部分:配置编译参数

| Menuconfig                | 对应说明                                                     |
| ------------------------- | ------------------------------------------------------------ |
| **Target System**         | 软路由选择 x86 [选择你的设备所使用的处理器架构]              |
| **Subtarget**             | CPU 子选项 [根据设备的详细型号,选择相应的子目标]            |
| **Target Profile**        | 厂家具体型号 [选择你的设备型号。这会自动设置与设备兼容的预设选项] |
| **Target Images**         | 选择生成的固件类型,例如:squashfs、ext4等                   |
| **Global build settings** | 配置全局编译设置,例如:启用/禁用软件包的签名检查、IPv6支持等 |
| **Base system**           | 选择基本系统组件,例如:网络配置、系统日志、防火墙等         |
| **Extra packages**        | 选择额外的软件包,如:文件系统支持、VPN、代理等              |
| **Kernel modules**        | 选择内核模块,如:支持的硬件设备、文件系统、网络协议等       |
| **LuCI**                  | 选择Web界面组件,包括主题、应用、协议支持等                  |
| **Languages**             | 选择系统支持的语言包                                         |
| **Libraries**             | 选择编译时需要的库文件,如:加密库、数据库库等               |
| **Utilities**             | 选择实用工具,如:文件管理器、终端模拟器、脚本语言支持等     |
--------------------------------------------------------------------------------------------------
# 如果要编译插件写入固件,请按 Y 
# 如果只编译不写入固件,请按 M
# 如果不编译或者取消已经内置的选择,请按 N
------------------------------------- 上面是说明,下面是配置指南 --------------------------------------

# 执行命令进入编译菜单
make menuconfig

# 选择 CPU 类型
Target System (x86) --> # 软路由选择 x86 硬路由根据型号厂家自行选择
Subtarget (x86_64) --> # CPU 子选项
Target Profile (Generic x86/64) --> # 厂家具体型号

# 设置镜像编译的格式(squashfs,ext4)
Target Images --> # 默认 squashfs [选择生成的固件类型,例如:squashfs、ext4等]
 
# 添加较多插件时,为了避免空间不足,建议修改下面两项默认大小(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 # 选择喜欢的主题,可以选多个
 
# 其他选项一般不需要调整,如感兴趣可以自行了解

# 插件对照表(二次编译时使用)
https://www.right.com.cn/forum/thread-3682029-1-1.html

# 完成编译菜单设置后选择Save保存
# 再选择Exit退出菜单
# 预先下载编译所需的软件包
make download -j8

# 检查文件完整性
find dl -size -1024c -exec ls -l {} \;

# 检查文件完整性命令可以列出下载不完整的文件,小于1k的文件属于下载不完整,如果存在则用下面的命令删除,然后重新下载编译所需的软件包,再次检查
# 确认所有文件完整可大大提高编译成功率,避免浪费时间
find dl -size -1024c -exec rm -f {} \;

第三部分:正式开始第一次编译固件

# 说明: 如果编译出错别急找错,直接按下面这三行命令执行(清理所有预设及文件缓存等,我们需要先跑一遍)
make clean
make dirclean
rm -rf ./tmp && rm -rf .config
make menuconfig
make download -j8
find dl -size -1024c -exec ls -l {} \;
make V=s -j1
-----------------------------------------------------------------------------------

# 第一次基础编译测试(这里重新切用户和进lede是为了防止新手不会用screen)
# 切换非根用户
su openwrt

# 重新进入分支目录
cd ~
cd lede

# 分离窗口并开始编译(-j 后面是线程数,首次编译推荐用单线程)
screen -S 你想要的窗口名字
make V=s -j1

# 编译完成后输出路径是[bin/targets]默认密码是[password]

二次编译

二次编译的作用是跟随源代码分支内容更新固件或自己想再次更新某些内容再编译固件的行为

# 拉取最新 OpenWrt 源码和更新 feeds 源中的软件包源码
cd lede
git pull
./scripts/feeds update -a
./scripts/feeds install -a
# 同首次编译,多线程编译失败后自动进入单线程编译,失败则输出详细日志
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

其它可选

自定义配置(将此部分搬移至底下是为了不让学生被打乱思路)

# 以下为可选类型(请在修改配置参数(make menuconfig)前使用)

# 修改默认IP为 10.0.0.2(这段可以不执行,反正我不是旁路)
#sed -i 's/192.168.1.1/10.0.0.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

清除旧的编译产物和目录(可选)

# 源码有大规模更新或者内核更新后执行,以保证编译质量
# 此操作会删除 /bin 和 /build_dir 目录中的文件
make clean

# 更换架构编译前必须执行
# 此操作会删除 /bin 和 /build_dir 目录的中的文件(make clean),以及 /staging_dir、/toolchain、/tmp 和 /logs 中的文件
make dirclean

问题说明-归类

# 编译错误部分

# 不知哪里错了?(先清理一遍所有信息再编译)
make clean
make dirclean
rm -rf ./tmp && rm -rf .config
make menuconfig
make download -j8
find dl -size -1024c -exec ls -l {} \;
make V=s -j1
# Screen部分的错误提醒
# There is no screen to be resumed matching xxx(没有要恢复的屏幕匹配xxx)

screen -ls
screen -d id
screen -r 你创建时的自定义名字

指令说明-Screen

| screen                 | 说明                                 |
| ---------------------- | ------------------------------------ |
| screen -S 你要的名字   | 创建窗口                             |
| screen -ls             | 查看进程                             |
| screen -r 你的进程名字 | 再次进入窗口                         |
| ctrl+A+D               | 退出窗口(但不会导致正在跑的程序结束) |

灵感抄自以下Bro

雾时の森-从零开始自定义编译 OpenWrt(LEDE) 固件
米粒一频道-Openwrt固件编译
笨鸟教程-screen 命令使用