ラズベリーパイ(Raspberry Pi Zero WH)でSDカードの寿命を延ばす設定

赤いケースに入ったRaspberry Pi Zero WHとmicroSDカードを並べ、SDカードの寿命を延ばす設定として書き込みを減らすことを説明したアイキャッチ

Raspberry Piを動かすのに欠かせない SDカード

OSも設定ファイルも、作ったプログラムも、基本的にはSDカードに保存されます。

ただ、SDカードには書き換え回数の上限があります。

すぐに壊れるものではありませんが、ログや一時ファイルの書き込みが多い状態で使い続けると、少しずつ負担がかかります。

そこで、Raspberry Pi Zero WHでSDカードへの書き込みをできるだけ減らす設定をしていきます。

この記事で行う主な内容は、次の3つです。

スワップを無効化、tmpfsを使う、不要なログを見直すという3つの設定でSDカードへの書き込み回数を減らす流れを説明した図
  • スワップを無効化する
  • 一時ファイルやログをtmpfsに置く
  • 不要なログ出力を見直す

必須の設定ではありません。

メモリが少ない環境でスワップを無効化すると、動作が不安定になる場合もあります。

「SDカードへの書き込みを減らしたい」「Raspberry Piを長く使いたい」という場合に、内容を確認しながら試す設定です。

うさたん

SDカードは大事な保存場所だから、できるだけ負担を減らしたいね。

まある

設定を間違えないように、ひとつずつ確認しながら進めよう。

目次

スワップを無効化する

まずは、スワップを無効化します。

スワップとは、メモリの容量が足りないときに、一時的にメモリの内容を保存しておく場所です。

メモリ(主記憶装置)は、処理中のデータを置いておく作業スペースです。

高速にアクセスできますが、電源を切るとデータは消えます。

よく、メモリは「机」や「作業台」に例えられます。

机の上に本やノートを広げて作業すると、効率よく進められます。

でも、机の上がいっぱいになったら、使っていないものをいったん本棚に戻したり、別の場所へ仮置きしたりします。

メモリとSDカードの違いを机と本棚にたとえ、スワップの仕組みを説明した図

スワップは、机がいっぱいになったときに、本棚の一部を仮置き場として使うような仕組みです。

ただ、Raspberry Piの場合、その仮置き場がSDカード上に作られます。

そのため、スワップを多く使うとSDカードへの書き込みが増えます。

Raspberry Pi Zero WHで軽い用途に使う場合、スワップをあまり使っていないこともあります。

そこで、この設定ではスワップを無効化します。

現在のスワップを確認する

まず、現在のスワップの状態を確認します。

$ free -h (-h:読みやすい単位で表示)
Swap: 99M

-h は、読みやすい単位で表示するオプションです。

この例では、スワップとして99MBが割り当てられていることが分かります。

chkconfigをインストールする

自動起動サービスの設定を行うchkconfig コマンドをインストールします。

$ sudo apt install chkconfig

dphys-swapfileの状況を確認する

現在の dphys-swapfile の状況を確認します。

$ chkconfig dphys-swapfile --list
dphys-swapfile 0:off 1:off 2:on 3:on

dphys-swapfileを無効化する

dphys-swapfile を無効化します。

$ sudo chkconfig dphys-swapfile off

もう一度確認します。

$ chkconfig dphys-swapfile --list
dphys-swapfile 0:off 1:off 2:off 3:off

これで、dphys-swapfile が無効化できました。

スワップが0になったか確認する

もう一度、スワップの状態を確認します。

$ free -h
Swap: 0B

スワップが0になっていればOKです。

ただし、メモリ不足が起きる使い方をする場合は、スワップを無効化しないほうが安定することもあります。

Raspberry Piで重い処理をする場合は、実際の使い方に合わせて判断してください。

一時ファイルとログファイルをメモリ上に出力する

次に、一時ファイルとログファイルを、SDカードではなくメモリ上に作るようにします。

使うのは tmpfs です。

tmpfsは、メモリ上に作成できるファイルシステムです。

この記事では、次の領域をtmpfsにします。

  • /tmp
  • /var/tmp
  • /var/log

