設定ファイルとしては、これまでお見せしてきたテキスト形式のknot.confの他にconfiguration databaseと呼ばれるバイナリ形式のファイルを使うこともできます。
knot.confではなくconfiguration databaseを使うと、knotdを終了してもDynamic configurationで投入した設定を保持して、次回の起動時にも反映させることができます。
configuration databaseを作るには
$ knotc conf-init
OK
で空のconfiguration databaseを作り、すべての設定をdynamic configurationで投入していく方法と
$ knotc conf-import /etc/knot/knot.conf
OK
でknot.confをインポートする方法があります。
knotc conf-initを使う方法を少しだけ試してみます。
$ knotc conf-init
OK
$ ls -al /var/lib/knot/confdb
合計 32
drwxr-x--- 2 knot knot 4096 8月 24 21:20 .
drwxr-xr-x 5 knot knot 4096 8月 24 21:20 ..
-rw-r----- 1 knot knot 20480 8月 24 21:20 data.mdb
-rw-r----- 1 knot knot 40448 8月 24 21:20 lock.mdb
config databaseが作られました。
knotdを起動します。
$ /usr/bin/sudo knotd -v
2018-08-24T21:22:09 debug: confdb '/var/lib/knot/confdb'2018-08-24T21:22:09 info: Knot DNS 2.4.0 starting
2018-08-24T21:22:09 info: loading 0 zones
2018-08-24T21:22:10 warning: no zones loaded
2018-08-24T21:22:10 info: starting server
2018-08-24T21:22:10 info: server started in the foreground, PID 1114
2018-08-24T21:22:10 info: control, binding to '/run/knot/knot.sock'
/etc/knot/knot.confではなく/var/lib/knot/confdbを参照して動作していることがわかります。
それではdynamic configurationで設定を投入していきます。
$ knotc conf-begin
error: failed to connect to socket '/run/knot/knot.sock' (operation not permitted)
設定が空なのでユーザknotではなくユーザrootで動作しているのでoperation not permittedと言われてしまいました。rootでやり直します。
# knotc conf-begin
OK
2018-08-24T21:27:40 info: control, received command 'conf-begin'
# knotc conf-set server.listen 0.0.0.0 ::
OK
2018-08-24T21:29:41 info: control, received command 'conf-set'
# knotc conf-set server.user knot
OK
2018-08-24T21:31:24 info: control, received command 'conf-set'
# knotc conf-set 'zone[example1.jp]'
OK
2018-08-24T21:32:30 info: control, received command 'conf-set'
# knotc conf-set 'zone[example1.jp].file' /etc/knot/primary/example1.jp.zone
OK
2018-08-24T21:34:51 info: control, received command 'conf-set'
knotc conf-diffでconf-begin以降に投入した設定を確認することができます。
# knotc conf-diff
+server.user = knot
+server.listen = 0.0.0.0 ::
+zone.domain = example1.jp.
+zone[example1.jp.].file = /etc/knot/primary/example1.jp.zone
# knotc conf-commit
OK
2018-08-24T21:38:37 info: control, received command 'conf-commit'
2018-08-24T21:38:37 info: binding to interface '0.0.0.0@53'
2018-08-24T21:38:37 info: binding to interface '::@53'
2018-08-24T21:38:37 info: [example1.jp.] zone will be loaded, serial none
2018-08-24T21:38:37 info: [example1.jp.] loaded, serial 1
dynamic configurationで追加したexample1.jpゾーンについてクエリしてみます。
# kdig +norec @localhost example1.jp
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 32548
;; Flags: qr aa; QUERY: 1; ANSWER: 0; AUTHORITY: 1; ADDITIONAL: 0
;; QUESTION SECTION:
;; example1.jp. IN A
;; AUTHORITY SECTION:
example1.jp. 900 IN SOA ns.example1.jp. hostmaster.example1.jp. 1 1200 900 2419200 900
;; Received 79 B
;; Time 2018-08-24 21:41:28 JST
;; From ::1@53(UDP) in 0.2 ms
ちゃんと応答します。
それではknotdを再起動してみます。
# knotc stop
Stopped
2018-08-24T21:40:40 info: control, received command 'stop'
2018-08-24T21:40:40 info: stopping server
2018-08-24T21:40:40 info: updating zone timers database
2018-08-24T21:40:40 info: shutting down
$ /usr/bin/sudo knotd -v
2018-08-24T21:40:54 debug: confdb '/var/lib/knot/confdb'
2018-08-24T21:40:54 info: Knot DNS 2.4.0 starting
2018-08-24T21:40:54 info: binding to interface '0.0.0.0@53'
2018-08-24T21:40:54 info: binding to interface '::@53'
2018-08-24T21:40:54 info: changing UID to '112'
2018-08-24T21:40:54 info: loading 1 zones
2018-08-24T21:40:54 info: [example1.jp.] zone will be loaded, serial none
2018-08-24T21:40:54 info: starting server
2018-08-24T21:40:54 info: [example1.jp.] loaded, serial 1
2018-08-24T21:40:54 info: server started in the foreground, PID 1297
2018-08-24T21:40:54 info: control, binding to '/run/knot/knot.sock'
先ほど投入した設定が反映されています。
それでは一旦/var/lib/knot/confdbを削除して、knotc conf-importを使い、/etc/knot/knot.confの内容をインポートしたconfiguration databaseを作成してみます。
$ rm -rf /var/lib/knot/confdb
$ knotc conf-import /etc/knot/knot.conf
OK
knotdを起動します。
$ /usr/bin/sudo knotd -v
2018-08-24T21:52:26 debug: confdb '/var/lib/knot/confdb'
2018-08-24T21:52:26 info: Knot DNS 2.4.0 starting
2018-08-24T21:52:26 info: binding to interface '0.0.0.0@53'
2018-08-24T21:52:26 info: binding to interface '::@53'
2018-08-24T21:52:26 info: changing UID to '112'
2018-08-24T21:52:26 info: loading 2 zones
2018-08-24T21:52:26 info: [example1.jp.] zone will be loaded, serial none
2018-08-24T21:52:26 info: [example2.jp.] zone will be loaded, serial none
2018-08-24T21:52:26 info: starting server
2018-08-24T21:52:26 info: [example1.jp.] loaded, serial 1
2018-08-24T21:52:26 info: [example2.jp.] loaded, serial 1
2018-08-24T21:52:26 info: server started in the foreground, PID 1451
2018-08-24T21:52:26 info: control, binding to '/run/knot/knot.sock'
参照しているのは/etc/knot/knot.confではなく/var/lib/knot/confdbですが、/etc/knot/knot.confに記述している設定が反映されています。
configuration databaseの内容はknotc conf-exportを使うとテキスト形式で書き出すことができます。
$ knotc stop
Stopped$ knotc conf-export /tmp/exported-confdb
OK
$ cat /tmp/exported-confdb
# Configuration export (Knot DNS 2.4.0)
server:
user: "knot"
listen: [ "0.0.0.0", "::" ]
template:
- id: "Primary"
storage: "/etc/knot/primary"
zone:
- domain: "example1.jp."
template: "Primary"
- domain: "example2.jp."
template: "Primary"
knotc conf-importとknotc conf-exportはknotdを経由せず直接configuration database にアクセスするので、knotdの動作中には行わないように注意されています。configuration databaseを使って運用しているときに設定を変更する方法としては
の2通りが考えられますが、1つ目方法では設定変更の都度knotdを止めなければならず、今やっているような実験ならともかく実運用しているネームサーバにはふさわしくない方法です。したがって、一度configuration databaseを使い始めたら、それ以降はdynamic configurationで運用を続けていくことになるのではないかと思います。
on-the-fly zone managementとdynamic configurationを使えば、ゾーンファイルやknot.confを直接編集することなくコマンドラインでリソースレコードを追加/削除/変更したりゾーン自体を追加したりできるので、例えばWebインターフェースを持つDNSホスティングのサーバを構築するのに応用できるんじゃないでしょうか。
Last update: $Date: 2018-10-21 16:09:48 +0900 (Sun, 21 Oct 2018) $