いろいろやっていると経験的にRaspberry PIは不安定だと知ります。
そしてトラブルがおきた時に対処が難しいです。最大の理由はやはりディスプレイを本番では繋がないためだと思います。
ラズパイの安定化では電源の確保は大事なことです。他にあれこれ安定化策を私は打っています。
1. ミニKVMを用意する
Windows PCはグランドコントロールステーションなどの関係から持っていきます。ミニKVMと呼ばれる製品はHDMIとUSBキーボードをエミュレートする機器が数種類あるので用意、練習しておきます。
ここ数年で出てきたものですね。従来の小さいHDMIディスプレイやUSBキーボード繋ぐより表面でもかさばらない点でも、ぜひ揃えておきたいものだと思います。
実際に経験していますが、Raspberry Piが突然ブートしない場合などは直接繋いで状況を見ることができるものがないと手も足も出ません。
私はOpenterraceという製品を使っていますが、動かない組み合わせがあったり、フォントサイズ変えられなかったり、あまりいいとも言えないです。
2. 軽量なRaspi OSを使う
言うまでもないことですが、ドローンに搭載するコンピュータにGUIは必要ありません。また、Unixはコマンドラインからの作業を避けられないのでGUIのないもの、Raspi OS 64bit Lightを選びます。
逆に汎用のUbuntuはRaspiに必要なパッケージが入っていないのでオススメしません。
3. スワップをやめる
Protect your Raspberry Pi µSD card (use read-only filesystem)
SDカードへのアクセスを極力減らすためです。
そこでこのようなシステムではスワップをゼロにして余計な書き込みが起きないようにします。
sudo swapoff --all
これだけだとリブートしても元に戻るので、次を停止。
sudo systemctl stop dphys-swapfile sudo systemctl disable dphys-swapfile
RAMディスクの活用
/etc/fstabに以下を追記する
tmpfs /tmp tmpfs defaults,size=32m,noatime,mode=1777 0 0 tmpfs /var/tmp tmpfs defaults,size=16m,noatime,mode=1777 0 0
ファイルを消す。
sudo rm -rf /tmp sudo rm -rf /var/tmp
ただし規模の大きいアップグレードなどやる時には外してください。容量不足になります。
4. 耐久性のあるSDカード
「マイクロSDカードが弱いんだ。USBメモリーにすればいいんだ。SSDはパソコンでも使われている!」という意見もあるようですが、どれも中身は同じフラッシュメモリーです。原理的にはどれも同じです。フラッシュメモリーはHDDと違ってアップデートでも追記して、できるだけ幅広くメモリーを使おうとします。メモリーをいっぱいいっぱいで使うことは事実上ありませんから、一般的に容量が大きい方が安定して長持ちするとは言えるのです。
書き込み速度ばかりが話題になりますが、SLC (Single Level Cell) チップを使ったもののほうが耐久性は高いです。1ビットの記憶に1セルが割り当てられています。一般的には「産業用」として売られているモデルです。
ちょっと高いですが、圧倒的な耐久力です。Raspberry PIのシステムのために使うので選ぶべきでしょう。
5. きちんとシャットダウンするメカニズム
Raspberry PIにはボタンでシャットダウンを開始できる機能がある。
/boot/firmware/config.txtに
dtoverlay=gpio-shutdown,debounce=1000
GPIO3(デフォルト)とGNDにスイッチをつけると、1秒以上押すとシャットダウンし、再び押すとブートします。なんだよこれ。ボード上にタクトスイッチひとつつけてほしかったな。
また動いているのかどうか知るために、アクティブな間はLEDを点滅(ハートビート)させて、シャットダウンしたらハートビートが止まる(点灯しっぱなし)定義が以下。
dtparam=pwr_led_trigger=heartbeat
稼働中はパパッ、パパッて感じで赤色LEDが点滅します。
これでいきなり電源をオフすることになって、SDカードファイルが壊れるという心配はなくなります。
6.不要なタスクを削除
systemctl list-timers を行うとさまざまなタスクが登録されています。
少なくとも自動アップデート関連とman-dbは必要ないので止めます。
systemctl stop apt-daily.timer systemctl disable apt-daily.timer systemctl stop apt-daily-upgrade.timer systemctl disable apt-daily-upgrade.timer systemctl stop man-db.timer systemctl disable man-db.timer






