RPi2でubuntu14.04LTS(2)SDを延命
tmpfsを使う
SDへの書き込み回数を減らすため、テンポラリディレクトリをtmpfsにマウントするよう/etc/fstabを変更します。
対象とするのは/tmp、/var/tmpです。
1 2 3 4 5 |
proc /proc proc defaults 0 0 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 /dev/mmcblk0p1 /boot/firmware vfat defaults 0 2 tmpfs /tmp tmpfs defaults,size=32m,noatime,mode=1777 0 0 tmpfs /var/tmp tmpfs defaults,size=16m,noatime,mode=1777 0 0 |
後ろの2行が追加した部分です。
logをtmpfsに置いてバックアップ
/var/logもtmpfsに持っていきたいところですが、logはあとで参照したい場合がありますね。
スクリプトを使ってシャットダウン時にSDにバックアップしておき、起動時にtmpfsに戻せないかと考えていたところ、denian向けにちょうど良いスクリプトがありましたので、これを利用することにします。
このページから-etc-init.d-transientlog.shをダウンロードしてファイル名transientlogで保存します。
transientlogを/etc/init.dに配置し、パーミッションを設定します。
1 2 3 |
sudo sh -c "tr -d '\r' < transientlog > /etc/init.d/transientlog" sudo chown root:root /etc/init.d/transientlog sudo chmod a+x /etc/init.d/transientlog |
ファイルの改行コードがCR+LFなので、trコマンドでCRを削除しながらコピーしています。
このあとにinsservコマンドでスクリプトを登録するのですが、「Required-Startが無い」「Required-Stopが無い」と言ってエラーになるので、Providesの後に記述しておきます。
1 2 3 4 5 6 7 |
#!/bin/sh ### BEGIN INIT INFO # Provides: transientlog # Required-Start: # Required-Stop: # X-Start-Before: $syslog # X-Stop-After: $syslog |
insservで登録します。
1 |
sudo /usr/lib/insserv/insserv transientlog |
ホームディレクトリのファイル
~/.bash_historyなどもtmpfsに持って行きましょう。
bashスクリプト/usr/local/bin/temporizeを新規作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
#!/bin/bash FILES=(".bash_history" ".Xauthority" ".xsession-errors") temporize() { if [ ! -L $HOME/$1 ]; then if [ ! -e /tmp/$USER/$1 ]; then if [ -e $HOME/$1 ]; then cp -ra $HOME/$1 /tmp/$1 else touch /tmp/$USER/$1 fi fi rm -rf $HOME/$1 ln -s /tmp/$USER/$1 $HOME/$1 fi } permanent() { if [ -L $HOME/$1 ]; then rm $HOME/$1 fi if [ ! -e $HOME/$1 -a -e /tmp/$USER/$1 ]; then cp -ra /tmp/$USER/$1 $HOME/$1 fi rm -rf /tmp/$USER/$1 } do_start() { if [ `w -h |grep -c "^$USER[ \t]"` -eq "1" ]; then mkdir -p /tmp/$USER for f in ${FILES[@]}; do temporize $f file done fi } do_stop() { if [ `w -h |grep -c "^$USER[ \t]"` -eq "1" ]; then for f in ${FILES[@]}; do permanent $f done rm -rf /tmp/$USER fi } do_stopall() { for u in `ls /tmp`; do echo $u if [ `cat /etc/passwd | grep -c "$u:"` -eq "1" ]; then for f in ${FILES[@]}; do permanent $u/$f done rm -rf /tmp/$u fi done } case "$1" in login) do_start ;; logout) do_stop ;; shutdown) do_stopall ;; *) ;; esac |
temporize loginとして実行すると、~/.bash_history、~/.Xauthority、~/.xsession-errorsを/tmp/$USERにコピーし、ホームディレクトリからリンクを張ります。
temporize logoutではリンクを削除して/tmp/$USERからホームディレクトリに書き戻します。
シャットダウンやリブートするときは、temporize shutdownで/tmpからすべてのユーザーのファイルを書き戻します。
ログイン時にtemporize loginを実行するように~/.bash_profileを編集します。
1 |
/usr/local/bin/temporize login |
~/.bash_logoutにはtemporize logoutの処理を追記します。
1 2 3 4 5 6 7 8 9 |
# ~/.bash_logout: executed by bash(1) when login shell exits. # when leaving the console clear the screen to increase privacy if [ "$SHLVL" = 1 ]; then [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q fi /usr/local/bin/temporize logout |
シャットダウンとリブート時にはtemporize shutdownを実行するように、/etc/init.d/transientlogを編集します。
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred /usr/local/bin/temporize shutdown [ -f $LOCKFILE ] || return 1 # Check if I am root [ `id -u` -eq 0 ] || return 2 # Merge back to permanent storage cp -rfup $VARLOG -T $VARLOGPERM # The following cannot fail... or can it? umount -l $VARLOG umount -l $VARLOGPERM rm -f $LOCKFILE return 0 } |
キャッシュ間隔を長くする
デフォルトではメモリキャッシュの書き込みは5秒間隔となっています。
これを30秒に設定します。/etc/sysctrl.confの末尾に以下の行を追加します。
1 |
vm.dirty_writeback_centisecs = 3000 |
mlocateを削除
cron.dailyでmlocate(ファイル検索)のデータベースが更新されています。
私はmlocateを使わないので、パッケージごと削除してしまいます。
1 |
sudo apt-get purge mlocate |