30 April 2013

Raspberry Pi のtmpディレクトリをRAMディスクに移動

Raspberry Piのテンポラリ ディレクトリをRAMディスクに移動し、SDカードに書き込む回数をなるべく押さえるようにする設定

■ 検証環境
・Raspberry Pi (Debian) 2013-02-09-wheezy-raspbian

■ マウント設定の変更

/etc/fstab
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 $
 
#### ramdisk
tmpfs           /tmp            tmpfs   defaults,size=32m 0       0
tmpfs           /var/tmp        tmpfs   defaults,size=16m 0       0
tmpfs           /var/log        tmpfs   defaults,size=32m 0       0
tmpfs           /var/www/mrtg   tmpfs   defaults,size=2m  0       0

■ /var/log 内のファイルの準備

再起動後、/var/log内に必要なディレクトリやファイルを作成し、初期状態を作る。今回は、Apache2やSamba用のファイルも作成している。

まず、initスクリプトを作成する。(ファイル名は、適当で良い)

/etc/init.d/make-varlog-files
#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          make-varlog-files
# 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/apt
    mkdir -p /var/log/fsck
    mkdir -p /var/log/mrtg
    mkdir -p /var/log/ntpstats
    mkdir -p /var/log/samba
    mkdir -p /var/log/squid3
 
    chown root.adm /var/log/apache2
    chmod 750 /var/log/apache2
    chown root.adm /var/log/mrtg
    chown ntp.ntp /var/log/ntpstats
    chown root.adm /var/log/samba
    chown proxy.proxy /var/log/squid3
 
    ############################
    # prepare /var/log file for ramdisk init on every 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.adm  /var/log/apache2
    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
    chown root.utmp /var/log/lastlog
    chown root.utmp /var/log/wtmp
    chown root.utmp /var/log/btmp
   ;;
  'stop')
   ;;
  'restart')
   ;;
  'reload'|'force-reload')
   ;;
  'status')
   ;;
  *)
   echo "Usage: $SELF start"
   exit 1
   ;;
esac

デフォルト ランレベル(2,3,4,5)の起動用リンクを作成する

$ sudo update-rc.d make-varlog-files defaults 01 10

ランレベル 2用の起動スクリプト ディレクトリを念の為確認する

$ /etc/rc2.d/
K01hostapd     S01ifplugd            S02bind9           S04isc-dhcp-server
K01lightdm     S01make-varlog-files  S02dbus            S04postfix
K01squid3      S01motd               S02dphys-swapfile  S05plymouth
K02dnsmasq     S01rsyslog            S02ntp             S05rc.local
K06nfs-common  S01samba              S02snmpd           S05rmnologin
K06rpcbind     S01saslauthd          S02ssh
README         S01sudo               S03apache2
S01bootlogs    S01triggerhappy       S04cron

S03Apache2より前に(若い数に)指定されていなければ、Apache2の起動条件を満たさないため、S01で登録されていることで問題が無いことが分かる。

■ ログファイルをメール転送する設定を行う (任意)

RAMディスクにログが記録されているため、電源を落とすと消えてしまう。スケジュールで電源を落とす設定の場合、その前にログをメールで外部転送する設定を行なっておく。

/usr/local/bin/mail_logfiles.sh
#!/bin/sh
 
/usr/bin/logger "mail logfiles task started"
 
/usr/bin/base64 /var/log/syslog 1> /tmp/syslog.txt 2> /dev/null
/usr/bin/base64 /var/log/dpkg.log 1> /tmp/dpkg.log.txt 2> /dev/null
/usr/bin/base64 /var/log/apache2/access.log 1> /tmp/access.log.txt 2> /dev/null
/usr/bin/base64 /var/log/apache2/error.log 1> /tmp/error.log.txt 2> /dev/null
/usr/bin/base64 /var/log/apache2/ssl_access.log 1> /tmp/ssl_access.log.txt 2> /dev/null
 
/usr/bin/zip -j /tmp/mrtg_data.zip /var/www/mrtg/*.log 1> /dev/null 2>&1
/usr/bin/base64 /tmp/mrtg_data.zip 1> /tmp/mrtg_log.zip 2> /dev/null
 
/usr/bin/perl /usr/local/bin/make_mailbody.pl /tmp/syslog.txt /tmp/dpkg.log.txt /tmp/access.log.txt /tmp/error.log.txt /tmp/ssl_access.log.txt /tmp/mrtg_log.zip 1> /tmp/mailbody.txt 2> /dev/null
 
cat /tmp/mailbody.txt | /usr/sbin/sendmail -t 1> /dev/null 2>&1

※なお、『(Linux) シェルスクリプトとsendmailで添付ファイル付きメールを送信する』で作成したmake_mailbody.plファイルが/usr/local/binディレクトリにインストールされていること。

このスクリプトを、cronで定時シャットダウン等の前に自動実行させれば良い。

$ sudo crontab -e
 
25 1 * * * /usr/local/bin/mail_logfiles.sh
30 2 * * * /sbin/shutdown -h 0 cron_shutdown_schedule

スワップファイル

ramdisk化に加えて、swapfileも停止して最適化することもできる。swapfileの状態は free コマンドで確認できる。

swapfile無効化
$ sudo swapoff --all
$ sudo systemctl stop dphys-swapfile
$ sudo systemctl disable dphys-swapfile
$ systemctl status dphys-swapfile

元に戻すときは...

swapfile有効化
$ sudo systemctl start dphys-swapfile
$ sudo systemctl enable dphys-swapfile
$ systemctl status dphys-swapfile