Raspberry Pi B+ のSDカードの寿命を延ばすために
SDカードへの頻繁な書き換えを減らして寿命を延ばす
Raspberry Pi B+の起動ディスクはMicro SDカードです。御存知のとおり、SDカードを構成しているフラッシュメモリには書き換え回数に上限があります。そのため、SDカードは書き込む場所を全体に分散させる、つまり故意にフラグメントを発生させるような書き込みをして、書き換えが一箇所に集中することを避けるような工夫がされているそうです。それでも頻繁な書き換えをすると、寿命が短くなってしまうそうです。
これはSSDでも同じことが言えるのですが、SSDはSDカードに比べたら容量が一桁以上大きいために、デスクトップマシンの起動ディスクとして使う程度であれば、書き換え回数による寿命は問題にならないようです。
しかしRaspberry PiのSDカードは最低4GBで、ウチのRaspberry Pi B+で使っているのは32GBです。この程度の容量で24時間稼働させるのであれば、頻繁な書き換えが行われないよう対策を講じておいた方が良いらしいですね。
対策は以下の2つです。
- swapファイルを作成しないようにする
- 頻繁に書き換えられる場所をRAMディスクにする
参考にさせていただいたのは、以下のホームページです。
1. swapファイルを作成しないようにする
swapファイルは"/var/swap" だったかな?(消してしまったので忘れた^^;)動作メモリが不足すると、メモリページをswapファイルに追い出して空きメモリページを作る仕組み(仮想記憶)です。多くのプログラムを動かしたりして使用メモリ量が不足すると、この処理が頻繁に起こりswapファイルの書き換えが頻発するという次第。swapファイルを使うことで、搭載メモリ以上にメモリを消費する多くのプログラムを動かせるようになるのですが、swapが発生すると当然ながら性能が低下します(スローダウン)。
それにRaspberry Piでは、swapファイルは100MB程度しかなかったと思いました。(swapファイルのサイズ設定は"/etc/dphys-swapfile" に記述されているそうです。)と言うわけで、swapファイルを作らないようにしました。
- chkconfigをインストール
# apt-get update
# apt-get upgrade
# apt-get install chkconfig
|
- chkconfigでdphys-swapfileをオフにする
# chkconfig dphys-swapfile off
# chkconfig --list dphys-swapfile
dphys-swapfile 0:off 1:off 2:off 3:off 4:off 5:off 6:off
|
2. 頻繁に書き換えられる場所をRAMディスクにする
参考にさせていただいたホームページにあるよう、以下の場所をRAMディスクに置き換えました。
手順は以下のようになります。
/etc/fstab を書き換える
/etc/rsyslog.conf を編集して、ログファイルの書き出しを最小限にする
- RAMディスクにするディレクトリ(マウントポイント)配下にあるファイル、ディレクトリは消してしまう
- /var/log内にディレクトリが無いと起動できないデーモンのために、ブート時に必要なディレクトリ、ファイルを作成するスクリプトを作る
1) /etc/fstabを書き換える
/etc/fstab を以下のように編集し、/tmp, /var/tmp, /var/log にRAMディスクがマウントされるようにしました。
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, so no using swapon|off from here on, use dphys-swapfile swap[on|off] for that
#
# tmp files put on RAM disk
tmpfs /tmp tmpfs defaults,size=32m,noatime,mode=1777 0 0
tmpfs /var/tmp tmpfs defaults,size=16m,noatime,mode=1777 0 0
#
# Log files write on RAM disk
tmpfs /var/log tmpfs defaults,size=32m,noatime,mode=0755 0 0
|
2) /etc/rsyslog.confを編集して、ログファイルの書き出しを最小限にする
/etc/rsyslog.conf を以下のように編集(コメントアウト)して、ログファイルの書き出しを抑えます。
# /etc/rsyslog.conf Configuration file for rsyslog.
#
〜略〜
###############
#### 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
#
# Logging for INN news system.
#
#news.crit /var/log/news/news.crit
#news.err /var/log/news/news.err
#news.notice -/var/log/news/news.notice
#
# 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:*
#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
#daemon,mail.*;
# news.=crit;news.=err;news.=notice;
# *.=debug;*.=info;
# *.=notice;*.=warn /dev/tty8
| |
3) RAMディスクにするディレクトリ(マウントポイント)配下にあるファイル、ディレクトリは消してしまう
RAMディスクにするディレクトリ(マウントポイント)の配下には、既に幾つかのファイルやディレクトリが作成されています。その場所にRAMディスクがマウントされると、それらのファイルやディレクトリは用が無くなるのでRAMディスクがマウントされる前に削除しておきます。
4) /var/log内にディレクトリが無いと起動できないデーモンのために、ブート時に必要なディレクトリ、ファイルを作成するスクリプトを作る
/var/log配下にログファイルを出力するデーモンやプログラムの中には、事前にディスクやフォルダが作られていないと起動しないものがあるので、/var/log配下にディスクやフォルダを作成するスクリプトを作ります。/etc/rc.local ファイルで行う方法もあるようですが、このスクリプトファイルは /etc/rc?.d/内のスクリプトを実行させた後で呼び出されるようです。そのため、/etc/rc?.d/内にログファイルが出力できないと起動しないものがあると、そのプログラムやデーモンはブート時に自動起動しないことになります。典型的なのがApache2でした。
そのため、/var/log配下に必要なディレクトリやファイルを作るスクリプトを作成し、/etc/rc?.d/の最初の方で呼び出されるようにしました。
作成したスクリプトは以下です。
#!/bin/bash
#
### BEGIN INIT INFO
# Provides: make-varlog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Required-Start:
# Required-Stop:
# Short-Description: Create /var/log/... files on tmpfs at startup
# Description: Create /var/log/... files needed by system daemon
### END INIT INFO
#
# main()
#
case "${1:-''}" in
'start')
##########################################################
# prepare /var/log subdir for ramdisk init on every boot #
##########################################################
mkdir -p /var/log/ConsoleKit
mkdir -p /var/log/apache2
mkdir -p /var/log/samba
mkdir -p /var/log/fsck
mkdir -p /var/log/mrtg
mkdir -p /var/log/apt
mkdir -p /var/log/ntpstats
chown root.adm /var/log/apache2
chmod 750 /var/log/apache2
chown root.ntp /var/log/ntpstats
chown root.adm /var/log/samba
chown root.adm /var/log/mrtg
chown ntp.ntp /var/log/ntpstats
#
# Create Lastlog, wtmp, btmp, apache2 when boot
#
touch /var/log/lastlog
touch /var/log/wtmp
touch /var/log/btmp
touch /var/log/apache2/access.log
touch /var/log/apache2/error.log
touch /var/log/apache2/other_vhosts_access.log
touch /var/log/apache2/ssl_access.log
chown root.utmp /var/log/lastlog
chown root.utmp /var/log/wtmp
chown root.utmp /var/log/btmp
chown root.adm /var/log/apache2/access.log
chmod 640 /var/log/apache2/access.log
chown root.adm /var/log/apache2/error.log
chmod 640 /var/log/apache2/error.log
;;
'stop')
;;
'restart')
;;
'reload'|'force-reload')
;;
'status')
;;
*)
echo "Usage: $0 start"
exit 1
;;
esac
exit 0
|
このファイルを/etc/init.d/make-varlog という名前で置きました。その後、
# chmod +x /etc/init.d/make-varlog
# update-rc.d make-varlog defaults
# chkconfig --list make-varlog
make-varlog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# ls -l /etc/rc2.d/*
〜略〜
lrwxrwxrwx 1 root root 21 11月 12 16:50 /etc/rc2.d/S01make-varlog -> ../init.d/make-varlog
|
として、作成したmake-varlogスクリプトがインストールされた事を確認しました。
これでRaspberry Piを再起動した後、不要になったswapファイルを削除したら完了。RAMディスクがマウントされ、/var/log/にディレクトリやファイルがちゃんと出来ていればOK。
|