Raspberry Pi の起動ストレージ(SD/SSD/USBメモリ)の寿命を伸ばす

create
2021年09月24日
update
2021年09月24日

Table 1. 環境
Version

Raspberry Pi 4B

4GB

Raspberry Pi OS Lite

Debian 10 (buster) 64bit

🥧はじめに

Raspberry Pi 4B で、起動ストレージへの書き込みを抑えて寿命を伸ばすために行ったことの備忘録。

🗃️スワップの調整

スワップはストレージの予約領域で読み書きを行うため、理論的には無効化したほうがストレージ寿命を伸ばせる。

ただし、

  • スワップはメモリの利用について最適化する

  • 無効化するとシステムが不安定になる恐れがある

という点から、無効化ではなくサイズを調整する方法をとった。

Example 1. スワップサイズの変更
推奨サイズについて
サーバーとしての利用&メモリ 2GB 以上 → とりあえずメモリの半分でいい(参考:SwapFaq - Community Help Wiki)。
あとはシステムの利用状況を見て増減しておく。

変更する場合は /etc/dphys-swapfile ファイルを修正する。

/etc/dphys-swapfile
CONF_SWAPSIZE=100   (1)
CONF_SWAPFILE=/var/swap     (2)
1 MB 単位でスワップサイズを指定。
👉 推奨サイズと異なるが、現在システムがメモリをほとんど使ってないので少なくしている。
2 USBや外付けドライブにスワップファイルを保存したい場合はここのパスを変更する。
変更したスワップ設定を適用
sudo service dphys-swapfile restart
スワップの確認
swapon --show=NAME,TYPE,SIZE,USED
NAME      TYPE SIZE USED
/var/swap file 100M   0B

🔪マウントオプションから atime を除外する

atime だと頻繁に書き込み処理が発生するため、代わりに noatimerelatime を使用する。

ただ、最初から noatime に設定されているかも。

マウントオプションの確認
findmnt --target /
TARGET SOURCE    FSTYPE OPTIONS
/      /dev/sda2 ext4   rw,noatime
Example 2. /etc/fstab からマウントオプションを変更
/etc/fstab のサンプル
# Use noatime option
tmpfs   /tmp            tmpfs   rw,async,nodev,nosuid,noatime,size=256M,mode=0777               0 0
tmpfs   /var/log        tmpfs   rw,async,noexec,nodev,nosuid,noatime,size=64M,mode=0755         0 0
アクセス日時情報について
atime

ファイルが読み込まれる度にアクセス日時を書き込む。

noatime

アクセス日時を一切書き込まない。

relatime

ファイルに変更があった時だけアクセス日時を書き込む。
noatime ではうまく動かないプログラムがある場合に有効。

📊ログ

tmpfs を使ってメモリ上にログを出力する

事あるごとにログをストレージに書き込むことを止めさせ、代わりにメモリ上へ出力するようにさせる。
👉 /var/log(とついでに /tmp)を tmpfs でマウントすればいい。

この作業を行うと電源を落とす度にログが消えてしまうことに注意する。

やっぱりログを保存しておきたいという場合は、以下のような方法が考えられる。

  • rsyslog サーバーを構築して、そこへログを転送させる

  • ログ保存用のUSBメモリとかを用意して、そこへログを出力する

  • Logwatch などのログ収集ツールを使う。

Example 3. tmpfs としてマウントさせる設定

/var/log/tmptmpfs としてマウントするよう設定変更する。

/etc/fstab に下記を追記
### ADD custom tmpfs
tmpfs /tmp      tmpfs  rw,async,nodev,nosuid,noatime,size=256M,mode=0777        0 0
tmpfs /var/log  tmpfs  rw,async,noexec,nodev,nosuid,noatime,size=64M,mode=0755  0 0
ログのバックアップを取っておく
sudo tar \      (1)
    -czf /var/early-logs.tar.gz \
    --directory=/var/log .
sudo rm -rf /var/log/*      (2)
1 現在の /var/log を圧縮してバックアップする。
2 バックアップ後、/var/log を空にする。
👉 空ディレクトリ以外に tmpfs をマウントしようとするとエラーが発生するため。
Example 4. systemdサービスの修正
エラー対策に rsyslog.service を修正
sudo systemctl edit rsyslog.service
[Unit]
After=local-fs.target   (1)
1 fstab の処理が終わってから rsyslog.service が起動するように修正。
修正した設定を適用
sudo systemctl daemon-reload

上記設定後、再起動して適用する。

再起動して設定を適用
sudo reboot

findmnt --target /var/log   (1)
TARGET   SOURCE FSTYPE OPTIONS
/var/log tmpfs  tmpfs  rw,nosuid,nodev,noexec,noatime,size=65536k,mode=755
1 /var/log のマウントオプションが変更されているか確認。

ログの出力を抑制

rsyslog 設定を修正
sudo cp /etc/rsyslog.conf{,.bk}
sudo nano /etc/rsyslog.conf
デバッグ情報とプリンタ・メールのログは出力しない
diff -U 0 --label before --label after /etc/rsyslog.conf{.bk,}
--- before
+++ after
@@ -62 +62 @@
-*.*;auth,authpriv.none         -/var/log/syslog
+*.info;auth,authpriv.none      -/var/log/syslog
@@ -64,5 +64,5 @@
-daemon.*                       -/var/log/daemon.log
-kern.*                         -/var/log/kern.log
-lpr.*                          -/var/log/lpr.log
-mail.*                         -/var/log/mail.log
-user.*                         -/var/log/user.log
+daemon.warn                    -/var/log/daemon.log
+kern.warn                      -/var/log/kern.log
+#lpr.*                         -/var/log/lpr.log
+#mail.*                        -/var/log/mail.log
+user.warn                      -/var/log/user.log
@@ -74 +74 @@
-mail.info                      -/var/log/mail.info
+#mail.info                     -/var/log/mail.info
@@ -81,3 +81,3 @@
-*.=debug;\
-       auth,authpriv.none;\
-       news.none;mail.none     -/var/log/debug
+#*.=debug;\
+#      auth,authpriv.none;\
+#      news.none;mail.none     -/var/log/debug
変更したログ設定を適用
sudo service rsyslog restart

systemd の journal ログ

デフォルトで /run/log/journal に保存される。
/runtmpfs なので、何もする必要がない。そのままでOK。

findmnt --target /run/log/journal
TARGET SOURCE FSTYPE OPTIONS
/run   tmpfs  tmpfs  rw,nosuid,nodev,mode=755