このページはリンク切れを生じないために残してありますが、内容は古くなっていますのでご注意下さい。

インストール

まずhttp://www.knot-dns.cz/からソースをgetします。今のところ最新はv1.0.6です。getしたtar-ballを展開します。gitでレポジトリも公開されています。

Ubuntu 12.04 LTSにインストールしてみる

Ubuntu 12.04 LTSではREADMEに書いてある通りの手順ですんなりインストールできました。
apt-getで依存するパッケージをインストールします。

% /usr/bin/sudo apt-get install autoconf libtool flex bison libssl-dev liburcu-dev

続いてautoreconfig、configureを実行します。今回は

% autoreconf -if
% ./configure --prefix=/proj/knot-1.0.6 --sysconfdir=/proj/knot-dns/etc --localstatedir=/proj/knot-dns/var

というパラメータでインストールしました。
configureがエラーを発生せず終了したらmakeします。

% make

makeもエラーを発生せず終了したらmake installを実行してインストールし、さらにインストールされたダイナミックライブラリにアクセスできるようldconfigを実行します。

% /usr/bin/sudo make install
% /usr/bin/sudo ldconfig

これでインストールは終了です。

FreeBSD 8.3-RELEASEにインストールしてみる

portsでdevel/libtool、devel/autoconf、textproc/flex、devel/bisonをインストールします。
liburcuはREADMEにも書いてあるように、現時点ではportsにはありませんので、ソースの配布物からインストールしなければなりません。配布サイトはhttp://lttng.org/downloadです。READMEには0.5.4以上が必要と書いてありますが、現時点での最新である0.7.3を使ってみます。配布ファイルの名前はuserspace-rcu-0.7.3.tar.bz2です。
適切なディレクトリにソースを展開します。

% tar xvzf ~/work/userspace-rcu-0.7.3.tar.bz2
x userspace-rcu-0.7.3/
x userspace-rcu-0.7.3/liburcu-bp.pc.in
x userspace-rcu-0.7.3/LICENSE
        :
        :

configureを実行します。インストールを試したホストの都合で、--prefix=/pubとしました。

% cd userspace-rcu-0.7.3
% ./configure --prefix=/pub
checking build system type... x86_64-unknown-freebsd8.3
checking host system type... x86_64-unknown-freebsd8.3
        :
        :
config.status: executing depfiles commands
config.status: executing libtool commands
SMP support enabled.

configureがエラーを起こさず終了したのでmakeします。

% make
make  all-recursive
Making all in .
  CC     wfqueue.lo
        :
        :
  CC     test_urcu_hash-compat_futex.o
  CCLD   test_urcu_hash

makeも成功したのでrootになりmake installします。

% /usr/bin/su
Password:
#  make install
Making install in .
test -z "/pub/lib" || config/install-sh -c -d "/pub/lib"
        :
        :
 /usr/bin/install -c -m 644 rcu-api.txt cds-api.txt uatomic-api.txt '/pub/share/doc/userspace-rcu'
Making install in tests

liburcuがインストールできたので、いよいよKnot DNSのビルドに取りかかります。knot-1.0.6にcdして、まずはREADMEにしたがってautoreconfを実行します。

