既に BIND が (例えば RPM から) インストール済みなら、
新しい BIND をインストールする前に、それらを削除しておきましょう。
Red Hat のシステムなら、
bind パッケージと bind-utils パッケージを削除すればいいです。
もし bind-devel や caching-nameserver があったら、
それらも削除しておきましょう。
init スクリプト (/etc/rc.d/init.d/named)
があったら、パッケージの削除前にコピーを保存しておくといいでしょう。
後で役に立ちます。
これは簡単な方です :-)
make install を実行すれば全部やってくれます。
chroot でないほうの BIND を間違って実行しないように、
あとで chmod 000 /usr/local/sbin/named
を実行しておくといいかもしれません
(先に私がおすすめした /usr/local/sbin
を選ばなかった人は、
ここでは /usr/sbin/named になります)。
【訳注: バイナリの再ビルドをしなければ、ここの作業は不要ですね。】
chroot jail の中で生活する必要があるのは 2 つのプログラムだけです。
メインの named デーモン自身と
named-xfer です。後者はゾーン転送に用いられます。
ソースツリーからコピーするだけで OK です。
# cp src/bin/named/named /chroot/named/bin
# cp src/bin/named-xfer/named-xfer /chroot/named/bin
【訳注:
バイナリの再ビルドをしなければ、
ここではパッケージに含まれる named,
named-xfer を移動すれば良いです。
訳者としましては、
移動先にはデフォルトを反映させて /chroot/named/usr/sbin
の方をおすすめしたいのですが。】
ディストリビューションに含まれている init スクリプトがあれば、
それを /chroot/named/bin/named を
適切なスイッチとともに起動するよう変更するのが最も簡単でしょう。
スイッチは... (ここでドラムロール...)
-u named, これは BIND をユーザ root ではなく named
で実行します。-g named, これは BIND をグループ root や wheel ではなく
named で実行します。-t /chroot/named, これはにより BIND は自分自身を
(先に用意した) jail に chroot します。以下の init スクリプトは、著者が自分の
Red Hat 6.0 システムで使っているものです。
おわかりのとおり、ほとんどは Red Hat のものと変わりありません。
ndc restart コマンドも少々変更し、
chroot を保ったまま正しくサーバを再起動するようにしてあります。
これをそのままコピーしただけでは使えない場合でも、
お使いの init スクリプトに同じ変更は簡単に行えるはずです。
#!/bin/sh
#
# named This shell script takes care of starting and stopping
# named (BIND DNS server).
#
# chkconfig: 345 55 45
# description: named (BIND) is a Domain Name Server (DNS) \
# that is used to resolve host names to IP addresses.
# probe: true
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -f /chroot/named/bin/named ] || exit 0
[ -f /chroot/named/etc/named.conf ] || exit 0
# See how we were called.
case "$1" in
start)
# Start daemons.
echo -n "Starting named: "
daemon /chroot/named/bin/named -u named -g named -t /chroot/named
echo
touch /var/lock/subsys/named
;;
stop)
# Stop daemons.
echo -n "Shutting down named: "
killproc named
rm -f /var/lock/subsys/named
echo
;;
status)
/usr/local/sbin/ndc status
exit $?
;;
restart)
/usr/local/sbin/ndc -n /chroot/named/bin/named "restart -u named -g named -t /chroot/named"
exit $?
;;
reload)
/usr/local/sbin/ndc reload
exit $?
;;
probe)
# named knows how to reload intelligently; we don't want linuxconf
# to offer to restart every time
/usr/local/sbin/ndc reload >/dev/null 2>&1 || echo start
exit 0
;;
*)
echo "Usage: named {start|stop|status|restart}"
exit 1
esac
exit 0
Caldera OpenLinux システムでは、 先頭付近で定義されている変数を修正し、以下のようにすれば OK です。
NAME=named
DAEMON=/chroot/named/bin/$NAME
OPTIONS="-t /chroot/named -u named -g named"
【訳注:
先に述べたように、
ndc に -c, -p, -n などのオプションを用いれば、
バイナリの再コンパイルは訳者の環境では不要でした。
訳者が Debian で使っている init スクリプト
(/etc/init.d/bind) を以下に示します。
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
test -x /chroot/named/usr/sbin/named || exit 0
case "$1" in
start)
echo -n "Starting domain name service: named"
start-stop-daemon --start --quiet --exec /chroot/named/usr/sbin/named \
-- -u named -g named -t /chroot/named
echo "."
;;
stop)
echo -n "Stopping domain name service: named"
start-stop-daemon --stop --quiet \
--pidfile /chroot/named/var/run/named.pid \
--exec /chroot/named/usr/sbin/named
echo "."
;;
restart)
/usr/sbin/ndc -c /chroot/named/var/run/ndc \
-n /chroot/named/usr/sbin/named \
-p /chroot/named/var/run/named.pid \
"restart -u named -g named -t /chroot/named"
;;
reload)
/usr/sbin/ndc -c /chroot/named/var/run/ndc \
-n /chroot/named/usr/sbin/named \
-p /chroot/named/var/run/named.pid \
reload
;;
force-reload)
$0 restart
;;
*)
echo "Usage: /etc/init.d/bind {start|stop|reload|restart|force-reload}" >&2
exit 1
;;
esac
exit 0
named と named-xfer) の置場所は
ディレクトリ構造に関する訳注
のところで書いたように、chroot jail 内の /usr/sbin にしています。】
named.conf にもいくつか追加・修正を行い、
いろいろなディレクトリが正しく動作するようにする必要があります。
特に、以下を option セクションに追加 (あるいはすでにあれば修正)
しなければなりません。
directory "/etc/namedb";
pid-file "/var/run/named.pid";
named-xfer "/bin/named-xfer";
これらのファイルは named デーモンが読むことになるので、
もちろんパスはすべて chroot jail 内部での相対位置になります。
【訳注: named.conf に関する訳注 のところで書きましたが、 directory は一時ファイルの置き場所であると同時に ゾーンファイルのパス指定のベースディレクトリになるところです。
pid-file はデフォルトと同じなので特に指定の必要はなし、
named-xfer は
ディレクトリ構造に関する訳注
で書いたように、バイナリを /chroot/named/usr/sbin
に置けば指定しなくて良いはずです。】
何人かの人のレポートによれば、
以下の余分なブロックを named.conf に書かないと、
ndc が正しく動作しない、とのことです。
controls {
unix "/var/run/ndc" perm 0600 owner 0 group 0;
};