编译 openwrt
鉴于访问技术网站慢,clone 慢的问题,决定编译出适合访问外网的 openwrt
编译前提
不要用 root 编译,不要用 root 编译,不要用 root 编译。
- 选购 vps
- 先去“腾讯云/阿里云”选择一台香港或者新加坡的vps,选择“竞价服务器”,这样就可按时计费(阿里云需要充值100,但腾讯云不用充值)
- 系统选择 ubuntu20.04 LTS 或者 centos8 并开启 BBR
- 阿里云或者腾讯云新建安全组并开放 22、443、80 等端口
- 参考: https://www.bilibili.com/video/BV16q4y1n755
- 将你的域名解析到 vps
- 申请 SSL 证书并下载证书文件
- 在 vps 中开启 xrag/v2ray + Nginx 等(已通过脚本实现) xray 安装与配置
- 本地开启代理
- 安装并配置 xray/v2ray 客户端,如:Qv2ray,确保本机可访问外网
- 本地主机开启代理
- 全局代理
- 如:本人使用的是 Fedora35,可通过 Qv2ray 开启全局系统代理,然后去 “设置---网络---网络代理” 可查看到代理信息
- 如果要在虚拟机中开启代理,则不能使用全局代理,否则虚拟机不能使用网络
- 手动设置代理
- Git 使用代理
git config --global http.proxy 'socks5://127.0.0.1:1089'
git config --global https.proxy 'socks5://127.0.0.1:1089'
- 终端使用代理
export http_proxy="http://127.0.0.1:8889"
export https_proxy="http://127.0.0.1:8889"
- 当然也可使用 proxychains 实现终端代理,像这样使用:
proxychains curl www.google.com
- 取消 Git 代理
git config --global --unset http.proxy
git config --global --unset https.proxy
- Git 使用代理
- 全局代理
- 虚拟机中开启代理
- 一定要取消 Qv2ray 中的 “首选项---入站设置---设置系统代理” 的勾选
- Qv2ray 中的 “首选项---入站设置---监听地址“ 设置为 "0.0.0.0” 表示允许局域网访问代理
- 在 ubuntu20.04.4 中使用代理,可去 “设置---网络---网络代理” 选择 “手动”
- HTTP、HTTPS、FTP 设置
- IP 填写为主机的 IP,如:192.168.2.26
- 端口填写为 Qv2ray 中设置的 HTTP 端口,如:8889
- HTTP、HTTPS、FTP 设置
- 也可使用命令开启代理
git config --global http.proxy 'socks5://192.168.2.26:1089' git config --global https.proxy 'socks5://192.168.2.26:1089' export http_proxy="http://192.168.2.26:8889" export https_proxy="http://192.168.2.26:8889"
- 一定要注意此处的 ip 与端口,端口可去 Qv2ray 中的 “首选项---入站设置” 查找
- 在终端使用
curl -I www.google.com
测试,如果返回 301 或者 200 表示可访问外网
开始编译
- 安装依赖
- Ubuntu
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-pip qemu-utils \ rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev
- Fedora
- Ubuntu
- 下载 openwrt/lede 源码(以下操作建议全部开启代理来执行)
- 官方 openwrt
- 下载源代码:
git clone https://github.com/openwrt/openwrt.git
- 添加自己需要的插件,如:Passwall、OpenAppFilter(可选,后续可手动编译成 ipk 文件,然后在 openwrt web 中安装)
- 添加 Passwall 源
cd openwrt
echo "src-git kenzo https://github.com/kenzok8/openwrt-packages" >> feeds.conf.default
echo "src-git small https://github.com/kenzok8/small" >> feeds.conf.default
- 上面的软件源收集了常用插件,如果只想安装 Passwall 源可选择 Passwall luci 源
- 在已经编译好的 openwrt 中使用 Passwall,请参考:手动编译安装 Passwall
- 添加 OpenAppFilter 软件源(每次编译前都要在此目录中执行 git pull 获取最新的源代码):
cd openwrt
git clone https://github.com/destan19/OpenAppFilter.git package/OpenAppFilter
- 添加 Passwall 源
- 自定义设置
- 改时区与主机名与lan口ip
- 修改 openwrt/package/base-files/files/bin/config_generate
- set system.@system[-1].timezone='UTC' 改为 Asia/Shanghai
- set system.@system[-1].hostname='OpenWrt' 改为 WiFi-Router
- sed -i 's/192.168.1.1/192.168.2.88/g' package/base-files/files/bin/config_generate
- 改官方版本 连接数
- 在编译时往 package/base-files/files/etc/sysctl.d/ 里添加11-nf-conntrack.conf 文件,然后添加net.netfilter.nf_conntrack_max=65535即可
- 修改默认密码
- cat package/base-files/files/etc/shadow
- 参考:https://iqqoz.com/post-2843.html
- 改时区与主机名与lan口ip
- 更新 feeds:
cd openwrt git pull ./scripts/feeds update -a ./scripts/feeds install -a
- 配置 openwrt 编译文件:
make menuconfig
- 不清除要怎么选择 openwrt 编译参数,请参考:openwrt make menuconfig 详解
- 下载 dl 库:
make download -j8
- 验证是否下载成功:
find dl -size -1024c -exec ls -l {} \;
- 删除没有成功的下载项:
find dl -size -1024c -exec rm -f {} \;
- 验证是否下载成功:
- 编译:
make V=s -j$(nproc) | tee ../compile.log
- 网上都说首次只能开启一个线程编译,但我觉得没必要,单线程非常耗时,且该有的错误它也一定会出现,如果用多线程编译出错,可用下面的方法找到错误
cat ../compile.log | grep ERROR:
cat ../compile.log | grep failed
- 网上都说首次只能开启一个线程编译,但我觉得没必要,单线程非常耗时,且该有的错误它也一定会出现,如果用多线程编译出错,可用下面的方法找到错误
- 二次编译(不对 menuconfig 做修改又重新编译一次,可选)
cd openwrt git pull ./scripts/feeds update -a ./scripts/feeds install -a rm -rf .config.old make defconfig make download -j8 make V=s -j$(nproc)
- 重新配置(可选)
rm -rf ./tmp && rm -rf .config make menuconfig make V=s -j$(nproc)
- 编译后的文件存储路径:
bin/targets
- 下载源代码:
- lean 的 lede(适合国内环境的修改版 openwrt)
- 下载源代码:
git clone https://github.com/coolsnowwolf/lede
- 添加自己需要的插件,如:Passwall、OpenAppFilter(可选,后续可手动编译成 ipk 文件,然后在 openwrt web 中安装)
- 添加 Passwall 源(每次编译前都要在此目录中执行 git pull 获取最新的源代码)
- 在 lede/feeds.conf.default 添加 kenzok8 仓库在 make menuconfig 中找不到 passwall,所以只能用下面的方式:
cd lede/package/
git clone https://github.com/kenzok8/openwrt-packages.git
git clone https://github.com/kenzok8/small.git
- 添加 OpenAppFilter 软件源(每次编译前都要在此目录中执行 git pull 获取最新的源代码):
cd lede
git clone https://github.com/destan19/OpenAppFilter.git package/OpenAppFilter
- 添加 Passwall 源(每次编译前都要在此目录中执行 git pull 获取最新的源代码)
- 更新 feeds:
cd lede git pull ./scripts/feeds update -a ./scripts/feeds install -a
- 下载源代码:
- 配置 openwrt 编译文件:
make menuconfig
- 下载 dl 库:
make download -j8
- 编译:
make V=s -j$(nproc) | tee ../compile.log
- 官方 openwrt
FAQ
- [/home/echoxu/openwrt_Project/lede/include/toplevel.mk:230:world] 错误 2
- 执行 make clean rm -rf ./tmp && rm -rf .config 重新执行 make download -j1 v=s 发现没用 rm -rf .config.old
- 参考:https://github.com/coolsnowwolf/lede/issues/5886
- ERROR: package/feeds/packages/golang [host] failed to build.
- 看日志应该是下载 go 失败,挂代理重新编译即可
- 参考:https://github.com/openwrt/packages/issues/15581
- 安装 passwall 报错:satisfy_dependencies_for: Cannot satisfy the following dependencies for luci-i18n-passwall-zh-cn 提示缺少 dns2socks v2ray-core等包
make clean && rm -rf ./tmp
make clean 会导致编译时间又变长./scripts/feeds clean
./scripts/feeds update -a
./scripts/feeds install -a
- 重新执行
make menuconfig && make download -j8
后再编译
- 如何构建多个平台的 openwrt
- 如:我想构建适用于虚拟机安装的 x86-64 的 openwrt 以及硬路由的 openwrt
- 用虚拟机快照管理 openwrt ,每当 openwrt 成功构建后可创建一次快照,下次再构建相同平台的 openwrt 时可恢复此快照
- 如何移植 lede 的插件到官方 openwrt 中
- 本地编译经常失败怎么办?
- 可在 vps 中编译,然后下载到本地,建议选择高主频的cpu(核心数不用那么高),内存4G 即可
- Github 云编译,https://github.com/jerrysuu/openwrt
- 若在调整OpenWrt系统组件的过程有多次保存操作,则建议先删除.config.old文件再继续操作:
rm -f .config.old
- 根据编译环境生成默认配置:
make defconfig
- 对比默认配置的差异部分生成配置文件(可以理解为增量):
./scripts/diffconfig.sh > seed.config
- 若在调整OpenWrt系统组件的过程有多次保存操作,则建议先删除.config.old文件再继续操作:
- 如何在编译的时候指定 lan 口默认 ip
sed -i 's/192.168.1.1/192.168.199.1/g' package/base-files/files/bin/config_generate
- openwrt 和 lede 选择哪个
- 编译后大于路由器可上传固件
- 重启后 wifi 不能打开
- wifi 信号太差,可以考虑更换 eeprom
- https://forum.openwrt.org/t/newifi-d2-terrible-wifi-performance-on-openwrt/66473/41
- https://www.right.com.cn/forum/thread-428424-1-1.html
- https://www.right.com.cn/forum/thread-526831-1-1.html
- https://iqqoz.com/post-2350.html
- https://www.openwrt.pro/post-401.html
- https://www.openwrt.pro/post-615.html
- https://www.openwrt.pro/post-384.html
- https://iqqoz.com/post-3237.html
- https://iqqoz.com/post-2802.html
- https://iqqoz.com/post-3176.html