關於OpenWrt下運行.Net需要上Mono這回事
這幾天淘到了一台T640 Plus ,買了一個 I350 AM3 祖國版 和 i210 移除掉自帶的 Mini-Pcie 網卡 搭建家庭主路由來着、畢竟T640 支持 AES 指令集 性能強大 拓展完善
原本設想是EXSi 開直通安裝 Koolshare 的 LEDE ,結果硬件關係自帶的網卡無法直通,CPU 網卡 太燒性能屬實浪費,結果發現OpenWrt 可以用 KVM 了
這樣正好直接用LEDE 安裝 KVM 無損消耗,到時候開個虛擬機用來做掛機寶,結果LEDE 的版本更新慢,KVM 裝不上。沒辦法只能自己編譯一個 OpenWrt 出來發光和熱了,然後想自己做一個管理中心管理我的KVM
本來想着 .Net 6 預覽版都出來了 ,我自己編譯一個 .Net 5 到OP上面去 這樣就能幹活了 ,然後發現 .Net Core 沒有編譯文檔,發現 Mono 提供了 非常完整的文檔 包括如何裁剪
於是我就自己跑去編譯一個Mono 然後跑我的 OP 上面了,結果發現是真的能折騰,經過和 羣友 請教的 兩三天 終於在 OP 上面 成功運行了我的 Mono
展示截圖 :
關於划水被羣主説這回事
正事
編譯環境: podman Ubuntu:laster
構建版本: OpenWrt :snapshots
默認大家都會自己編譯OpenWrt的SDK 如果不會請參考 其他人的教程
安裝好構建SDK需要的依賴
克隆 OpenWrt 最新的代碼
make menuconfig 進入選項中 開啓 需要的拓展 zlib 、 libatomic
如果缺少zlib 會報出 -lz
如果缺少libatomic 會報出 少了 atomic_ops.h 頭文件 這裏基本都是自行推斷即可少啥補啥
如果全部正常則理論可以正常編譯
Make 構造出來 SDK 、將SDK 解壓出來
然後就可以克隆 Mono 倉庫了,我使用的是Mono 2021-02
準備構造工具 Path
環境變量
測試:
確保環境配置正確(務必)
echo $PATH
使用git 克隆 Mono 倉庫是使用 ./autogen
如果是使用的 Mono 發佈的版本 則是使用 configure
這裏使用的是克隆的Mono 2021-02
./autogen.sh --prefix=/ --host=x86_64-openwrt-linux-musl --enable-minimal=profiler,debug,logging --enable-small-cnotallow=yes --disable-mcs-build --without-mcs-docs --with-monotallow=no --disable-boehm
這裏我們需要關閉 boehm gc,我們用不了
使用 --host 指定 運行環境
使用 --enable-minimal 指定需要裁剪的內容
這裏只是示範裁剪,具體裁剪內容要根據使用環境去調整
如果一切順利在輸出中會有一句
- checking whether we are cross compiling… yes
表示當前是交叉編譯了,可以直接 Make
安裝Mono到指定的目錄方便提取文件
make install DESTDIR=/Build
複製 /Build 到 測試機 就可以直接測試了
以下是 大佬教的裁剪方法
首先我們編譯出來的Mono裏面會有一堆的東西 大部分是不需要的比如
share 、includ 文件夾直接刪掉
然後我們進入bin 文件夾 除了 mono 和 mono-sgen 其他的都刪掉
mono這裏是一個軟連接 連接到 mono-sgen
strip 是SDK中的一個工具
使用 strip 工具對 mono-sgen 進一步裁剪
使用 strip 工具對 lib 中的 so庫 進一步裁剪
最終大小隻會不到20m
丟到 OpenWrt 上面去就可以正常運行那麼就是編譯成功
編譯起來難度不大,跟着官方文檔走就可以了,只是一些細小的問題如果沒有相關經驗的確很難辦成
一開始少了 zlib 我還自己使用 Make CFLAGS="-I" 添加頭文件,結果後來發現是SDK的問題
既然Mono 可以正常運行了,那麼下一個軟件中心還遠嗎?