N@i.jp  昨日:0578
 今日:0151
 総計:01121513
keywords
管理者専用
  Post   Add link   Control Panel 






























新しいトピック
最新:05/16 20:08


新しいコメント
最新:02/29 20:34





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つです。

  1. swapファイルを作成しないようにする
  2. 頻繁に書き換えられる場所をRAMディスクにする

 参考にさせていただいたのは、以下のホームページです。

1. swapファイルを作成しないようにする

 swapファイルは"/var/swap"だったかな?(消してしまったので忘れた^^;)動作メモリが不足すると、メモリページをswapファイルに追い出して空きメモリページを作る仕組み(仮想記憶)です。多くのプログラムを動かしたりして使用メモリ量が不足すると、この処理が頻繁に起こりswapファイルの書き換えが頻発するという次第。swapファイルを使うことで、搭載メモリ以上にメモリを消費する多くのプログラムを動かせるようになるのですが、swapが発生すると当然ながら性能が低下します(スローダウン)。
 それにRaspberry Piでは、swapファイルは100MB程度しかなかったと思いました。(swapファイルのサイズ設定は"/etc/dphys-swapfile"に記述されているそうです。)と言うわけで、swapファイルを作らないようにしました。

  1. chkconfigをインストール
    # apt-get update
    # apt-get upgrade
    # apt-get install chkconfig
    
  2. 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ディスクに置き換えました。

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

 手順は以下のようになります。

  1. /etc/fstabを書き換える
  2. /etc/rsyslog.confを編集して、ログファイルの書き出しを最小限にする
  3. RAMディスクにするディレクトリ(マウントポイント)配下にあるファイル、ディレクトリは消してしまう
  4. /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。


< 過去の記事 [ 5月の 全てのカテゴリ リスト ] 新しい記事 >

2017 calendar
5月
123456
78910111213
14151617181920
21222324252627
28293031


掲示板
最新:08/15 17:19



管理人へMAIL

GsBlog was developed by GUSTAV, Copyright(C) 2003, Web Application Factory All Rights Reserved.