% autoreconf -if
libtoolize: putting auxiliary files in `.'.
libtoolize: copying file `./ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'.
libtoolize: copying file `m4/libtool.m4'
libtoolize: copying file `m4/ltoptions.m4'
libtoolize: copying file `m4/ltsugar.m4'
libtoolize: copying file `m4/ltversion.m4'
libtoolize: copying file `m4/lt~obsolete.m4'

続いてconfigureを実行します。

% ./configure --prefix=/pub/knot-1.0.6
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
        :
        :
checking for library containing rcu_set_pointer_sym... no
configure: error: liburcu not found

liburcuを非標準のディレクトリにインストールしたので、Knot DNSのconfigureが発見してくれませんでした。環境変数CFLAGSとLIBSを設定して、もう一度やってみます。

% setenv CFLAGS -I/pub/include
% setenv LIBS -L/pub/lib
% ./configure --prefix=/pub/knot-1.0.6
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
        :
        :
config.status: executing depfiles commands
config.status: executing libtool commands

今度はうまく行きました。それではmakeしてみましょう。

% make
Making all in src
make  all-am
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -std=gnu99 -DHAVE_CONFIG_H -I.    -Wall -Ilibknot -DLIBEXECDIR='"/pub/knot-1.0.6/libexec"' -DSYSCONFDIR='"/pub/knot-1.0.6/etc"' -DSBINDIR='"/pub/knot-1.0.6/sbin"' -I/pub/include -I/usr/local/include  -mmmx -msse -msse2 -msse3 -MT utils.lo -MD -MP -MF .deps/utils.Tpo -c -o utils.lo `test -f 'libknot/util/utils.c' || echo './'`libknot/util/utils.c
        :
        :
libtool: compile:  gcc -std=gnu99 -DHAVE_CONFIG_H -I. -Wall -Ilibknot -DLIBEXECDIR=\"/pub/knot-1.0.6/libexec\" -DSYSCONFDIR=\"/pub/knot-1.0.6/etc\" -DSBINDIR=\"/pub/knot-1.0.6/sbin\" -I/pub/include -I/usr/local/include -mmmx -msse -msse2 -msse3 -MT dthreads.lo -MD -MP -MF .deps/dthreads.Tpo -c knot/server/dthreads.c  -fPIC -DPIC -o .libs/dthreads.o
knot/server/dthreads.c: In function 'dt_setaffinity':
knot/server/dthreads.c:864: error: 'cpu_set_t' undeclared (first use in this function)
knot/server/dthreads.c:864: error: (Each undeclared identifier is reported only once
knot/server/dthreads.c:864: error: for each function it appears in.)
knot/server/dthreads.c:868: warning: implicit declaration of function 'pthread_setaffinity_np'
knot/server/dthreads.c:868: error: expected expression before ')' token
*** Error code 1

Stop in /u1/share/pub/src/knot-dns/knot-1.0.6/src.
*** Error code 1

Stop in /u1/share/pub/src/knot-dns/knot-1.0.6/src.
*** Error code 1

Stop in /u1/share/pub/src/knot-dns/knot-1.0.6.

調べてみたところ、FreeBSDでは定義されていないcpu_set_tが使われていることが原因でした。ちなみにUbuntu 12.04 LTSでは/usr/include/i386-linux-gnu/bits/sched.hの中で定義されていました。なお、この問題はv1.1.0-rc1では修正されています。
原因となったknot-1.0.6/src/knot/server/dthreads.cの864行目付近は

#ifdef HAVE_PTHREAD_SETAFFINITY_NP
        if (len != sizeof(cpu_set_t)) {
                return KNOTD_EINVAL;
        }
        pthread_t tid = pthread_self();
        int ret = pthread_setaffinity_np(tid, len, (cpu_set_t*)mask);
        if (ret < 0) {
                return KNOTD_ERROR;
        }
#else
        return KNOTD_ENOTSUP;
#endif

となっています。小手先ですが、試しにknot-1.0.6/src/config.hを以下のように書き換えてみました。

% cd src
% mv config.h config.h.ORG
% cp config.h.ORG config.h
% ed config.h
10154
/HAVE_PTHREAD_SETAFFINITY_NP
#define HAVE_PTHREAD_SETAFFINITY_NP 1
s/^#define/#undef/
s/ 1$//
p
#undef HAVE_PTHREAD_SETAFFINITY_NP
s/^#define/#undef/
s/ 1$//
p
#undef HAVE_PTHREAD_SETAFFINITY_NP
w
10151
q
% diff -u config.h.ORG config.h
--- config.h.ORG        2012-06-30 14:56:16.000000000 +0900
+++ config.h    2012-06-30 15:08:09.000000000 +0900
@@ -107,7 +107,7 @@
 #define HAVE_PSELECT 1
 
 /* Define to 1 if you have the `pthread_setaffinity_np' function. */
-#define HAVE_PTHREAD_SETAFFINITY_NP 1
+#undef HAVE_PTHREAD_SETAFFINITY_NP
 
 /* Define to 1 if you have the `regcomp' function. */
 #define HAVE_REGCOMP 1
% cd ..

これでもう1度makeしてみます。

