以 X-WRT 为例,使用 Ubuntu 22.04 LTS 系统,建议使用国外服务器编译。

编译准备

不要用root用户进行编译操作,因此需要先新建一个用户,并且授予root权限

# Login via SSH
ssh root@your_server_ip

# Create a new user and follow prompts
adduser <user>

# Add user to superuser group to unlock admin privileges
usermod -aG sudo <user>

# Then log in as the new user
su - <user>

更新软件包并安装依赖

# Update package lists
sudo apt-get update

# Update installed packages
sudo apt-get upgrade

sudo apt install build-essential ecj fastjar file flex g++ gcc-multilib g++-multilib gawk gettext git git-core java-propose-classpath libelf-dev libncurses5-dev libncursesw5-dev libssl-dev swig python3 python3-distutils subversion unzip wget zlib1g-dev rsync qemu-utils

下载源码

git clone https://github.com/x-wrt/x-wrt.git
cd x-wrt

#更新代码tag:
git fetch origin
git fetch origin --tags

#列出可以使用的版本tag:
git tag
#注意按 q 键结束
#或者直接获取最新发布版本
git describe --tags $(git rev-list --tags --max-count=1)

#选择并切换到指定的版本tag:
git checkout -f <tag-name>
#例如
git checkout -f 21.10_b202112032317
#或者
git checkout -f $(git describe --tags $(git rev-list --tags --max-count=1))

#更新代码:
./scripts/feeds update -a
./scripts/feeds install -a

然后就可以使用make menuconfig进行固件配置,但是我们可以从配置模版开始会更轻松一些。

比如 ramips-mt7621 的设备可以用拷贝这个模版feeds/x/rom/lede/config.ramips-mt7621 内核分区限制小的设备,选用 -nosymbol 结尾的config配置模版。

# 0 拷贝模板到根目录
cp feeds/x/rom/lede/config.ramips-mt7621 .config

# 1 执行
make menuconfig

# 2 进入 Target Profile 选择需要编译打包的设备型号,选择型号后立刻退出,保存

#3 执行下面的命令修复 .config
sh feeds/x/rom/lede/fix-config.sh

#4 再次执行 make menuconfig 然后立刻退出保存
make menuconfig

#5 最后一次 执行 make menuconfig 自定义选择你需要的软件包
make menuconfig

配置目标(可选项)

在上述准备好的模版配置文件的基础上,执行make menuconfig命令进行个性化定制,增删应用。

定位到各个子菜单,选择对应的软件包。

添加自定义源

# 进入openwrt目录
cd ~/openwrt

# 添加自定义源
cat >> feeds.conf.default <<EOF
src-git kenzo https://github.com/kenzok8/openwrt-packages
src-git passwall https://github.com/xiaorouji/openwrt-passwall
EOF

更新下载软件仓库的源码到本地,并安装自定义源包含的软件包

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

添加插件

首先,进入make menuconfig菜单

要编译到固件里面,就要选择<\*>,如果只选择<M>只是编译成软件包ipk,不会打包进入固件。

进入LuCI - Applications子菜单下面,选择自己想要的应用

进入Kernel modules - USB Support菜单,选择 USB 支持的驱动

进入Kernel modules - Filesystems菜单,选择需要支持的文件系统,比如ext4,ntfs,vfat

进入Kernel modules - Wireless Drivers菜单,选择无线支持的驱动,如果需要挂卡的驱动,也是在这里找

单独添加软件包

如果需要单独添加软件,请拉取源码到 package 目录之下。示例如下:

# 添加 OpenAppFilter 应用过滤插件
git clone https://github.com/destan19/OpenAppFilter package/OpenAppFilter

# 添加 OpenClash
git clone https://github.com/vernesong/OpenClash.git
mv OpenClash/luci-app-openclash package/

# 添加 eqos
git clone https://github.com/zhaojh329/eqos.git package/

执行make menuconfig进行配置

OpenClash:
LuCI > Applications > luci-app-openclash
Kernel modules > Network Support > kmod-tun

OpenClash 需要排除 dnsmasq,安装 dnsmasq-full,不排除会冲突:
Base system > dnsmasq

eqos:
LuCI > Applications > luci-app-eqos
Network > eqos

设置默认主题

注:此操作请在编译前执行,设置 ar­gon 为默认主题,以此为例举一反三

# 删除自定义源默认的 argon 主题
rm -rf package/lean/luci-theme-argon

# 部分第三方源自带 argon 主题,上面命令删除不掉的请运行下面命令
find ./ -name luci-theme-argon | xargs rm -rf;

# 针对 LEDE 项目拉取 argon 原作者的源码
git clone -b 18.06 https://github.com/jerrykuku/luci-theme-argon.git package/lean/luci-theme-argon

# 替换默认主题为 luci-theme-argon
sed -i 's/luci-theme-bootstrap/luci-theme-argon/' feeds/luci/collections/luci/Makefile

设置路由器默认的 LAN IP

注:此操作请在编译前执行

# 设置默认IP为 192.168.199.1
sed -i 's/192.168.1.1/192.168.199.1/g' package/base-files/files/bin/config_generate

执行编译

命令:

make

或者

# -j1:单线程编译
make -j1 V=s

单线程编译可提高编译成功率,但过程非常漫长,也完全取决于机器的性能。

编译完成后固件输出路径:bin/targets/下面。

如果需要再次修改配置编译,只要不是换设备,都可以直接 make menuconfig 修改后就编译,如果需要修改设备,请从拷贝模版配置的地方重新开始配置。

二次编译步骤

更新本地编译环境

# 更新软件列表、升级软件包
sudo sh -c "apt update && apt upgrade -y"

# 拉取最新源码
cd ~/openwrt && git pull

