Raspberry Piで遠隔リブート装置を作ってみた
前提
- はんだ付けしません(ビニールテープは使います)
- 抵抗とかでてきません
- 一番高いパーツは Raspberry Pi です
動機
我が家のサーバーがなんとなく不調で、不定期にフリーズする。
# まずそれをなんとかしろという話もあるけれども
しかも、カーネルパニックでもないようで、フリーズした時は一切の表示がなくなってしまう。
これでは大事な録画に失敗しかねないと言う事で遠隔からリブートを可能にする為の機器を作ることにした。
# ちゃんとしたサーバー買ってくれば、BMC とか IPMI とかがあるのでこんなことしなくても良いんですけどね
材料
Amazon へのリンクを張っておきますが、ご参考程度です。これじゃないとダメではないです。
- 特に、ジャンパーワイヤはそれっぽければ何でもよいと思います。
Raspberry Pi を除けば、1000 円でお釣りが来る感じです。
(ただし、中国発送なので到着までそれなりに時間かかります)
Amazon で調べてみると、ジャンパーワイヤはメスメス・オスオス・オスメスのセット品もあるみたいです。
- Raspberry Pi 一式(使ったのは 3 ですが 2 でも 1 でも ZERO でもいけるんじゃないでしょうか)
- ジャンパーワイヤ メスメス 20cm https://www.amazon.co.jp/gp/product/B00P9C2KE8
- SODIAL リレーモジュール https://www.amazon.co.jp/gp/product/B00L11KL10
- ジャンパーワイヤ オスオス 20cm https://www.amazon.co.jp/gp/product/B01LZWVFED
その他:
- ダイソー 小物入れ(ケース扱いなのでなくても良い)
- テスター(お安いので十分)
- ケースを加工する道具類(ピンバイス・やすり等)
作り方
リレーモジュールには、リレーが二つ付いていますが、一つしか使いません。
以下の物理ピン番号は、同一機能の別のピンを使用しても問題ない です。
接続はとても簡単な、メスーメス ジャンパーワイヤを使用して繋いでいます。
- モジュールの JD-VCC と VCC を繋いでいるジャンパをハズします。
- Pi の 5V ピン(物理ピン番号 2) => モジュールの JD-VCC に接続
- Pi の 3V ピン(物理ピン番号 1) => モジュールの VCC(JD-VCC の隣の方) に接続
- Pi の GPIO ピン(物理ピン番号 12) => モジュールの IN1 に接続
- Pi の GND(物理ピン番号 14) => モジュールの GND(IN1 の隣にある方)に接続
- 動作確認する
- モジュールの COM1 => PC のマザーボードの電源ピン(+-どちらでも OK)
- モジュールの NO1 => PC のマザーボードの電源ピン(残った方)
モジュールから電源ピンへの接続は
モジュールオス-オスメス-メス と繋ぐことで半田付けを回避できます。
メスメスの片方を切り落として、皮膜を剥けばオスオスを使う必要はないのですが。
動作確認
Raspberry Pi 上から、以下のようにコマンドを叩きます。
<code class="language-bash">GPIO_NO=17 # ピン番号について。を参照
echo ${GPIO_NO} > /sys/class/gpio/export
sleep 0.05
echo out > /sys/class/gpio/gpio${GPIO_NO}/direction
# ここでリレーモジュールのランプが付くはず。
# ランプがついている状態は、 COM1-NO1 間が繋がった状態になる。
# 逆に言うと、ランプが消えている状態(通常状態)では COM1-NC1 間が繋がっている
# 気になるならテスターで要チェックです。
# これでリレーモジュールのランプが消える。
echo ${GPIO_NO} > /sys/class/gpio/unexport
実稼働
とりあえず SSH で
とりあえず、Raspberry Pi に SSH でログインして、上記をよしなに書き換えたスクリプトを実行することで、
対象の PC の電源 OFF/ON を実行できます。
スクリプトは、こちらで公開しています。簡単なスクリプトなので解説不要だと思いますが、
引数に short / long を付けて実行すると電源ボタンを普通押し/長押し させることができます。
Web アプリにしておきたい
しかし、万が一出先でサーバーがフリーズした場合、スマホから VPN 接続して ssh、コマンドを叩く。というのは
いくら何でも面倒です。と言うことで、これを Web 化しようと考えました。
適当な部分が多いですが公開しています
# 本当は、Zabbix で監視しているので自動で復旧させようと思ったのですが、物理的なメンテナンス中に
# 電源入れられたりすると嫌だなぁということであえて手動にしています。
ピン番号について
gpio readall の出力です。Pi 3 と出ているとおり、Raspberry Pi 3 での出力です。
動作確認中で使用する GPIO_NO はこの表の BCM 欄 の値です。
物理ピン番号でも 、GPIO. n の値でもありません。(かなりハマりました)
` +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 0 | IN | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | IN | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
蛇足(困ったことなど)
GPIO 準備待ち?
スクリプト上で GPIO ピンを有効にした直後に direction を設定しようとすると、失敗する ことがあるので、
sleep 0.05 で少しだけ待機する必要があります。内部的な処理が間に合わない のでしょう。
export 直後、GPIO = LOW になる件
最初は、動作開始時(RaspberryPi 起動時)に、使用する GPIO ピンを export して、後は、値の変更だけで制御しようと考えていました。
しかし、GPIO ピンを export した瞬間に GPIO 出力=LOW(0) となる仕様(?)のようで
そのままいくと、対象の PC が起動中に、RaspberryPi を再起動すると、PC の電源が落ちてしまう羽目になります。
# ピンによっては HIGH で開始されるピンもある。という記述を見かけたのですが、どのピンも
# export した直後は LOW になってしまいました。
仕方ないので、export / unexport を行って制御しています。 unexport された GPIO ピンは、未接続状態に
なるので一切電気は流れない・・・そうです。論理を反転させる回路を組めば、LOW/HIGH を逆転できるのでしょうが、
それをすると、半田ごての出番になってしまうので、ソフトウェア側でなんとかしました。
今後のアップデートが必要なこと
PC 本体の電源ボタンが効かなくなる
残念ながら、PCケースの電源ボタンはどこにも配線されなくなります。これは割と困るので、今後どうにかしたいと思います。電源ボタン分岐ケーブル買ってくれば OK なんですけどね。
あ、、、よく考えればこれで十分だった。そのうち記事をアップデートするか追加します。
リモートから電源スイッチを押しても、シャットダウンしたタイミングがわからない
Web アプリから Ping を打って生死確認できるようにしてありますが、Ping 応答しない=電源 OFF とは限りません。(もしかしたら、シャットダウン中にフリーズしているかも。電源長押し が失敗しているかも)
なので、マザーボードの電源 LED への配線を GPIO に入力して、電源状態を把握できるようにした方が良い気がしてきました。これは単純に GPIO を読むだけで済むはずなので 実装したい感じです。
参考にしたサイト
これらを読んだらこの記事いらないかも。
リモートで PC の電源スイッチ操作(eject じゃなくて Raspberry Pi でな
怪しいリレーモジュールを買ってみた
ツール・ラボ 第 24 回 Raspberry Pi の GPIO を制御する(コマンド編)
Discussion