grasys blog

赤外線カメラでも読み取れる、サーバのステータスモニターを自作してみました

あらすじ

私は何年も趣味で自宅サーバを運用していますが、その間いろんな問題が発生しました。

  • LAN ケーブルが原因不明で抜けた
  • ルータの電源アダプターが重すぎて勝手にタップから抜けた
  • サーバの SSL 証明書の自動更新が失敗した
  • nvidia-smi が原因不明で落ちた
  • 夏でサーバが爆熱になった

などなど、大なり小なり問題がありました。

自宅サーバちゃんは高性能な GPU を積んでいて発熱しやすいものだったので、
サーバに接続できないたびに火災が起きないか毎回焦りました。

心配した僕が最近編み出したのは

そんな僕が最近編み出したのは、これ

監視カメラを別のインターネット回線にして、
物理的にサーバの様子を確認できるステータスモニターを作ればいいでは?

というアイディアがあったので、作成しました。

最終的にこんな感じになりました。

家に余ったポータブル 14 インチ画面の光度を 0 まで下げることで、電気代節約できそう。。。?
部屋の方も電気消しているので、監視カメラが勝手に赤外線カメラになった。

ちなみに、サーバの方に GUI がないので、bash から起動しています。

完成したコードはこちらのリポジトリーにて確認できます。

github.comhttps://github.com/Lycoris52/Terminal_Dashboardgithub.com

赤外線カメラでも各ステータスが確認できます。

一行目 = CPU 温度 | GPU 温度 | ネットワーク回線の状態
二行目 = nvidia-smi | サーバのヘルスチェック

仮に LAN ケーブルを抜いてみたらこうなります。

ネットワーク状況とサーバのヘルスチェックが通らなくなりましたので、
Dead に変わりました。

これである程度サーバがどういう死に方しているかを物理で把握できましたので、
火災の心配も少なくなりました。

余談

結果だけ見ると簡単に作れそうですが、わりと時間がかかりました。
いくつかの問題に遭遇しました。

ターミナルによってフォントが違う

なので、単純にテキストを描画することができません。
回避策として、0 と 1 フラグを使って、文字列っぽいのを作成しました。
0 の場合、背景色を描画する一方、
1 の場所で背景色を表示するため描画しないようにしました。

下記は "D" 文字の列サンプルです。

ターミナルによって表示できる色が違う

Windows のターミナルや mintty, powershell など非常に表示できる色は多いですが、
生の bash だと表示できる色は非常に限られています。

しかも同じ色でも描画してみたらターミナルによって違う色になります。
Black で指定しても、サーバで描画したのはほぼグレーに見えた場合もあります。

なので、Black のフォントの代わりに本来のターミナルの色の方が黒いので、
Black を使う時、代わりに何も描画しないようにしました。

暗い色じゃないと赤外線カメラでは見えづらい

赤外線カメラはかなり敏感に光に反応しますので、明るい色だと真っ白にしか見えません。
最初は緑と赤で正常時とエラー時を区別していましたが、赤外線カメラを通すとなにも違いがわかりません。

なので、黒色と暗い赤色にして、画面の輝度を 0 にしたら見えました。

LCD 画面が Burn-in する問題

これは後で気付きましたが、ずっと同じ描画をしたら LCD 画面が Burn-in 
(画面に同じ表示を長時間出し続けた結果、うっすら残像のように見える現象)
する可能性が高いので、1 分ごとに画面を 3 秒間画面を暗くし、
各ステータス更新が終わったらまた描画するようにしました。
今回は TN パネルを使っていましたが、OLED パネルなど Burn-in しやすいものだともっと工夫しないといけないと思います。

まとめ

趣味でやっている自宅サーバですが、やっぱり何年もやると色々と知恵を得られ、かなり貴重な存在だと感じました。
これからも自宅サーバを育てながら、運用でしか得られない知見を積み重ねていきます。


採用情報
お問い合わせ