Raspberry Piで遠隔リブート装置を作ってみた

前提

  • はんだ付けしません(ビニールテープは使います)
  • 抵抗とかでてきません
  • 一番高いパーツはRaspberry Pi です

動機

我が家のサーバーがなんとなく不調で、不定期にフリーズする。

# まずそれをなんとかしろという話もあるけれども

しかも、カーネルパニックでもないようで、フリーズした時は一切の表示がなくなってしまう。

これでは大事な録画に失敗しかねないと言う事で遠隔からリブートを可能にする為の機器を作ることにした。

# ちゃんとしたサーバー買ってくれば、BMCとかIPMIとかがあるのでこんなことしなくても良いんですけどね

材料

Amazonへのリンクを張っておきますが、ご参考程度です。これじゃないとダメではないです。

特に、ジャンパーワイヤはそれっぽければ何でもよいと思います。

Raspberry Pi を除けば、1000円でお釣りが来る感じです。

(ただし、中国発送なので到着までそれなりに時間かかります)

Amazonで調べてみると、ジャンパーワイヤはメスメス・オスオス・オスメスのセット品もあるみたいです。

その他:

  • ダイソー 小物入れ(ケース扱いなのでなくても良い)
  • テスター(お安いので十分)
  • ケースを加工する道具類(ピンバイス・やすり等)

作り方

リレーモジュールには、リレーが二つ付いていますが、一つしか使いません。

以下の物理ピン番号は、同一機能の別のピンを使用しても問題ないです。

接続はとても簡単な、メスーメス ジャンパーワイヤを使用して繋いでいます。

  • モジュールの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 を付けて実行すると電源ボタンを普通押し/長押し させることができます。

https://github.com/yakumo-saki/raspberrypi-powerweb/tree/master/scripts

Webアプリにしておきたい

しかし、万が一出先でサーバーがフリーズした場合、スマホからVPN接続してssh、コマンドを叩く。というのは

いくら何でも面倒です。と言うことで、これをWeb化しようと考えました。

適当な部分が多いですが公開しています

https://github.com/yakumo-saki/raspberrypi-powerweb

# 本当は、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なんですけどね。

http://ponpokotarou.blog.fc2.com/blog-entry-53.html

あ、、、よく考えればこれで十分だった。そのうち記事をアップデートするか追加します。

リモートから電源スイッチを押しても、シャットダウンしたタイミングがわからない

WebアプリからPingを打って生死確認できるようにしてありますが、Ping応答しない=電源OFFとは限りません。(もしかしたら、シャットダウン中にフリーズしているかも。電源長押しが失敗しているかも)

なので、マザーボードの電源LEDへの配線をGPIOに入力して、電源状態を把握できるようにした方が良い気がしてきました。これは単純にGPIOを読むだけで済むはずなので実装したい感じです。

参考にしたサイト

これらを読んだらこの記事いらないかも。

リモートでPCの電源スイッチ操作(ejectじゃなくてRaspberry Piでな

http://unsui.hatenablog.com/entry/2014/09/11/225211

怪しいリレーモジュールを買ってみた

http://yaplog.jp/kazuikazui/archive/459

ツール・ラボ 第24回 Raspberry PiのGPIOを制御する(コマンド編)

https://tool-lab.com/make/raspberrypi-startup-24/