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

新しくコメントをつける

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

トップ   凍結 差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 2596, today: 1, yesterday: 0
最終更新: 2020-12-26 (土) 15:07:35 (JST) (1211d) by yuji