【NTP入門 第4回】Linuxの時刻同期(chrony) ― chrony.confの設定、chronyc tracking・sourcesの読み方、仮想マシンとコンテナの時刻

NTP サーバー
スポンサーリンク
スポンサーリンク

「chronyc sourcesを打ったら、記号と数字が並んでいて、同期しているのか分かりません」
「仮想マシンの時刻が、ときどき1秒近く行ったり来たりします」

Linuxの時刻同期は、今やchronyが主流です。設定はシンプルですが、状態を表示するコマンドの出力には、読み方を知らないと分からない情報が詰まっています。

第3回では、NTPが時刻を測って直す仕組みを見ました。第4回では、その仕組みがchronyの設定と出力にどう現れるかを、Linuxのサーバーと仮想マシンを例に見ていきます。


ntpdからchronyへ

Linuxでは長くntpd(NTPの参照実装)が使われてきましたが、現在の主流はchronyです。

ntpdが長く標準だったが、2014年にRHEL 7でchronyが既定になり、2018年にUbuntu 18.04でtimesyncdが既定に、2019年にRHEL 8でntpdの提供が終了し、2025年にUbuntu 25.10でchrony+NTSが既定になり、2026年8月にchrony 4.9が出たという流れを示す図
  • Red Hat Enterprise Linux(RHEL)は7でchronyを既定にし、8以降はntpdを提供していない
  • Ubuntuは18.04〜25.04で簡易なsystemd-timesyncdを既定にしていたが、25.10以降の新規インストールではchronyが既定になり、NTS(第8回)で時刻サーバーと同期する
  • chronyは、常時つながっていない端末や仮想マシンのように時計が不安定な環境でも早く合わせられるよう設計されており、NTSやハードウェアタイムスタンプにも対応する。2026年9月時点の最新版は4.9(2026年8月)

ntpdの知識は、ネットワーク機器や古いサーバーの設定を読むときに役立ちます。


chronyの構成とファイルの場所

要素RHEL 系Ubuntu(25.10 以降)役割
デーモンchronyd(chronyd.service)chronyd(chrony.service)時刻を測り、時計を直す本体
設定ファイル/etc/chrony.conf/etc/chrony/chrony.conf時刻源、直し方、配る範囲
追加の設定sourcedir /run/chrony-dhcp(DHCP で配られたサーバー)/etc/chrony/sources.d/.sources、/etc/chrony/conf.d/.conf時刻源や設定を別ファイルで足す
ドリフトファイル/var/lib/chrony/drift/var/lib/chrony/chrony.drift時計の進み・遅れ(ppm)の記録
操作コマンドchronycchronyc状態の確認と操作
通信UDP 123(NTP)、TCP 4460(NTS-KE)同左時刻の問い合わせと NTS の鍵交換

chronycは同じホストのchronydとだけ通信し、変更を伴う操作(makestepなど)にはrootの権限が要ります。一般ユーザーで実行すると501 Not authorisedと返ります。chronyc -nで時刻源をIPアドレスで、-Nで設定に書いた名前で表示できます。Windowsの相当は、W32Timeサービスとw32tmです(第5回)。


chrony.confの主な設定

時刻源

設定例意味
serverserver ntp1.corp.example.jp iburst1台のサーバーを時刻源にする
poolpool 2.rhel.pool.ntp.org iburst名前が返す複数のアドレスから時刻源を選ぶ
maxsourcespool … maxsources 4pool から使う台数。既定4、最大16
iburstserver … iburst起動直後に4〜8回続けて問い合わせ、早く合わせる
minpoll/maxpollminpoll 6 maxpoll 10問い合わせ間隔(2のべき乗秒)。既定は 6〜10(64〜1,024秒)
preferserver … prefer条件が同じならこの時刻源を優先する
ntsserver nts1.example.jp iburst ntsNTS で応答の正しさを確かめる(第8回)
minsourcesminsources 2使える時刻源がこの数に満たないと時計を直さない

時刻源が1台だと、その1台が誤った時刻を返しても見抜けません。3〜4台を参照し、多数決で外れ値を除けるようにします(第3回)。社内のサーバーを並べるときはserver、DNSの名前で入れ替わる公開サービスにはpoolを使います。台数と参照先の設計は第7回で扱います。

