カテゴリー
FreeBSD

netatalk 3.1 が遅いのを誤魔化した

前回の続き。

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

コメントを残す