timesyncdのFallbackNTPは「予備サーバー」ではない
環境
Ubuntu 20.04LTS(デスクトップ版)などtimesyncdで時刻合わせをしているOS。
要約
FallbackNTP
の設定はNTP
に「アクセスできない」時ではなく、NTP
が「定義されていない」時にのみ使用される。
FallbackNTPを設定しても使用されない?
Ubuntu(デスクトップ版)は18.04以降、時刻合わせにtimesyncdを使うようになっているが、/etc/systemd/timesyncd.conf
の設定項目にFallbackNTP
というものがあり大抵の解説サイトで「予備サーバー」といった説明がされている。
NTP
の設定方法がサーバーをスペース区切りで複数記載できるようになっていることもあり、ntpdの動作になまじ詳しかったりすると以下のような動作をしていると思い込むかもしれない。
-
NTP
にリストされているNTPサーバー「すべて」にアクセスして得られた時刻を総合して現在時刻を設定する。 - 上記が失敗した時に
FallbackNTP
のリストをNTP
のリストの代わりに使用する。
自分も、そう信じてNTP
FallbackNTP
を設定していたのだが、NTP
のサーバーにアクセスできない場合でもFallbackNTP
が使用されず時刻同期されないままになるので納得できないでいた。
調査結果
探してみると同じ勘違いをしている人が…いた。
これによると、
-
FallbackNTP
はNTPサーバーが「定義されていない」時に使用され、NTP
にリストされているサーバーにアクセスできなくても「定義さえされている」ならFallbackNTP
は使用されない。 -
NTP
のリストは先頭から順に「一つずつ」アクセスして一つ成功すれば以降はそのサーバーが使用される。
ということらしい。timesyncd.confの説明から、この動作を読み取れなかったのは先入観のせいなのだろうか。
設定の仕様
- 残念ながらntpdのように複数のNTPサーバーから信頼できる時刻を割り出して設定するという使い方はできない。
- 複数のNTPサーバーを指定し、優先したいNTPサーバーがなく、一つのNTPサーバーに固定されても構わないのであれば
NTP
にリストする。 - NTPサーバーに優先順位があり、毎回(あるいは定期的に)先頭から順にNTPサーバーをチェックする(こうしたい場合が一番多いのではなかろうか)という使い方は出来ない。
-
FallbackNTP
はNTP
が空の時以外意味を持たないので無意味に思えるが、唯一違うのは、systemd.networkで定義したNTPサーバーとNTP
は対等であるのに対し、FallbackNTP
は劣後するという点くらいに思える。 - 明示的に書かれていないが
NTP
を空にしてsystemd.networkでの定義ごと「リセット」し、FallbackNTP
に対象NTPサーバーをリストするというのがFallbackNTP
の使用法だと思われる。 - Ubuntuのデフォルトではsystemd.networkでNTPの設定をすることはないので、事実上両者に差はないということになる。
動作検証
NTP
を空にしてFallbackNTP
に対象NTPサーバーをリストする設定で動作を確認した。
Ubuntu 18.04にはないが、20.04ではtimedatectl timesync-status
というコマンドが使える。
-
NTP
FallbackNTP
両方を空にするとUbuntuの場合OSのデフォルト値ntp.ubuntu.com
が有効になる。 -
NTP
に不正なアドレスを入れた場合でさえFallbackNTP
が有効になることはない。 - 一旦アクセス可能なNTPサーバーが見つかれば、リストでそれより前に載っているNTPサーバーにアクセスできるようになっても、サーバを変更することはない。
- 再起動するか使用中のNTPサーバーがアクセス不能になると、リストの最初から読み直す。
考察
他の人の記述を見ても自分と同じような勘違いを前提にした設定内容を記載している人は結構いるように見えた。
一方、Ubuntuのデフォルト設定はコメントアウトされた状態ながら、
#NTP=
#FallbackNTP=ntp.ubuntu.com
となっており、冒頭の勘違いの解釈でも矛盾はないが、上記を踏まえて読むとデフォルト値がNTP
でなくFallbackNTP
の方に定義されているのは、systemd.networkでの定義によらずNTPのデフォルト値を定めるためと深読みすることもできる。
実際のところNTPサーバーにアクセス出来ないという事態がめったに無いので問題になることは稀とは思うが、以前から頭にひっかかっていた疑問が解けた。アクセスできない時の"Fallback"ではなく定義されていない時の"Fallback"であるというのは、名前の付け方が非常に紛らわしいのではないかと思った。
また、timesyncdの設定をsystemd.networkの設定に「優先させる」ために"Fallback"に設定を記載するというのも理解に苦しむが、これについては明示的に書かれた使用法ではないので自分がさらに勘違いしている可能性もあるとは思う。
改訂履歴(表現の修正などは除く)
- 2020/6/20: 初版