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というコマンドが使える。
-
NTPFallbackNTP両方を空にすると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: 初版