FreeBSD で netatalk 3.1

FreeNAS にザセツしたので慣れた FreeBSDnet/netatalk3(これを書いてる時点では netatalk 3.1.0) を入れて TimeMachine Server にもなるファイルサーバーを作ったのでメモ。慣れた、とはいえ最近の FreeBSD は真面目に使ってないので俺としては結構新発見があって楽しいです。

  • FreeBSD のインストール
    OS X に入れてある VMWare Fusion を使って FreeBSD 10-RC3 を先日買った Cruzer Switch CZ52 8GB (da0) に入れて、それを HP Microserver N54L の内臓 USB に突っ込むプレイ。 USB 2.0 なのせいか読み書きが遅いので ports collection は bsdinstall ではスキップ、というのが勝利のカギかもしれない。入れてもいいけど。あと swap は zfs に置く予定なのでブートスライス以外は ufs で / にしちゃった。 kernel は GENERIC のまま、特に設定をいじる必要もなくブートも完了。
  • zfs
    ディスクを 3 本挿したら ada0,ada1,ada2 と認識したので raidz にしてみた

    zpool create tank raidz ada0 ada1 ada2

    慣例に従ってメモリ容量の倍の swap を作って

    zfs create -V 16G tank/swap
    zfs set org.freebsd:swap=on tank/swap
    zfs set checksum=off tank/swap

    適当にデータセットを作成

    zfs create tank/TimeMachine
    zfs create tank/Users
    zfs create tank/Backups
    zfs create tank/ports

    TimeMachine 用ボリュームはクォータを設定

    zfs set quota=2T tank/TimeMachine
    zfs get quota tank/TimeMachine
    NAME              PROPERTY  VALUE  SOURCE
    tank/TimeMachine  quota     2T     local

    マウントポイントを変更(FreeNAS ではこれが何故か効かないのであった…)

    zfs set mountpoint=/TimeMachine tank/TimeMachine
    zfs set mountpoint=/Users tank/Users
    zfs set mountpoint=/Backups tank/Backups
    zfs set mountpoint=/usr/ports tank/ports
    zfs get mountpoint
    NAME              PROPERTY    VALUE         SOURCE
    tank              mountpoint  /tank         default
    tank/Backups      mountpoint  /Backups      local
    tank/TimeMachine  mountpoint  /TimeMachine  local
    tank/Users        mountpoint  /Users        local
    tank/swap         mountpoint  -             -
  • pkgng
    普段は ports で make install してるんだけど、せっかく FreeBSD 10 系で生きていくので pkgng を使ってみよう、と。

    sudo pkg install lv

    うっかり pkg_install とか書きたくなるのが罠w

  • FreeBSD のアップグレード
    netatalk3 と戯れているうちに FreeBSD 10-RC4 がリリースされたので freebsd-update を使ってアップグレード。

    sudo freebsd-update upgrade -r 10.0-RC4
    sudo freebsd-update install
    sudo shutdown -r now
    sudo freebsd-update install

    おお、素晴らしく楽チンだ!

  • ports collection
    zfs の tank/ports が /usr/ports になるように設定したので、そこに ports collection を持ってくる。 pkgng と整合性取れなくなるといやなので svn で ports/head を拾ってくるのではなく RC4 公式配布物にしてみた

    fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/10.0-RC4/ports.txz
    cd / && tar xvfJ ~/ports.txz
  • Open Directory 認証
    FreeNAS で一回やったので今回は気楽?

    sudo pkg install pam_ldap nss_ldap
    • /usr/local/etc/nss_ldap.conf
      基本的には FreeNAS でやった時のままで OK なんだけど、応用的には若干違った。具体的には rootbinddn で指定した Directory Administrator のパスワードを FreeNAS ではナゾの技術で隠蔽してた(とは言え django の db を覗いたら平文で確認できたけど…)んだけど、 FreeBSD では /etc/ldap.secret に平文でパスワードを記載する必要があるみたい。パーミッションを 400 にしましょう的な対処をとるとはいえ、平文で書くのは抵抗あるなー、とか思ったけど、このファイルを他人に読まれてるってことは root 取られてるってことだから今更どうでもいいのか、とか。で、よくわからないまま

      sudo ln -s /etc/ldap.secret /usr/local/etc/ldap.secret

      とかしてみた。

    • Self Signed Certificate
      FreeNAS では tls_cacertfile で指定したファイルに Open Directory が使ってるであろう証明書を置けばよかったんだけど、 FreeBSD ではそれだとダメで、 tls_checkpeer no と書く(証明書の検証をしない)か、中間証明書を特定のファイル名で置けばいいみたい。うちの証明書は startssl の無料のを使ってるのでこの手順に従って startssl の中間証明書をハッシュ値.0 ってファイル名で置きました。勝手証明書の場合は tls_checkpeer no でいいんじゃないカナ

      cd /etc/ssl/certs
      wget http://www.startssl.com/certs/ca.pem -O startssl.pem
      openssl x509 -noout -hash -in startssl.pem
      ln -s startssl.pem ae8153b9.0
    • /etc/pam.d
      FreeNAS はシステムがよきに計らってくれましたが、 FreeBSD では自前で設定しないとダメです。Pluggable Authentication Modules 読むなりググるなりしてテキトーに設定すればなんとかなるでしょう
  • netatalk
    なにも考えずに

    sudo pkg install avahi netatalk

    とかやったら netatalk 2 がインストールされたので

    sudo pkg delete netatalk
    sudo pkg install netatalk3

    とやり直し。
    afp.conf は公式のドキュメント読みながら適当に設定してみた。

    [Global]
            uam list = uams_dhx2.so
            afpstats = yes
            log file = /var/log/netatalk.log
            log level = default:info
            dbus daemon = /usr/local/bin/dbus-daemon
    
    [Homes]
            basedir regex = /Users
            spotlight = yes
    
    [TimeMachine]
            path = /TimeMachine
            spotlight = yes
            time machine = yes

    /etc/pam.d に netatalk とかってファイルを作ってそれっぽく設定したんだけど、 FreeBSD 上のアカウントでアクセスできるんだけど Open Directory 上のユーザーではアクセスできない。なんでじゃ!? とか調べていたらどうも pkg でインストールされる netatalk3 は LDAP 認証(と PAM)が無効化されているらしい。仕方ないので

    sudo pkg delete netatalk3

    してから

    cd /usr/ports/net/netatalk3
    make config
    make
    make install package

    とかして KRB5, LDAP, PAM を有効化して入れ直したところ、今度は Open Directory 上のユーザーでアクセスできた! SSO できないのが玉に瑕なんだけど、どうせ TimeMachine の認証情報は SSO 出来ないしーってことで理由は追ってません。ここら辺を解決してる人がいたらこっそり教えてください…あ、 kdc 上で kadmin 使って登録しないといかん、とかいう話?(→そんなお話でした。詳細はこちら) ちなみにオプションで Zeroconf support として avahimDNSresponder のどっちかを選べて(デフォルトは avahi) 、それのお陰か avahi で何も設定してないのに OS X からブラウズ出来ました。偉い。
    あと、 netatalk 3 は CNID が /var/netatalk/CNID 以下に置かれるって話なんだけど、そのままだと遅い USB メモリに作成されてえれーボトルネックになるような予感がしたので

    sudo mkdir /tank/var/netatalk
    sudo rsync -avr /var/netatalk/ /tank/var
    sudo mv /var/netatalk /var/netatalk.old
    sudo mkdir /var/netatalk
    sudo mount -t nullfs /tank/var/netatalk /var/netatalk

    とかしてみた。
    が、こうしてブログにまとめてみると、何故 zfs のデータセット作ってそれを /var/netatalk にマウントしなかったのかと小一時間。なので

    zfs create tank/var
    zfs create tank/var/netatalk
    zfs set mountpoint=/var/netatalk tank/var/netatalk

    とするほうが綺麗だな…

とまぁこんな感じで Time Machine Server を OS X Server から FreeBSD に移すのと、 OS X Server に置いてるファイル(Aperture とか iTunes とか)の Time Machine を使わないバックアップができる準備は整ったかなーって。

コメントを残す