時計の直し方・RTC・うるう秒

設定例意味
makestepmakestep 1.0 3最初の3回の更新までに1秒を超えてずれていれば、step で一気に合わせる。以降は slew だけ
maxslewratemaxslewrate 500slew の速さの上限。chrony の既定は 83,333ppm(1/12)で、ntpd の 500ppm より速い
rtcsyncrtcsyncカーネルが11分ごとにシステム時刻を RTC に書き込む。コマンドではなく設定
driftfiledriftfile /var/lib/chrony/drift時計の進み・遅れを1時間ごとに記録し、再起動の直後から補正に使う。chronyd が書き込める権限が必要
leapsectzleapsectz right/UTCタイムゾーンのデータから、うるう秒の予定と TAI−UTC を知る
leapseclistleapseclist /usr/share/zoneinfo/leap-seconds.list同じ目的で leap-seconds.list を読む(Ubuntu の既定)
leapsecmodeleapsecmode slewうるう秒の直し方(system・step・slew・ignore)。既定は system(カーネルが1秒戻す)
smoothtimesmoothtime 400 0.001024 leaponlyサーバーとしてリープスメアを行う(配る時刻をゆっくりずらす)
  • RTCへ手動で書き込むコマンドはhwclock -w(--systohc)で、rtcsyncを使えば不要
  • リープスメアをするサーバーとしないサーバーを混ぜて参照してはいけない(第7回)。うるう秒は2027年5月20日から連続したUTCに移ることが決まったが(第2回)、それまでは設定を残す

サーバーとして時刻を配る

# 192.0.2.0/24 と 2001:db8:10::/64 のクライアントにだけ時刻を配る
allow 192.0.2.0/24
allow 2001:db8:10::/64
deny  192.0.2.128/28
# 上位と通信できない隔離環境でだけ使う(下の注意を参照)
local stratum 10 orphan
allow 192.0.2.0/24と書いた社内のNTPサーバーは、192.0.2.0/24の社内のサーバー・PCにはUDP 123で応答し、198.51.100.0/24の範囲外の端末には応答しないことと、allow 192.0.2.0は192.0.2.0の1台だけ、allow 192.0.2.0/24は256アドレスを許可することを示す図
  • 既定ではallowが無く、クライアントとしてだけ動く。allowを書いたときだけNTPサーバーになる(NTSの鍵交換の受け付けも同じ設定で決まる)
  • プレフィックス長を必ず書く:allow 192.0.2.0/24。allow 192.0.2.0は1台のホストだけの許可になる。ドットの数で長さを決める省略形(allow 192.0.2は/24)もあるが、読み違えを防ぐためCIDRで書く
  • local stratum 10は、上位を失っても「同期している」と名乗り続ける。隔離されたネットワーク専用。上位に届く環境で安易に使うと、ずれた時刻を正しい顔で配ってしまう。複数台に設定するときはorphanを付け、互いを参照させる
  • chronycの管理用の通信(UDP 323)は、既定で自ホストからだけ受け付ける

設定例:社内のNTPサーバーとクライアント

# ntp1.corp.example.jp(社内の NTP サーバー)の /etc/chrony.conf
# 外部の時刻源(選び方は第7回)
server ntp-a.example.jp iburst
server ntp-b.example.jp iburst
server ntp-c.example.jp iburst
server ntp-d.example.jp iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
leapsectz right/UTC
allow 192.0.2.0/24
logdir /var/log/chrony

# 一般のサーバー(クライアント)の /etc/chrony.conf
server ntp1.corp.example.jp iburst
server ntp2.corp.example.jp iburst
server ntp3.corp.example.jp iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync

変更はsystemctl restart chronyd(Ubuntuはchrony)で反映し、Ubuntuのsources.dだけならchronyc reload sourcesで足ります。サーバー側はファイアウォールでUDP 123を開けます(RHELはfirewall-cmd --permanent --add-service=ntp)。Windowsで同じ役割を持たせる設定は第5回で扱います。


chronyc trackingの読み方

chronyc trackingは、自分の時計が今どれだけ正確かを表示します。

