前回の続き。
といっても、 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 がマウント出来ない自体でもう負けなのでいいかな、と(笑