ラズパイのMicroSDを長寿命化

ラズパイのストレージがSDカードなので、読み書きを大量にすると寿命が短くなります。そのため、無駄な書き込みをなくすために以下の1~4の設定を行っておきましょう。
備えあれば憂いなしです。突然悲劇は訪れるのでやれるこはやっとかないと・・・

実際にサーバー運用するにあたり、以下の1~4の対策を実施しましたので紹介しておきます。

1.SWAPを無効化する

以下のコマンドでswapの使用状況を確認する。

$free -h
total used free shared buff/cache available
Mem: 874Mi 322Mi 38Mi 33Mi 513Mi 447Mi
Swap: 99M 3.5M 96M <-Swap領域として99M程度使用されている

おおよそ100MBくらいのswap領域を確保しています。
以下のコマンドで、不要なパッケージを削除して、swap領域を無効にします。

$sudo swapoff --all 
$sudo apt-get purge -y --auto-remove dphys-swapfile 
$sudo rm -fr /var/swap

swap無効化後の状況を確認します。

total used free shared buff/cache available
Mem: 874Mi 323Mi 37Mi 33Mi 514Mi 446Mi
Swap: 0B 0B 0B  <-ここが"0"になっていればOK

swap領域が0バイトにってればOKです。

2.一時フォルダとログファイルの保存場所をRAMディスクにマウント

fstabを編集して、一時フォルダとログフォルダをRAMディスク(tmpfs)にマウントします。
以下の2行を追加

$ sudo vi /etc/fstab
↓この2行を末尾に追加します。
tmpfs /tmp tmpfs defaults,size=32m,noatime,mode=1777 0 0
tmpfs /var/tmp tmpfs defaults,size=16m,noatime,mode=1777 0 0

編集後に再起動して、きちんとマウントされているか確認します。
/tempと/var/tmpがRAMディスク(tmpfs)にマウントされていればOKです。

$ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/root 27G 11G 15G 42% /
devtmpfs 433M 0 433M 0% /dev
tmpfs 438M 0 438M 0% /dev/shm
tmpfs 438M 13M 425M 3% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 438M 0 438M 0% /sys/fs/cgroup
tmpfs 16M 0 16M 0% /var/tmp   <--/var/tmpがtmpfsにマウント
tmpfs 32M 4.0K 32M 1% /tmp  <--/tmpがtmpfsにマウント
/dev/mmcblk0p6 253M 52M 201M 21% /boot
/dev/sda1 932G 258M 932G 1% /mnt/hdd
tmpfs 88M 4.0K 88M 1% /run/user/1001

3.ログ出力を極力減らす

サービスを起動していると知らないうちにたくさんのログが出力されています。使っていないサービスのログは不要なので出力しないように設定します。

