創建編譯環境_編譯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 安裝支持包。
- 用源碼包,也可以單獨編譯軟件包。但第一次編譯,需要編譯的東西很多,耗時長。
- --- 以下步驟在 非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/ .