创建编译环境_编译OPENWRT固件_用SDK为官方固件编译第三方软件3proxy
转载注明来源: 本文链接 来自osnosn的博客,写于 2021-11-23, 修改2023-02.
参考
- 官方 openwrt 的参考,
开发者指南的目录【Developer guide】
Linux的系统准备/设置【Build system setup】
编译op系统固件的步骤【Build system usage】
单独升级编译ipk包【Building a single package】
用SDK为官方固件编译,现有或第三方ipk包【Using the SDK】
用预编译包,重新生成固件【Using the Image Builder】
【OpenWrt编译 – 说明】 - 网友的参考
【基于win10下openwrt软路由的编译环境搭建及编译配置的入门教程】
【openwrt编译入门(绝对详细版)】,【OPENWRT/LEDE编译教程】
【零基础编译openwrt看这一篇就够了】
【OpenWrt X86 编译教程】
【OpenWRT实践1:开发环境构建】更改feed源feed.conf.default
【OpenWRT 编译过程】源码结构介绍
【用OpenWrt单独编译ipk插件】
【R2S软路由OpenWRT固件编译】
【搭建OpenWrt开发环境(包括编译过程)】自己写一个package
给 newifi Y1, mt7620 编译一个 3proxy
- 装一个 debian 11.
- 根据官方文档 Using SDK , 用 apt install 给 debian 安装支持包。【系统准备】
- 比如:
apt install build-essential clang flex bison g++ gawk gcc-multilib g++-multilib gettext git libncurses-dev libssl-dev python3-distutils rsync unzip zlib1g-dev file wget
- 用源码包,也可以单独编译软件包。但第一次编译,需要编译的东西很多,耗时长。
- 比如:
- --- 以下步骤在 非root 身份下操作! ---
- 下面的很多下载都是用git,而git的操作目标, 大多都比较慢。设置一下git的代理。
参考此贴的git部分【yum_apt_golang_curl_py3_pip3_php_git_wget_设置_proxy_socks5_tsocks】 - 3proxy不是golang的项目,无需准备 upx。
- 去
https://openwrt.org/downloads
, 找到 Mirrors 找一个合适的镜像站。
进入releases/19.07.8/targets/ramips/mt7620/
找到 sdk 包,
openwrt-sdk-19.07.8-ramips-mt7620_gcc-7.5.0_musl.Linux-x86_64.tar.xz
下载。 - 解压 sdk 包。
cd
进入 sdk 目录。 - 编辑
feeds.conf.default
, 为编译第三方而加入源。对于现有软件,无需更改feeds。 - 把第三方软件 3proxy 放入 package 目录
git clone --depth 1 https://github.com/osnosn/3proxy-openwrt.git package/3proxy
看 【https://github.com/osnosn/3proxy-openwrt 】 - 如果想指定3proxy版本,去掉上面那行中的
--depth 1
,并执行以下两行。否则跳过这两行。
cd package/3proxy
git checkout v0.8.13
rm -rf tmp/
./scripts/feeds update -a; ./scripts/feeds install -a
这步如果使用代理,要设置 git的代理,在.gitconfig
( http:// 或 https:// )。
如果是git:// 协议
,.gitconfig
难以设置。建议用 proxychains 或者 tsocks。
base 约10mb,packages 约50mb,luci 约153mb,routing 约3mb,telephony约3mb。- 如果 luci因太大 clone失败。可以考虑使用
git://协议
手工 clone。
cd feed; git clone -v git://git.openwrt.org/project/luci.git luci
然后退回上级目录,重新执行./scripts/feeds update luci
。 - 或, 改
feeds.conf.default
中https://
为git://
。
然后proxychains ./script/feeds update -a
或用 tsocks。
proxychains 更好, 支持 remote dns。 tsocks 不支持。 - 还是无法下载。考虑 gitee.com/openwrt-mirror/,【加速openwrt编译过程中的下载】。
https://gitee.com/openwrt-mirror/
的镜像中有 openwrt(base), packages, luci。
base 约218mb,packages 约60mb,luci 约284mb。(op23.05, 2023-11记录) - github clone 加速:01,02,03,04。
- 如果 luci因太大 clone失败。可以考虑使用
- 执行
make menuconfig
,然后直接退出,并保存为 .config 。
默认 menuconfig 选取了大多数的软件包。对于指定软件包的编译,没什么影响。
可以在 "Network" -> "Web Servers/Proxies" -> "3proxy",确定选择了 <M> 3proxy "模块"。
指定软件包的编译,只会编译相关的依赖包。
如果看着不舒服,可以这么操作,减少选择。- 缺省有 860 多个 built-in,8400 多个 module。
- 进
make menuconfig
, 进入"Global build settings", 去掉前三个"Select all..."的项目。 - 现在,大约有 640 多 built-in, 890 多 module。
- 不过可能因为少选了什么,导致 menuconfig 中看不到你想编译的包名称。
可以试着恢复第三个 "Select all userspace packages by default" 再看看。
- 创建一个
dl/
目录,多个sdk共用。见下文。 - 可用的命令说明:
用到curl,如需代理,设置.curlrc
。
make package/3proxy/download
下载,
make package/3proxy/prepare
解压,如需则自动下载、patch
make package/3proxy/compile
编译,如果需要会自动下载、解压、patch。
make package/3proxy/clean
清理编译目录 - 直接
make package/3proxy/compile V=s -j2
2任务并行- 用任务并行,根据你机器的实际cpu内核数量设置。
是否使用多任务,对编译结果没影响。
只是,多个任务的输出信息,全混在一起了。
如果编译失败,信息没法看。
这时候,就只能老老实实的用 -j1 ,这样才能看清楚出了什么错误。
- 用任务并行,根据你机器的实际cpu内核数量设置。
- 完成,在
bin/packages/....
目录中,可以找到 ipk 文件。 - 另外,make compile 过程中会自动下载很多依赖包到 dl 目录。
mv dl/ ..; ln -s ../ld dl
下载目录放在外面。哪天玩坏了sdk,删了重建就不需要重新下载依赖包。 - 3proxy 安装后的配置,参考【Danted/Socks5 代理服务_多IP_多出口的配置_3proxy】
- 编译好的 3proxy_mipsel_24kc.ipk , 3proxy_x86_64.ipk 可以在这里找到现成的【github.备份的文件】。
错误处理
- 出现
libfakeroot: connect: Connection refused
检查自身防火墙设置,是否拒绝本地的tcp连接。
如用 nft,则加上nft add inet input iifname "lo" accept
可解决。
其他第三方包
- 两个更新快的,都能用。clone到 packages目录中即可。
- https://github.com/kenzok8/openwrt-packages (被重新整理了,2023-11)
https://github.com/kenzok8/small-package (更新很快,2023-11)
https://github.com/kenzok8/small (有现成的ipk在releases中下载,2023-11) - https://github.com/kiddin9/openwrt-packages (更新很快,2023-11)
有3proxy包(较旧),有frp, - 【xiaorouji #1557】
- https://github.com/liuran001/openwrt-packages (好像停更了,2023-11)
- https://github.com/kenzok8/openwrt-packages (被重新整理了,2023-11)
- 单独获取
svn co https://github.com/liuran001/openwrt-packages/trunk/frp
见【github_拉取指定子目录_使用svn】 - 有的包,编译完,要到 bin/packages/..../base/ 中找。
- 编译frp之类的golang包, 如果要指定代理, 用这种方式,同时指定两种代理,否则编译过程,会下载失败。
http_proxy=http://user:pw@127.0.0.1:888/ https_proxy=http://user:pw@127.0.0.1:888/ make package/xxxx/compile V=s
或者设置 GOPROXY=https://goproxy.io,direct 这个环境变量。 - 编译 golang 写的包,会用到 upx 压缩。而 SDK 又找不到upx命令。
需要事先ln -s /usr/bin/upx staging_dir/host/bin/
。
否则编译出来的文件体积很大。- 对于mipsel架构的程序,新版upx-3.96压出来的程序无法启动。最新可用的只有upx-3.93。
参考【GOLANG 的交叉编译以及 upx 压缩】。可以下载预编译包【github-upx】。 - 对于x86-64的程序, upx-3.93会
Segmentation fault (core dumped)
。
只好用系统自带的upx-3.96。用这个版本压缩x86_64的程序,能正常使用。 - 如果路由器的内存比较小,<128M。upx压缩,会给内存更大的压力。所以不建议用upx压缩。【见例子】。
- 对于mipsel架构的程序,新版upx-3.96压出来的程序无法启动。最新可用的只有upx-3.93。
- 各种项目的编译过程,都会按需下载所需组件。分别会用到 curl wget git svn go, 为了顺利,可以都事先设置好它们的缺省代理。
curl 设置 ~/curlrc , wget 设置 ~/.wgetrc , git 设置 ~/.gitconfig , svn 设置 ~/.subversion/servers , go 用 http_proxy https_proxy 或 GOPROXY 环境变量。
见【yum_apt_golang_curl_py3_pip3_php_git_wget_设置_proxy_socks5_tsocks】
curl 和 wget, 优先用curl。如果没装 curl 才会用 wget。
如果用wget,必须用 http 代理,因为 wget 不支持socks5。其他几个都支持 socks5 和 http。
还有几个,bzr, hg, darcs 应该用不到。 - 如果在 WSL 中编译,而win系统中装了360防毒。以下是编某个东西时
make compile
的耗时对比。- 防护全开,37min10s。
- 关闭进程防护,3min15s。
- 关闭进程防护,关闭文件系统防护,2min59s。
wpad-openssl (hostapd full)
- 见【CentOS7用hostapd做radius服务器为WiFi提供802.1X企业认证】
或【Newifi OpenWrt 下 EAP-PEAP,EAP-TLS 企业级无线认证及 FreeRadius3】 - wpad-openssl (wpad full)
【在Openwrt上利用hostapd进行EAP-TLS认证】
【OpenWrt 用 hostapd 作为 Radius 服务器配置 WPAx-EAP 认证】
SDK 占用硬盘空间
完成编译后,对sdk的目录,占用空间统计。
- sdk-op19.07.8-ramips-mt7620,占1.3GB。
- sdk-op19.07.8-ramips-mt7621,占2.2GB。
- sdk-op19.07.8-x86-64,占2.4GB。
- sdk-op21.02.1-ramips-mt7621,占2.0GB。
- sdk-op21.02.1-x86-64,占2.9GB。
- sdk-op22.03.0-armvirt-64,占2.1GB
- 以上 6 个sdk,共用一个
/dl/
目录,占2.0GB。 - sdk-op23.05.2-ramips-mt7621,占2.9GB。
- sdk-op23.05.2-x86-64,占3.4GB。
有三种方法编译openwrt定制固件
- 用ImageBuilder打包,把事先编译好的内核(内置),加上你需要的package(下载ipk),加上自定义配置(自己创建)。
打包成一个img固件。
编译好的内核在build_dir/target-xxxxx_musl/linux-xxxxx/
目录中。
打包后生成的东西在bin/
目录中。 - 用SDK编译,用于编译package仓库中没有的软件包,另外其中有配套的内核源码及头文件,编译缺失的内核模块也很方便。
总之,SDK是用来编译第三方包,或者编译自定义配置的官方包。
SDK中不编译内核(kernel.bin)。
编译后生成的东西在bin/
目录中。 - 从源码编译,因为要重新编译cross-compile toolchains,下载最内核和软件包的源码编译,导致这个过程比较耗时,用于上述两种情况搞不定的情况。
- 源码编译,会生成,SDK, ImageBuilder, 内核(kernel), 内核包(kmod.ipk), 软件包(ipk), rootfs, 固件。
编译后生成的东西在bin/
目录中。 - 如果需要一套不同平台(比如arm机器用)的SDK, ImageBuilder工具包,就要从源码编译。然后可以在arm上交叉编译其他cpu的东西。
- 官网只提供 x86 运行的 SDK 下载。
- 源码编译,会生成,SDK, ImageBuilder, 内核(kernel), 内核包(kmod.ipk), 软件包(ipk), rootfs, 固件。
- 使用 openwrt 的 SDK 交叉编译其他软件。
【debian11中,带go-sqlite3包的golang程序,交叉编译到mipsel】。 - 参考
【Openwrt Image Builder/SDK 初探】。
【官方文档 imagebuilder】
从源码,重新编译内核
- 重新编译内核,会先编译toolchains。
- toolchains 的位置在 staging_dir/ 目录中。
- 可以从openWRT 镜像站中下载 toolchains 包,安装进去。省去了编译toolchains的过程。直接进入编译内核,或软件包 的步骤。
- 见【方法三:为openWRT的arm64重新编译内核】
用ImageBuilder打包固件
- 【armvirt:用ImageBuilder打包自定义img】
- 【Newifi Y1/D2:用imagebuilder打包一个自定义bin文件】
- ImageBuilder 就是个打包器。里头有现成的kernel,通过下载ipk包。然后把 kernel 和 ipk 打包成映像。
如果 ipk下载顺利,打包执行的速度就很快。
其他参考
- 【MT7688学习笔记(3)——定制OpenWrt系统及添加自开发软件】
- 【openwrt编译 -- 添加用户自定义app】
- 【OpenWrt插件安装对照表】,【Applications 添加插件应用说明-L大【2021.11.18】】
- 【Openwrt学习之路-(1-Openwrt clone and bulid)】
- 【Openwrt学习之路-(2-Openwrt directory structure)】
- 【Openwrt学习之路-(3-Openwrt start-up process)】
- 【Openwrt学习之路-(4-Openwrt main Makefile)】
- 【Openwrt学习之路-(5-Openwrt package Makefile)】
- 【6-Openwrt SDK】,【5-Openwrt add function module to package】
转载注明来源: 本文链接 https://www.cnblogs.com/osnosn/p/15594017.html
来自 osnosn的博客 https://www.cnblogs.com/osnosn/ .