テンポラリ領域の /tmp/var/tmp、ログファイルの /var/log をメモリ上に置くことで、SDカードへの書き込みを減らします。

ただし、tmpfsはメモリ上にあるため、再起動すると中身が消えます。

そのため、ログを長期間保存したい用途には向きません。

現在のディスク使用状況を確認する

まず、dfコマンド(ディスクの空き容量を表示)で、現在の状況を確認します。

$ df -h     (-h:読みやすい単位で表示)
ファイルシス         サイズ  使用    残り  使用% マウント位置
/dev/root                30G  5.6G   23G   20%  /
devtmpfs              181M       0  181M    0%  /dev
tmpfs                   186M       0  186M    0%  /dev/shm
tmpfs                   186M  5.1M  180M    3%  /run
tmpfs                    5.0M  4.0K  5.0M    1%  /run/lock
tmpfs                   186M       0  186M    0%  /sys/fs/cgroup
/dev/mmcblk0p1           44M   23M   22M   51%  /boot
tmpfs                    37M       0   37M    0%  /run/user/1000

/etc/fstabを編集する

どのようにマウントするかは、/etc/fstab というファイルに記述します。

マウントとは、ツリー構造のどこかに、記憶媒体をディレクトリとして登録することです。

ファイルの最後に、次の3行を追加します。

各フィールドの空白は、スペースまたはタブで区切ります。

$ sudo vi /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
tmpfs  /var/log  tmpfs  defaults,size=32m,noatime,mode=0755  0  0

ここで設定している内容は、ざっくりいうと次のような意味です。

  • /tmp をtmpfsにする
  • /var/tmp をtmpfsにする
  • /var/log をtmpfsにする
  • noatime でアクセス時刻の更新を抑える
  • size で使用するメモリ容量の上限を決める
  • mode で権限を指定する

/etc/fstab は起動時に読み込まれる重要な設定ファイルです。

入力ミスがあると起動時に問題が起きる場合があるため、慎重に編集します。

正しくマウントされているか確認する

設定後、再起動してから、もう一度 df -h で確認します。

$ df -h
ファイルシス   サイズ  使用    残り  使用% マウント位置
・・・
tmpfs             32M    156K   32M    1%   /var/log
tmpfs             16M       0   16M    0%   /var/tmp
tmpfs             32M    4.0K   32M    1%   /tmp

/tmp/var/tmp/var/log がtmpfsとして表示されていればOKです。

不要なログを停止する

次に、不要なログを停止します。

Raspberry Piは、システムの状態やエラーなどをログとして記録します。

ログはトラブル調査には大切ですが、使い方によっては不要なログもあります。

SDカードへの書き込みを減らしたい場合は、不要なログを減らすことも効果があります。

ただし、ログを止めすぎると、不具合が起きたときに原因を調べにくくなります。

必要なログは残しつつ、不要なものだけ見直します。

tmpfsにマウントし、不要なログを削減し、起動時にログディレクトリを復元して、動作確認する流れを説明した図

/etc/rsyslog.confを編集する

/etc/rsyslog.conf を編集します。

不要なログの行頭に # を付けてコメントアウトします。

$ sudo vi /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

#
# Emergencies are sent to everybody logged in.
#
*.emerg                         :omusrmsg:*

この例では、一部のログ出力をコメントアウトしています。

どのログを止めるかは、使い方によって変わります。

よく分からない場合は、無理に止めすぎず、必要最小限の変更にしておくほうが安心です。

復元スクリプトを設置する

/var/log をtmpfsにすると、再起動のたびに中身が消えます。

つまり、ログファイルやログ用のディレクトリも消えます。

そこで、起動時に必要になる /var/log のディレクトリ構成を復元するスクリプトを設置します。

/etc/rc.local を編集します。

$ sudo vi /etc/rc.local
・・・
mkdir -p /var/log/apt
mkdir -p /var/log/fsck
mkdir -p /var/log/ntpstats
mkdir -p /var/log/samba
chown root.ntp /var/log/ntpstats
chown root.adm /var/log/samba

touch /var/log/btmp
touch /var/log/lastlog
touch /var/log/wtmp

chown root.utmp /var/log/btmp
chown root.utmp /var/log/lastlog
chown root.utmp /var/log/wtmp