% make
Making all in src
make  all-am
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -std=gnu99 -DHAVE_CONFIG_H -I.    -Wall -Ilibknot -DLIBEXECDIR='"/pub/knot-1.0.6/libexec"' -DSYSCONFDIR='"/pub/knot-1.0.6/etc"' -DSBINDIR='"/pub/knot-1.0.6/sbin"' -I/pub/include -I/usr/local/include  -mmmx -msse -msse2 -msse3 -MT utils.lo -MD -MP -MF .deps/utils.Tpo -c -o utils.lo `test -f 'libknot/util/utils.c' || echo './'`libknot/util/utils.c
        :
        :
libtool: link: gcc -std=gnu99 -Wall -Ilibknot -DLIBEXECDIR=\"/pub/knot-1.0.6/libexec\" -DSYSCONFDIR=\"/pub/knot-1.0.6/etc\" -DSBINDIR=\"/pub/knot-1.0.6/sbin\" -I/pub/include -I/usr/local/include -mmmx -msse -msse2 -msse3 -o knotd main.o  -L/usr/local/lib ./.libs/libknotd.a -L/pub/lib ./.libs/libknot.a ./.libs/libknots.a -lz -lcrypto /pub/lib/liburcu.so /pub/lib/liburcu-common.so -lpthread -lm -Wl,-rpath -Wl,/pub/lib -Wl,-rpath -Wl,/pub/lib
Making all in samples

rootになってmake installします。

% /usr/bin/su
Password:
# make install
Making install in src
make  install-am
        :
        :
[ -d //pub/knot-1.0.6/etc ] ||  /usr/bin/install -c -d //pub/knot-1.0.6/etc
[ -f //pub/knot-1.0.6/etc/knot.sample.conf ] ||  /usr/bin/install -c -m 644 knot.sample.conf example.com.zone //pub/knot-1.0.6/etc

起動してみます。

# /pub/knot-1.0.6/sbin/knotc -i start
2012-06-30T15:16:32.613555+09:00 Using '/pub/knot-1.0.6/etc/knot.conf' as default configuration.
2012-06-30T15:16:32.613819+09:00 Running in interactive mode.
2012-06-30T15:16:32.615703+09:00 Reading configuration '/pub/knot-1.0.6/etc/knot.conf' ...
2012-06-30T15:16:32.615872+09:00 Loading 1 compiled zones...
2012-06-30T15:16:32.616135+09:00 Loaded zone 'example2.jp.'
2012-06-30T15:16:32.616423+09:00 Loaded 1 out of 1 zones.
2012-06-30T15:16:32.616438+09:00 Configured 0 interfaces and 1 zones.
2012-06-30T15:16:32.616443+09:00 
2012-06-30T15:16:32.616447+09:00 Starting server...
2012-06-30T15:16:32.616557+09:00 Server started in foreground, PID = 65840
2012-06-30T15:16:32.616564+09:00 PID stored in /pub/knot-1.0.6/var/knot.pid

クエリにも応答しています。実験環境の都合でknot.confのinterfaces{}にはport 8053;と書いています。

% dig -p 8053 @localhost example2.jp SOA

; <<>> DiG 9.6.-ESV-R5-P1 <<>> @localhost -p 8053 example2.jp SOA
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8036
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;example2.jp.                   IN      SOA

;; ANSWER SECTION:
example2.jp.            86400   IN      SOA     ns.example2.jp. hostmaster.example2.jp. 2012062401 1200 900 2419200 900

;; AUTHORITY SECTION:
example2.jp.            86400   IN      NS      ns.example2.jp.

;; ADDITIONAL SECTION:
ns.example2.jp.         86400   IN      A       203.0.113.1

;; Query time: 0 msec
;; SERVER: 127.0.0.1#8053(127.0.0.1)
;; WHEN: Sat Jun 30 15:24:54 2012
;; MSG SIZE  rcvd: 120



Copyright(c) 2012 Koh-ichi Ito, All rights reserved
ページ先頭のアイコン: Copyright(c) 2017 いらすとや, All rights reserved.
Last update: $Date: 2019-08-16 11:45:02 +0900 (Fri, 16 Aug 2019) $
[indexへ|DNS関連情報へ|起動へ]