げっとシステムログ

WEB開発メモ

ラズパイに USB をさして電源を落とそう大作戦

CONTENTS
  1. なんでそんなことをするのか
  2. USB をさしたときの様子を確認する
  3. USB デバイスの詳細を確認する
  4. USB をさしたときにスクリプトを起動する
  5. まとめ
  6. 参考資料

なんでそんなことをするのか

ラズベリーパイは電源につなげることで起動する。 しかし、電源ボタンがないので、ディスプレイとキーボードをつないで shutdown しないと電源を切ることができない。

先日の記事で、ラズパイをルーターにしたのだが、電源が切れないので不便だった。 ディスプレイとかをつながなくても電源を切れる方法が欲しい。

  • 電源を引き抜くことで電源を落とすと、10回に1回くらい壊れるのでやりたくない

ラズパイに電源ボタンをつける記事はいくつか見つかったが、少々大仰なのでほかの方法を見つけたい。 起動後に USB キーボードをつなぐと認識するので、USB デバイスは監視されているようだ。

USB デバイスを認識したときにフックスクリプトを走らせることができれば、そこで shutdown できる。 その方法をまとめる。

TOP

USB をさしたときの様子を確認する

以下のコマンドでデバイスの接続を監視できる。

udevadm monitor

このコマンドを実行した状態で USB デバイスを抜きさしすると、add とか remove とかが観察できる。

TOP

USB デバイスの詳細を確認する

以下のコマンドでデバイスの情報を確認できる。

udevadm info $DEVICE_PATH

$DEVICE_PATH にはデバイスのパスを指定する。

パスがわからないときは以下のコマンドを試してみる。

udevadm info -e

出力がとても多いが、とにかくすべて表示されるので何とかする。

手ごろな USB デバイスとして YubiKey があったので、これをさしてみると ID_SERIAL の値が Yubico_Security_Key_by_Yubico だった。 これを使えば YubiKey を認識できそうだ。

TOP

USB をさしたときにスクリプトを起動する

/etc/udev/rules.d にファイルを設置することで、デバイスを認識したときのルールを記述できる。

ここでは 80-usb.rules という名前で以下の内容を保存する。

SUBSYSTEM=="usb", ACTION=="add", ENV{ID_SERIAL}=="Yubico_Security_Key_by_Yubico",  RUN+="/home/pi/bin/shutdown.sh"

この設定で、以下の場合に /home/pi/bin/shutdown.sh を実行する、という指示になる。

  • SUBSYSTEM=="usb" : USB デバイスが
  • ACTION=="add" : 接続した
  • ENV{ID_SERIAL}=="Yubico_Security_Key_by_Yubico" : ID_SERIAL が YubiKey のやつ

詳細は udevadm の man ページに詳しく書いてある。

/home/pi/bin/shutdown.sh は以下の内容で作成する。

#!/bin/sh
shutdown -h now

root ユーザーで実行されるので、これで電源が切れる。

以下のコマンドで rule を有効化する。

sudo udevadm control --reload

これで YubiKey をさすと shutdown するようになった。

TOP

まとめ

ラズパイに USB デバイスをさしたときに電源を切る方法をまとめた。

これでディスプレイをつながなくてもよくなった。 どんな YubiKey でも電源を切っちゃう気がするけどまあヨシ。

TOP

参考資料

TOP