exit 0

ここで使っているコマンドは、次のような意味です。

  • mkdir -p:必要なディレクトリを作成する
  • touch:空のファイルを作成する
  • chown:ファイルやディレクトリの所有者を変更する

/var/log/ntpstats は、NTP(Network Time Protocol)機能のログです。

fsck は、主にUNIX系OSで使われるファイルシステムチェック用のコマンド・プログラムです。

外部記憶装置のファイルシステムの状態を調べたり、修復したりするために使われます。

rc.local を有効にします

Raspberry Pi起動時に、rc.local が実行されるように設定します。

raspi-config を起動します。

$ sudo raspi-config

Boot Options を選択します。

raspi-configのBoot Optionsを選択している画面

Wait for Network at Boot を選択します。

raspi-configでWait for Network at Bootを選択している画面

はい を選択します。

起動時にネットワーク接続を待つか確認するraspi-configの画面

設定したら、再起動します。

$ sudo reboot

再起動後、/var/log の下に必要なログ用ディレクトリやファイルができていることを確認します。

pi@raspberrypi:~ $ ls -la /var/log/
・・・
drwxr-xr-x  2 root root       40 10月 31 16:37 apt
-rw-------  1 root utmp        0 10月 31 16:37 btmp
drwxr-xr-x  2 root root       40 10月 31 16:37 fsck
drwxr-xr-x  2 root root       40 10月 31 16:37 ntpstats
drwxr-xr-x  2 root root       40 10月 31 16:37 samba
-rw-rw-r--  1 root utmp     2304 10月 31 16:42 wtmp

ここまで確認できれば、/var/log をtmpfsにしつつ、起動時に必要なログ用ディレクトリを復元できています。

なお、ext4ファイルシステムのジャーナルを無効化する方法もあります。

ただ、不具合が発生したという情報もあったため、この設定では行っていません。

SDカードへの書き込みを減らす設定は便利ですが、安定性とのバランスも大切です。

寿命を延ばす方法(運用編)

ここまでは、Raspberry Pi側の設定で書き込みを減らす方法を紹介しました。

ここからは、運用面でSDカードへの書き込みを減らす方法です。

RAMディスクを使用する

プログラムの一時データ置き場として、容量が可変のtmpfsを使う方法があります。

tmpfsは標準で /dev/shm にマウントされています。

処理中の一時データをメモリ上に置き、必要なタイミングで外部のストレージに保存するようにすれば、SDカードへの書き込みを減らせます。

たとえば、

  • センサーの一時データ
  • 処理途中の画像
  • 一時的なログ
  • すぐ消してもよい中間ファイル

などは、SDカードに直接書き込まず、メモリ上で扱える場合があります。

ただし、メモリ上のデータは電源を切ると消えます。

大切なデータは、定期的に外部ストレージやNASなどへ保存する必要があります。

外部ストレージやNASをマウントする

次に、データを保存するために外部ストレージをマウントします。

USB接続のハードディスクも使えますが、ここではネットワーク上で動いているnasneに接続しています。

nasneは、テレビチューナーが付いたネットワーク接続型のハードディスクです。

パソコンやスマホからテレビ番組を録画したり見たりできる機器ですが、簡易NASのようにファイル置き場として使うこともできます。

詳しくはこちらの記事でも紹介しています。

Windowsとファイルを共有する仕組みとしてはSambaが有名ですが、ここではCIFSを使って接続しています。

CIFSは、Windowsのファイル共有で使われるSMBをもとにした仕組みです。

cifs-utilsを確認する

Raspberry Pi Zero WHに、CIFSを扱うための cifs-utils が入っているか確認します。

pi@raspberrypi:~ $ dpkg -l | grep cifs
ii cifs-utils 2:6.7-1 armhf Common Internet File System

もし入っていない場合は、インストールします。

sudo apt install cifs-utils

マウントポイントを作成する

Raspberry Pi側に、マウントポイントを作成します。

$ sudo mkdir /mnt/nasne1

権限を変更します。

pi@raspberrypi:/mnt $ sudo chmod 777 /mnt/nasne1

確認します。

pi@raspberrypi:/mnt $ ls -la
・・・
drwxrwxrwx  2 root root 4096 11月  1 10:18 nasne1

