Raspberry Pi のmicroSDの寿命を延ばしてサーバを安定運用する

Raspberry Piで何かのサーバを作るのは非常に楽しいし、ロマンがあっていいですよね。ですが、よく考えて設定をしておかないと後々後悔することになるわけです。かくいう私が後悔したことが何回もあるのでこの設定の大切さを皆さんに少しでも知ってもらえると嬉しいですね。では始めていきます。ちなみにRaspbian(Raspberry Pi OS)についての話になります。

目次

サーバを襲う悲劇

ある日私が立てていた録画サーバを悲劇が襲いました。あるときに録画ができておらず、番組を取り損ねた上になんと番組表も見れなくなっていました。何か設定を間違えたのか、それとも、うまいこと番組表を見るためのサーバがうまく機能しなくなってしまったのか。これを特定する作業を始めました。するとメンテナンスをするべくSSH接続をしようとするとSSHにすらつながりません。これはRaspberry Piが止まってるよねということで、Raspberry Piを再起動。

おっ、番組表も映るし何か電圧が不安定になって、調子悪くなっただけだったのか。なんて思ったのもつかの間。ログをみているとENOENTというものがいっぱい出ています。なんだこれと思って調べてみると、簡単にいうとディレクトリやファイルがないことを示すとのこと。エラーメッセージをさかのぼると確かにディレクトリが書かれています。つい最近だし、もともと正しく動作していただろうしないってことはないと思うけどなぁというわけで、cdコマンドとlsコマンドを駆使してディレクトリを捜索。当然最近まで動いていただけあって、存在していました。となるとアクセスできないと仮定すれば権限の問題…?となり、何かの拍子で変わっていないかと以下のコマンドで権限を確認。

ls -l

これも正しく動作する権限になっています。とりあえず全員アクセスできるようにしてしまえ!ということでさらにディレクトリに対して以下のコマンドを入力して確認。

sudo chmod -R 777 /hoge/huga

権限は間違っていなかったので、当然ながらこれでも解消されないエラー。私の考えうる知識ではそろそろ限界が見えてきています。あと考えるのも面倒になってきてしまいました。こんな時にさっとOSを書き込みなおしたり、バックアップをそのまま焼いて復旧できるのがRaspberry PiのOSをmicroSDでインストールしているメリットが効いてきます。というわけで、当時どちらを選んだかを覚えていないのですが、OSの書き込み直しかバックアップイメージを直接ツールを使って焼こうとしました。すると途中でWindowsからこんなメッセージが出てきました。

巡回冗長検査(CRC)エラー

今までmicroSDでこんなエラー出たことないけど、HDDで面倒だったような…と思い、調べてみるとなんとmicroSDの寿命で不良セクタや、コントローラチップ、データチップあたりにエラーが出ていてどうしようもないといういこと。一言で言えば「microSDカードが壊れた」わけです。

なぜmicroSDが壊れる事態になったのか

知らない方が多いかとは思いますが、SDカードもはたまた最近主流のSSDもそうですが、NANDメモリなどを用いて作られる不揮発メモリというものには寿命があります。寿命のの長さは仕組みによってさまざまですが、microSDカードで主流のNANDチップというものは案外現実的な回数で寿命がきます。市販品のものだと同じ場所に1000回書き込むと壊れる程度の耐久性のものも多いです(もちろんものによります)。でも1000回も書き換えないよねって思う方も多いと思うのですが、案外そうでもありません。正しくは使い方によっては案外そうでもないというのが正しいですね。

例えばスマホに使った場合は写真を撮って、動画を撮って、音楽入れてみたいなあまり書き込んだ後に書き換えるなんてこと少ないかと思います。こういう使い方ならそうそう来ないでしょう。

