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

2019/11/19

t f B! P L
ラズベリーパイを動かすのに不可欠なSDカード

書き換え回数に上限があるんですよね。

種類にもよりますが、1万回くらいが書き換えの寿命だとか。

貧乏性なので、なるべくSDカードをながく使いたい! と思います。

そこで、SDカードの寿命を延ばすべく、できるだけ書き込み回数を減らす設定をしていきます。

もしかしたら、エラーの原因になってしまうかもしれませんし、必須の設定ではないので、トライしたいっ! という方だけ見ていただけたらと思います。

スワップを無効化

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

スワップとは、メモリの容量が足りないときに、一時的にメモリの内容を保存しておく場所です。
メモリ(主記憶装置)とは、処理をするときに使うデータをおいておく場所です。

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

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

机の上に本を広げて、作業すると効率良く速く作業できます。

でも、必要な本が机の上になければ、本棚(SDカードなどのストレージ)までとりにいって、机に広げなおさなければならないので、時間がかかってしまいます。
swap
スワップは、机がいっぱいになったら、本棚の一部に仮置きするような感じです。

結局、本棚までデータをとりにいかなければならないので、そんなに速くはなりません。
ラズベリーパイの場合、そんなにスワップを使っていませんし、SDカードに書き込むことになるので無効にします。

現在のスワップを確認すると、99MBあてられていることが分かります。
$ free -h  (-h:読みやすい単位で表示)
Swap: 99M
自動起動サービスの設定を行うchkconfigコマンドをインストールします。
$ sudo apt install chkconfig
現在のdphys-swapfileの状況を確認します。
$ chkconfig dphys-swapfile --list
dphys-swapfile 0:off 1:off 2:on 3:on
dphys-swapfile を無効化します。
$ sudo chkconfig dphys-swapfile off
もう一度確認すると、dphys-swapfile が無効化できました。
$ chkconfig dphys-swapfile --list
dphys-swapfile 0:off 1:off 2:off 3:off
スワップが0になっていることが確認できます。
$ free -h
Swap: 0B

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

テンポラリ領域の /tmp /var/tmp 、ログファイルの /var/log が、メモリ上のファイルシステム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
どのようにマウントするかを記述する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
dfコマンドで正しくマウントされていることを確認します。
$ df -h
ファイルシス   サイズ  使用    残り  使用% マウント位置
・・・
tmpfs             32M    156K   32M    1%   /var/log
tmpfs             16M          0   16M    0%   /var/tmp
tmpfs             32M     4.0K   32M    1%   /tmp
マウントとは、ツリー構造のどこかに、記憶媒体をディレクトリとして登録することです。
tmpfsは、メモリ上に作成できるファイルシステムです。日経XTECHのサイトで詳しく解説されています。

不要なログを停止する

/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 の ディレクトリ構成を復元するスクリプトを設置します。
/etc/rc.localexit 0 の前に、次の内容を追記します。
$ 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
fsckは、主にUNIX系OSで用いられるコマンドおよびプログラムの一つで、外部記憶装置(ストレージ)のファイルシステムの状態を調べたり修復したりするためのものです。
/var/log/ntpstats は、NTP(Network Time Protocol)機能のログです。
mkdir -p コマンドは、サブディレクトリごとディレクトリを作成します。
touchコマンドは、ファイルのタイムスタンプを変更します。また、新規で空のファイルを作成します。
chownコマンドは、ファイルやディレクトリの所有者を変更します。

rc.local を有効にします

ラズベリーパイ 起動時に、rc.local が起動されるように設定します。
raspi-config を起動します。
$ sudo raspi-config
[Boot Options]を選択します。

boot-options

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

boot-options2


[はい] を選択します。

boot-options


再起動します。
$ 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
*ext4 ファイルシステム の ジャーナル を 無効化するという方法もありましたが、不具合が発生したという情報もあったので今回はやめておきます。

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

RAMディスクを使用する

プログラムの一時データ置き場として、容量が可変のtmpfs(標準で/dev/shmにマウントされている)を使用するようにします。

そして、一定時間ごとに電源を切ってもデータが消えない外部のハードディスクなどに書き出すようにしたいと思います。

ちなみに、一般的なUSBメモリの寿命はおよそ1~2年。外部接続のSSDやSDカードも頻繁に書き込むと壊れるので注意です。

ハードディスクをマウント

つぎにデータを保存するために外部のハードディスクをマウントしたいと思います。

USB接続のハードディスクもいいのですが、せっかく小さいRaspberry Pi Zero WHを身軽に動かしたいので、いつも家のネットワーク上で動かしているnasneに接続したいと思います。

nasneは、テレビチューナーがついたハードディスクでネットワークにつないで使います。パソコンやスマホからテレビ番組を録画したり観たりできてとっても重宝しています。

プレイステーション対応の機器ですが、わが家のようにプレステがなくても活躍しています。
(普通のハードディスクをネットワークにつないで使うのもいいと思います。)

Windowsとファイルを共有する仕組みとしては、Sambaが有名ですがCIFSの方が簡単という情報があったので、今回はこちらを試してみます。

CIFSとは、Windowsのファイル共有サービスで利用されている通信プロトコルSMBを拡張し、Windows以外のOSやアプリケーションソフトでも利用できるよう仕様を公開したもの。
  引用元:IT用語辞典 e-Words

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

ラズベリーパイに、マウントポイントを作成します。
$ 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

Windowsのパソコンからnasne上にマウントさせるフォルダを作成します。

nasneの「share1」フォルダの下に「raspi1」というフォルダを作成しました。

nasneのIPアドレスを調べます。

Windowsのスタートメニューから、[Windowsシステムツール]-[コマンドプロンプト]を起動し、次のコマンドを入力します。
ping nasne-xxxxxx(nasne 底面に記載されたファイルサーバー名)

調べた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を指定
    (バージョンの指定を1.0にしないとエラーになりました。2.0も3.0もだめでした。)
アンマウント(マウントの解除)する場合はこちらのコマンドです。
$ 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 PCの両方からアクセスして、ファイルの書き込みができることを確認します。

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

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

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コマンドの使い方と活用例と違い

まとめ

スワップやログの設定変更と運用面の両方から、SDカードへの書き込み回数を減らす方法の紹介をしました。

これで、センサーの値をたくさん保存したり、写真や動画など大きなファイルを扱う場合も、SDカードの心配はしなくて済みそうです。

小さなRaspberry Pi Zero WHの可能性が、格段に広がったのではないでしょうか。

今後、不具合が起きないか注意しながら、いろいろな工作に挑戦していきたいと思います。

このブログを検索

プロフィール


こんにちは!
小学生の男の子 2人のママです。

ラズベリーパイを使った簡単な電子工作とプログラミングに挑戦しています。

よかったら、詳しいプロフィールも見てください。

QooQ