# 更新下载安装订阅源包含的软件包
cd ~/openwrt
./scripts/feeds update -a && ./scripts/feeds install -a

清理旧文件

# 删除/bin和/build_dir目录中的文件
make clean

如果要更换架构,例如要从 x86_64 换到 MediaTek Ralink MIPS 建议执行以下命令深度清理 /bin/build_dir 目录的中的文件 (make clean) 以及 /staging_dir/toolchain/tmp/logs 中的文件。

make dirclean

如果需要对组件重新调整,则建议先删除旧配置

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

根据自己的定制需求,再次调整 Open­Wrt 系统组件

make menuconfig

下载编译所需的软件包

make download -j8 V=s

编译 Open­Wrt 固件

make -j$(nproc) || make -j1 || make -j1 V=s

二次编译可以优先使用多线程,报错会自动使用单线程,仍然报错会单线程执行编译并输出详细日志。

附录

常用插件列表

在调整 Open­Wrt 系统组件时:[*]表示编译软件包并加入到固件;[M] 表示编译软件包但不加入固件;[ ] 则表示不对软件包进行任何设置。

# 常见
luci-app-aria2 ARRIA2下载工具
luci-app-ddns DDNS工具
luci-app-mwan3 MWAN3负载均衡
luci-app-openvpn OPENVPN
luci-app-ksmbd Ksmbd文件网络共享(samba文件共享)
luci-app-upnp UPNP设置
luci-app-wireguard WireGuard配置界面
luci-app-natcap 远程界面管理模块和全锥形nat实现模块
luci-app-natflow-users 用户认证(用户流量显示)模块

## 插件类
LuCI ---> Applications ---> luci-app-accesscontrol #上网时间控制
LuCI ---> Applications ---> luci-app-adbyby-plus   #去广告
LuCI ---> Applications ---> luci-app-arpbind  #IP/MAC绑定
LuCI ---> Applications ---> luci-app-autoreboot  #高级重启
LuCI ---> Applications ---> luci-app-aliddns   #阿里DDNS客户端
LuCI ---> Applications ---> luci-app-ddns   #动态域名 DNS
LuCI ---> Applications ---> luci-app-filetransfer  #文件传输
LuCI ---> Applications ---> luci-app-firewall   #添加防火墙
LuCI ---> Applications ---> luci-app-frpc   #内网穿透 Frp
LuCI ---> Applications ---> luci-app-mwan3   #MWAN负载均衡
LuCI ---> Applications ---> luci-app-nlbwmon   #网络带宽监视器
LuCI ---> Applications ---> luci-app-ramfree  #释放内存
LuCI ---> Applications ---> luci-app-samba   #网络共享(Samba)
LuCI ---> Applications ---> luci-app-sqm  #流量智能队列管理(QOS)
LuCI ---> Applications ---> luci-app-openclash #你懂的那只猫
LuCI ---> Applications ---> luci-app-dnsfilter #广告过滤
LuCI ---> Applications ---> luci-app-passwall #不敢解释
LuCI ---> Applications ---> luci-app-mtwifi #闭源Wi-Fi驱动
LuCI ---> Applications ---> luci-app-eqos #根据IP控制网速
LuCI ---> Applications ---> luci-app-syncdial #薛定谔的多拨应用
LuCI ---> Applications ---> luci-app-zerotier #虚拟局域网
LuCI ---> Applications ---> luci-app-oaf #应用过滤神器
LuCI ---> Applications ---> luci-app-watchcat #断网检测功能与定时重启
LuCI ---> Applications ---> luci-app-wol   #WOL网络唤醒
LuCI ---> Applications ---> luci-app-wrtbwmon  #实时流量监测
LuCI ---> Applications ---> luci-app-upnp   #通用即插即用UPnP(端口自动转发)
LuCI ---> Applications ---> luci-app-argon-config #Argon主题设置

# 常用主题类
LuCI ---> Themes ---> luci-theme-argon

# 网络相关 (普通用户用不上)
Network ---> IP Addresses and Names ---> ddns-scripts_cloudflare.com-v4
Network ---> IP Addresses and Names --->  bind-dig
Network ---> Routing and Rediction ---> ip-full
Network ---> File Transfer ---> curl
Network ---> File Transfer ---> wget-ssl
Network ---> iperf3
Network ---> ipset
Network ---> socat #多功能的网络工具
Base system --> dnsmasq-full #DNS缓存和DHCP服务(dnsmasq-full和dnsmasq二者不可共存)

# 工具类 (普通用户用不上)
Utilities --> acpid  #电源管理接口(适用于x86平台)
Utilities --> Editors --> nano #Nano 编辑器
Utilities --> Shells --> bash #命令解释程序
Utilities --> disc --> eject #弹出可移动介质
Utilities --> disc --> fdisk #MBR分区工具
Utilities --> disc --> gdisk #GBT分区工具
Utilities --> disc --> lsblk #列出磁盘设备及分区查看工具
Utilities --> Filesystem --> resize2fs #调整文件系统大小
Utilities --> Filesystem --> e2fsprogs #Ext2(及Ext3/4)文件系统工具

# IPv6(未来运营商可能不再提供 IPv4 公网地址,有远程访问需求的建议加入)
Extra packages ---> ipv6helper (勾选此项即可,下面几项自动勾选)
Network ---> odhcp6c
Network ---> odhcpd-ipv6only
LuCI ---> Protocols ---> luci-proto-ipv6
LuCI ---> Protocols ---> luci-proto-ppp

参考文献

https://blog.x-wrt.com/docs/build/

https://www.moewah.com/archives/4003.html

https://ghost.org/docs/install/ubuntu/

https://github.com/skyformat99/eqos/blob/master/README_ZH.md

https://xiaohai.co/build-openwrt-firmware/