しかしRaspberry PiのOSを書き込んだ場合はどうでしょうか。OSというものは案外いろんなデータを読み出しログを記録しています。ましてやサーバなどではアクセスログなど膨大なログを取っていたりもします。上述していますが、書き込み回数で寿命がある程度決まっているわけですが、データをこまめに書き足す、極端なことを言えばテキストファイルにに1を追加するのも書き込みです。ログファイルはこんな文字を追加していくような形で取られることが多いわけですが、書き込み回数で上限が決まるということは、こういったSDカードなどはこまめな書き込みを行うような使い方は非常に苦手です。しかしmicroSDカードにOSを書き込み、サーバを作るとなるとこの事態は避けようがなく、何も設定を行わなければ書き込みを繰り返され、そして一部の領域が破損し動作がおかしくなっていくというわけです。microSDカードにOSを書き込む以上は多少は仕方ないため、対策をして少しでも故障する確率を下げるしかありません。

寿命を延ばすための設定

これは録画サーバでもファイルサーバでもwebサーバでも割と共通した設定になっています。というのも、上述した細かな書き込みを苦手とするというのはほとんどがログファイルであることが多いです。それか一時データとかです。幸いにもこういったものを出力をするディレクトリというものはある程度決まっています。大体以下の2つのディレクトリです。

/tmp
/var/tmp 

あとはシステムが標準で出力するログというものもあるのですが、これは以下のファイルに記述があるので後で設定を行います。

/etc/rsyslog.conf

あとは「スワップ」という物理メモリが足りないときその物理メモリのデータを主記憶装置(Raspberry Piの場合はmicroSDカードのことです)に移動させる機能があります。これは、物理メモリがなくなる前に動作をするのですが、これを毎回されるとmicroSDにいっぱい書き込みを行ってしまうことになってしまいますので、この「スワップ」という機能を停止します。

では設定をしていってみましょう。初めに一時ファイルの場所を対策します。以下のようにコマンドを入力してください。

sudo nano /etc/fstab

この/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

これが何をしているかというと、次回以降の起動時に物理メモリ上に/tmpと/var/tmpに相当する領域を割り当てる指示を書いています。

今回はRaspberry Pi 3B+を使うので「size=」以降の部分を32MBとかにしていますが、Raspberry Pi 4B 4GBなので、メモリに余裕がある場合はもう少し大きくとったら安心かもしれません。

あとは現在ある同様のファイルを消さないと起動時にうまく動いてくれないので現在あるディレクトリを削除してしまいます。以下のコマンドを実行してください。

sudo rm -rf /tmp
sudo rm -rf /var/tmp

次にシステムログの出力設定をします。見ないなら全部出力しないようにしてもいいですね。以下のコマンドを実行してください。

sudo nano /etc/rsyslog.conf

色々表示されますが、以下のような記述になっている場所を探してください。

###############
#### RULES ####
###############

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                         /var/log/cron.log
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

# Logging for the mail system.  Split it up so that
# it is easy to write scripts to parse these files.
#
mail.info                       -/var/log/mail.info
mail.warn                       -/var/log/mail.warn
mail.err                        /var/log/mail.err

#
# Some "catch-all" log files.
#
*.=debug;\
        auth,authpriv.none;\
        news.none;mail.none     -/var/log/debug
*.=info;*.=notice;*.=warn;\
        auth,authpriv.none;\
        cron,daemon.none;\
        mail,news.none          -/var/log/messages

...

この場所を不要なら全部コメントアウト(先頭に#を付ける)してしまってください。必要なログがあるならそれは底しておきましょう。

全部コメントアウトするとこんな感じです。

###############
#### RULES ####
###############

#
# First some standard log files.  Log by facility.
#
#auth,authpriv.*                 /var/log/auth.log
#*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                         /var/log/cron.log
#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

# Logging for the mail system.  Split it up so that
# it is easy to write scripts to parse these files.
#
#mail.info                       -/var/log/mail.info
#mail.warn                       -/var/log/mail.warn
#mail.err                        /var/log/mail.err

#
# Some "catch-all" log files.
#
#*.=debug;\
 #       auth,authpriv.none;\
 #       news.none;mail.none     -/var/log/debug
#*.=info;*.=notice;*.=warn;\
#        auth,authpriv.none;\
#        cron,daemon.none;\
#        mail,news.none          -/var/log/messages

...

これでシステムログの設定は終わりなので、最後にスワップを停止させます。以下のコマンドを入力してください。

sudo swapoff --all
sudo systemctl stop dphys-swapfile

これでスワップも停止できました。これでOSで設定するべき設定は以上です。お疲れ様でした。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です