nasne側に保存用フォルダを作成する

Windowsパソコンからnasne上に、Raspberry Pi用のフォルダを作成します。

ここでは、nasneの share1 フォルダの下に raspi1 というフォルダを作成しています。

nasneのIPアドレスを調べる

Windowsのスタートメニューから、コマンドプロンプトを起動します。

ping nasne-xxxxxx

nasne-xxxxxx の部分には、nasne底面に記載されたファイルサーバー名を入れます。

CIFSでマウントする

調べたnasneのIPアドレスを指定してマウントします。

$ sudo mount -t cifs //192.168.x.xx/share1/raspi1 /mnt/nasne1 -o sec=none,vers=1.0

オプションの意味は、次の通りです。

  • -t cifs:ファイルシステムはCIFS
  • -o sec=none:アカウント・パスワードなしで接続
  • vers=1.0:CIFSのバージョン1.0を指定

(この環境では、vers=1.0 を指定しないとエラーになりました。2.0も3.0もだめでした。)

ただし、SMB/CIFSのバージョンや認証方式は、NASやOSの設定によって異なります。

現在の環境では、SMB1.0が無効になっている場合や、パスワード認証が必要な場合もあります。

実際に設定するときは、使っているNASや共有フォルダの仕様に合わせて確認してください。

アンマウントする

マウントを解除する場合は、次のコマンドを使います。

$ sudo umount /mnt/nasne1

起動時に自動でマウントする

起動時に自動でマウントさせたい場合は、/etc/fstab に追記します。

$ sudo vi /etc/fstab
//192.168.x.xx/share1 /mnt/nasne1 cifs
username=pi,password=,vers=1.0,iocharset=utf8,uid=1000,gid=1000,forceuid,forcegid,_netdev 0 0

この設定も、環境によって書き方が変わる場合があります。

特にパスワードや共有名を直接書く場合は、セキュリティ面にも注意してください。

マウントできているか確認する

マウントできているか確認します。

pi@raspberrypi:~ $ df -h
ファイルシス                         サイズ 使用  残り 使用% マウント位置
...
//192.168.x.xx/share1/raspi1         930G 196G 735G 22% /mnt/nasne1

Raspberry PiとWindowsパソコンの両方からアクセスして、ファイルの書き込みができることを確認します。

これで、大きなデータや長く残したいデータを、SDカードではなく外部ストレージ側へ保存しやすくなります。

参考にさせていただいたサイト

こちらのサイトを参考にさせていただきました。ありがとうございました。

Raspberry Pi 2 Model B でSDカード寿命を延ばすためにRAMディスクを使う
Raspbian Jessie Lite の SDカード 延命化
Raspberry Pi Zeroから自宅のNASにアクセスしてみよう
WindowsとLinuxでCIFSを使って簡単にファイル共有する方法
Raspberry piにNASをマウントした時の覚書
SONYのnasneをLinuxにマウントする方法
aptコマンドとdpkgコマンドの使い方と活用例と違い

まとめ

Raspberry Pi Zero WHで、SDカードへの書き込み回数を減らすための設定を紹介しました。

今回行った主な内容は、次の通りです。

  • スワップを無効化する
  • /tmp/var/tmp/var/log をtmpfsにする
  • 不要なログ出力を見直す
  • 起動時にログ用ディレクトリを復元する
  • 一時データはRAMディスクを使う
  • 大きなデータは外部ストレージやNASに保存する

これらの設定を行うことで、SDカードへの書き込みを減らし、SDカードを長く使いやすくなります。

一方で、tmpfsに置いたデータは再起動すると消えます。

また、ログを減らしすぎると、トラブル時の原因調査がしにくくなる場合もあります。

SDカードを守ることと、安定して使うことのバランスを見ながら設定するのが大切です。

センサーの値をたくさん保存したり、写真や動画など大きなファイルを扱ったりする場合は、SDカードだけに書き込むのではなく、外部ストレージやNASも組み合わせると安心です。

Raspberry Pi Zero WHの初期設定はこちらです。

Raspberry Pi Zero WHの環境設定はこちらです。

ラズベリーパイの概要はこちらです。

制作ノート全体はこちらです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次