1 ポイント 投稿者 GN⁺ 2024-02-18 | 1件のコメント | WhatsAppで共有
  • Raspberry Pi を数週間から数年にわたって無介入の状態で維持するには、障害が発生したときに自動的に復旧する経路をあらかじめ設計しておく必要がある
  • このガイドは、既存の SD カードの摩耗を減らす記事を置き換える、より広範な信頼性シリーズであり、問題の種類ごとの対策とモニタリングのヒントをまとめている
  • 主なリスクは、WiFi 接続の失敗、サービス停止、ハードウェア・ファームウェア・ドライバーの不安定さによるクラッシュ、SD カードの摩耗または容量超過に分けられる
  • SD カードの問題は、適切な microSD の選択、swap の不使用、書き込み削減、読み取り専用ルートファイルシステム、必要に応じた fsck の実行で緩和できる
  • journaling の無効化は摩耗を減らせる可能性がある一方で、クラッシュや停電時にファイルシステム破損のリスクを高めるため、長期安定性という目標には合わない

長期運用でまず見るべき障害ポイント

  • Raspberry Pi を長期間オンラインに保つには、各障害状況で Pi がどのように復旧するかを検討し、解決策の利点とリスクも併せて比較する必要がある
  • 著者は自宅で Raspberry Pi を低出力 FM 送信機や UPS エネルギーモニターなどとして使用している
  • Raspberry Pi Reliability シリーズは、実際に遭遇した問題の種類と解決方法を整理し、主に Uptime Kuma を活用したモニタリングのヒントも含んでいる
  • このシリーズは、既存の SD カードの摩耗を減らす記事より包括的なガイドを目指しており、リンク先の記事群が更新版の代替として機能する

問題の種類ごとの対策と避けるべき選択

