Watchdogを使ってRaspberry Piをオンライン維持する方法

solar-panel-on-roofdeck
目次

この記事は Dries Buytaert 氏の公式ブログ「dri.es」の翻訳記事です。Driesブログの記事一覧よりすべての翻訳記事をご覧いただけます。

少し前に、ソーラー発電・自己ホスティングのウェブサイトを構築しました。再生可能エネルギーだけでウェブサイトを動かすのは、なかなか達成感があります——Raspberry Pi Zero 2 W が音信不通になり始めるまでは。

ウォッチドッグでRaspberry Piをオンラインに保つ

ソーラーパネルとRaspberry Pi Zero 2 Wは、テスト用に屋上デッキに設置しています。

数週間おきに、Piはネットワークからぷっつり消えてしまうのです。pingも通らず、SSHも繋がらない。完全に手が届かない状態なのに、電源LEDはちゃんと点灯しています。SDカードの空き容量も十分あります。

ソーラーパネルやバッテリーの問題でもありません。実際、ソーラーダッシュボードを見ると、215日間ノンストップで動き続けています。まったく乱れなし。

Raspberry Pi がオフラインになるたびに、同じ面倒な手順を繰り返さなければなりません。屋上に上がって、防水ケースを開け、Piを取り外し、SDカードを抜いて、自室に戻り、フォーマットして、OSを再インストールしてすべてを再設定。それからまた屋上に上って元に戻す、という具合です。

防水ケースに取り付けられているRS485 CAN HATモジュール付きのRaspberry Pi 4。

RS485 CAN HATモジュールを装着したRaspberry Pi 4を防水ケースに組み込んでいるところです。

1ヶ月前、ボストンの冬の寒さと格闘しながら、また屋上デッキに出る羽目になりました。かじかんだ指で小さなネジとコネクターを扱いながら、もうこれは何とかしなければと思いました。

Raspberry Pi Zero 2 W はIoTプロジェクトに最適なデバイスです。ただし、何年も無人で動き続けられれば、の話ですが。

ウォッチドッグ:トラブル発生時の安全網

そこで登場するのがウォッチドッグです。障害を検知して自動的に再起動をかけるツールです。種類は2つあります。

  1. ハードウェアウォッチドッグ – カーネルパニックやハードウェアのロックアップなど、システム全体のフリーズから回復するために、低レベルのリセットを強制します。
  2. ソフトウェアウォッチドッグ – ネットワーク接続の喪失、CPU負荷の高騰、メモリ不足など、サービスレベルの障害を検知して修復します。

両方を組み合わせることで、軽微なトラブル(接続の一時的な途切れなど)からシステムクラッシュ(すべてが応答しなくなる状態)まで、幅広いケースに対応できます。

ハードウェアウォッチドッグ

ハードウェアウォッチドッグは、Raspberry PiのBroadcomチップに内蔵されたタイマーです。OSは定期的にこのタイマーをリセット(ペット)しなければなりません。設定した時間内にリセットできなかった場合、ウォッチドッグはシステムがフリーズしたと判断して強制的に再起動します。

ハードウェアウォッチドッグのサポートはRaspberry PiのLinuxカーネルに組み込まれているので、有効化するだけでOKです。

/etc/systemd/system.conf を編集して以下を追加します。

RuntimeWatchdogSec=10s
ShutdownWatchdogSec=10min
  • RuntimeWatchdogSec – ウォッチドッグをリセットする間隔を定義します。Raspberry Piではハードウェアの制約により、15〜20秒未満に設定する必要があります。
  • ShutdownWatchdogSec – シャットダウン中もウォッチドッグを有効にし、ハング(停止状態)を検知します。

ウォッチドッグを有効化するために systemd を再起動します。

$ sudo systemctl daemon-reexec

再起動後、systemd がハードウェアウォッチドッグタイマーのリセットを開始します。万一リセットに失敗した場合、Raspberry Piは自動的に再起動します。

完全な復旧を確保するために、重要なサービスはすべて自動再起動に設定しておきましょう。たとえば私のウェブサーバーは自動起動するよう設定してあるので、ソーラー駆動のウェブサイトも手作業なしでオンラインに戻ります。

ソフトウェアウォッチドッグ

ハードウェアウォッチドッグがシステム全体のフリーズに対応するのに対し、ソフトウェアウォッチドッグはネットワーク接続やCPU負荷などのメトリクスを監視します。

ソフトウェアウォッチドッグをインストールします。

$ sudo apt update
$ sudo apt install watchdog

次に /etc/watchdog.conf を編集して以下の設定を追加します。

# ネットワーク監視
ping = 8.8.8.8
ping = 1.1.1.1
ping-count = 5

# インターフェース監視
interface = wlan0

# 基本設定
watchdog-device = none
retry-timeout = 180
realtime = yes
interval = 20

各設定の意味は以下の通りです。

  • ping = 8.8.8.8 / ping = 1.1.1.1 – PiからGoogle(8.8.8.8)とCloudflare(1.1.1.1)に疎通できるか確認します。
  • interface = wlan0 – Wi-Fiインターフェースがアクティブであることを確認します。
  • retry-timeout = 180 – これらのチェックが180秒間失敗し続けた場合、Piを再起動します。
  • interval = 20 – 20秒ごとにチェックを実行します。
  • watchdog-device = none – ハードウェアウォッチドッグは使わず、デーモンが障害を検知してOS経由でソフトウェア再起動をかけます。

ここではネットワーク監視のみ設定していますが、CPU使用率やRAMなどシステムの健全性指標を監視するよう追加設定することも可能です。

設定が完了したら、ウォッチドッグサービスを有効化・起動します。

$ sudo systemctl enable watchdog
$ sudo systemctl start watchdog

enable でブート時に自動起動するよう登録し、start で再起動を待たずにすぐ動かします。

ウォッチドッグによる再起動のデバッグ

ウォッチドッグが再起動をかけたときは、システムログで原因を調べることができます。最近のシステム起動履歴を確認するには、次のコマンドを実行します。

$ journalctl --list-boots

起動セッションの一覧が表示され、それぞれにインデックスが付きます(例:-1 が直前の起動、-2 がその前)。

シャットダウンイベントとその理由をすべて確認するには、次のコマンドを実行します。

$ journalctl --no-pager | grep "shutting down the system"

特定の再起動前後のログを詳しく見たい場合は、次のコマンドで直前の50件のログエントリを確認できます。

$ journalctl -b -1 -n 50 --no-pager
  • -b -1 – 直前の起動のログを取得します。
  • -n 50 – その再起動直前の最後の50件のログエントリを表示します。
  • --no-pager – ログのページング表示を無効にします。

進展あり、でも謎は残る

ウォッチドッグを導入してから、Raspberry Pi はオフラインのままになることがなくなりました。ずっと接続を保てています。このまま続いてほしいものです。

ログを見ると、ソフトウェアウォッチドッグが定期的にシステムを再起動していることがわかります。再起動の原因は常にネットワーク接続の喪失です。

ウォッチドッグは意図した通りに動いていますが、本当の謎はまだ解けていません。なぜネットワークが切れ続け、しかもRaspberry Piが自力で回復できない状態になるのか?

それでも、これは確かな前進です。凍えるような寒さの中で屋上に上る必要がなくなりました。家を離れている間も、システムが自力で復旧してくれます。

— Dries Buytaert

この記事は「Keeping your Raspberry Pi online with watchdogs」(投稿日:2025-03-05)の翻訳記事です。

カテゴリ