Raspberry PiでMicroSDカード寿命を延ばすためにRAMディスクを使う anchor.png

MicroSDカードやSDカードは,NANDフラッシュが使われていて,このNANDフラッシュには書き換え寿命が存在する。

Raspberry PiはOSをSDカードに書き込んで利用しているため,数ヶ月から1年程度でMicroSDカードやSDカードが寿命で使えなくなってしまう。

対策で考えられるのは,

  1. swapを使わないようにする
  2. 頻繁に書き換えられる場所を,RAMディスクにする
  3. ルートファイルシステムをRAM上で運用する
  4. 別のメディア等に定期的にバックアップを取る
    壊れたらバックアップしたSDカードに入れ替える。
  5. Networkブートにし,ストレージとしてSD/MicroSDカードは使わない
  6. SDカードのファイルシステムをRead-Onlyな読み込み専用にする

などが考えられます。

そこで,SD/MicroSDカードの寿命を伸ばすため,とりあえずswapを使わないようにし,ログファイルをRAM Disk化して,出来るだけSD/MicroSDカードへの書き込み回数を減らすようにしてみる。

以下は,Raspbian Jessie/Stretchを使用している場合。

Page Top

SWAPを使わないようにする anchor.png

freeコマンドでswapサイズを確認してみる。

$ free
              total       used       free     shared    buffers     cached
Mem:        750632     523468     227164       5460      53252     361196
-/+ buffers/cache:     109020     641612
Swap:       102396          0     102396

と,スワップファイルとして100MBが確保されている。usedは0なんで,スワップは発生していないが・・・

まず,swapを無効化してみる。

# dphys-swapfile swapoff

確認してみると,

# free
             total       used       free     shared    buffers     cached
Mem:        750632     527064     223568       5460      53652     361688
-/+ buffers/cache:     111724     638908
Swap:            0          0          0

使用されなくなった。

再度swapを有効化するには,

# dphys-swapfile swapon

でOK。

 

swapは使用しなくなったが,電源ONでswapが自動起動しないようにsystemctlで設定します。

# systemctl stop dphys-swapfile
# systemctl disable dphys-swapfile

Raspberry Piを再起動してswapが使用されていないか確認しておく。

Page Top

RAMディスクの設定 anchor.png

メインRAMの一部をRAM Diskとして使用し,そこをテンポラリファイル保存場所に利用するようにする。
RAMディスクは,電源OFF-ONやブートしたりした場合消えてしまうが,テンポラリのログ等では消えてしまってもまあ問題ない。

/etc/fstabを編集して,/tmpと/var/tmpと/var/logを移動するようにしてみる。

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, no line here
#   use  dphys-swapfile swap[on|off]  for that

これを,

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, no line here
#   use  dphys-swapfile swap[on|off]  for that
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

とtmpfsとして3個追加する。

再起動して,マウント確認をする。

# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root         15G  4.6G  8.9G   34% /
devtmpfs         363M     0  363M    0% /dev
tmpfs            367M     0  367M    0% /dev/shm
tmpfs            367M  5.1M  362M    2% /run
tmpfs            5.0M  4.0K  5.0M    1% /run/lock
tmpfs            367M     0  367M    0% /sys/fs/cgroup
tmpfs             32M   88K   32M    1% /var/log
tmpfs             16M     0   16M    0% /var/tmp
tmpfs             32M     0   32M    0% /tmp
/dev/mmcblk0p1    63M   21M   42M   34% /boot
tmpfs             74M     0   74M    0% /run/user/1001
Page Top

不要なログは作成しないようにする anchor.png

rsyslog.confを変更して,不要なログを作成しないようにする。
/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
 
#
# 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:*

テンポラリ用のディレクトリが無いと困るプログラム用に,起動時にディレクトリを作っておく。 /etc/rc.localで,これを行う。

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
 
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
 
mkdir -p /var/log/ConsoleKit
mkdir -p /var/log/samba
mkdir -p /var/log/fsck
mkdir -p /var/log/apt
mkdir -p /var/log/ntpstats
chown root.adm /var/log/samba
 
touch /var/log/lastlog
touch /var/log/wtmp
touch /var/log/btmp
chown root.utmp /var/log/lastlog
chown root.utmp /var/log/wtmp
chown root.utmp /var/log/btmp
 
exit 0

新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

Front page   Freeze Diff Backup Copy Rename Reload   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom)
Counter: 2748, today: 1, yesterday: 0
Last-modified: 2020-12-26 (Sat) 15:07:35 (JST) (1354d) by yuji