2009/02/10(火)nsd (Name Service Daemon)

先日からのVPSの話の続き。
CPI VPSスケールプランの一番安いやつでbindを起動したらメモリが140MB近くまで消費されてしまい悩ましい、という話を書いた。
そもそも自由に使えるDNS Contents Serverが欲しくてVPSを契約しようとしていたので、これは何とか解決しないといけない。

そのときにも書いたけど、bind以外のDNSサーバとしてnsdという選択肢がある。動くかどうか実験してみた。
ネタ元はこのあたり

個人用途なのでzone数もレコード数もたかがしれてます。
query数も極小であると思われるので、パフォーマンスについては資料を読んで「ふーん、結構良さそうですね」と言う以上は考えないことにします。

今回の実験の条件は以下の通り。(個人向けだよ)
  • primary DNSサーバにしてみる
  • secondary DNSサーバにしてみる
  • 適当なところにchrootする
    • /service/nds あたりに入れる
    • syslogはsocketとかめんどくさいので直説logを書く
  • DNSSECとか考えない。
ざっくりインストール。
# ./configure --prefix=/service/nsd
# make
# make install
# mkdir -p /service/nsd/etc/nsd/p ← primary zone置き場所
# mkdir -p /service/nsd/etc/nsd/s ← secondary zone置き場所
# mkdir -p /service/nsd/var/db/nsd
# mkdir -p /service/nsd/var/log
# chown -R named /service/nsd ← user作るの面倒なので"named"で動かすつもり
/service/nsd/etc/nsd/nsd.conf
server:
        chroot: /service/nsd
        logfile: /service/nsd/var/log/nsd.log
        username: named
        ip-address: ???.???.???.??? ← listenするアドレス
        ip4-only: yes

zone:
        name: example.jp
        zonefile: p/example.jp.zone

zone:
        name: example.net
        zonefile: s/example.net.zone
        allow-notify: 127.0.0.1 NOKEY ← これを書かないと自分でコントロールできないようだ
        allow-notify: ???.???.???.??? NOKEY
        request-xfr: ???.???.???.??? NOKEY ← 転送元
primaryであるexample.jpのzoneは用意しておこう。(基本的にbindと同じ書式でOK)
準備ができたら、zoneをbuild*1してdaemonを起動させる。
# sudo -u named /service/nsd/sbin/nsdc rebuild
# /service/nsd/sbin/nsdc start
なんか動いたっぽい。応答には答える。

secondary側はちょっと変わった挙動をするので一瞬悩む。
詳しい話はこのあたりに頼りましょう。

注意する点は、zoneをbuildしたりする場合は必ずnsdが動作するユーザ権限(ここではnamed)で行うこと。sudoでもsuでもよいけど。
rebuildを実行すると/service/nsd/var/db/nsd/nsd.dbなんかが作られるけど、これはnsdcを起動した権限で作られる。なので、rootのまま作業をするとrootの持ち物になってしまう。*2
ただし、nsdを起動するときはrootで行う必要がある。

同じコマンドだけど実行する内容によって使い方が違うので注意という話ですね。ちょっとわかりにくい。



肝心のメモリ占有率の話ですが、nsdとhttpdが起動した状態でこれぐらい。
privvmpages usage: 32 MB (18% of 175)
nsdを止めるとこのぐらいなので
privvmpages usage: 23 MB (13% of 175)
十分実用になりそうです。

よかったよかった。

*1 : bindと違って明示的にbuildして、バイナリ形式のzone dataを準備しておく必要がある

*2 : あれ、もしかしてそれでも動作に問題ないのか?