$ chronyc tracking
Reference ID    : C000027B (ntp1.corp.example.jp)
Stratum         : 3
Ref time (UTC)  : Sat Sep 26 07:03:18 2026
System time     : 0.000642552 seconds slow of NTP time
Last offset     : -0.000104149 seconds
RMS offset      : 0.000598395 seconds
Frequency       : 2.581 ppm slow
Residual freq   : +0.002 ppm
Skew            : 0.151 ppm
Root delay      : 0.002197427 seconds
Root dispersion : 0.000886113 seconds
Update interval : 64.2 seconds
Leap status     : Normal
項目読み方
Reference ID今の同期先。IPv4 ではアドレスの16進(C0.00.02.7B=192.0.2.123)。7F7F0101 は local の設定で動作中
Stratum同期先(stratum 2)の1つ下。上位を失うと値が上がる
Ref time (UTC)同期先の測定を最後に反映した時刻。古いままなら同期が止まっている
System time今のずれ。システム時計が chronyd の保つ時刻より 0.64ms 遅れており、slew で縮めている途中
Last offset・RMS offset直前の更新で見積もったずれ(正なら自分が進んでいた)と、長期の平均。RMS は普段の精度の目安
Frequency直さなければ時計がどれだけ遅れるか。2.581ppm は1日に約0.22秒
Residual freq・Skew最新の測定と今の補正値の差、Frequency の見積もりの誤差。0 に近いほど安定
Root delay・Root dispersionstratum 1 までの往復の遅延の合計と、積み重なった誤差の見積もり(第3回)
Update interval直近2回の時計の更新の間隔
Leap statusNormal、Insert second、Delete second、Not synchronised のいずれか。Not synchronised なら同期していない

誤差の上限を見積もる

真の時刻を中心に、|System time| 0.64ms、Root dispersion 0.89ms、Root delay÷2 1.10msを足して誤差の上限が±約2.6msになることと、業務の要件と比べてログの突き合わせ(10ms〜1秒)には足りるが1msの要件には足りず、上限の多くは上位までの遅延と誤差なので近い上位を選ぶと縮むことを示す図

誤差の上限は「|System time| + Root dispersion + Root delay ÷ 2」で見積もれます(chronycの説明書)。この例では0.00064+0.00089+0.00110 ≒ 0.0026秒で、約2.6ms以内です。これを業務に必要な精度(第1回)と比べます。上限の多くは上位までの遅延と誤差なので、近い上位を選ぶと縮みます。Windowsではw32tm /query /status(第5回)で確かめます。


chronyc sourcesの読み方

冒頭の「記号と数字が並んでいて分からない」の答えです。

$ chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp1.corp.example.jp          2   6   377    34   +412us[ +398us] +/-   12ms
^+ ntp2.corp.example.jp          2   6   377    35   -803us[ -817us] +/-   15ms
^- ntp3.corp.example.jp          3   7   377    98  +3021us[+3021us] +/-   48ms
^x 198.51.100.20                 2   6   377    40  +2102ms[+2102ms] +/-   20ms
^? 203.0.113.30                  0   8     0     -     +0ns[   +0ns] +/-    0ns
記号意味
^ = #(1文字目)サーバー/ピア/直結の基準時計(GPS 受信機など)
*現在の同期先(最良と判断した時刻源)
+同期先と組み合わせて使っている時刻源
–使える候補だが、今は組み合わせていない
?使えない(届かない、同期していない、測定が足りない)
x誤り(falseticker)と判断:多数派と時刻が合わない
~ばらつきが大きすぎる
  • Pollは問い合わせ間隔(2のべき乗秒、6なら64秒)、LastRxは最後に良い応答を受けてからの秒数
  • Last sampleは「補正後のずれ[実測のずれ] +/- 誤差の範囲」。正のずれは自分が進んでいることを示す
  • 上の例の^x 198.51.100.20は、他より2秒も進んでいるため多数決で除かれた(第3回のfalseticker)。^?は一度も届いていない
  • -vを付けると列の説明も表示される。Windowsの相当はw32tm /query /peers(第5回)

Reachの8進数とsourcestats

