※この記事は公開から時間が経っているため、現在の環境とは内容が異なる場合があります。
Raspberry Piを動かすのに欠かせない SDカード。
OSも設定ファイルも、作ったプログラムも、基本的にはSDカードに保存されます。
ただ、SDカードには書き換え回数の上限があります。
すぐに壊れるものではありませんが、ログや一時ファイルの書き込みが多い状態で使い続けると、少しずつ負担がかかります。
そこで、Raspberry Pi Zero WHでSDカードへの書き込みをできるだけ減らす設定をしていきます。
この記事で行う主な内容は、次の3つです。

- スワップを無効化する
- 一時ファイルやログをtmpfsに置く
- 不要なログ出力を見直す
必須の設定ではありません。
メモリが少ない環境でスワップを無効化すると、動作が不安定になる場合もあります。
「SDカードへの書き込みを減らしたい」「Raspberry Piを長く使いたい」という場合に、内容を確認しながら試す設定です。
うさたんSDカードは大事な保存場所だから、できるだけ負担を減らしたいね。
まある設定を間違えないように、ひとつずつ確認しながら進めよう。
スワップを無効化する
まずは、スワップを無効化します。
スワップとは、メモリの容量が足りないときに、一時的にメモリの内容を保存しておく場所です。
メモリ(主記憶装置)は、処理中のデータを置いておく作業スペースです。
高速にアクセスできますが、電源を切るとデータは消えます。
よく、メモリは「机」や「作業台」に例えられます。
机の上に本やノートを広げて作業すると、効率よく進められます。
でも、机の上がいっぱいになったら、使っていないものをいったん本棚に戻したり、別の場所へ仮置きしたりします。

スワップは、机がいっぱいになったときに、本棚の一部を仮置き場として使うような仕組みです。
ただ、Raspberry Piの場合、その仮置き場がSDカード上に作られます。
そのため、スワップを多く使うとSDカードへの書き込みが増えます。
Raspberry Pi Zero WHで軽い用途に使う場合、スワップをあまり使っていないこともあります。
そこで、この設定ではスワップを無効化します。
現在のスワップを確認する
まず、現在のスワップの状態を確認します。
$ free -h (-h:読みやすい単位で表示)
Swap: 99M-h は、読みやすい単位で表示するオプションです。
この例では、スワップとして99MBが割り当てられていることが分かります。
chkconfigをインストールする
自動起動サービスの設定を行うchkconfig コマンドをインストールします。
$ sudo apt install chkconfigdphys-swapfileの状況を確認する
現在の dphys-swapfile の状況を確認します。
$ chkconfig dphys-swapfile --list
dphys-swapfile 0:off 1:off 2:on 3:ondphys-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カードへの書き込みを減らしたい場合は、不要なログを減らすことも効果があります。
ただし、ログを止めすぎると、不具合が起きたときに原因を調べにくくなります。
必要なログは残しつつ、不要なものだけ見直します。

/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-configBoot Options を選択します。

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

はい を選択します。

設定したら、再起動します。
$ 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 nasne1nasne側に保存用フォルダを作成する
Windowsパソコンからnasne上に、Raspberry Pi用のフォルダを作成します。
ここでは、nasneの share1 フォルダの下に raspi1 というフォルダを作成しています。
nasneのIPアドレスを調べる
Windowsのスタートメニューから、コマンドプロンプトを起動します。
ping nasne-xxxxxxnasne-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/nasne1Raspberry 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の環境設定はこちらです。

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

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