1件のコメント

 
GN⁺ 2024-02-18
Hacker News のコメント
  • 代わりに Lenovo mini PC を買い始めたが、18cm x 18cm x 3cm なので今でもかなり小さい
    最近はかなり安く手に入り、きちんとしたケースと冷却も備えている: https://psref.lenovo.com/syspool/Sys/PDF/ThinkCentre/ThinkCe...
    すぐ横に1台置いて使っているが、i5-8500T、32GB RAM、SSD 2台構成で、powertop の自動チューニング状態では現在アイドル時の消費電力が5W: https://wiki.archlinux.org/title/powertop

    • GPIO、I2C、SPI がない。単に小さくて軽いサーバーを探しているなら適切だが、Raspberry Pi はコンシューマー向け/オフィス向け機器では珍しい 入出力機能 があることでも人気がある
      マイクロコントローラーにシリアル接続を追加することはできるだろうが、そうすると解決策があまりすっきりしなくなる
    • 昨年、Kodi メディアプレーヤーを RasPi 4 から N3350 mini PC に移行したが、後悔していない
      最近は NAS(N5105)とサービス用マシン(3215U)も、eBay やフリーマーケットで中古で手に入れた mini PC とロック解除済み Chromebook に移した。安く、消費電力も低く抑えつつ、計算性能は Pi とはまったく別次元だ
    • 自分も同じように使っているが、Dell 7060 を使っている
      オーストラリアではリース終了で放出される機体が何千台も出てくる。8500T や 8700T チップは優秀で、公式に Windows 11 を実行でき、ハードウェアトランスコーディングも内蔵しているので Plex サーバーに向いている
      手持ちの1台は 2TB SSD 2台と 64GB RAM にアップグレードしており、問題なく24時間365日動いている
    • 自分も同じ。Dell のリファービッシュ品 を買ったら、ずっと手間が減った
      SDカードがおそらく最大の問題原因で、RPi に SSD などを接続する費用まで考えると、もはや費用対効果がよくなかった
    • ARM ハードウェアと比べると、ほぼどんな Linux ディストリビューション でも動かせる点も良い
  • 最初の助言が、ファイルシステムのジャーナリングモードを有効にしろ、であるべきではない
    最初の助言は、ファイルシステムを 読み取り専用 でマウントし、/var はメモリ上にマウントし、すべてのログを RPi ではなく、まともな UPS と NUT が動いているノードへ送ることにすべきだ。ファイルシステムが読み取り専用か一時領域なら、停電は実質的に無害になる
    RPi が1台だけならやり過ぎかもしれないが、筆者は家のあちこちで複数台使っていると言っていた
    また、A/B システムパーティション を用意し、パーティション全体を書き直す方式でアップグレードしてからアクティブパーティションを切り替えるのもよい。そうすれば新バージョンに致命的なバグがあっても、常に正常なシステムパーティションが1つ残り、復旧しやすい
    この方式で、さまざまな用途の複数の小型/シングルボード PC を20年以上うまく使ってきた

    • 筆者は数行下で 読み取り専用構成 の助言へのリンクを載せている
      https://www.dzombak.com/blog/2021/11/Reducing-SD-Card-Wear-o...
    • /var だけでなく /tmp のような場所にも tmpfs を使うべきだ。そうすれば SDカードの寿命は大きく延びるはず
    • A/B システムパーティションを用意してパーティション全体を書き直す形でアップグレードするなら、アップグレード手順がどうなっているのか気になる
      新しいディスクイメージをどう作るのか、各デバイスにログインしてアップグレードするのか、それとも自動化があるのか知りたい
    • ファイルシステムを読み取り専用でマウントした場合、システム更新や新しいソフトウェアのインストールはどうするのか気になる
    • Docker のようなものを使うと、/var をメモリ上にマウントしたときにデバイスのメモリを超えることがある
      /var/lib/docker を補助ストレージに移す必要があるかもしれない
  • 2011年に Global Scale Technologies の初期のプラグコンピューター上で動く商用製品を作ったことがある
    20台しか売れなかったが、全台が SDカード破損 の問題で返品され、急いでルートファイルシステムを読み取り専用に変更しなければならなかった。それ以来、この方式を気に入っている
    その初期の商用製品は、ごく小さなホームオートメーション機能を含む家庭用セキュリティ製品で、2021年に新しい名前でオープンソースとして公開し、今は Jetson 系シングルボードコンピューターで動作する: https://github.com/hcfman/sbts-install
    今では高度な YOLO モデルもトリガーとして含まれている。スタンドアロン製品を意図していたため HTTPS をサポートし、証明書まわりの作業全体を包む GUI もあった。この機能はオープンソース版にも残っており、デバイス間の REST 呼び出しに自己署名証明書を使いやすい
    また、マルチパーティションのメモリ overlayFS 方式を維持・拡張しており、インストール時にまず sbts-base システムをインストールするようにして、他の人がそれを自分のベースシステムとして使えるようにしている

    • 似た経験がある。5ドルの Pentium 2 PC をファンレスで無音のワークステーションに改造し、HDD を CFカード に置き換えた
      時間が経つと、ディスク書き込みのたびにシステムが1〜2秒ずつ止まり始め、かなりつらかった
  • こういうことをしようとしている人には、まず ESP32 のような小さなボードで必要な処理をまかなえないか見てみることを勧めたい
    消費電力はずっと少なく、価格は数ドル程度で、多くの用途には十分。Python 系を好むなら、多くのボードが MicroPython と CircuitPython の両方をサポートしている
    初期購入費用と継続的な電気代を減らせるので、検討する価値はある

    • 組み込みプログラミングの時間コストや複雑さを心配する反論も理解できるが、ホビーユーザーなら少なくとも検討に値する良い提案だと思う
      マイクロコントローラーで実現したプロジェクトは、Pi ベースのプロジェクトより何十年単位で安定していたし、デフォルトの SSH 設定を変え忘れてボットネットの一部になる心配も少ない。デフォルトは pi:raspberry ではなかったかと思う
      MicroPython 以外にも、ESP32C3 向けの no_std Rust サポートは毎月よくなっている。趣味で小さなホームオートメーションプロジェクトをする人にとっては、追加の制約がむしろ楽しく、やりがいのあるものにしてくれることもある
      ただし Linux にすでに慣れている人には Pi のほうが概してずっと簡単で、私の経験では費用は少なくとも10倍くらい高い。同じレベルの安定性を得るための SSD ブート、ネットワークブート、読み取り専用ルートファイルシステム、ウォッチドッグ設定といった追加構成や、より高い消費電力、特に Pi 5 の電力も意思決定に含めるべき
    • ESP32 でメディアサーバーを動かせるか? できない
      ESP32 でパスワードマネージャーのサーバーを動かせるか? できない。Pi-hole は? 無理。Unifi コントローラーは? 無理
      こういう提案は、人々が Pi をガレージドアのコントローラーみたいな用途に使っていると想像しているようだが、反射的に ESP32 を Pi の代替として提案するのはあまり役に立たない
    • ESP32 と関連ボードはかなり素晴らしいが、まったく別の考え方が必要になる
      何かがうまくいかないときに HDMI とキーボードをつないで、一般的なユーティリティがそろったメインライン Linux 環境でその場でデバッグすることはできない
    • Pi Zero の電気代は年間1ドル程度
    • 最近の少し複雑な構成では、Pi Zero 1台と複数の ESP8266/32 を HTTP と Wi-Fi で通信させて使っている
      Arduino の代わりに MicroPython を初めて使ってみたが本当に気に入っていて、驚くほど非常に安定している。以前は Wi-Fi の電力状態のせいで長期的にはプロジェクトがよく壊れていたが、今のところ MicroPython 構成では問題がない
  • 「Wi-Fi 接続が大丈夫かを定期的に確認し、そうでなければ Wi-Fi インターフェースや Pi 全体を再起動するスクリプトにほぼ行き着く」というのはハックではなく ベストプラクティス
    データセンターの重要なサーバーに IPMI やリモート制御可能な RPDU コンセントのようなアウトオブバンド接続が必要なように、アクセスしにくい遠隔地の重要なサーバーにはウォッチドッグスクリプトが必要
    もちろん再起動の影響と、再起動までのダウンタイムを考慮して用途に合わせて調整する必要があり、少なくとも後で調査できるように異常イベントを記録することはできる
    リモート RPi を配備したとき、最初にやったのは簡単な Bash のウォッチドッグスクリプトだった。Wi-Fi の問題だけでなく、壊れる可能性があり、再起動で直る可能性のある何十もの状況のためのものだった

    • 最近のほとんどのディストリビューションでは、こうしたウォッチドッグの役割は init/PID 1、つまり systemd が担っている
      init がサービスを管理できると信頼できないなら、システムがサービスを提供するという保証はどこから来るのか疑問
      スクリプトで作り直すこともできるだろうが、私たちはすでにその段階を過ぎている。systemd に多く触れているが、ひいきしたいわけではなく代替手段もある
      ほとんどのサービスは、自分が存在する環境をきちんと活用していない。Web サーバーが特定のマウントを必要とすると宣言するような、サイト固有のカスタマイズを期待しているように見える
      よく見落とされるディレクティブが PartOf= だ。あるサービスやリソースの再起動を別のものと結び付けられる
      もっと簡単には、NetworkManager が Wi-Fi/ポータル確認をカスタマイズする方法を提供しているはず。完全に過激な方向に行く必要はないかもしれない
    • 似たように ESP8266 で Wi-Fi ルーターとケーブルモデムを監視している。問題が起きれば再起動する
      ルーターについては、適切な SSID への接続を試み、ルーターに ping を送って、どちらか一方でも失敗すれば別のルーターに切り替える。同じ設定の同じルーターを2台用意し、電源は SPDT リレーの NO/NC 接点につないで、一方が失敗したらリレーの状態だけを変えてもう一方へ切り替える
      ルーターが生きていれば、ウォッチドッグはケーブルモデムのステータスページを取得し、ISP ネットワーク内で CMTS かその近くの機器に見える3つの IP のどれかに ping を送って、HFC 設備が生きているか確認する。再起動で解決できない障害なら、わざわざ再起動したくないからだ
      残念ながら、同じ MAC を持つケーブルモデムを2台用意して切り替える方法は見つけられず、ISP も同じアカウントでモデム2台を許可していないので、ケーブルモデムが失敗したら再起動してうまくいくことを願うしかない
      これに、停電中でもルーターとモデムを30時間以上動かせるバッテリーラックを付けており、2020年5月に作ってからほぼずっとオンライン状態を保っている。コードはひどいが、実際には非常に堅牢に動作している
    • 完全に同意。ウォッチドッグタイマーは、「永遠に」ソフトウェアを動かすマイクロコントローラーやコンピューターには必須
      完璧なコードと設計でも防げないことは起きるし、ウォッチドッグタイマーは無限ループを断ち切ってリセットしてくれる。宇宙線がビットを反転させることや瞬間的な電圧低下のようなものもあり、Raspberry Pi では SD カード破損も心配しなければならない
      Raspberry Pi には内蔵ハードウェアウォッチドッグタイマーがあると認識している。Arduino には確実にある
    • ベストプラクティスであると同時にハックでもある。本来は必要ないはずだが、バグが存在するので必要になる
  • ほぼ10年にわたり、本番環境で数千台の Piを運用してきて、いまは x86 への移行を始めている
    Pi の価格性能比は以前ほどではなくなった。最近 State of Open Con でこの経験について発表した: https://youtu.be/vX-qK9mxKZI

    • Raspberry Pi デジタルサイネージ企業の CEO 仲間として、発表で Pi 4 以降で可能なセキュアブート対応に触れていなかったのは意外だった
      私たちのサービスではまだ使っていないが、ドキュメント上はかなり堅牢そうで、ディスク/SD 上のデータを保護できる
      私たちはまだ Pi にかなり満足しており、よりオープンな API である Mesa/DRM/KMS/FFmpeg へ移行したことも、ようやく実用的な状態になってきていて非常に有望に見える
      主な用途はいまもデジタルサイネージなので、生の処理性能はそれほど重要ではない。コストの大きな部分である動画デコードは当然アクセラレーションされるし、Pi で可能な後方互換性は素晴らしい。いまでもほぼ10年目の Pi1B+ を動かし続け、私たちが提供する最新 OS リリースを使っている顧客がいる
    • 利用方法を考慮する必要がある。アイドル状態が多いなら、ARM は x86 より良いと思う
      寿命も見るべきで、そこでも ARM のほうが x86 より長持ちしそうだ。モジュール性の面でも ARM は x86 より優れている。小さなデバイスを複数置くほうが安いからだ
      ただし拡張性、つまり現在の経済状況での事業性は x86 のほうが ARM より良い
      また、すべてのグラフはワット当たりを基準にすべきだ。2 から 4 へ移って性能が上がったというのは新しい話ではなく、重要なのはワット当たり性能が向上したかどうかだ
      そう見ると、Raspberry Pi 5 はワット当たり性能の向上が期待ほど大きくないことが分かる。人類史上、恒久的にピークに達してしまったように思える
      最後に、現時点で何らかの進展に対する唯一の希望は、性能ではなくオープン性の面で JH7110 だが、3D 対応が遅れている
    • ディスプレイ駆動用なのか、それとも生産組立装置のように GPIO を使う運用機器用なのか気になる
    • x86 に移るというのが具体的に何を意味するのか気になる
  • そうしたことを何一つしていなくても、いくつかの Pi は新モデルに交換されるまで何年も問題なく動いていた
    HomeKit/Zigbee ゲートウェイとデータロガーはいま Pi 4 だ。結局、良い SD カードと安定した電源供給が肝心なのだと思う

    • 同意する。私も複数の Pi を動かしてきたが、故障したときはSD カード不良が原因だった
      pibenchmark は良い情報源だと思う: https://pibenchmarks.com/
      購入前に SD カードは必ず比較すべきだ
    • サンプルサイズのほうが経験により大きく影響すると思う
      十分に多くのデバイスを運用すれば、起こり得る問題はすべて起きるし、夢にも思わなかった新しい故障モードも現れる
    • 2016年前後およびそれ以前の古い Raspbian OS ではアクセス時刻の記録が有効になっていて、ファイルを読むたびに書き込みが発生していた
      その後、カード破損の報告が多かった理由はおそらくそれだろう
    • 私も似たようなものだ。Pi3 を数台 Cups サーバーとして何年も動かしていて、稼働時間がリセットされるのは停電時だけだ。停電も非常にまれだ
      micro SD カードに Raspbian をインストールし、Cups を設定し、プリンターに USB を接続した以外は何もしていない。別の1台はネットワークプリンターを管理している。その後は放置しているだけだ
    • かなりばらつきがある。あるものは際限なく問題が起き、別のものは長く問題なかった。はっきりしたパターンは見えない
      今では大半を SSD に替えた。そうしないと、あまりに運任せに感じる
  • SD カードの話が最初に出てこないことに驚いたし、記事でUSB ブートを提案していないことにはさらに驚いた
    Pi を1台、何年もほぼ 24/7 で稼働させているが、問題がなかった理由は、1) ディスクにほとんど触れないよう Alpine を構成したこと、2) 破損する SD カードがないこと、だと思っている。なぜ USB のほうが安定するのかは分からないが、経験的にはそうだった

    • SSD を付けた私の Argon Raspberry 構成も安定している
      失敗する唯一の理由は停電時だ。10分だけ持つバッテリーがあれば十分すぎると思う
    • Alpine をディスクにほとんど触れないように構成する方法が気になる
      たとえば https://wiki.alpinelinux.org/wiki/Installation#Diskless_Mode のようなものを言っているのか知りたい
    • SD で問題なく動かした Pi のカードはたくさんあった。ところが1つだけ、突然 SD カードがものすごく熱くなったものがあり、設定中の新しい Pi だった
      カードを抜いて、そのカードと次の Pi は USB SSD に替えて使っている。少し怖かった。それでも前述のとおり、micro SD で Cups サーバーを何年も問題なく動かしている Pi もある
    • 完全に同意する。私の RPi の故障はすべて SD カードが原因だった
      RPi 2台はいずれも USB からブートして動かしており、何年も順調に稼働している
    • 私も同じだ。M.2 HAT で SSD からブートしているが、とてもよく動いている
  • 2017年から同じSDカードで2台のPiをほぼ継続して動かしている。停電は2〜3回ほどあった
    1台はDNS/プリントサーバーで、もう1台はKodi、メディアは外部NFS上にある。自分がやったことは全ログをオフにしただけで、一度も問題はなかった
    どちらも SanDisk 2GBカード を使っている。「容量が少ない → ビット密度が低い → 信頼性が高い」というふうに素朴に考えていた記憶がうっすらある

    • log2ramgithub/azlux/log2ram)を使ってきており、結果には満足している
      /var にRAMディスクをマウントし、たまにログをRAMディスクからSDカードへコピーするだけ。おかげでSDカードを激しく叩かなくても、すべてのログを確認できる
    • 元のSDカードのまま Pi 1でKodi をほぼ10年動かし続けている
      ほとんど電源は入ったままだが、接続しているUSB電源をうっかり切ってしまうことがたまにある。5ポートの小型電源で、これもほぼ同じくらい古く、自分の構成では電源ボタンがあまりに押されやすい
    • 2014年から同じSDカードで休まず動いているRPiが1台あり、天気サイトを提供している
      基本的にすべてのログとWebページをtmpfsにマウントしており、DBはSDカード上にあって5分ごとに書き込まれる
    • 最初のPiを今でも持っている。おそらく Pi 1B だと思う
      いくつかのインストールを経たが、今はバックアップDNSサーバーになっている。ファイルシステムを見ると2018年からPi-holeとして使われており、数回の再起動と引っ越しの時を除けば、実質的に24時間365日動いている
      SDには何も書き込まず、すべて /dev/shm のRAMへ送っている。Pi-holeはまれに落ちてもリストを取り直せばよく、そもそも毎日ダウンロードしている
    • 私も同じだ。Raspberry Pi 3が2台あり、2019年から広告ブロック用の Pi-hole を動かしている
      後にはローカルDNSとTailscaleノードとしても使い始めた。数か月再起動しなかったこともあり、最長稼働時間は約11か月だった。非常に堅牢だった。UPSにつないでおくと確実に役に立つ
  • 「Raspberry Piを数週間、数か月、数年間、手を入れずにオンライン状態に保つのは、ある程度は職人芸だ」とあったが、私は 組み込みファイルシステムを含むNetBSDカーネル を起動している
    たとえばINSTALLカーネルやカスタムカーネルを使う。起動直後にSDカードは抜いてもよく、必要に応じて接続したストレージへ chroot する
    こうすれば数週間、数か月、数年間動く。ブログ筆者が挙げていた問題は経験したことがない
    私が見つけた唯一の問題は、ケースを使うときの電源コネクタまわりだ。たとえば交換用ケーブルを使うと接続が弱いことがある。最近のPiでは改善されているかもしれない
    だが、たいていのコンピュータでも似たようなことは言える。ケーブルとコネクタはたいてい弱くて安価な部品だ。動いた拍子に電源が切れると、Piは自動的に再起動する