QNAP NASにChronyを導入し高精度時刻同期

# 概要
自宅に導入したQNAP社のNASにChronyを入れて、時刻を同期してみました。おそらくQNAP社製NASの大半が、以下の方法で設定可能だと思います。

Chronyは、スクラッチから書かれたNTPクライアント・サーバーで、高精度の時刻同期を効率よく実現します。素のntpdが苦手とする仮想PC、ラップトップPC、モバイル回線、手作業での時刻合わせといった、環境が安定しない状況下でもいい感じに統計を取り 、ベストエフォートの時刻情報を提供します。昔NTPを初めて知った時に、こんな機能があれば良いなあと思っていたものがすべて入っており、使い勝手の良いツールです。Windows版が無いのが残念。

もちろん、QNAPのNAS自体にも元々時刻同期の仕組みはあるのですが、最短でも1時間に1回しか同期してくれず、しかもなぜか私の環境では時々同期に失敗するという事情がありました。色々と調べましたが良くわからないので「もうChronyを入れて解決しよう」となりました。

手順は、[[QNAPにntpdをインストールしてNTPサーバーにしてみた]](https://tech-mmmm.blogspot.com/2016/02/qnapntpdntp.html)を参考にします。基本的にはそのページとほぼ同じで、1 Entwareのインストール、2 Chronyのインストール、3 設定ファイルの修正、4 chronydの起動で良いのですが、いくつか注意点があります。

# 設定手順
## NAS本体の設定

当然ながら、NAS本体の **時刻同期機能** および **NTPサーバー機能** は無効にします。

## Entwareのインストール

Entwareは、QTSなどのNASでも使用可能なLinuxパッケージ管理ツールです。[https://github.com/Entware/Entware/wiki/Install-on-QNAP-NAS](https://github.com/Entware/Entware/wiki/Install-on-QNAP-NAS)からstandard installationをダウンロード、PCでQNAPのApp Centerを開き、右上の「手動でインストール」ボタンでパッケージを指定してインストールします。QNAPの非公認パッケージなので、 **リスクは理解した上でインストール** しましょう。

![IMG_1605.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117634/af5d2269-b6fd-86e6-eaf3-9005d031ccc8.jpeg)

## Chronyのインストール

SSHかTelnetでNASにログインして作業します。Entwareがインストールされていれば/opt/bin/opkgコマンドでパッケージを管理可能になっていて、これはDebian系で言うaptコマンドに相当します。なので、
>sudo /opt/bin/opkg install chrony

でChronyをインストールできます。
```console:
[~] # sudo /opt/bin/opkg install chrony
Installing chrony (4.4-1) to root...
Downloading http://bin.entware.net/x64-k3.2/chrony_4.4-1_x64-3.2.ipk
Installing libgcc (8.4.0-11) to root...
Downloading http://bin.entware.net/x64-k3.2/libgcc_8.4.0-11_x64-3.2.ipk
Installing libc (2.27-11) to root...
Downloading http://bin.entware.net/x64-k3.2/libc_2.27-11_x64-3.2.ipk
Installing libssp (8.4.0-11) to root...
Downloading http://bin.entware.net/x64-k3.2/libssp_8.4.0-11_x64-3.2.ipk
Installing libpthread (2.27-11) to root...
Downloading http://bin.entware.net/x64-k3.2/libpthread_2.27-11_x64-3.2.ipk
Installing librt (2.27-11) to root...
Downloading http://bin.entware.net/x64-k3.2/librt_2.27-11_x64-3.2.ipk
Installing libcap (2.69-1) to root...
Downloading http://bin.entware.net/x64-k3.2/libcap_2.69-1_x64-3.2.ipk
Configuring libgcc.
Configuring libc.
Configuring libpthread.
Configuring libssp.
Configuring librt.
Configuring libcap.
Configuring chrony.
[~] #
```
## 設定ファイルの修正

Entwareでインストールしたプログラムによる読み書きは、基本的に **/opt以下で完結** した方が良いようです。Chronyについても/opt/etc/chrony/以下にサンプルの設定ファイルが置かれるので、そのうちいずれかをchrony.confにリネームしたうえでvi等で修正すれば良いでしょう。このファイルは普通にChronyのマニュアル通りに記述すれば良いのですが、ドリフトファイル等のファイル・ディレクトリー名を記述する箇所は、下記のように **/opt以下に変更** すべきだと思われます。

```conf:/opt/etc/chrony/chrony.conf
pool ntp.nict.jp minpoll 6 maxpoll 13 iburst

driftfile /opt/var/lib/chrony/drift

bindcmdaddress 127.0.0.1
bindcmdaddress ::1

makestep 1.0 3
rtcsync

log measurements statistics tracking
logdir /opt/var/log/chrony

allow 192.168.0.0/24
```

## chronydの起動

起動には/opt/etc/init.d/S06chronyd という名前のスクリプトを使いますが、そのままでは上手く動きません。というのも、QTSでのSuperuserの名前はadminであるのに対し、Chronyではrootであることを前提としているため、齟齬が発生しているようです。そこで、S06chronyd内の **ARGS変数を修正** し、実行するアカウント名を追加します。

```shell:/opt/etc/init.d/S06chronyd
#!/bin/sh

ENABLED=yes
PROCS=chronyd
ARGS="-u admin" #adminアカウントで実行
PREARGS=""
DESC=$PROCS
PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

chmod 750 /opt/var/run/chrony

. /opt/etc/init.d/rc.func
```

これで準備ができました。既に、システムを再起動すると自動実行されるように設定されていますが、手動でも開始できます。
>sudo /opt/etc/init.d/S06chronyd start

をコマンドラインに入力します。

```console:
[~] # sudo /opt/etc/init.d/S06chronyd start
 Starting chronyd...              done.
[~] #
```
# 動作確認

動作確認は、chronycコマンドで可能です。
```console:
[~] # /opt/bin/chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^- ntp-k1.nict.jp                1   6    17    11  +1598us[+1598us] +/-   11ms
^* ntp-a2.nict.go.jp             1   6    17    11   -783us[  -87us] +/- 6044us
^- ntp-b2.nict.go.jp             1   6    17    11   -578us[ -578us] +/- 5528us
^- ntp-b3.nict.go.jp             1   6    17    11   +424us[ +424us] +/- 5190us
[~] #
```
成功しました。NTPサーバーとしても動いているため、allowを適切に記述すれば他からの接続も可能です。