Anything-sync-daemonを導入してみた[Wheezy編]
先日交換したmicroSDカードの寿命を延ばすため
先日、Raspberry Pi2のmicroSDカードが逝ってしまいました。勿論microSDカードの寿命を延ばすために、swapは止めているし、ログの書き出しも最小限にし、/tmp, /var/tmp, /var/log はRAMディスク(tmpfs)にするという対策はしてあります。にもかかわらず、1年半ほどで壊れてしまったことになります。
それほどmicroSDへのI/O量は多くないように思うのですが、何故なんだろう?と考えて一つ思いついたことがありました。それは、Linuxの各種情報をモニタできるMonitorixを入れていること。Raspberry Piの様々な情報をWebページにグラフ化して表示してくれる便利なツールなのですが、1日間、1週間、1ヵ月、1年にわたる情報を表示できるという事は、最大1年に渡ってデータを採取、保持していることになります。
データを保存、グラフ化するにはRRDtoolという物を使っているようです。データ保存先は"/var/lib/monitorix" 配下にある *.rrdファイルです。
RRD は Round Robin Database の略で、全データサイズは一定で、終端まで書き込んだら先頭に戻って書いて行くという循環型のデータベースです。Monitorixが、このRRDファイルにどの程度の頻度でデータを保存しているのかは分からないのですが、*.rrdファイルのタイムスタンプを見る限り毎分更新されているようです。と言うことは、少なくとも1分間に1回は書き込んでいるものと思われます。これが原因で microSDカードの書き換えが頻発し、寿命が短くなってしまったのではないだろうかと考えました。
であれば、"/var/lib/monitorix" をRAMディスク化してしまえば良いだろうと思ってしまいますが、話はそう簡単ではありません。RAMディスクにするということは、再起動やシャットダウンでデータが消えてしまうと言うことになります。最大1年間にわたり各種情報を表示してくれるというMonitorixの利点が失われてしまいます。よって、単に"/var/lib/monitorix" をRAMディスク化するだけでなく、時々microSDの方へもバックアップするような仕組みも必要になります。そこで Anything-sync-daemonを導入してみることにしました。
- Anything-sync-daemonとは何か?
Anything-sync-daemon(以後、asd)についてはここを参照してもらえば日本語で説明されています。要するに、
- 指定した場所をtmpfsに移して、頻繁なディスクI/Oはtmpfsに対して行わせる
- 指定した元の場所はバックアップとなり、そこへrsyncを用いて定期的に同期させる
これにより物理ディスク(今回の場合は microSD)の損耗を減らすというものです。システム起動時に起動される疑似的なデーモンと書かれてありますが、正体はシェルスクリプトでして、システム起動時には指定されたディレクトリを tmpfs上に移し、元のディレクトリはそこへのシンボリックリンクに書き換えている様子です。定期的な同期にはcronを使用しているようです。(システムにプロセスとして常駐するのではないので、疑似的なデーモンと言っているのだろうと思います。実際psで見ても、それらしいプロセスは見当たりませんでした。)
また、overlayfsを利用することで同期を高速化させてメモリの使用量を減らすことができると書かれています。overlayfs って何?Raspberry でも使えるのかな?ウチの Raspberry Pi2 はRaspbian Wheezyなのだが、overlayfsは使えるだろうか?先ずはここから調べてみました。
- overlayfsが使えるか?
overlayfsとは共用マウントの仕組みで、複数のディレクトリ(マウントポイント)を一箇所の共用マウントポイントに重ね合わせてマウントできるようにしたものらしいです。下位のディレクトリと上位のディレクトリがあり、それを共用マウントポイントにoverlayマウントすると、
- 書き込みは上位ディレクトリにだけ反映される
- 下位ディレクトリに書き込むと、上位ディレクトリにも反映される
- 上位と下位の内容をマージした結果は、共用マウントポイントで見ることができる
という仕様だそうな。
overlayfsは kernel 3.18.0 から取り込まれているそうなのだけど、ウチの Raspberry Pi2 では、
$ uname -a
Linux Pollux 4.4.14-v7+ #896 SMP Sat Jul 2 15:09:43 BST 2016 armv7l GNU/Linux
|
という結果。Raspbian Wheezy でも kernel 4.4.14 ということであれば、overlayfs が使えるのではないかな?試してみましょう。以下は rootで作業します。
- マウントポイントとして、以下のようにディレクトリを作る。
# mkdir /lower
# mkdir /upper
# mkdir /work
# mkdir /overlap
|
- /lowerは下位ディレクトリ
- /upperは上位ディレクトリ
- /work は作業ディレクトリで、中身が空である必要がある
- /overlap が共用マウントポイントで、下位と上位のマージ結果ディレクトリ
になります。
- マウントできるか試す
これでマウントできるか試してみます。
# mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,workdir=/work /overlap
#
|
何事もなくmountコマンドは成功しました。確認のためmountコマンドを叩いてみると、
# mount
〜略〜
overlay on /overlap type overlay (rw,relatime,lowerdir=/lower,upperdir=/upper,workdir=/work)
|
できているようですね。また /etc/mtab を見ても、
# cat /etc/mtab
〜略〜
overlay /overlap overlay rw,relatime,lowerdir=/lower,upperdir=/upper,workdir=/work 0 0
|
こちらも問題ないですね。
- ファイルを作ってみる
試しに上位ディレクトリにファイルを作ってみます。
# cd /upper
# echo hoge >sample.txt
# ls -l
-rw-r--r-- 1 root root 5 7月 16 15:11 sample.txt
|
ファイルが出来ました。では下位ディレクトリはどうなっているでしょうか?
# cd /lower
# ls -l
合計 0
#
|
下位ディレクトリにはファイルは出来ていません。書き込みは上位ディレクトリだけで、下位ディレクトリには及んでいません。正しい動作ですね。また、マージ結果のディレクトリでは、
# cd /overlap
# ls -l
-rw-r--r-- 1 root root 5 7月 16 15:11 sample.txt
# cat sample.txt
hoge
#
|
ちゃんとファイルが見えます。ちなみに/work作業ディレクトリの様子は、
# cd /work
# ls -l
d--------- 2 root root 4096 7月 16 15:05 work
|
何やらworkという名前のディレクトリが作られていました。
- お片付け
ともかくoverlayfsは使えそうだと言うことが分かったので、unmountして、作成したディレクトリは削除しておきましょう。
# umount /overlap
# rm -rf /upper /lower /work /overlap
|
- Anything-sync-daemonの導入を試みる
- Anything-sync-daemon のダウンロード
https://aur.archlinux.org/packages/Anything-sync-daemon/ から"anything-sync-daemon-5.80.tar.xz" をダウンロードします。
- 解凍
$ xzcat anything-sync-daemon-5.80.tar.xz | tar xf -
$ cd anything-sync-daemon-5.80
|
- インストール
ここからは rootになって作業します。
# make
Setting version
# make install-upstart-all
Installing main script...
install -p -d "/usr/bin"
install -p -m755 common/anything-sync-daemon "/usr/bin/anything-sync-daemon"
ln -s anything-sync-daemon "/usr/bin/asd"
install -p -d "/usr/share/zsh/site-functions"
install -p -m644 common/zsh-completion "//usr/share/zsh/site-functions/_asd"
install -p -d "/usr/share/bash-completion/completions"
install -p -m644 common/bash-completion "//usr/share/bash-completion/completions/asd"
Installing manpage...
install -p -d "/usr/share/man/man1"
install -p -m644 doc/asd.1 "/usr/share/man/man1/asd.1"
gzip -9 "/usr/share/man/man1/asd.1"
ln -s asd.1.gz "/usr/share/man/man1/anything-sync-daemon.1.gz"
Installing cronjob...
install -p -d "/etc/cron.hourly"
install -p -m755 common/asd.cron.hourly "/etc/cron.hourly/asd-update"
Installing upstart files...
install -p -d "/etc"
install -p -d "/etc/init.d"
install -p -m644 common/asd.conf "/etc/asd.conf"
install -p -m755 init/asd.upstart "/etc/init.d/asd"
|
Raspbian Wheezyなので、Upstartの方をインストールしています。Raspbian Jessieの場合は、
# make install-systemd-all
|
にすれば良いのではないかと思います。Raspberry Pi3 が Jessie ですから、後日試してみるつもりです。
"/etc/asd.conf" の編集
"/etc/asd.conf" を編集します。編集した箇所は、赤字の部分です。
WHATTOSYNC=('/var/lib/monitorix')
〜
USE_OVERLAYFS="yes"
|
- 設定確認
# asd p
egrep: ) または ¥) が不一致です
Anything-sync-daemon v5.80 on Raspbian GNU/Linux 7 (wheezy)
Daemon pid file is not present.
Resync cronjob is present.
Overlayfs v23 is currently active.
Asd will manage the following per /etc/asd.conf settings:
owner/group id: root/0
target to manage: /var/lib/monitorix
sync target: /var/lib/.monitorix-backup_asd
tmpfs target: /tmp/asd-root/var/lib/monitorix
dir size: 56M
overlayfs size:
recovery dirs: none
|
何かegrepが文句言ってるよ。場所は、
# bash -x /usr/bin/asd p
+ BLD='¥e[01m'
+ RED='¥e[01;31m'
+ GRN='¥e[01;32m'
+ BLU='¥e[01;34m'
+ NRM='¥e[00m'
+ VERS=5.80
+ ASDCONF=/etc/asd.conf
+ DAEMON_FILE=/run/asd
+ [[ -f /etc/asd.conf ]]
+ [[ ! -f /run/asd ]]
+ egrep -qv '^$|^#|^'¥''|^)|^[^ ]*=[^;]*' /etc/asd.conf
egrep: ) または ¥) が不一致です
|
)の前にエスケープが必要なんじゃないかな?スクリプトを修正してみます。
# vi /usr/bin/anything-sync-daemon
|
24: if egrep -qv "^$|^#|^'|^¥)|^[^ ]*=[^;]*" "$ASDCONF"; then
〜
28: egrep -vn "^$|^#|^'|^¥)|^[^ ]*=[^;]*" "$ASDCONF"
|
¥は実際には半角の「\」(バックスラッシュ)です。これで文句言われなくなりました。
しかし、元の dir size は56Mもありますね。これをRAMディスク(tmpfs)に持って行くので、tmpfsのサイズはこれ以上必要になるわけで、結構メモリを食われることになります。これについては後で対処します。
- 動かしてみる
# /etc/init.d/asd start
Sync successful
# /etc/init.d/asd status
anything-sync-daemon is running.
|
動いたっぽいですね。overlayfsのマウントを確認してみます。
# mount
〜
overlaid on /tmp/asd-root/var/lib/monitorix type overlay (rw,relatime,
lowerdir=/var/lib/.monitorix-backup_asd,
upperdir=/tmp/asd-root/var/lib/monitorix-rw,
workdir=/tmp/.asd-root/var/lib/monitorix)
|
長いので折り返して書いていますが、実際には1行です。
もともとの /var/lib/monitorix は、
# ls -l /var/lib
lrwxrwxrwx 1 root root 31 7月 16 16:25 monitorix -> /tmp/asd-root/var/lib/monitorix
|
という具合に、共用ディレクトリへのシンボリックリンクに書き変わっていました。
下位のディレクトリ"/var/lib/.monitorix-backup_asd" は
# date
2016年 7月 16日 土曜日 16:43:38 JST
# ls -l /var/lib/.monitorix-backup_asd/*.rrd
-rw-r--r-- 1 root root 6007232 7月 16 16:25 /var/lib/.monitorix-backup_asd/fs.rrd
-rw-r--r-- 1 root root 24022976 11月 19 2014 /var/lib/.monitorix-backup_asd/int.rrd
-rw-r--r-- 1 root root 1690960 7月 16 16:25 /var/lib/.monitorix-backup_asd/kern.rrd
-rw-r--r-- 1 root root 5631904 7月 16 16:25 /var/lib/.monitorix-backup_asd/net.rrd
-rw-r--r-- 1 root root 3379936 7月 16 16:25 /var/lib/.monitorix-backup_asd/netstat.rrd
-rw-r--r-- 1 root root 3379936 7月 16 16:25 /var/lib/.monitorix-backup_asd/port.rrd
-rw-r--r-- 1 root root 3379936 7月 16 16:25 /var/lib/.monitorix-backup_asd/proc.rrd
-rw-r--r-- 1 root root 1690960 7月 16 16:25 /var/lib/.monitorix-backup_asd/raspberrypi.rrd
-rw-r--r-- 1 root root 1824960 7月 16 16:25 /var/lib/.monitorix-backup_asd/serv.rrd
-rw-r--r-- 1 root root 1972456 7月 16 16:25 /var/lib/.monitorix-backup_asd/system.rrd
-rw-r--r-- 1 root root 752640 7月 16 16:25 /var/lib/.monitorix-backup_asd/user.rrd
|
RRDファイルの更新は行われていません。一方、上位のディレクトリ"/tmp/asd-root/var/lib/monitorix-rw" の方は、
# date
2016年 7月 16日 土曜日 16:46:21 JST
# ls -l /tmp/asd-root/var/lib/monitorix-rw/*.rrd
-rw-r--r-- 1 root root 6007232 7月 16 16:46 /tmp/asd-root/var/lib/monitorix-rw/fs.rrd
-rw-r--r-- 1 root root 1690960 7月 16 16:46 /tmp/asd-root/var/lib/monitorix-rw/kern.rrd
-rw-r--r-- 1 root root 5631904 7月 16 16:46 /tmp/asd-root/var/lib/monitorix-rw/net.rrd
-rw-r--r-- 1 root root 3379936 7月 16 16:46 /tmp/asd-root/var/lib/monitorix-rw/netstat.rrd
-rw-r--r-- 1 root root 3379936 7月 16 16:46 /tmp/asd-root/var/lib/monitorix-rw/port.rrd
-rw-r--r-- 1 root root 3379936 7月 16 16:46 /tmp/asd-root/var/lib/monitorix-rw/proc.rrd
-rw-r--r-- 1 root root 1690960 7月 16 16:46 /tmp/asd-root/var/lib/monitorix-rw/raspberrypi.rrd
-rw-r--r-- 1 root root 1824960 7月 16 16:45 /tmp/asd-root/var/lib/monitorix-rw/serv.rrd
-rw-r--r-- 1 root root 1972456 7月 16 16:46 /tmp/asd-root/var/lib/monitorix-rw/system.rrd
-rw-r--r-- 1 root root 752640 7月 16 16:46 /tmp/asd-root/var/lib/monitorix-rw/user.rrd
|
RRDファイルの更新が続いています。この状態で Monitorixを表示させてみましたが、問題ない様子です。
- /tmpを増やす
/tmpはRAMディスク(tmpfs)なのですが、これまでサイズは32MBに設定していました。
# cat /etc/fstab
tmpfs /tmp tmpfs defaults,size=32m,noatime,mode=1777 0 0
|
これでは"/var/lib/monitorix" の56Mのファイルが入りきりません。実際、暫くmonitorixを動かしていたら/tmpが100%になってパンクしてしまいました。そのため、サイズを32+56=88MB程度に増やします。
tmpfs /tmp tmpfs defaults,size=84m,noatime,mode=1777 0 0
|
とりあえず84MBにしてみました、様子を見て足りないようなら更に増やしましょう。メモリは1GBあるのだ
から、ケチケチせず128MBくらい割り当てても良いかもね。
- 起動時に動くようにしてみる
# chkconfig --list asd
asd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
# cd /etc/rc0.d
# ln -s ../init.d/asd K01asd
# cd /etc/rc1.d
# ln -s ../init.d/asd K01asd
# cd /etc/rc2.d
# ln -s ../init.d/asd S01asd
# cd /etc/rc3.d
# ln -s ../init.d/asd S01asd
# cd /etc/rc4.d
# ln -s ../init.d/asd S01asd
# cd /etc/rc5.d
# ln -s ../init.d/asd S01asd
# cd /etc/rc6.d
# ln -s ../init.d/asd K01asd
# chkconfig --list asd
asd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
|
備考)こんな風に手作業でシンボリックリンクを貼らなくても、今は便利なスクリプトやコマンドがあって、以下の方法で行えば良いらしいです。
- update-rc.d asd default
- insserv -d asd
ただ、この優先順位(01)では正常に起動しないという事が次で判明するのですが。
- 再起動してみる
Raspberry Pi2 を再起動しても大丈夫か?確認してみます。
再起動後、
# /etc/init.d/asd status
anything-sync-daemon is not running ... failed!
|
あれ?動いてないや。起動順が早過ぎたのかな?と言うことで、asdとmonitorixの優先順位(起動順、終了順)を以下のように変えてみました。
# ls -l /etc/rc*.d/*asd /etc/rc*.d/*monitorix
lrwxrwxrwx 1 root root 19 12月 6 2014 /etc/rc0.d/K01monitorix -> ../init.d/monitorix
lrwxrwxrwx 1 root root 13 7月 16 17:20 /etc/rc0.d/K02asd -> ../init.d/asd
lrwxrwxrwx 1 root root 19 12月 6 2014 /etc/rc1.d/K01monitorix -> ../init.d/monitorix
lrwxrwxrwx 1 root root 13 7月 16 17:20 /etc/rc1.d/K02asd -> ../init.d/asd
lrwxrwxrwx 1 root root 13 7月 16 15:56 /etc/rc2.d/S20asd -> ../init.d/asd
lrwxrwxrwx 1 root root 19 12月 6 2014 /etc/rc2.d/S20monitorix -> ../init.d/monitorix
lrwxrwxrwx 1 root root 13 7月 16 15:56 /etc/rc3.d/S20asd -> ../init.d/asd
lrwxrwxrwx 1 root root 19 12月 6 2014 /etc/rc3.d/S20monitorix -> ../init.d/monitorix
lrwxrwxrwx 1 root root 13 7月 16 15:57 /etc/rc4.d/S20asd -> ../init.d/asd
lrwxrwxrwx 1 root root 19 12月 6 2014 /etc/rc4.d/S20monitorix -> ../init.d/monitorix
lrwxrwxrwx 1 root root 13 7月 16 15:57 /etc/rc5.d/S20asd -> ../init.d/asd
lrwxrwxrwx 1 root root 19 12月 6 2014 /etc/rc5.d/S20monitorix -> ../init.d/monitorix
lrwxrwxrwx 1 root root 19 12月 6 2014 /etc/rc6.d/K01monitorix -> ../init.d/monitorix
lrwxrwxrwx 1 root root 13 7月 16 17:20 /etc/rc6.d/K02asd -> ../init.d/asd
# reboot
〜再起動後〜
# /etc/init.d/asd status
anything-sync-daemon is running.
|
今のところ、これでうまく動いているっぽい。
- 問題点
これでRRDファイルをRAMディスクに移して microSDへの書き込みを減らすことができたようですが、いくつか問題が残りました。
- 上位のディレクトリ(RAMディスク)から下位ディレクトリ(micro SD)に書き込む(強制同期)するには
asd resync または asd sync とするのではないかと思うのですが、何故か同期されません。(*1)
強制同期するには、
# /etc/init.d/asd restart
|
という具合にAnything-sync-daemonを再起動するとできます。
- 上位ディレクトリから下位ディレクトリへの定期的な同期には、
"/etc/cron.hourly/asd-update" で行うようなのですが、このスクリプトの中身は、
# cat /etc/cron.hourly/asd-update
#!/bin/sh
/usr/bin/anything-sync-daemon resync &> /dev/null
|
なので、要するにasd resync ですね。このスクリプトが1時間毎に実行されるのだと思われますが、やっぱり下位ディレクトリの内容は書き変わりません(同期されません)。このスクリプトは削除してしまっても良いかも。(*1)
ここに挙げた問題点は、overlapfsを使用した場合の「仕様」なのかもしれません。まぁ再起動やシャットダウンの際には、きちんと下位ディレクトリに書き込まれますので、これでヨシとしましょう。
(*1):
その後、asd resync で同期が行われる(書き込み)先は、下位ディレクトリではなく"/var/lib/.monitorix-back-ovfs" というバックアップディレクトリであることが分かりました。cronで1時間毎に書き込まれる先も同じです。ですから、"/etc/cron.hourly/asd-update"スクリプトは削除してはいけません。このバックアップは、Anything-sync-daemonのFAQに書かれているところの、システムダウンなどに備えた「最新の問題がない」バックアップの事ではないかと思います。
|