NetBSDでもchronyで時刻同期してみる

[NetBSD Advent Calendar 2020](https://qiita.com/advent-calendar/2020/netbsd) 2日目の記事です。
今日はNetBSDでの時刻同期を[chrony](https://chrony.tuxfamily.org/)で行う手順を紹介しようと思います。

## 背景

仮想マシン上に各種バージョンのNetBSDをインストールしてカーネルビルドを試すような場合、ストレージ用のマシンにソースツリーを展開し、NFS経由で参照したいことがあります。その時にそれぞれのマシンで時刻がズレていたりするとビルド結果がおかしくなることがあり、ちゃんと時刻を同期させておくことが(意外と)重要です。

`ntpdate` を使用すればお手軽な時刻を同期できるため、私の環境でも以下のようなCRON設定を行い、定期的に時刻合わせするという運用を行っていました。

```sh
# run five minutes after midnight, every day
5 0 * * *       ntpdate s2csntp.miz.nao.ac.jp > /dev/null
```

これはこれで悪くはないのですが、Linux環境では別のお作法で時刻同期の設定を行うこともあり、「時刻同期したいだけなのにそれぞれの環境で個別の手順を覚えるのはちょっと面倒...。ntpdateで良いかな...」と考えていました。特にCentOS 7,8環境ではバージョンによって時刻同期の設定手順が異なっており、CentOS 8では[chrony](https://chrony.tuxfamily.org/)を使用する方法になっていました。仕方なしに手順を調べたりしていたのですが、[chrony](https://chrony.tuxfamily.org/)のWebサイトを見るとNetBSDもサポートしているようで、これならNetBSDでもCentOSにも設定手順がある程度共用できそうな感じです。

そこで今日の記事では、NetBSDで[chrony](https://chrony.tuxfamily.org/)を利用した時刻同期設定を紹介しようと思います。

## NetBSDでchronyを利用する

### chronyのインストール

ソースコードから[chrony](https://chrony.tuxfamily.org/)をビルドする必要があるのかなと思っていましたが、パッケージで提供されているようで、単に `pkg_add` でインストールすればまずは準備完了です。

```sh
$ sudo -i pkg_add -v pkgin
$ sudo -i pkgin search chrony
chrony-3.5.1         Daemon for maintaining the accuracy of computer clocks
$
$ sudo -i pkg_add -v chrony
```

以下のファイルがインストールされます。

```sh
$ pkg_info -L chrony
Information for chrony-3.5.1:

Files:
/usr/pkg/bin/chronyc
/usr/pkg/man/man1/chronyc.1
/usr/pkg/man/man5/chrony.conf.5
/usr/pkg/man/man8/chronyd.8
/usr/pkg/sbin/chronyd
/usr/pkg/share/examples/chrony/chrony.conf.example
/usr/pkg/share/examples/chrony/chrony.keys.example
/usr/pkg/share/examples/rc.d/chronyd
```


### chronyでの時刻同期設定

#### 必要なファイルの配置

パッケージ経由で設定用のサンプルファイル( `chrony.conf.example` )と `rc.d` 用のスタートアップスクリプトが提供されるので、まずはそれを配置します。

```sh
$ sudo cp -i /usr/pkg/share/examples/rc.d/chronyd /etc/rc.d/chronyd
$ sudo cp -i /usr/pkg/share/examples/chrony/chrony.conf.example /usr/pkg/etc/chrony.conf
```

#### chrony.confの設定

配置した `/usr/pkg/etc/chrony.conf` を設定します。私の環境では以下のような設定を行いました。
基本的には `server` と `allow` ディレクティブの設定でOKです。

```sh
$ diff -u /usr/pkg/share/examples/chrony/chrony.conf.example /usr/pkg/etc/chrony.conf
--- /usr/pkg/share/examples/chrony/chrony.conf.example  2020-10-09 08:42:58.000000000 +0900
+++ /usr/pkg/etc/chrony.conf    2020-12-02 08:22:47.396997981 +0900
@@ -27,6 +27,7 @@
 # you can access at http://support.ntp.org/bin/view/Servers/WebHome or
 # you can use servers from the pool.ntp.org project.

+server s2csntp.miz.nao.ac.jp iburst
 ! server foo.example.net iburst
 ! server bar.example.net iburst
 ! server baz.example.net iburst
@@ -143,6 +144,7 @@
 #
 # e.g. to enable client access from the 192.168.*.* class B subnet,

+allow 192.168.10.0/24
 ! allow 192.168/16

 # .. but disallow the 192.168.100.* subnet of that,
```

#### chronydの起動

`/etc/rc.d/chronyd` で時刻同期デーモンの `chronyd` を起動します。

```sh
$ sudo /etc/rc.d/chronyd onestatus
chronyd is not running.
$
$ sudo /etc/rc.d/chronyd onestart
Starting chronyd.
$
$ sudo /etc/rc.d/chronyd onestatus
chronyd is running as pid 8860.
```

NTPサーバとの同期状況は `chronyc sources` コマンドで確認できます。 `^*` は現在同期しているNTPサーバを示しており、この例では `133.40.41.136` と時刻同期しているようです。

```sh
$ chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 133.40.41.136                 2   6    17    16  +8019us[-1023ms] +/-   59ms
```

`chrony.conf` に設定した `s2csntp.miz.nao.ac.jp` を名前解決してみると `133.40.41.136` が得られるため、設定したNTPサーバを利用していることが分かります。

```sh
$ nslookup s2csntp.miz.nao.ac.jp | egrep '^Name|^Address'
Address:        192.168.10.1#53
Name:   s2csntp.miz.nao.ac.jp
Address: 133.40.41.135
Name:   s2csntp.miz.nao.ac.jp
Address: 133.40.41.136
Name:   s2csntp.miz.nao.ac.jp
Address: 133.40.41.134
```

#### 時刻同期してみる

コマンドラインから時刻同期する場合は `chronyc -a makestep` コマンドを使用します。
(実験用の仮想マシン上だったので、派手に時刻がズレていました...)

```sh
$ date ; sudo chronyc -a makestep ; date
水 12月  2 08:25:17 JST 2020
200 OK
水 12月  2 23:42:22 JST 2020
```

これで[chrony](https://chrony.tuxfamily.org/)を使用した時刻同期設定が行えました。

## まとめ

[chrony](https://chrony.tuxfamily.org/)のインストールと時刻同期設定について紹介してみました。
`ntpdate` でも良いといえばそうなのですが、[chrony](https://chrony.tuxfamily.org/)はCentOS 8系でも採用されており、設定手順をある程度揃えておけるというのは利点かもしれません。OpenBSDはチェックできていませんが、FreeBSDでもパッケージで提供されているようなので、BSD系での時刻同期を[chrony](https://chrony.tuxfamily.org/)に揃えてしまうのも良さそうです。