Reach(8進数)2進数(右が最新)意味
37711111111直近8回すべて応答あり(正常)
37611111110最新の1回だけ応答なし(一時的な欠落)
177011111118回前の1回だけ欠落。または起動後7回成功した途中
1700001111起動後4回成功した途中(iburst の直後によく見る)
252101010101回おきに欠落。回線の品質や相手のレート制限を疑う
000000000一度も届かない。名前解決、UDP 123、相手の停止を確認
Reachは8ビットを右から3ビットずつ区切って8進数に読み替え、問い合わせのたびに1つ左へずれて右端に結果が入るので、11111111は377、最新の1回が欠落すると376、1回おきの欠落は252、一度も届かなければ0になることを示す図
$ chronyc sourcestats
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
ntp1.corp.example.jp       12   7   12m     +0.003      0.041   +405us    38us
ntp2.corp.example.jp       11   6   11m     -0.012      0.066   -790us    52us
ntp3.corp.example.jp        8   5   15m     +0.021      0.310  +2987us   410us

sourcestatsは時刻源ごとの統計で、NPは保持している測定の数、Spanはその期間、Offsetはずれの見積もり、Std Devはばらつきです。Freq SkewやStd Devが他より大きい時刻源(上のntp3)は、経路が不安定か、時刻源自体の品質が低いと考えられます。


時刻を今すぐ合わせる

$ sudo chronyc makestep            # 残っているずれを step で一気に解消
200 OK
$ sudo chronyc burst 4/4           # すぐに4回測り直す
200 OK
$ chronyc waitsync 30 0.01         # ずれが10ms未満になるまで待つ(10秒×最大30回)
try: 1, refid: C000027B, correction: 0.000576966, skew: 0.133
PS> w32tm /resync                  # Windows の相当(第5回)
+2秒進んでいた時計を、chronyの既定のslewなら時刻を止めずに最大の速さで約24秒かけて縮め、5秒後にchronyc makestepを実行するとその瞬間に時刻が2秒戻り、戻した2秒の間の時刻がログに2回現れることを示すグラフ
  • chronyc makestepは時刻を飛ばす。データベース、ログの順序、タイマーなど、時刻の飛びに弱いアプリが動く本番では、停止中や保守の時間帯に行う
  • 起動時の自動のstepはchrony.confのmakestep、手動のstepはchronyc makestep。rtcsyncはコマンドではなく設定で、手動のRTCへの書き込みはhwclock -w
  • 時刻が大きく未来にずれていた場合、stepで戻すと同じ時刻が2回現れる。ログの突き合わせやKerberosのチケットに影響するため、戻した時刻と幅を記録に残す
  • waitsyncは、起動スクリプトで「時刻が合うまで待ってからアプリを起動する」のに使える

systemd-timesyncdとtimedatectl

観点chronysystemd-timesyncd
種類NTP の完全な実装SNTP のクライアント(簡易版)
時刻源の使い方複数を同時に比べ、誤った時刻源を除く1台ずつ使う。誤った時刻を見抜けない
NTP サーバーになるできる(allow)できない
設定chrony.conf/etc/systemd/timesyncd.conf(NTP=、FallbackNTP=)
状態の確認chronyc tracking、chronyc sourcestimedatectl timesync-status
向く用途サーバー、NTP サーバー、仮想マシン精度を求めない端末や最小構成

chronyとtimesyncdを同時に動かさないでください。別々に時計を直し、時刻が揺れます。Ubuntuではchronyを入れるとtimesyncdは削除されます(パッケージが競合)。timedatectlのNTP service: activeは、どちらかが動いていることを示します(timedatectlの表示は第2回)。WindowsではGet-TimeZone、w32tm /tzで確かめます。


仮想マシンの時刻

冒頭の「仮想マシンの時刻が行ったり来たりする」の原因は、多くの場合ここにあります。

二重の同期(悪い例)では、ゲストVMのchronyが社内NTPに、ツールの同期がホストに合わせるため、10:00:00.0と10:00:00.8に交互に合わせられて時刻が行ったり来たりし、1つに決める(良い例)ではゲストはchronyだけ、ホストも同じ社内NTPを参照し周期的な同期を止めることを示す図
  • 仮想マシン(VM)の時計は、ホストのCPUを分け合って動くため、物理マシンより不安定。一時停止からの再開、スナップショットからの復元、ライブマイグレーション(vMotionなど)の後には、時刻が大きくずれることもある
  • そこでハイパーバイザーは、ゲストの時刻をホストに合わせる機能を持っている。VMware ToolsやHyper-Vの統合サービスの時刻同期、KVMのkvm-clock(準仮想化クロック)とptp_kvmなど
  • 問題は、ゲストのchronyとハイパーバイザーの機能が、別々の時刻源に向かって同時に時計を直す「二重の同期」。時刻が行ったり来たりし、ログの逆転や認証の失敗を招く

