編譯 Freshtomato 並自訂包含的功能

如何設定 Freshtomato 的編譯參數並編譯需要的功能進去韌體,移除預設勾選用不到的功能以減少映像大小,以利用有限的快閃記憶體空間

目錄

前言

Freshtomato 是一個開放原始碼的路由器韌體,可以讓一些原廠韌體已經停止更新的老路由器續命,更多種種好處在網路上也可以看到大家敘述。

我自己主要會用的原因是因為我手上的路由器都是 ASUS 的,官方韌體版本都老到不支援我需要用到的 VPN,例如一台 RT-AC66U-B1 官方韌體最新版本是 3.0.0.4.386_52062,但是我想用的 WireGuard VPN 需要 3.0.0.4.388.23000 版本以上才能支援(我一直以為這台已經老到被放棄了,結果剛為了查韌體最新版才發現兩周前官方才剛發了一個韌體更新,但仍然只有修補功能,沒有新增功能),以及另一台更老的 RT-N15U,上面甚至只有 PPTP 伺服器,沒有任何 VPN 客戶端可用,沒辦法拿來作為我網路拓樸裡面的存取點。

正好這兩台路由器都在 Freshtomato 的支援清單中,RT-AC66U-B1 這台的 Flash Memory 比較大,可以無腦選 AIO 版本,而且支援的 Kernel 版本也比較新,支援 WireGuard,這台直接刷官方的 pre-build binary 韌體就可以了。

但是為何需要自己編譯 Freshtomato 韌體呢?主要是因為 RT-N15U 這台 Flash Memory 只有 8MB,根據官方 Feature matrix 來看,8MB 的 pre-build 版本中至多只有 OpenVPN、PPTP 這兩種 VPN,但是我比較偏好 8MB 以上才包含的 Tinc 這個原生支援 Mesh 的 VPN,所以需要自己挑用不到的功能去掉,然後在省下來的空間加上 Tinc 來編譯。

編譯步驟

環境

  • OS: Ubuntu 24.04.3
  • Kernel: 6.14.0-33-generic
  • Docker: 28.5.1

Freshtomato 的 Repo 裡面已經有寫好的 Docker file 包裝編譯環境了,不用自己一個一個裝,文件裡面沒提到這點。

本次使用的 mips 架構的韌體儲存庫連結:
https://github.com/FreshTomato-Project/freshtomato-mips

步驟

我要編譯的韌體是要給 RT-N15U 用的,這台是 mips 架構,如果要操作的話先去查自己要哪個架構、哪台機器。

# Clone 專案
git clone https://github.com/FreshTomato-Project/freshtomato-mips.git
cd freshtomato-mips
# 具體切哪個 branch 去看 README
git checkout mips-master
cd docker

然後先看預設的 Flavors 有哪些:

make help

輸出會類似像這樣:

 r2e            MIPS Release 2 VPN
 r2c            MIPS Release 2 BTgui-VPN
 r2d            MIPS Release 2 Nocat-VPN
 r2u            MIPS Release 2 BT
 r2t            MIPS Release 2 BT-VPN
 r2b            MIPS Release 2 Big-VPN
 r2o            MIPS Release 2 Mega-VPN (for 8MB+ flash)
 r2z            MIPS Release 2 AIO (for 8MB+ flash)
 r2v            MIPS Release 2 IPv6-VPN (no usb)
 r2m            MIPS Release 2 Max (no usb)
 r2i            MIPS Release 2 MiniIPv6 (for 4MB flash)
 r2j            MIPS Release 2 MiniVPN (OpenVPN; for 4MB flash)
 r2j2           MIPS Release 2 MiniVPN (PPTPD; for 4MB flash)
 r2f            MIPS Release 2 Mini (for 4MB flash)

那些後綴就是 Feature matrix 裡面的後綴版本,前面就是 make 的 target,這時候如果懶得重寫一個 target 的話可以挑一個現成的 target 來改,例如我是從 Max (no usb) 開始改的。

這些 targets 寫在 release/src-rt/targets.mak 裡面,找出原本代表 Max (no usb) 的 target:

m:
   @$(MAKE) bin USB="" B=E MULTIWAN=y IPV6SUPP=y OPENVPN=y KEYGEN=y PPTPD=y NOCAT=y \
   NFS=y SNMP=y STUBBY=y TOR=y BBEXTRAS=y EBTABLES=y BCMNAT=y ADVTHEMES=y OPENSSL11=y \
   PROXY=y BUILD_DESC="Max"

在這些功能裡面我用不到的有:

  • OPENVPN: 我用不到
  • PPTPD: 古老 VPN
  • NOCAT: 網路登入頁面
  • NFS: 網路檔案系統
  • SNMP: 簡單網路管理協定
  • TOR: 洋蔥路由
  • ADVTHEMES: 更多的主題

並且想要加上的有:

  • USB: USB 相關功能支援,這台有一個 USB 孔可以使用
  • TINC: VPN,本次重點
  • IPERF: 網路效能測試工具

所以改完這些之後 target 長這樣:

m:
	@$(MAKE) bin USB="USB" B=E TINC=y IPERF=y MULTIWAN=y IPV6SUPP=y KEYGEN=y STUBBY=y \
	BBEXTRAS=y EBTABLES=y BCMNAT=y OPENSSL11=y PROXY=y BUILD_DESC="Tinc"

然後在剛才的 ./docker 資料夾編譯這個目標:

sudo make clean
sudo make build.r2m

因為這個 makefile 裡面跑 docker 的時候繼承了外面的 user 權限,所以需要用 sudo 跑。

等編譯完成就可以在 ./release/src-rt/image 裡面看到 .trx 韌體檔案了,這時候可以量一量韌體大小,如果小於 8MB 的話可以拿來用了,如果覺得空間還夠塞點什麼功能的話,可以把下一個想要的功能打開重新編譯一次觀察大小。

都準備好的話就可以開始把韌體刷進去路由器了。

刷韌體

如果路由器中還是原廠韌體的話,在上傳新韌體時會檢查簽名,不是官方韌體的話會不給更新,此時需要用救援模式來刷。

然後官方那個 救援用的程式 很難用,我沒成功過幾次,每次都跟我說沒有發現無線裝置在救援模式中,如果不是真的徹底變成磚塊的話我還是比較偏好以下的方法。

以我這台為例,先把電源關掉或拔掉,然後戳著 Reset 按鈕不放接著開機,等到電源燈變成慢閃的時候就可以用原本 Gateway 的 ip 連上去,就能看到簡陋的上傳韌體介面了,這裡上傳的韌體不會檢查簽名,此時記得先按清除 NVRAM 之後再上傳,不然直接更新的話下次開機有很大機會會變磚塊,這裡上傳不會有進度條,速度也慢得出奇,請耐心等待。

我忘記先清 NVRAM 開機變磚塊了怎麼辦

我就這樣幹過,開機亮電源燈但是連線完全沒反應,按著 Reset 開機進救援模式也進不了韌體上傳介面,當然那個整天秀斗的官方救援程式也一如往常地找不到救援模式中的路由器,開機狀態長按 Reset 也沒辦法重置,完全沒有反應。

此時可以參考官方的 Hard Fectory Reset 方式,以我這台為例(雖然這台不在官方這個方法的適用機型清單裡),先斷電然後按住 WPS 按鈕接著插電開機,然後會看到電源燈快閃,給他閃個幾秒放開等到重啟,接下來就能用預設的 192.168.1.1 連上去 Freshtomato 了。


隨機推薦文章