家裡有一臺半閒置的 12 年的 Mac Mini,之前偶爾跑點 Docker 的東西,順便還有把一臺超舊的印表機共享到局域網裡。不過想想應該拿它做點別的事,比如裝個 Linux 然後搭上 v2ray 做軟路由實現透明代理,然後再裝個 Docker 偶爾測試自己寫的 Linux 的東西~
不過這一篇 post 並不是寫如何用 v2ray 在 Linux 上搭軟路由,而是想起現在的軟路由用的是 Raspberry Pi 4。Raspberry Pi 4 在實際使用的時候還是不錯的,但是發熱量比較大,以及 softirq 看起來略有點爆炸 233333
因為打算用 Raspberry Pi 4 做點別的專案,那麼軟路由透明代理的 workload 就交給 Mac Mini 好啦,再寫個程式手動控制一下 Mac Mini 的風扇轉速~這樣就不會因為 workload 比較大,然後晚上風扇轉速太高影響睡眠? 白天的時候倒是基本無所謂。測試的時候發現 3000-3300 RPM 幾乎聽不到聲音,同時也比最低速 1800 RPM 高出一截,不太會因為過熱而出現問題~(╹ڡ╹)
那麼名字就叫 Breezin 好啦(一邊聽彩彩的 Breezin' 一邊寫~
當然,僅僅說完成功能的話,Shell Script 都完全足夠,但是既然是正好在玩 Rust 的話,那就用 Rust 寫來玩玩吧(*^3^)
在 Mac Mini 上安裝了 Ubuntu 18.04 LTS 之後,SMC 報告的風扇和溫度等資訊都被對映在了 /sys/devices/platform/applesmc.768
下
➜ ~ ls /sys/devices/platform/applesmc.768/fan* -r--r--r-- 1 root root 4096 12 3 14:52 /sys/devices/platform/applesmc.768/fan1_input -r--r--r-- 1 root root 4096 12 3 14:52 /sys/devices/platform/applesmc.768/fan1_label -rw-r--r-- 1 root root 4096 12 3 14:53 /sys/devices/platform/applesmc.768/fan1_manual -r--r--r-- 1 root root 4096 12 3 14:52 /sys/devices/platform/applesmc.768/fan1_max -rw-r--r-- 1 root root 4096 12 3 14:54 /sys/devices/platform/applesmc.768/fan1_min -rw-r--r-- 1 root root 4096 12 3 14:53 /sys/devices/platform/applesmc.768/fan1_output -r--r--r-- 1 root root 4096 12 3 14:52 /sys/devices/platform/applesmc.768/fan1_safe
這裡可以看到實際可寫入的只有 fan1_manual
, fan1_min
和 fan1_output
。
fan1_label
裡面儲存了風扇的名字。fan1_manual
實際上會被解釋成一個 Boolean 值,0
代表系統控制,1
代表手動設定。
fan1_min
是對應風扇的最低的 RPM,這個是我們可以控制的。相應的 fan1_max
則是最大轉速,但是不能限制風扇的最大轉速。
fan1_input
是表示當前風扇報告的 RPM,但是是一個只讀的量。fan1_output
表示需要對應風扇達到的 RPM,當 fan1_manual
的值為 1
時有效,否則寫入之後也會被系統覆蓋(即自動控制轉速)。
最後的 fan1_safe
看起來大概是該風扇的最低?安全轉速,然而雖然寫了可讀,實際測試的時候並不可讀(也許是 Ubuntu 下 SMC 驅動的問題?)。
➜ ~ cat /sys/devices/platform/applesmc.768/fan1_safe cat: /sys/devices/platform/applesmc.768/fan1_safe: Invalid argument
在知道了這些對應的對映之後,想法就是在使用者請求資訊的時候,去 glob /sys/devices/platform/applesmc.768/fan*
,然後做成 JSON 資料返回。在使用者設定的風扇轉速的時候,就寫入到對應的 output
裡面,並將 manual
設定為 1
於是設想就是做一個 HTTP API,假如 IP 是 10.0.1.2
,服務執行在 2275
埠的話,那麼要做的就是如下 2 個 API