周期的に時計を合わせる仕組みは1つに決め、ゲストでchronyを使うなら、ハイパーバイザー側の周期的な同期は止めます。どちらでも、ホスト自身の時刻を正しく保つことが前提です(第6回)。

基盤ごとの設定とコンテナの時刻

基盤ハイパーバイザーの同期Linux ゲストの推奨確認
VMware vSphere周期的な同期は既定で無効。起動・再開・vMotion・スナップショット時の一回限りの同期は既定で有効chrony で社内 NTP と同期し、周期的な同期は無効のまま(第6回)vmware-toolbox-cmd timesync status
Hyper-V統合サービスの時刻同期(既定で有効)。ホストの時刻を /dev/ptp_hyperv として提供chrony で refclock PHC /dev/ptp_hyperv を使う。NTP だけにするなら統合サービスの時刻同期を止めるls /sys/class/ptp
KVMkvm-clock。ptp_kvm でホストの時計を /dev/ptp_kvm として提供chrony で NTP、または refclock PHC /dev/ptp_kvm(ホストが正確な場合)cat /sys/devices/system/clocksource/clocksource0/current_clocksource
クラウド各社の時刻サービス(Amazon Time Sync Service など)イメージの既定の設定を使う(第7回、連載「クラウド入門」第7回)chronyc sources
Web(TZ=Asia/Tokyo)、DB(TZ=UTC)、バッチ(TZ=Asia/Tokyo)の各コンテナがホストのカーネルの時計を同じように読み、その時計をホストのchronydが社内NTPに合わせることを示す図

コンテナは独自の時計を持たず、ホストのカーネルの時刻をそのまま使います。コンテナの中でchronyを動かす必要はなく、権限(CAP_SYS_TIME)が無いため通常は時刻を変えられません。Linuxの時間名前空間も単調時計などをずらすだけで、時刻は共有です。同期はホスト(Kubernetesならノード)で行い、タイムゾーンはコンテナごとにTZ環境変数などで指定します。


考えてみよう

  1. 自分が管理するLinuxサーバーでchronyc sourcesを実行し、*と+の付いた時刻源が何台あるか確かめてください。1台しか無い場合、その1台が誤った時刻を返したら何が起きますか。
  2. chronyc trackingのSystem time・Root delay・Root dispersionから、そのサーバーの時刻の誤差の上限を計算してみてください。業務に必要な精度(第1回)を満たしていますか。
  3. VMwareやHyper-V上のLinuxのVMで、ハイパーバイザーの時刻同期とゲストのchronyが、それぞれどう設定されているか説明できますか。

ヒント:この記事の誤差の上限の式、sourcesの記号の表、二重の同期の図と基盤ごとの表が手がかりです。


まとめ

  • RHEL・Ubuntuとも、既定の実装はchronyにそろった
  • 時刻源はserverで3〜4台。起動時だけmakestep 1.0 3、RTCはrtcsync
  • NTPサーバーにするならallowをCIDRで。localは隔離環境だけ
  • trackingの|System time|+Root dispersion+Root delay÷2が誤差の上限
  • sourcesの*が同期先、xは多数決で除かれた時刻源。Reach 377が正常
  • makestepは時刻を飛ばす。本番では保守の時間帯に
  • 仮想マシンは二重の同期を避ける。コンテナはホストの時刻を共有する

次回は、Windowsの時刻同期(Windows Time サービス)と、ADドメインの時刻の階層を扱います。


連載「NTP入門」全11回

  1. なぜ時刻同期が必要か
  2. 時刻の基礎知識
  3. NTPの仕組み
  4. Linuxの時刻同期(chrony)(この記事)
  5. Windowsの時刻同期
  6. ネットワーク機器・仮想基盤
  7. 設計と推奨構成
  8. NTPのセキュリティ
  9. PTPと高精度同期
  10. 時刻同期のトラブルシュート
  11. 時刻同期の設計演習

コメント

タイトルとURLをコピーしました