GPSモジュールを接続したRaspberry piでchronyを動作

# はじめに
[以前書いた記事](https://qiita.com/RCA3610/items/c478bb087acdad418cd3)では、Raspberry pi3 Model B+にGPSモジュールを接続し、ntpdを利用してNTPサーバを構築していました。
今回は上記の記事で構築した環境・機器を利用し、chronyでNTPサーバを動作させます。

2024/03/09時点
リンク切れや細かな表現を修正

# コマンド入力
下記のコマンドを入力する。
`/etc/chrony/chrony.conf`は次の項目に記載の内容に基づいて設定する。
途中に出てくる「systemd-timesyncd」はネットワークを介して時刻同期するNTPクライアントのサービスです。今回の環境では不要のため無効化しています。
また、筆者の環境ではchronydを有効化した段階でntpdは停止されていました。systemd-timesyncdが停止にならなかった理由は分かりません。

```terminal
sudo apt-get install chrony
sudo cp -a /lib/systemd/system/gpsd.service /etc/systemd/system/
sudo vim /etc/chrony/chrony.conf 
sudo systemctl enable gpsd.service
sudo systemctl restart gpsd.service
sudo systemctl disable systemd-timesyncd.service
sudo systemctl enable chrony
sudo systemctl start chrony
```

# 設定ファイル
`/etc/chrony/chrony.conf`を設定すれば動作する。`/etc/systemd/system/chronyd.service`は元から必要なパラメータが最初から設定されていたため、特に変更はいらなかった。

## /etc/chrony/chrony.conf

gpsdを利用しているため、`refclock SHM 0 refid GPS`を追記する。precisionやdelayなどのオプションで細かな設定を追記が可能。
`refclock`で記述しているSHMについては[NTP document -refclock-](http://doc.ntp.org/4.1.2/refclock.htm)や[Shared Memory Driver](https://www.ntp.org/documentation/drivers/driver28/)、[chrony.conf(5) Manual Page](https://chrony.tuxfamily.org/doc/2.4/chrony.conf.html)に詳細な説明がある。
gpsdからどのようにchronyが時刻を取得しているか参考になる。

`log`文では出力させたいログの種類を選択可能だが、今回の環境ではtrackingとmeasurements、statisticsのみ出力される。


```config
# NTP authentication.
keyfile /etc/chrony/chrony.keys

# This directive specify the file into which chronyd will store the rate
# information.
driftfile /var/lib/chrony/chrony.drift

# Uncomment the following line to turn logging on.
log tracking measurements statistics rtc refclocks tempcomp

# Log files location.
logdir /var/log/chrony

# Stop bad estimates upsetting machine clock.
maxupdateskew 100.0

# This directive enables kernel synchronisation (every 11 minutes) of the
# real-time clock. Note that it can’t be used along with the 'rtcfile' directive.
rtcsync

# Step the system clock instead of slewing it if the adjustment is larger than
# one second, but only in the first three clock updates.
makestep 1 3

# setting for GPS
refclock SHM 0 refid GPS precision 1e-1 offset 0.9999 delay 0.2


allow 192.168.1.0/24
```

## /etc/systemd/system/chronyd.service

```config
[Unit]
Description=chrony, an NTP client/server
Documentation=man:chronyd(8) man:chronyc(1) man:chrony.conf(5)
Conflicts=systemd-timesyncd.service openntpd.service ntp.service ntpsec.service
After=network.target
ConditionCapability=CAP_SYS_TIME

[Service]
Type=forking
PIDFile=/run/chronyd.pid
EnvironmentFile=-/etc/default/chrony
ExecStart=/usr/sbin/chronyd $DAEMON_OPTS
ExecStartPost=-/usr/lib/chrony/chrony-helper update-daemon
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=full

[Install]
Alias=chronyd.service
WantedBy=multi-user.target
```
# 動作確認

`chronyc sources -v`や`timedatectl status`で動作しているか確認可能。

```terminal
pi@raspi:~ $ chronyc sources -v
210 Number of sources = 1

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
#* GPS                           0   4   377    17    -14ms[  -17ms] +/-  200ms
```

# 参考サイト

- [Raspberry Pi 3 Model B + USB接続GPSレシーバ + ChronyでStratum 1なNTPサーバを作る](https://lunatilia.wordpress.com/2019/01/29/building_stratum-1_ntp-server_with_raspi3_and_bu-353s4_and_chrony/)
- [systemd な distro で ntp が動かないとき](https://tech.matchy.net/archives/1217)