メールとか使ってないサービスをコメントアウト(先頭”##”箇所を変更)

$ sudo vim /etc/rsyslog.conf

<rsyslog.confの変更箇所>
(省略)
54 ###############
55 #### RULES ####
56 ###############
57
58 #
59 # First some standard log files. Log by facility.
60 #
61 auth,authpriv.*??-?-/var/log/auth.log
62 *.;auth,authpriv.none?-?--/var/log/syslog 
63 ##cron.??-?-?-/var/log/cron.log
64 ##daemon.?-?-?--/var/log/daemon.log 
65 ##kern.?-?-?-?--/var/log/kern.log
66 ##lpr.??-?-?--/var/log/lpr.log 
67 ##mail.?-?-?-?--/var/log/mail.log
68 ##user.*?-?-?-?--/var/log/user.log
69
70 #
71 # Logging for the mail system. Split it up so that
72 # it is easy to write scripts to parse these files.
73 #
74 ##mail.info??-?--/var/log/mail.info
75 ##mail.warn??-?--/var/log/mail.warn
76 ##mail.err?-?-?-/var/log/mail.err

79 # Some "catch-all" log files.
80 #
81 ##*.=debug;\
82 ##?auth,authpriv.none;\
83 ##?news.none;mail.none?-/var/log/debug

4.ログファイルの一時作成場所をRAMディスクに変更

ここはちょっと長いですが、延命化には一番効果がありそうです。
以下の手順1~7の順に設定すればOKです。

  • 【手順1】生成スクリプト(make-init-logfiles.sh)の生成
  • 【手順2】起動時に実行するスクリプト(setup-logs.sh)の生成
  • 【手順3】起動時に実行するスクリプト(/etc/init.d/setup-tempfs-logs)の作成
  • 【手順4】終了時にバックアップを作成するスクリプト(backup-logs.sh)の作成
  • 【手順5】起動時に実行するスクリプト(/etc/init.d/setup-tempfs-logs)を登録
  • 【手順6】定期的にログのバックアップをとるようcronに登録
  • 【手順7】/var/log を RAMディスク(tmpfs)にマウントする

では、さっそく設定してみましょう!

前準備

作業前に/var/logのバックアップをとります。

$sudo mkdir -p /back/var-log
$sudo cp -r /var/log/* /back/var-log/

【手順1】生成スクリプト(make-init-logfiles.sh)の生成

/var/logは以下のファイルやディレクトリ情報からリストを作成します。
以下のコマンド実行してそれぞれの情報リスト(logFiles,logDIrs)が生成されればOKです。

(1)ファイル情報のリストを作成するコマンド
$stat --format='%a %U:%G %n' `find /var/log/ -maxdepth 1 -mindepth 1 -type f` | grep -v .gz\|.log$\|1$\|.old > ~/logFiles
(2)ディレクトリ情報のリストを作成するコマンド
$stat --format='%a %U:%G %n' `find /var/log/ -maxdepth 1 -mindepth 1 -type d` > ~/logDirs

上記リストを使って、生成スクリプト(make-init-logfiles.sh)を作成します。

$vi ~/scripts/make-init-logfiles.sh
#!/bin/sh
 
# 出力するスクリプトファイル
fScr="${HOME}/scripts/setup-logs.sh"
 
# ログファイルリスト生成
stat --format='%a %U:%G %n' `find /var/log/ -maxdepth 1 -mindepth 1 -type f` | grep -v '.gz\|.log$\|1$\|.old' > ~/logFiles
cp -i ~/logFiles ~/logFiles.bak
 
# ログディレクトリリスト生成
stat --format='%a %U:%G %n' `find /var/log/ -maxdepth 1 -mindepth 1 -type d` > ~/logDirs
cp -i ~/logFiles ~/logDirs.bak
 
echo "#!/bin/sh" > $fScr
echo "\n### Make directories ###" >> $fScr
 
cat ~/logDirs | while read line
do
	echo "##" >> $fScr
	echo $line | awk '{print "mkdir -p " $3}' >> $fScr
	echo $line | awk '{print "chmod " $1 " " $3}' >> $fScr
	echo $line | awk '{print "chown " $2 " " $3}' >> $fScr 
done

echo "\n### Make files ###" >> $fScr

cat ~/logFiles | while read line
do
	echo "##" >> $fScr
	echo $line | awk '{print "touch " $3}' >> $fScr
	echo $line | awk '{print "chmod " $1 " " $3}' >> $fScr
	echo $line | awk '{print "chown " $2 " " $3}' >> $fScr 
done 
 
# 実行権をつけておく 
chmod +x $fScr

【手順2】起動時に実行するスクリプト(setup-logs.sh)の生成

手順1で生成スクリプト(make-init-logfiles.sh)を実行すると、最新の/var/log に必要なファイルやフォルダを作成するスクリプト(setup-logs.sh)ができます。

$ sh ~/scripts/make-init-logfiles.sh

【手順3】起動時に実行するスクリプト(/etc/init.d/setup-tempfs-logs)の作成

起動、終了時に実行するスクリプト(setup-tempfs-logs)を作成します。
touchコマンドでファイルを新規作成、実行権を付与、viで編集

$sudo touch /etc/init.d/setup-tempfs-logs
$sudo chmod +x /etc/init.d/setup-tempfs-logs
$sudo vi /etc/init.d/setup-tempfs-logs
#!/bin/sh
### BEGIN INIT INFO
# Provides:          setup-tempfs-logs
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Setup tempfs log files
### END INIT INFO
case "$1" in
  start|"")
    sh /home/user1/scripts/setup-logs.sh 2>&1 >/dev/null
    ;;
  stop)
    sh /home/user1/scripts/backup-logs.sh 2>&1 >/dev/null
    ;;
  *)
    echo "Usage: /etc/init.d/setup-tempfs-logs [start|stop]" >&2
    exit 3
    ;;
esac

起動時に実行するスクリプトは、先ほど生成したsetup-logs.sh をstartに指定して、必要なログファイルの準備を行うようにしています。

終了時に実行するスクリプトとして、バックアップファイルを作成するスクリプトbackup-logs.shを作成して、stopに指定しています。

【手順4】終了時にバックアップを作成するスクリプト(backup-logs.sh)の作成

まず、バックアップ先のディレクトリ(back/logs)を作成します

$sudo mkdir -p /back/logs

スクリプト(bakkup-logs.sh)を作成します。中身はrsyncコマンドでバックアップしています。

$vi /home/user1/scripts/backup-logs.sh
#!/bin/sh
LOG="/back/logs/backup-history.txt"
sudo sh -c "date > $LOG"
sudo sh -c "rsync -av /var/log/* /back/logs/ >> $LOG"

スクリプトに実行権を付与して実行します。

$ chmod +x backup-logs.sh
$ sudo ./backup-logs.sh

うまく実行されていれば、/back/logs/ にログファイルとbackup-history.txtができます。

【手順5】起動時に実行するスクリプト(/etc/init.d/setup-tempfs-logs)を登録

起動時に実行されるように登録します。

$sudo update-rc.d setup-tempfs-logs defaults

以下のコマンドできちんと登録されているか確認します。

$sudo ls /etc/rc.d/setup-tempfs-logs

setup-tempfs-logsのdefalt設定が反映されていればOK
#Default-Start: 2 3 4 5 <-ランレベル2,3,4,5では”S”
#Default-Stop: 0 1 6 <-ランレベル0,1,6では”k”
/etc/rc0.d/K01setup-tempfs-logs /etc/rc2.d/S08setup-tempfs-logs /etc/rc4.d/S08setup-tempfs-logs /etc/rc6.d/K01setup-tempfs-logs
/etc/rc1.d/K01setup-tempfs-logs /etc/rc3.d/S08setup-tempfs-logs /etc/rc5.d/S08setup-tempfs-logs

【手順6】定期的にログのバックアップをとるようcronに登録

毎時0分にバックアップをするようcronに登録

$ sudo crontab -e
0 * * * * /home/user1/scripts/backup-logs.sh

【手順7】/var/log を RAMディスク(tmpfs)にマウントする

/etc/fstab を編集して、tmpfsの1行を追加

$sudo vi /etc/fstab
tmpfs /var/log tmpfs defaults,size=32m,noatime,mode=0755 0 0

最後に、既存の/var/logを削除して、再起動すれば完了です。

$sudo rm -rf /var/log
$sudo shutdown -r now

ログファイルの更新は頻繁に行われるので、RAMディスクを使うことでSDカードの延命化につながりそうですね。

自分は、少し高価(1000円前後)になりますが、品質の高さでは信頼がおけるSanDiskエクストリームシリーズを購入しています。ラズパイでサーバーを運用する場合は、SDカードの延命化が最大の課題です。信頼できるメーカーのものを選んでおく方が安心ですね。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA