Lede 源码编译 OpenWrt 软路由固件
前言
常见软路由器系统举例
- pfSense:
- 优点:强大的功能,支持高级网络配置、VPN、负载均衡等。
- 缺点:学习曲线较陡峭。
- 适用场景:中小企业、需要高级网络功能的用户。
- 例子:将pfSense用于中小型办公室,实现安全的互联网访问和VPN连接。
- OpenWRT:
- 优点:轻量级,支持广泛的硬件,有丰富的插件和定制选项。
- 缺点:某些高级功能需要额外的配置。
- 适用场景:家庭用户、技术爱好者。
- 例子:在家中使用OpenWRT将老旧路由器转变为强大的路由器,扩展网络功能。
- DD-WRT:
- 优点:易于安装,支持大量硬件,有许多高级功能。
- 缺点:某些高级功能可能对新手不太友好。
- 适用场景:家庭用户、需要更多网络控制的用户。
- 例子:使用DD-WRT为家庭网络设置访客网络和家长控制。
- IPFire:
- 优点:专注于安全性,有强大的防火墙和入侵检测功能。
- 缺点:界面可能较为简单。
- 适用场景:需要高级网络安全的用户。
- 例子:在小型企业网络中使用IPFire加强网络安全性。
恩山论坛上有很多用户编译好的现成固件,自己编译固件最大的优势是可以根据需求更好的自定义,建议没有特别需求的用户还是直接选用现成的固件即可。编译固件也是一种乐趣,整个过程大约1-3小时左右,需要耐心等待。
环境要求
系统版本
Debian 11 或者 Ubuntu LTS
网络要求
最好是境外主机或者能够访问国际网络,大陆网络环境编译失败率较高,配置推荐 2H4G 以上
编译依赖
1
2
3
4
5
6
7
8
9
10
11
12
13# 升级
sudo apt update -y
sudo apt full-upgrade -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
开始编译
新建一个用户,用于编译固件
1
2
3
4
5
6
7
8
9useradd -m openwrt # 新建一个名为 openwrt 的用户
# 修改用户默认的 Shell
apt install -y sudo
usermod -s /bin/bash openwrt
# 切换用户
su openwrt
cd ~拉取源码,这里用的是 Lean 大佬的 LEDE 分支源码
1
2git clone https://github.com/coolsnowwolf/lede
cd lede添加软件源,L大源码里默认有四个软件源里面包含了大部分常用插件,如果要添加其他没有的插件则需要自行添加软件源至
1
feeds.conf.default
文件,当然也可以单独添加某个插件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16vim 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
# 单独添加(在更新并安装插件之前执行)
## 插件
git clone https://github.com/esirplayground/luci-app-poweroff.git package/luci-app-poweroff
# 更新并安装插件
./scripts/feeds clean
./scripts/feeds update -a
./scripts/feeds install -afeeds 的工作流程
1. feeds update 的作用
1
./scripts/feeds update -a
- 更新什么:从远程仓库(如 GitHub)下载最新的包定义和源码
- 放到哪里:下载到
feeds/目录下 - 具体位置:
feeds/packages/- 第三方包feeds/luci/- LuCI 界面feeds/routing/- 路由相关包feeds/telephony/- 电话相关包
2. feeds install 的作用
1
./scripts/feeds install -a
- 安装什么:将
feeds/目录下的包创建符号链接 - 安装到哪里:链接到
package/feeds/目录 - 具体位置:
package/feeds/packages/- 第三方包的符号链接package/feeds/luci/- LuCI 包的符号链接
删除 rust 包后的操作
情况1:只删除 rust 包文件
1
2
3
4
5# 删除 rust 包
rm -rf feeds/packages/lang/rust
# 需要重新 install,因为符号链接可能还存在
./scripts/feeds install -a情况2:完全重新开始(推荐)
1
2
3
4
5
6
7
8# 删除整个 feeds 目录
rm -rf feeds/
# 重新下载所有 feeds
./scripts/feeds update -a
# 重新安装所有 feeds
./scripts/feeds install -a1
2make package/feeds/packages/geoview/dirclean V=s
make package/feeds/packages/geoview/compile V=s目录结构对比
1
2
3
4
5
6
7
8
9
10
11
12
13OpenWRT 源码目录/
├── feeds/ # feeds update 下载到这里
│ ├── packages/
│ │ └── lang/
│ │ └── rust/ # 源码在这里
│ └── luci/
├── package/feeds/ # feeds install 链接到这里
│ ├── packages/
│ │ └── lang/
│ │ └── rust -> ../../../feeds/packages/lang/rust # 符号链接
│ └── luci/
└── package/ # 系统原生包
└── system/验证操作结果
1
2
3
4
5
6
7# 检查 feeds 目录(源码)
ls -la feeds/packages/lang/ | grep rust
# 检查 package/feeds 目录(符号链接)
ls -la package/feeds/packages/lang/ | grep rust
# 如果 rust 已被删除,两个命令都应该没有输出推荐的操作步骤
1
2
3
4
5
6
7
8
9
10
11# 1. 删除 rust 包
rm -rf feeds/packages/lang/rust
# 2. 重新安装 feeds(更新符号链接)
./scripts/feeds install -a
# 3. 清理编译缓存
make clean
# 4. 重新编译
make V=s总结
- feeds update:从远程仓库下载源码到
feeds/目录 - feeds install:创建符号链接到
package/feeds/目录 - 删除 rust 后:需要重新
feeds install来更新符号链接 - 完全重新开始:删除整个
feeds/目录,然后update+install

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35cd packages
# alpha Theme
git clone https://github.com/derisamedia/luci-theme-alpha.git
git clone https://github.com/animegasan/luci-app-alpha-config.git
# Kucat Theme
git clone https://github.com/sirpdboy/luci-theme-kucat.git
git clone https://github.com/sirpdboy/luci-app-kucat-config.git
# argon Theme
git clone https://github.com/jerrykuku/luci-theme-argon.git
git clone https://github.com/jerrykuku/luci-app-argon-config.git # 24 以后 安装缺少的依赖项 luci-lib-ipkg
# plugin
git clone https://github.com/sirpdboy/luci-app-advancedplus.git
git clone https://github.com/rufengsuixing/luci-app-onliner.git # 需要luci-app-nlbwmon
git clone https://github.com/tty228/luci-app-wechatpush.git
git clone https://github.com/nikkinikki-org/OpenWrt-nikki.git # Mihomo
git clone https://github.com/Thaolga/openwrt-nekobox
git clone https://github.com/sirpdboy/luci-app-netdata
git clone https://github.com/immortalwrt/homeproxy.git # 需要Firewall4 nftables与iptables(fw3)冲突
git clone https://github.com/lisaac/luci-app-diskman.git
git clone https://github.com/rufengsuixing/luci-app-adguardhome.git
git clone https://github.com/xiaorouji/openwrt-passwall2.git
# openclash
mkdir package/luci-app-openclash
cd package/luci-app-openclash
git init
git remote add -f origin https://github.com/vernesong/OpenClash.git
git config core.sparsecheckout true
echo "luci-app-openclash" >> .git/info/sparse-checkout
git pull --depth 1 origin master
git branch --set-upstream-to=origin/master master1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102#!/bin/bash
# 1️⃣ 完整克隆(拉取整个仓库)
git_clone_full() {
local repo_url="\$1" # 仓库地址
local target_dir="\$2" # 目标目录(可选,默认直接克隆到当前目录)
echo "🔹 完整克隆: $repo_url → $target_dir"
git clone "$repo_url" "$target_dir"
}
# 2️⃣ 稀疏克隆(仅拉取指定子目录)
git_clone_sparse() {
local repo_url="\$1" # 仓库地址
local target_dir="\$2" # 目标目录
local sparse_path="\$3" # 要克隆的子目录
echo "🔹 稀疏克隆: $repo_url → $target_dir(仅拉取 $sparse_path)"
mkdir -p "$target_dir"
cd "$target_dir" || exit 1
git init
git remote add origin "$repo_url"
git config core.sparseCheckout true
# 设置要拉取的子目录
echo "$sparse_path/" >> .git/info/sparse-checkout
# 拉取代码(不限制深度,完整历史)
git pull --depth 1 origin master
cd - >/dev/null # 返回原目录
}
# 稀疏克隆:支持指定多个子目录
git_clone_sparse_multi() {
local repo_url="\$1" # 仓库地址
local target_dir="\$2" # 目标目录
shift 2 # 前两个参数已用,剩余参数为要克隆的子目录
echo "🔹 稀疏克隆: $repo_url → $target_dir(仅拉取: $*)"
mkdir -p "$target_dir"
cd "$target_dir" || exit 1
git init
git remote add origin "$repo_url"
git config core.sparseCheckout true
# 添加所有需要克隆的子目录
for dir in "$@"; do
echo "$dir/" >> .git/info/sparse-checkout
done
# 拉取代码(不限制深度)
git pull origin master
cd - >/dev/null # 返回原目录
}
# 进入 packages 目录
cd packages || exit 1
# 1️⃣ 批量克隆常规仓库(完整克隆)
for repo in \
https://github.com/derisamedia/luci-theme-alpha.git \
https://github.com/animegasan/luci-app-alpha-config.git \
https://github.com/sirpdboy/luci-theme-kucat.git \
https://github.com/sirpdboy/luci-app-kucat-config.git \
https://github.com/jerrykuku/luci-theme-argon.git \
https://github.com/jerrykuku/luci-app-argon-config.git \
https://github.com/sirpdboy/luci-app-advancedplus.git \
https://github.com/rufengsuixing/luci-app-onliner.git \
https://github.com/tty228/luci-app-wechatpush.git \
https://github.com/nikkinikki-org/OpenWrt-nikki.git \
https://github.com/Thaolga/openwrt-nekobox \
https://github.com/sirpdboy/luci-app-netdata \
https://github.com/immortalwrt/homeproxy.git
do
git_clone_full "$repo"
done
# 克隆 openwrt-passwall2(完整克隆)
git_clone_full \
"https://github.com/xiaorouji/openwrt-passwall2" \
"package/openwrt-passwall2"
# 克隆 OpenClash(仅拉取 luci-app-openclash)
git_clone_sparse \
"https://github.com/vernesong/OpenClash.git" \
"package/luci-app-openclash" \
"luci-app-openclash"
# 克隆 luci(指定文件夹下的文件夹)
git_clone_sparse_multi \
"https://github.com/coolsnowwolf/luci.git" \
"package/luci-applications" \
"applications" \
"applications/luci-app-zerotier" \
"luci-app-airplay2"
echo "✅ 所有仓库克隆完成!"自定义配置
1
2
3
4
5
6
7
8
9
10
11# 修改默认IP为 192.168.6.1
sed -i 's/192.168.1.1/192.168.6.1/g' package/base-files/luci2/bin/config_generate
# 修改默认主机名
sed -i '/uci commit system/i\uci set system.@system[0].hostname='N5105'' package/base-files/luci2/bin/config_generate
# 加入编译者信息
sed -i "s/OpenWrt /YuKiFuHaNe 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执行
1
make menuconfig
命令进入编译菜单

菜单选项简要说明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30# 选择 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 # 选择喜欢的主题,可以选多个
# 其他选项一般不需要调整,如感兴趣可以自行了解常用软件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107luci-app-autoreboot #支持计划重启
uci-app-adguardhome #AdGuard home广告过滤(Li大内插件)
luci-app-advanced-reboot #Linksys高级重启
luci-app-advancedsetting #系统高级设置(Li大内插件)
luci-app-airplay2 #Apple AirPlay2 无损音频接收服务器
luci-app-arpbind #IP/MAC绑定
luci-app-asterisk #支持Asterisk电话服务器
luci-app-cifs-mount #CIFS/SMB挂载设置 (与luci-app-cifsd冲突)
luci-app-cifsd #CIFS/SMB网络共享(与luci-app-cifs-mount冲突)
luci-app-clamav #ClamAV杀毒软件
luci-app-commands #Shell命令模块
# luci-app-cshark #CloudShark捕获工具 (Libraries ---> 需要libustream-mbedtls 与libustream-openssl冲突)
luci-app-ddns #动态域名 DNS(集成阿里DDNS客户端)
luci-app-diag-core #core诊断工具
luci-app-diskman #磁盘管理工具
luci-app-diskman ---> Include btrfs-progs #新型的写时复制 (COW)
luci-app-diskman ---> Include lsblk #lsblk命令 用于列出所有可用块设备的信息
luci-app-diskman ---> Include mdadm #mdadm命令 用于创建、管理、监控RAID设备的工具
luci-app-diskman ---> Include kmod-md-raid456 #RAID 4,5,6 驱动程序模块(丢弃)
luci-app-diskman ---> Include kmod-md-linear #RAID 驱动程序模块(丢弃)
luci-app-dnscrypt-proxy #DNSCrypt解决DNS污染
luci-app-dnsforwarder #DNSForwarder防DNS污染
luci-app-docker #Docker容器
luci-app-dockerman #Dockerman容器
luci-app-filebrowser #文件传输 网页浏览器
luci-app-filetransfer #文件传输(可web安装ipk包)
luci-app-firewall #添加防火墙
luci-app-frpc #内网穿透Frp客户端
luci-app-frps #内网穿透Frp服务端
luci-app-guest-wifi #WiFi访客网络
luci-app-haproxy-tcp #HAProxy负载均衡-TCP
luci-app-hd-idle #硬盘休眠
luci-app-hnet #Homenet Status家庭网络控制协议
luci-app-https-dns-proxy #通过HTTPS代理为DNS提供Web UI
luci-app-mjpg-streamer #兼容Linux-UVC的摄像头程序
luci-app-music-remote-center #PCHiFi 数字转盘遥控
luci-app-mwan3 #MWAN3负载均衡
luci-app-mwan3helper #MWAN3分流助手
luci-app-netdata #Netdata实时监控(图形化)
luci-app-nfs #NFS网络共享
luci-app-nft-qos #QOS流控 Nftables版
luci-app-netdata #Netdata实时监控(图形化)
luci-app-nlbwmon #网络带宽监视器
luci-app-lxc #LXC容器管理
luci-app-olsr #OLSR配置和状态模块
luci-app-olsr-services #OLSR服务器
luci-app-olsr-viz #OLSR可视化
luci-app-openclash #运行在OpenWrt上的Clash代理客户端
luci-app-privoxy #Privoxy网络代理(带过滤无缓存)
luci-app-pushbot #全能推送(钉钉推送,企业微信推送,Bark,PushPlus推送)
luci-app-qos #流量服务质量(QoS)流控
luci-app-radicale #CalDAV/CardDAV同步工具
luci-app-ramfree #释放内存
luci-app-rclone #命令行云端同步工具
Include rclone-webui #Rclone界面
Include rclone-ng (another webui) #Rclone另一个界面
Include fuse-utils (mount cloud storage) #fuse-utils(挂载云存储)(丢弃)
luci-app-samba4 #网络共享(Samba4)
luci-app-serverchan #微信/请不要发布这类群,谢谢推送的插件
luci-app-sqm #流量智能队列管理(QOS)
luci-app-statistics #流量监控工具
luci-app-syncdial #多拨虚拟网卡(原macvlan)
luci-app-socat #Socat多功能的网络工具(端口转发)
luci-app-travelmate #旅行路由器 (中继必备)
luci-app-tailscale # tailscale内网穿透
luci-app-ttyd #网页终端命令行
luci-app-turboacc #Turbo ACC 网络加速(支持 Fast Path 或者 硬件 NAT)
luci-app-turboacc ---> Include Flow Offload #Flow Offload加速(提高路由转发效率) *
luci-app-turboacc ---> Include Shortcut-FE #Shortcut-FE 流量分载
luci-app-turboacc ---> Include Shortcut-FE CM #Shortcut-FE 流量分载(高通芯片版) *
luci-app-turboacc ---> Include BBR CCA #BBR拥塞控制算法提升TCP网络性能
luci-app-turboacc ---> Include Pdnsd #DNS防污染 Pdnsd *
luci-app-turboacc ---> Include DNSForwarder #DNS防污染 Forwarder
luci-app-turboacc ---> Include DNSProxy #DNS防污染 Proxy
luci-app-udpxy #udpxy做组播服务器
luci-app-uhttpd #uHTTPd Web服务器
luci-app-unblockneteasemusic #解锁网易云灰色歌曲
luci-app-upnp #通用即插即用UPnP(端口自动转发)
luci-app-vlmcsd #KMS服务器设置
luci-app-vsftpd #FTP服务器
luci-app-vnstat #vnStat网络监控(图表)(与kodexplorer冲突 ! )
luci-app-watchcat #断网检测功能与定时重启
luci-app-webadmin #Web管理页面设置
luci-app-wifischedule #WiFi 计划
luci-app-wol #WOL网络唤醒
luci-app-wrtbwmon #实时流量监测
luci-app-zerotier #ZeroTier内网穿透插件中文说明对照表:https://www.right.com.cn/forum/thread-3682029-1-1.html
配置完成后使用编译菜单底部的
Save保存,然后退出菜单Exit,开始下载软件包1
2
3
4
5
6
7# 预下载编译所需的软件包
make download -j8
# 检查文件完整性
find dl -size -1024c -exec ls -l {} \;
# 检查文件完整性命令可以列出下载不完整的文件,小于1k的文件属于下载不完整,如果存在则用下面的命令删除,然后重新下载编译所需的软件包,再次检查
# 确认所有文件完整可大大提高编译成功率,避免浪费时间
find dl -size -1024c -exec rm -f {} \;1
2
3make package/kernel/linux/compile -j$(nproc)
make package/feeds/packages/node clean
make package/feeds/packages/node/compile -j$(nproc)1
2
3
4
5
6
7
8
9
10
11# 查看下载目录结构
ls -la dl/
# 常见文件类型
dl/
├── linux-5.4.138.tar.xz # Linux 内核源码
├── busybox-1.33.1.tar.bz2 # BusyBox 工具集
├── uclibc-ng-1.0.37.tar.xz # C 库
├── toolchain/ # 工具链相关
├── package/ # 软件包源码
└── feeds/ # feeds 相关源码最后编译固件,编译完成后输出路径是
1
bin/targets
,默认密码是
1
password
1
2# 编译固件(-j 后面是线程数,首次编译推荐用单线程)
make V=s -j1
二次编译
拉取最新 OpenWrt 源码和更新 feeds 源中的软件包源码
1
2
3
4cd lede
git pull
./scripts/feeds update -a
./scripts/feeds install -a清除旧的编译产物和目录(可选)
1
2
3
4
5
6
7make clean
# 源码有大规模更新或者内核更新后执行,以保证编译质量
# 此操作会删除 /bin 和 /build_dir 目录中的文件
make dirclean
# 更换架构编译前必须执行
# 此操作会删除 /bin 和 /build_dir 目录的中的文件(make clean),以及 /staging_dir、/toolchain、/tmp 和 /logs 中的文件1.make clean
1
2
3
4# 只清理编译结果,保留配置
make clean
# 保留:.config, dl/, feeds/, 源码
# 清理:build_dir/, staging_dir/, tmp/, bin/2. make distclean
1
2
3
4# 清理所有内容,包括配置
make distclean
# 清理:.config, build_dir/, staging_dir/, tmp/, bin/, dl/, feeds/
# 保留:源码文件3. make dirclean
1
2
3# 清理特定包的编译结果
make package/feeds/packages/geoview/dirclean
# 只清理指定包的编译文件同首次编译,多线程编译失败后自动进入单线程编译,失败则输出详细日志
1
2
3
4
5
6
7
8
9
10
11make 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=s0)原则:尽量“定点清理”,别一上来就全删
你可以按失败包来清:
清某个包的编译目录(最常用)
1
2make package/<path>/<pkg>/clean
2make package/<path>/<pkg>/compile -j1 V=s例如 feeds 的 nginx:
1
make package/feeds/packages/nginx/{clean,compile} -j1 V=s
如果是 host 工具/生成器出问题(在 staging_dir/host 里的)
1
2make package/<path>/<pkg>/host/clean
make package/<path>/<pkg>/compile -j1 V=s
1)下载/源码包损坏(适用于所有包:nginx/python/…)
表现:hash 不对、解压失败、tar 报错、patch 失败但文件内容看着不对。
清理对应下载文件最直接:
1
2
3rm -f dl/<包名相关>*
# 或者干脆清某个包的下载:
make package/<pkg>/download V=s如果你不确定是哪一个文件,就用更粗一点(代价:重新下载很多):
1
rm -rf dl/*
2)语言相关缓存(Go/Python/Rust/Node 等)——最容易“半拉子”
这些缓存不在 build_dir,而在
dl/或tmp/,定点清理更有效。Go
1
rm -rf dl/go-mod-cache tmp/go-build
Python(pip / pypi 源码包、wheel、构建缓存)
OpenWrt 的 Python 包通常会下载 sdist 到
dl/,构建发生在build_dir/。一般不需要额外缓存清理;但如果你用了某些带 pip 的构建流程,出现“缓存轮子损坏”,可以:1
rm -rf tmp/pip-cache # 如果存在的话
(是否存在看你的 build 系统/包写法)
Rust
1
2rm -rf dl/cargo
rm -rf tmp/cargo*Node/Yarn
1
2rm -rf dl/npm dl/yarn
rm -rf tmp/npm*
3)全局“重置包编译状态”(比 clean 更狠,但不动下载)
当你怀疑 staging 里装进去的库/头文件不完整,导致很多包一起怪异报错:
1
make package/clean
这会把已编过的包产物清掉,让它们下次重编并重新安装到 staging,但不会重下
dl/。
4)toolchain / host / staging 有问题(最狠,最后用)
如果出现:
- host 工具(比如 bison、pkgconf、python3-host)自己就坏了
- toolchain 相关报错、链接器/头文件不一致
- staging_dir 明显混乱
可以:
1
2make toolchain/clean
make target/clean再不行才考虑(很耗时):
1
make dirclean
make dirclean:会删掉.config(以及 tmp、staging、build、dl 等),基本回到刚 checkout 的状态。make distclean:更彻底,也会删.config,并且会额外清掉 feeds 相关生成物等(不同版本细节略有差异,但同样是“配置没了”级别)。- 想“清干净但保留
.config”用:make clean(通常保留.config,但会清大量编译产物)。
实用建议
在跑
dirclean/distclean之前先备份:1
2cp .config .config.bak
./scripts/diffconfig.sh > diffconfig.bak # 只保存与你默认值不同的项,更小更稳清完后恢复:
1
2cp .config.bak .config
make defconfig或者用
1
diffconfig
恢复(更推荐):
1
# 先生成一个新的默认 .config 再合并差异(做法有几种)
“清理但不想丢配置”
- 清单个包:
make package/xxx/clean - 清所有包产物:
make package/clean - 清更大范围但保
.config:make clean
5)建议的日常排错流程(通用)
先并行跑到失败:
make -j$(nproc) -k对失败包:
1
2make package/.../<pkg>/clean
make package/.../<pkg>/compile -j1 V=s如果错误像“no such file / checksum / unexpected EOF”,优先清
dl/对应文件或语言缓存(Go 就是 go-mod-cache)。如果很多包一起炸,才上升到
make package/clean甚至 toolchain 清理。
AX210 Devices open iwlwifi
Network -> WirelessAPD -> hostapd、wps-supplicant(无线认证)

也可以选wpad-mesh-openssl openssl包含最新的wpa3加密也集成了hostapd、wps-supplicant,缺点就是相对来说占空间
Kernel modules -> kmod-iwlwifi、wireless-regdb


Base system > wireless-tools

1 | Kmod-iwlwifi wireless-regdb iwlwifi-firmware-ax210 wireless-tools wpa-supplicant hostapd |
LuCI -> Applications -> luci-app-wifischedule(WiFi 计划,非必须)

usb net
1 | opkg install kmod-usb-net-rndis kmod-nls-base kmod-usb-core kmod-usb-net kmod-usb-net-cdc-ether kmod-usb-net-ipheth libimobiledevice-utils usbmuxd kmod-usb2 kmod-usb3 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 # 内核模块
Kernel modules --->
Wireless Drivers --->
[*] kmod-iwlwifi
[*] kmod-cfg80211
[*] kmod-mac80211
[*] iwlwifi-firmware-ax210
[*] kmod-rt2800-usb # 如果有其他USB网卡
[*] kmod-usb-core # USB支持
# 网络服务
Network --->
WirelessAPD --->
[*] hostapd
[*] hostapd-common
[*] wpa-supplicant
[*] wpad-basic-wolfssl # 或 wpad-openssl
# 工具
Utilities --->
[*] iw
[*] iwinfo
[*] wireless-tools
# LuCI界面
LuCI --->
Collections --->
[*] luci
Applications --->
[*] luci-app-wireless
[*] luci-mod-admin-full
Firmware > Wireless Drivers > wireless-regdb
Kernel modules > Wireless Drivers > kmod-wlcore
一、OpenWrt 简介
OpenWrt 是一个开源的嵌入式操作系统,专为无线路由器和其他网络设备而设计。平常我们买的路由器基本都是厂家烧录的固件,功能非常有限。而刷了 openwrt 固件或其他如潘多拉固件,这些固件可以以安装插件的方式,让我们更加方便灵活的使用一些功能,如 DDNS、广告屏蔽等插件。
OpenWrt 在方便的地方还是在于它的可定制性,因为不同的硬路由设备它的 falsh 和内存都不一样,所以可以根据自己的需要和路由器的硬件参数来编译自己的 openwrt 系统,因为每个人的路由器不一样,也许用别人编译的固件不一定适合。
接下来就说说如何编译自己的 openwrt 镜像,本次使用的源代码是官方的,地址:https://github.com/openwrt/openwrt
另外,国内也有大神对 openwrt 系统做了一些定制,整合了更多国内需要的插件,地址:https://github.com/coolsnowwolf/lede
其实使用官方源码也是可以自己整合主题和需要的插件的,这些内容将会在后面讲到。
二、纯官方源码编译
1. 编译前准备
最好是挂梯子,否则很有可能因为网络问题编译失败
首先官方推荐使用 ubuntu 或者 debian 来编译 openwrt 镜像,所以需要准备一台虚拟机或物理机安装好系统,本次使用的是 ubuntu 22.04。
安装好以后更新软件源和安装编译所需的软件,这里用到的是 lede 大神提供的命令。
1
2
3
4
5
6
7
8
9 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 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-setuptools2. 编译配置
接下来就可以下载源代码进行自定义配置了。
1 git clone https://github.com/openwrt/openwrt.git下载完源码后,还需要进入 openwrt 里面更新 feed。feed 可以认为是 openwrt 的一些组件,这些组件自己维护自己的源码,以免和 openwrt 核心源码耦合太高。feed 源可以在 feeds.conf.default 文件中看见,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12 # 软件包
src-git packages https://git.openwrt.org/feed/packages.git
# openwrt 图形界面
src-git luci https://git.openwrt.org/project/luci.git
# 路由相关的软件包
src-git routing https://git.openwrt.org/feed/routing.github
# 电话通信相关的软件包
src-git telephony https://git.openwrt.org/feed/telephony.git
#src-git video https://github.com/openwrt/video.git
#src-git targets https://github.com/openwrt/targets.git
#src-git oldpackages http://git.openwrt.org/packages.git
#src-link custom /usr/src/openwrt/custom-feed了解完这些以后,接下来需要更新和安装 feed。
1
2
3
4
5 cd openwrt
# 下载软件到 feeds 目录
./scripts/feeds update -a
# 实际上是将 feeds 目录下的文件软链到 package/feeds 目录下的文件
./scripts/feeds install -a然后接下来就是重中之重了,这里 openwrt 提供一个图形化界面进行相应的配置,配置好以后会生成一个
.config文件。进入图形化界面,输入以下命令即可:
1 make menuconfig如果第一次进来,看见这么多选项肯定会有点懵,没关系,下面将给出大概的解释。其实,就算是自己编译固件,如果不是很特殊的需求,只需要注意几点即可。
首先是确定目标的型号,比如编译 x86 通用的镜像还是说针对自己硬路由型号的固件。
然后就是 LuCI 中配置主题和需要的插件,当然这里的插件不要贪多,根据自己的需求即可,否则可能冲突导致编译报错。LuCI 配置要选 Collections 其中一项,因为默认是没有勾选的,不勾选将没有图形界面。Modules 里面选择 Translations 包含语言,简体中文是默认没有勾选的,需要勾选上。LuCI compatibility libraries 也需要勾选上,这个是 LuCI 的兼容库,不勾选可能导致页面加载缓慢。插件和主题的话根据自己需要进行选择,注意这里 * 代表编译并包含进固件镜像,M 代表仅仅编译,空则表示不编译。
下面就是对
make menuconfig界面的一些解释了,一般来说都需要了解,否则可能不能编译出自己需要的特殊镜像。
- Target System:目标系统的体系结构,比如 x86 架构、arm 架构等。
- Subtarget:目标系统的子目标,更精细化的选择,比如 x86 架构下有 64 位,还有传统的 32 位选项,另外还有 amd 和 i386。
- Target Profile:选择目标配置文件。
- Target Images:选择要生成的目标镜像类型。比如 x86 为例,可以生成 ext4、squashfs 等文件系统镜像,还可以直接生成虚拟机所用的磁盘文件,比如 qcow2、vhdk 文件等。这里还可以选择镜像的打包格式,这样可以节省空间,可以选择 cpio.gz 和 tar.gz。
ramdisk:内存盘。它是一个临时的文件系统,可以加载到内存中使用。
Root filesystem archives - 根文件系统的归档格式选项。(注意下面两个选择只是打包根文件系统,不影响下面的镜像打包)
- cpio.gz:使用 cpio.gz 格式来打包根文件系统。
- tar.gz:使用 tar.gz 格式来打包根文件系统。
Root filesystem images - 根文件系统的映像格式选项
- ext4:ext4 是一种日志化的文件系统,具有较高的性能和可靠性。支持读写操作,并提供了对大文件和大容量存储设备的支持。可以比较方便的调整分区大小,如果有扩展根分区的需求选这个。
- squashfs:squashfs 是一种只读压缩文件系统。它将文件系统打包成只读的压缩镜像,可以有效地减小文件系统的尺寸,并提供压缩和随机访问的功能,还有利于恢复系统。
Build GRUB images:构建 GRUB 引导加载程序的镜像,仅适用于 Linux x86 或 x86_64 主机。
Build GRUB EFI images:构建 GRUB EFI 引导加载程序的镜像,仅适用于 Linux x86 或 x86_64 主机。
Use Console Terminal (in addition to Serial):在串口之外使用控制台终端,启用时需要配置串口设备名称和串口波特率。
- Serial port device:串口设备名称。
- Serial port baud rate:串口波特率。
- Use RTE/cTs on serial console:启用 Use Console Terminal 时,可以启用该项在串口控制台上使用 RTE/cTs。
Extra kernel boot options:额外的内核启动选项,可以在此项输入字符串。
Seconds to wait before booting the default entry:在启动默认条目之前等待的时间(秒)。常用于引导加载程序(如 GRUB)的配置中,比如 centos 启动时有很多项可以选择,但是超过该时间就会选择默认条目。
Title for the menu entry in GRUB:GRUB 菜单条目的标题。
Build LiveCD image (ISO):构建 LiveCD 镜像(ISO 格式)。
Build PVE/KVM image files (Qcow2):构建 PVE/KVM 镜像文件(Qcow2 格式)。
Build VirtualBox image files (VDI):构建 VirtualBox 镜像文件(VDI 格式)。
Build VMware image files (VMDK):构建 VMware 镜像文件(VMDK 格式)。
Build Hyper-V image files (VHDX):构建 Hyper-V 镜像文件(VHDX 格式)。
Gzip images:对镜像进行 gzip 压缩,这里影响上面的几个选项。
Image Options - 镜像选项
- Kernel partition size (in MiB):内核分区的大小(以 MiB 为单位)。
- Root filesystem partition size (in MiB):根文件系统分区的大小(以 MiB 为单位)。一般该根文件系统分区会分得比较大些,剩下的空间将分配给 overlay。
- Root partition on target device:目标设备上的根分区。该选项通常是空白或未指定的。这意味着>根文件系统镜像不会自动安装到目标设备上的任何特定分区。根文件系统将会被写入设备的整个存储空间(通常是闪存或磁盘),而不是特定的分区。这种方式被称为“全闪存安装”或“整盘安装”。
- Make /var persistent:使/var 目录持久化。/var 目录通常是一个临时目录,其内容保存在内存中,每次重启内容都会丢失。可以将 /var 目录的存储改为持久化,使其在设备重启后保留数据。这对于存储需
要在重启间保持的配置文件、日志、临时数据等非易失性数据非常有用。编译的镜像不但有内核镜像和根文件系统镜像,还有一个带 combined 后缀的镜像,这个镜像实际上是将根文件系统和内核合并到一个镜像文件中可以更方便地部署和使用。所以其大小为内核分区 + 根文件系统的大小。
- Enable experimental features by default:这个选项允许默认启用实验性的功能。如果选择启用,编译生成的 OpenWrt 固件将会默认包含实验性的功能。这些功能可能还不够稳定或经过充分测试,因此仅供开发和测试目的使用。
- Global build settings:这个选项打开了全局构建设置,允许对 OpenWrt 的构建进行全局配置。
- Advanced configuration options:这个选项提供了高级配置选项,适用于开发人员。
- Build the OpenWrt Image Builder: 这个选项允许构建 OpenWrt 的镜像构建工具(Image Builder)。Image Builder 是一个独立的工具,允许你在已编译的基础上自定义和生成 OpenWrt 镜像。这个工具可以在编译好镜像以后,单独编译主题或者是软件包。 另外还支持配置网络设置、创建预配置的固件、构建定制的固件等。
- Build the OpenWrt SDK:这个选项允许构建 OpenWrt 的软件开发工具包(SDK)。SDK 提供了开发应用程序和软件包所需的工具和库,以便在 OpenWrt 上进行应用程序开发。
- Package the OpenWrt-based Toolchain:这个选项允许打包基于 OpenWrt 的工具链。工具链是一组编译器、库和工具,用于在特定平台上进行软件开发和编译。
后续的选项是组织 OpenWrt 固件的不同部分和组件,如基本系统、管理、引导加载程序、开发、额外软件包、固件、字体、内核模块、语言、库、LuCI(Web 界面)、邮件、多媒体、网络、声音、实用工具和 Xorg(X Window 系统)等。通过选择这些选项,你可以定制所需的功能和组件,并将其包含在编译生成的 OpenWrt 固件中。
- Base system:包括操作系统的核心组件和基本工具。这些组件是构建 OpenWrt 固件所必需的基本部分。比如防火墙、opkg 工具、dnsmasq 等包含在这里。
- Administration:提供管理和配置功能的软件包。这包括系统管理、网络管理、用户管理、文件管理等相关工具。比如 htop、Zabbix、netdata 等。
- Boot Loaders:用于启动设备的引导加载程序,例如 GRUB、U-Boot 等。这些组件负责引导加载和启动 OpenWrt 固件。
- Development:包括开发工具链和库,用于在 OpenWrt 上进行应用程序开发和定制。这使得用户能够为特定需求开发自己的软件和功能。
- Extra packages:提供额外功能和应用的软件包。这些包括各种网络工具、媒体应用、安全性软件、Web 服务器等。
- Firmware:包括路由器固件和其他设备所需的驱动程序和固件文件。这些组件负责设备的硬件支持和功能。
- Fonts:提供不同字体样式和字体库的软件包。这允许设备显示不同的字体和文本效果。
- Kernel modules:提供额外的内核模块,以支持特定的硬件功能和驱动程序。这些模块可以根据需要进行选择和包含。
- Languages:配置支持的编程语言。
- Libraries:提供各种库文件和依赖项。这些库提供了不同应用程序和组件的基础功能和支持。
- LuCI:包括 LuCI Web 界面的相关组件和应用。LuCI 是 OpenWrt 的默认 Web 管理界面,用于配置和管理路由器。
- Collections:这个目录包含了一组逻辑相关的 LuCI 插件。每个集合都有一个名称,并包含一组相关的功能模块。集合的目的是为了组织和管理 LuCI 的功能模块。 比如有支持 docker 的集合,还有使用 nginx 的集合等等。
- Modules:这个目录包含了 LuCI 的功能模块,也称为插件。每个模块对应 LuCI 界面的一个特定功能或配置项。模块可以是路由器的不同配置部分(如网络设置、无线设置、防火墙等),也可以是其他功能模块(如系统日志、文件管理等)。
- Applications:这个目录包含了一些额外的应用程序或服务插件,可以通过 LuCI 进行配置和管理。这些应用程序可能包括 DHCP 服务器、DDNS 客户端、VPN 客户端等。
- Themes:这个目录包含了 LuCI 的界面主题,用于改变 LuCI 界面的外观和样式。
- Protocols:这个目录包含了 LuCI 支持的不同网络协议的配置和管理插件。例如,可以配置 ipv6 和 ppp 网络协议的插件。
- Libraries:这个目录包含了 LuCI 使用的各种库文件,这些库文件提供了 LuCI 运行所需的核心功能和支持。
- Mail:提供邮件客户端和服务器的软件包。这使得设备能够发送和接收电子邮件。几乎用不到,所以默认不勾选。
- Multimedia:包括多媒体应用和库的软件包。这包括音频播放器、视频播放器、图像处理等。包括 ffmpeg 工具,还有解锁网易云灰色歌曲工具。
- Network:提供不同网络协议和网络工具的软件包。这包括网络协议栈、路由协议、网络分析工具等。包括常见的 iperf、wol 工具。
- Sound:提供音频处理和声音功能的软件包。这包括音频编解码器、音频处理工具等。软路由上几乎用不到,所以默认也几乎没有勾选。
- Utilities:包括各种实用工具和辅助软件的软件包。这些工具可以用于系统调试、日志记录、网络测试等。包括常见的 lsof、lscpu 等。
- Xorg:提供 X Window 系统的相关组件和应用。这允许设备具有图形用户界面和图形应用的功能。
3. 编译
编译前最好先进行下载编译所需的文件,避免编译时因为网络导致编译报错。其中
$(nproc)代表 cpu 核心数,如果你知道自己电脑的核心数,直接填写数量即可。
1 make download -j$(nproc)然后就是进行编译,编译的过程是非常漫长的,并且很多人建议首次编译时使用单线程,其实这只是为了方便查看报错。实际上,首次编译也可以使用多线程,如果遇到编译报错再使用单线程查看错误也是可以的,因为再次编译时会从报错的位置开始,而不是从头开始。这里设置 V=s 选项就是启用详细输出模式,让编译过程中的每个步骤都显示详细的日志信息,方便排查错误。
1 make V=s -j$(nproc)编译好以后,可以在 OpenWrt 源码目录下的
bin/targets/xxx/xxx文件查看到编译好的文件。名称带 kernel 的固件是内核固件,带 rootfs 的固件是根文件系统,带 combined 的镜像是内核和根文件系统的组合。内核固件是操作系统的核心,负责管理硬件和提供基本的系统功能。根文件系统包含了操作系统的文件和目录结构,提供了用户空间程序和配置文件。
在正常的启动过程中,引导加载程序(bootloader)会首先加载内核固件,然后将控制权交给内核。内核会初始化系统并挂载根文件系统,然后执行用户空间程序。
如果尝试单独启动内核固件,它将无法正常运行,因为缺少必要的系统组件和文件。同样地,如果你单独启动根文件系统,它将没有一个运行的内核来提供系统功能。
为了成功启动 OpenWrt,你需要同时加载内核固件和根文件系统。这通常是由引导加载程序完成的,它会将两者结合在一起并启动系统。
当然,在某些只需要根文件系统的情况下,可以只需要根文件系统,比如使用 lxc 容器启动容器,这容器将与宿主机共享内核。
三、添加第三方插件主题编译
其实添加第三方的主题或插件一般只需要拉取代码到 package 目录,可以在此目录下新建文件夹,因为执行
make menuconfig命令时会扫描该文件夹下的 Makefile。这里以 argon 主题和 passwall 插件为例:
添加第三方主题
1
2
3
4
5
6 cd package
# 创建以自己用户名命名的文件夹,方便管理
mkdir hz
cd hz
# 拉取主题代码
git clone https://github.com/jerrykuku/luci-theme-argon.git接下来就可以在
make menuconfig界面选择 LUCI -> Theme -> Luci-theme-argon 主题了。添加第三方插件
passwall 插件可能比较特殊,需要配置 feed 源,因为它需要依赖 v2ray-core、xray-core 等组件。
1
2
3 # 需要在 openwrt 源码根目录下执行
echo "src-git passwall_packages https://github.com/xiaorouji/openwrt-passwall-packages.git;main" >> "feeds.conf.default"
echo "src-git passwall https://github.com/xiaorouji/openwrt-passwall.git;main" >> "feeds.conf.default"更新并安装 feed 源:
1
2 ./scripts/feeds update -a
./scripts/feeds install -a接下来就是拉取 passwall 插件代码:
1
2
3
4
5
6 cd package
# 创建以自己用户名命名的文件夹,方便管理
mkdir hz
cd hz
# 拉取插件代码
git clone https://github.com/xiaorouji/openwrt-passwall.git接下来就可以在
make menuconfig界面选择 LUCI -> Applications -> Luci-app-passwall 插件,并需要把插件的 configuration 里面的选项全部选上。这里可能报错,也许是 passwall 默认依赖了 dnsmasq-full,和之前官方默认选择的 dnsmasq 有冲突,所以把 dnsmasq 取消即可。此外,编译其他的插件也有可能出现这种情况,所以需要注意看日志。
四、单独编译插件
也许你可能用的官方的固件,基本上很满意,但是想要安装一个插件,那么此时可以自己编译一个插件。需要注意的是,需要知道用哪个版本的源码来编译,这个目前还不知道怎么看,只知道个大概的编译流程。
这里以编译 luci-app-aria2 为例,首先最好更新一下 feeds:
1
2 ./scripts/feeds update -a
./scripts/feeds install -a然后需要运行如下命令:
1 make menuconfig在配置页面中,选择 LUCI -> Applications -> Luci-app-aria2 插件,并保存配置。
其次最重要的是知道需要单独编译的软件包,在 openwrt 源码的哪个目录下,如 aria2 的路径为
package/feeds/luci/luci-app-aria2/。知道路径以后,那么运行代码:
1
2
3
4
5
6
7
8
9 # 先清除模块
make package/feeds/luci/luci-app-aria/clean
# 编译模块
make package/feeds/luci/luci-app-aria2/compile V=s -j$(nproc)
# 也许因为是编译固件漏掉了该插件,那么可以执行如下命令
# 将单独编译的软件包安装到OpenWrt的软件包路径中
# make package/install
# 将软件包从软件包路径复制到目标设备中的相应位置进行安装
# make target/install等待 此时在
bin/packages/xxx/luci目录下已经生成了luci-app-aria2_git-xxx.ipk软件包,如果你是中文环境,那么还有可能生成了luci-i18n-aria2-zh-cn_git-xxx.ipk汉化包。需要注意的是,如果是自己下载源码放在 packages 的源码,目录有可能不同,可以考虑使用 find 命令查找:sudo find / -name “ipk” | grep “aria2”
如果此时直接打开 luci 界面,上传软件包并安装,会发现报错:
Collected errors:
- pkg_hash_check_unresolved: cannot find dependency aria2 for luci-app-aria2
- pkg_hash_fetch_best_installation_candidate: Packages for luci-app-aria2 found, but incompatible with the architectures configured
- opkg_install_cmd: Cannot install package luci-app-aria2.
这是因为 luci-app-aria2 的依赖没有安装,它的依赖可以在 Makefile 文件中看见:
1 LUCI_DEPENDS:=+luci-base +aria2说明 luci-app-aria2 依赖于 luci 基础包,还依赖于 aria2 这个软件包。一般来说,这个软件包会存在于 luci 目录同级目录下的的 packages 文件夹下。
关于软件包的依赖,还可以在官网查找:https://openwrt.org/packages/index/start。当然,如果官方源码里面没有的软件包,这里应该也是找不到的,还是需要看软件包的 Makefile 文件。
知道了需要先安装依赖那就好办了,因为在配置界面选中 luci-app-aria2 时,也会默认选中它的依赖。它能编译成功,说明他的依赖也编译成功了,可以在
bin/packages/xxx/packages目录下找到aria2_xxx.ipk。最后只需要按依赖顺序进行安装即可,
aria2_xxx.ipk->luci-app-aria2_git-xxx.ipk->luci-i18n-aria2-zh-cn_git-xxx.ipk。
参考文档
1 | 全部插件 |







