RaspberryPi[65] Raspberry PiでSDカードの寿命を延ばす

要旨

Raspberry PiにUSBメモリや外付けHDDを接続した際、起動直後やアクセス開始時にフリーズすることがあります。これは単純な電源不足ではなく、USB3.0ポートに搭載されているコントローラ(VL805)が、USBメモリ接続時の突入電流に弱いことが原因です。特にUSB3.0メモリは、挿した瞬間に0.8A〜1.5A程度の突入電流が流れる場合があり、ラズパイ内部の5V系が瞬間的に落ちてUSB制御が不安定になります。その結果、起動しなくなる・固まる・再起動が繰り返されるなどの症状が発生します。興味深いことに、同じUSBメモリでもUSB2.0ポートに挿した場合は正常に動くことがあります。これはUSB2.0側はSoC内部経由で制御されているため、瞬間的な電圧変動に強く、USB3.0ポートに比べて安定性が高いからです。つまり、USBメモリを使う場合は「USB2.0に挿す」ことで安定動作することがあります。ただし、それでも連続アクセスが多いとSDカード同様に書き込み寿命や電源負荷が問題になるため、長期運用には向きません。そこで本記事では、USBストレージに頼らず、かつSDカードの寿命を延ばして安定運用する方法として「ログをRAMに書き、一定間隔でSDにまとめて書き込む構成」を紹介します。

1.RAM上のログ保存ディレクトリを作成

sudo mkdir -p /mnt/ramlog
sudo chown pi:pi /mnt/ramlog

2./etc/fstab に tmpfs を登録

tmpfs  /mnt/ramlog  tmpfs  defaults,size=64m,mode=0755,uid=1000,gid=1000  0  0

3.SD側の保存先ディレクトリを作成

mkdir /home/pi/motion_log_backup

4.移動スクリプト

sudo vi /usr/local/bin/ramlog-sync.sh

内容:

#!/bin/bash
#!/bin/bash
/usr/bin/rsync -av --remove-source-files /mnt/ramlog/ /home/pi/motion_log_backup/
/usr/bin/find /mnt/ramlog -type f -empty -delete

実行権限:

sudo chmod +x /usr/local/bin/ramlog-sync.sh

5.systemd タイマー設定

sudo vi /etc/systemd/system/ramlog-sync.service

内容:

[Unit]
Description=Sync RAM log to SD
[Service]
Type=oneshot
ExecStart=/usr/local/bin/ramlog-sync.sh
sudo vi /etc/systemd/system/ramlog-sync.timer

内容:

[Unit]
Description=Run ramlog sync every 5 minutes
[Timer]
# 5分
OnCalendar=*:0/5
# 10秒
OnUnitActiveSec=10s

Persistent=true
[Install]
WantedBy=timers.target

サービスの反映:

sudo systemctl daemon-reload
sudo systemctl start ramlog-sync.service
sudo systemctl enable --now ramlog-sync.timer

6.効果

・USBを使わなくてもシステムが安定
・SDへの書き込みが「常時 → 5分に1回」に減少
・SDカードの寿命が大幅に延びる
・USB3.0フリーズ問題を根本的に回避できる
・USBメモリを使う場合はUSB2.0に挿すと安定性が高い

7.まとめ

USB3.0ポートでフリーズが発生するのは、電源ではなくUSB3.0コントローラの突入電流耐性が原因です。USB2.0ポートに挿すことで改善する場合もありますが、長期運用ではログをRAMに置き、まとめてSDへ書く構成が最も安定します。Raspberry Piを24時間運用する環境では特に効果が大きい方法です。