Configuration database

設定ファイルとしては、これまでお見せしてきたテキスト形式の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 managementdynamic configurationを使えば、ゾーンファイルやknot.confを直接編集することなくコマンドラインでリソースレコードを追加/削除/変更したりゾーン自体を追加したりできるので、例えばWebインターフェースを持つDNSホスティングのサーバを構築するのに応用できるんじゃないでしょうか。


Copyright(c) 2018 Koh-ichi Ito, All rights reserved

Last update: $Date: 2018-10-21 16:09:48 +0900 (Sun, 21 Oct 2018) $

[dynamic configurationへ|indexへ]