前回の続き。
といっても、 CNID を tmpfs に置けばそれなりのスピードになるよねってのは分ったので、そこを自動化するだけの話ですが。
netatalk が起動する前に tmpfs に CNID が準備されてて、 netatalk が終了した時に tmpfs に置いた CNID が real fs にコピーされてればいいだろうという方針で Practical rc.d scripting in BSD を読みながら /usr/local/etc/rc.d/netatalk を編集してみました。
/var/netatalk/CNID が tmpfs で、 /var/netatalk/CNID.real が zfs に置いたミラー(?)。 diff はこんな感じ
*** netatalk.org 2014-02-15 13:18:34.856257493 +0900
--- netatalk 2014-02-15 13:23:52.000000000 +0900
***************
*** 19,24 ****
--- 19,48 ----
name=netatalk
rcvar=netatalk_enable
+ start_precmd="netatalk_pre"
+ stop_postcmd="netatalk_sync"
+
+ extra_commands="sync"
+ sync_cmd="netatalk_sync"
+
+ netatalk_pre()
+ {
+ if [ ! -d /var/netatalk/CNID ]
+ then
+ mkdir -p /var/netatalk/CNID
+ fi
+ while [ ! `mount |grep CNID | wc -l` -eq 1 ]
+ do
+ mount -t tmpfs tmpfs /var/netatalk/CNID
+ sleep 1
+ done
+ if [ ! -f /var/netatalk/CNID/README ]
+ then
+ cp -a /var/netatalk/CNID.real/ /var/netatalk/CNID
+ fi
+ }
+
+ netatalk_sync()
+ {
+ /usr/local/bin/rsync -a /var/netatalk/CNID/ /var/netatalk/CNID.real
+ }
+
load_rc_config ${name}
command=/usr/local/sbin/${name}
あと cron に
*/5 * * * * /usr/sbin/service netatalk sync
とか書いて 5 分おきに CNID を tmpfs から zfs にコピーするようにしてます。 kernel panic 時にどこまで救えるか疑問ではあるのですが、 CNID を SSD に置くまでの回避策としてはこんなモンかなー、と。なお、なんらかの事情(← zfs export した時に気付いた)で zfs がマウント出来ないと while を抜けられずにコンソールから Ctrl-C しないとブートしなくなるけど、 zfs がマウント出来ない自体でもう負けなのでいいかな、と(笑
コメントを残す