【初心者向け】Ubuntu NTP設定完全ガイド:時刻合わせの基本

はい、承知いたしました。UbuntuにおけるNTP設定について、初心者向けに約5000語の詳細な解説記事を記述します。


【初心者向け】Ubuntu NTP設定完全ガイド:時刻合わせの基本

はじめに:なぜ正確な時刻がそんなに重要なのか?

コンピューターにおける「時刻」は、私たちが普段考えている以上にシステム全体の安定性、セキュリティ、そして正確なデータ管理において極めて重要な役割を果たしています。特に、UbuntuのようなサーバーOSや開発環境では、正確な時刻が必須となります。

では、具体的にどのような場面で正確な時刻が必要になるのでしょうか?

  1. システムログとデバッグ: システムやアプリケーションの動作状況を記録するログファイルには、必ずタイムスタンプが付与されます。複数のログファイルを参照して問題の原因を特定したり、特定のイベントの発生順序を追跡したりする場合、ログのタイムスタンプが正確でなければ、原因究明は非常に困難になります。例えば、Webサーバーとデータベースサーバーでそれぞれログを確認する際に、両者の時刻が大きくずれていると、どのリクエストがどのデータベースクエリに対応するのかを正確に判断できません。
  2. ファイルシステム: ファイルの作成時刻、更新時刻、アクセス時刻は、ファイルの同期、バックアップ、バージョン管理など、さまざまな操作で利用されます。これらのタイムスタンプが不正確だと、ファイルが正しく同期されなかったり、バックアップが期待通りに機能しなかったりする可能性があります。
  3. ネットワーク通信と分散システム: 多くのネットワークプロトコルや分散システム(例えば、データベースクラスタ、メッセージキュー、コンテナオーケストレーションなど)は、参加している全てのノードで時刻が同期していることを前提としています。時刻がずれていると、通信エラーが発生したり、データの一貫性が損なわれたり、デッドロックが発生したりする可能性があります。
  4. 認証とセキュリティ: KerberosやTLS/SSL証明書など、多くの認証プロトコルやセキュリティ技術は、時刻情報に依存しています。例えば、TLS証明書は有効期限を持っており、システム時刻が正確でないと、有効な証明書が無効と判断されたり、期限切れの証明書が有効と判断されたりする可能性があります。また、一度きりのパスワード(OTP)など、時間ベースの認証システムも正確な時刻に依存します。
  5. スケジューリングされたタスク: cronなどで設定された定期実行タスクは、システム時刻に基づいて実行されます。時刻がずれていると、タスクが遅延したり、意図しない時間に実行されたりします。

このように、正確な時刻はコンピューターシステムが適切に機能するための基盤となります。そして、この正確な時刻をネットワーク経由で自動的に取得・維持するためのプロトコルが NTP (Network Time Protocol) です。

NTPは、インターネット上の標準的な時刻源(原子時計など)から階層的に時刻情報を配信し、クライアントのシステム時刻を自動的に調整します。Ubuntuを含む多くのLinuxディストリビューションでは、このNTPを利用して時刻を同期する仕組みが標準で備わっています。

この記事では、Ubuntu初心者の方でも安心してNTP設定を行えるよう、時刻の確認方法から、デフォルトの同期機能、より高機能なNTPクライアント/サーバーの設定、トラブルシューティングまで、NTP設定の全てを網羅的に、かつ分かりやすく解説していきます。さあ、あなたのUbuntu環境を正確な時刻で満たしましょう!

1. まずは現在の時刻を確認してみよう

設定を変更する前に、まずはあなたのUbuntuシステムが現在どのような時刻になっているのかを確認してみましょう。これにはいくつかのコマンドがあります。

1.1 システムクロックの確認: date コマンド

最も基本的なコマンドは date です。これはシステムのソフトウェアクロック、つまりOSが現在認識している時刻を表示します。

bash
date

実行例:
Tue Sep 12 10:00:00 JST 2023

この出力は、「火曜日、9月12日、午前10時00分00秒、日本標準時、2023年」を示しています。

date コマンドは時刻を表示するだけでなく、手動でシステム時刻を設定することもできます。ただし、NTPによる自動同期を行う場合は、手動での時刻設定は推奨されません。NTPが自動的に正確な時刻に調整してくれるからです。

手動設定の例(非推奨):
“`bash

システム時刻を手動で設定する例(非推奨)

sudo date -s “2023-09-12 10:00:00”
“`

1.2 ハードウェアクロック(RTC)の確認: hwclock コマンド

コンピューターには、システムクロックとは別に、マザーボードに搭載されたバッテリーで維持される時計があります。これをハードウェアクロック(Real Time Clock; RTC)と呼びます。OSが起動していない間も、RTCは時刻を刻んでいます。システムの起動時には、通常このRTCの時刻がシステムクロックに読み込まれます。

ハードウェアクロックの時刻を確認するには hwclock コマンドを使用します。

bash
sudo hwclock

実行例:
2023-09-12 10:00:05.123456+0900

RTCは通常、システムクロックほど高精度ではありません。NTPで同期されるのはシステムクロックですが、多くのNTPサービス(特にchrony)は、システムクロックの情報を定期的にRTCにも書き戻すことで、次回の起動時に大きく時刻がずれないようにします。

hwclock コマンドを使って、システムクロックをRTCに書き込む(同期させる)こともできます。

“`bash

システムクロックの時刻をハードウェアクロックに書き込む

sudo hwclock -w
“`

また、RTCの時刻をシステムクロックに読み込むこともできますが、起動時に自動で行われるため通常は不要です。

“`bash

ハードウェアクロックの時刻をシステムクロックに読み込む(通常は不要)

sudo hwclock -s
“`

1.3 統合的な時刻設定・確認: timedatectl コマンド

Ubuntu(およびsystemdを使用している他の多くのLinuxディストリビューション)では、時刻、タイムゾーン、NTP同期設定などを統合的に管理するための timedatectl コマンドが提供されています。これが最も推奨される時刻管理コマンドです。

現在の時刻設定全体を確認するには、オプションなしで実行します。

bash
timedatectl

実行例:
Local time: Tue 2023-09-12 10:00:10 JST
Universal time: Tue 2023-09-12 01:00:10 UTC
RTC time: Tue 2023-09-12 10:00:08
Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
NTP service: active
RTC in local TZ: yes

この出力から、以下の情報が確認できます。

  • Local time: ローカルタイムゾーンでのシステム時刻。
  • Universal time: UTC(協定世界時)でのシステム時刻。
  • RTC time: ハードウェアクロック(RTC)の時刻。
  • Time zone: 設定されているタイムゾーン。
  • System clock synchronized: システムクロックが同期されているか(手動設定含む)。
  • NTP service: NTPによる時刻同期サービスが動作しているか。
  • RTC in local TZ: ハードウェアクロックがUTCではなくローカルタイムで設定されているか(Windowsとのデュアルブート環境などで重要)。

この timedatectl コマンドは、次のセクションで説明するデフォルトのNTP同期機能である systemd-timesyncd の状態管理にも使用されます。

2. Ubuntuのデフォルト時刻同期:systemd-timesyncd

Ubuntuの比較的新しいバージョン(Ubuntu 15.04以降)では、デフォルトで systemd-timesyncd という軽量なNTPクライアントサービスが有効になっています。これは、システムクロックをNTPサーバーと同期させる機能を提供しますが、他のマシンに時刻を提供するNTPサーバー機能は持っていません。ほとんどのデスクトップユーザーや、単に自分のマシンの時刻を正確に保ちたいだけのユーザーにとっては、この systemd-timesyncd で十分な場合があります。

2.1 systemd-timesyncd の状態確認

timedatectl コマンドを使って、systemd-timesyncd の状態を確認できます。

bash
timedatectl status

前述の例のように、「NTP service: active」と表示されていれば、systemd-timesyncd が動作しており、NTPサーバーと同期しようとしていることを示します。

さらに詳しい同期状況を確認するには、以下のコマンドを使います。

bash
timedatectl timesync-status

実行例:
Server: 2001:380:c100:2::b (ntp.ubuntu.com)
Poll interval: 1min 28s (min: 32s; max: 34min 8s)
Packet Lose: 0
Packet Count: 3
System Clock: synchronized
Accuracy: 1ms
RTC Time: Fri 2024-01-26 10:00:00

この出力は、現在同期しているNTPサーバーのアドレス、ポーリング間隔、同期の状態(System Clock: synchronized)、精度などが表示されます。NTP service: active となっていても、System Clock: synchronized となるまでには少し時間がかかる場合があります。

2.2 systemd-timesyncd の有効化・無効化

timedatectl コマンドで、systemd-timesyncd を有効にしたり無効にしたりできます。

NTP同期を有効にする:
bash
sudo timedatectl set-ntp true

NTP同期を無効にする:
bash
sudo timedatectl set-ntp false

set-ntp true を実行すると、systemd-timesyncd サービスが起動(まだ起動していなければ)し、自動的に時刻同期を開始します。

2.3 systemd-timesyncd の設定変更

systemd-timesyncd は非常にシンプルなサービスですが、同期するNTPサーバーを指定するなど、基本的な設定変更は可能です。設定ファイルは /etc/systemd/timesyncd.conf です。

デフォルトでは、Ubuntuが提供するNTPサーバープール (ntp.ubuntu.com) を使用します。必要に応じて、他のNTPサーバーを指定できます。

設定ファイルを編集します(編集には管理者権限が必要です)。

bash
sudo nano /etc/systemd/timesyncd.conf

ファイルを開くと、以下のような内容が表示されます(コメントアウトされていることが多いです)。

“`ini
[Time]

NTP=

FallbackNTP=ntp.ubuntu.com

RootDistanceMaxSec=5

PollIntervalMinSec=32

PollIntervalMaxSec=2048

“`

同期したいNTPサーバーを指定するには、NTP= の行のコメントアウトを外し、サーバーアドレスを記述します。複数のサーバーを指定する場合はスペースで区切ります。例えば、日本のNTPサーバープールとNICTのサーバーを指定する場合:

“`ini
[Time]
NTP=jp.pool.ntp.org ntp.nict.jp

FallbackNTP=ntp.ubuntu.com

RootDistanceMaxSec=5

PollIntervalMinSec=32

PollIntervalMaxSec=2048

“`

FallbackNTP は、NTP で指定したサーバーから応答がない場合の代替サーバーを指定します。デフォルトの ntp.ubuntu.com を残しておくと良いでしょう。

設定ファイルを保存したら、変更を適用するために systemd-timesyncd サービスを再起動する必要はありません。timedatectl set-ntp true を実行すれば、設定が再読み込みされます。あるいは、単にシステムを再起動しても良いでしょう。

より確実に設定を反映させるには、サービスを再起動します。

bash
sudo systemctl restart systemd-timesyncd

その後、timedatectl timesync-status で新しいサーバーが参照されているか確認できます。

2.4 systemd-timesyncd の利点と限界

利点:

  • 設定が非常に簡単で、デフォルトで有効になっている。
  • 軽量でシステムリソースをほとんど消費しない。
  • デスクトップ環境や、単に自分のマシンの時刻を正確に保ちたいだけの用途には十分。

限界:

  • NTPサーバー機能を持たない(他のマシンに時刻を提供できない)。
  • 時刻の補正方法がシンプルで、より高精度な同期には向かない場合がある。
  • ネットワークの状態が不安定な環境や、時刻の厳密な同期が必要な環境(サーバー用途など)では、より高機能なNTP実装(chronyやntpd)が推奨される。

もしあなたのUbuntu環境で、より高精度な時刻同期が必要だったり、他のマシンに時刻を提供したい場合は、次に説明する chrony または ntpd といった本格的なNTPサービスを導入することを検討しましょう。

3. より本格的なNTPサービス:chronyとntpd

systemd-timesyncd は手軽ですが、サーバー用途やより精密な時刻同期が必要な場合には、chrony または ntpd というより高機能なNTPサービスを使用するのが一般的です。これらは、単に時刻を取得するだけでなく、時刻のずれを精密に測定し、システムクロックの周波数(ドリフト)を調整することで、より安定した正確な時刻を維持します。また、ローカルネットワーク内の他のマシンに時刻を提供するNTPサーバーとして機能させることも可能です。

Ubuntuでは、これらのうち chrony が比較的新しく、より推奨される傾向にあります。

3.1 chrony vs ntpd:どちらを選ぶべきか?

historically, ntpd (Network Time Protocol daemon) has been the standard NTP implementation on Linux for many years. However, chrony has emerged as a modern alternative with several advantages.

  • chrony:

    • 利点:
      • 高速な初期同期: システム起動後、より迅速に時刻を同期させることができます。
      • 変動する接続への対応: ネットワーク接続が断続的な環境(ラップトップなど)でも、より安定して機能します。
      • リソース効率: ntpd よりも少ないCPUとメモリを使用します。
      • より優れた精度: 特に周波数(ドリフト)調整において、より精密なアルゴリズムを使用しています。
      • 新しい機能: NTPv4の新しい機能をより早く取り込む傾向があります。
    • 欠点:
      • ntpd に比べて歴史が浅く、情報が少ない場合がある(最近は普及しており情報も増えています)。
  • ntpd:

    • 利点:
      • 長い歴史と実績: 非常に古くから使われており、安定しています。
      • 豊富な情報: トラブルシューティング情報や設定例が豊富に存在します。
      • 機能豊富: 多くの高度な設定オプションや認証機能などをサポートしています。
    • 欠点:
      • 起動時の初期同期に時間がかかる場合がある。
      • ネットワークの断続的な変化に弱い場合がある。
      • リソース消費が chrony よりやや多い。
      • セキュリティに関する過去の脆弱性(Monlistなど)の問題があった(現在は修正済み)。

結論として、特別な理由がない限り、Ubuntuでは chrony を選択するのが推奨されます。 chrony は現代のネットワーク環境やハードウェア特性により適しており、パフォーマンスと精度に優れています。

もしntpdを選択する必要がある場合(例えば、既存のシステムとの互換性や、特定のntpdの機能が必要な場合など)、ntpdも引き続き利用可能です。

以降では、まず推奨である chrony の設定方法を詳しく解説し、その後に ntpd の設定方法を解説します。

3.2 デフォルトNTPサービス (systemd-timesyncd) の無効化

chronyやntpdをインストールして使用する場合、デフォルトで有効になっている systemd-timesyncd は競合を避けるために無効にする必要があります。

timedatectl コマンドを使って無効にします。

bash
sudo timedatectl set-ntp false

これにより、systemd-timesyncd サービスは停止し、次回起動時も自動起動しなくなります。

4. chrony による NTPクライアント設定(推奨)

chronyをインストールし、NTPクライアントとして設定する方法を解説します。

4.1 chrony のインストール

chronyパッケージはUbuntuのリポジトリからインストールできます。

bash
sudo apt update
sudo apt install chrony

インストールが完了すると、chronyサービス(chronydというデーモン名で実行されます)が自動的に起動し、デフォルトの設定ファイルに基づいて時刻同期を開始しようとします。

4.2 chrony の設定ファイル (/etc/chrony/chrony.conf)

chronyの全ての動作設定は、/etc/chrony/chrony.conf というファイルで行います。このファイルは、インストール時に作成され、デフォルトの設定が含まれています。

設定ファイルを編集するには、管理者権限が必要です。

bash
sudo nano /etc/chrony/chrony.conf

デフォルトの設定ファイルには、様々な設定ディレクティブと説明(コメントアウトされた行やコメント行)が含まれています。以下に、主な設定ディレクティブとその役割を解説します。

主な設定ディレクティブ:

  • pool または server: 同期対象のNTPサーバーを指定します。

    • pool は、同じドメイン名を持つ複数のサーバーから最適なサーバーを自動的に選択して使用します。負荷分散の観点から、公開NTPサーバーを利用する場合は pool を使うのが推奨されます。
    • server は、特定の単一サーバーを指定します。
    • 書式:
      ini
      pool <ホスト名またはIPアドレス> [オプション]
      server <ホスト名またはIPアドレス> [オプション]
    • オプション例:

      • iburst: chronyが起動した際に、サーバーに連続して複数のNTPパケットを送信し、より早く初期同期を完了させようとします。通常は指定することが推奨されます。
      • prefer: 複数のサーバーが指定されている場合、このサーバーを優先的に使用します。信頼性の高い、ネットワーク的に近いサーバーに指定すると良いでしょう。
      • minpoll <数>, maxpoll <数>: ポーリング間隔(chronyがサーバーに時刻を問い合わせる頻度)を秒単位で指定します。間隔は2の累乗で指定し、実際の間隔は 2^<数> 秒となります。例えば、minpoll 4 は最小で 2^4 = 16 秒ごと、maxpoll 8 は最大で 2^8 = 256 秒ごとになります。デフォルト値(通常 minpoll 6 / maxpoll 10)は多くの環境で適切ですが、必要に応じて調整できます。
      • burst: 起動時に複数のパケットを送信する(iburstと同様)。iburst は起動時のみですが、burst は同期ソースが再選択されたり、到達不能になった後に回復した場合などにも連続送信を行います。
      • offline: chronyが起動時にこのサーバーに接続できない場合でもエラーとせず、オンラインになったら接続を試みるようにします。特にノートPCなど、ネットワーク接続が頻繁に変わる環境で有効です。
    • 設定例:
      “`ini
      # 日本の公開NTPサーバープールを利用
      pool jp.pool.ntp.org iburst

      NICTの公開NTPサーバーも追加で指定

      server ntp.nict.jp iburst prefer

      特定のIPアドレスのサーバーを指定

      server 192.168.1.10 iburst

      “`

    • 日本の公開NTPサーバー/プールの例:

      • jp.pool.ntp.org: 日本のNTPサーバーコミュニティが提供するサーバープール。 geografic pool と呼ばれ、アクセス元から地理的に近いサーバーに自動的に割り振られます。最も一般的な選択肢です。
      • ntp.nict.jp: 情報通信研究機構 (NICT) が提供する公開NTPサーバー。日本の標準時を生成している機関のサーバーであり、非常に信頼性が高いです。
      • ntp.jst.mfeed.ad.jp: インターネットマルチフィード株式会社が提供する公開NTPサーバー。こちらも信頼性が高いです。
      • ntp.sakura.ad.jp: さくらインターネット株式会社が提供する公開NTPサーバー。

    あなたの環境や好みに合わせて、これらのサーバーを組み合わせて指定できます。jp.pool.ntp.orgntp.nict.jp を指定しておくのが一般的な、かつ信頼性の高い設定です。

  • driftfile: chronyがシステムクロックの周波数誤差(ドリフト)を記録しておくファイルを指定します。このファイルに情報を保存しておくことで、chronyはシステムの再起動後も以前のドリフト情報を利用して、より早く正確な同期を確立できます。

    • 書式: driftfile <ファイルのパス>
    • 例: driftfile /var/lib/chrony/chrony.drift (デフォルトで指定されていることが多いです)
  • rtcsync: システムクロックの時刻情報を、定期的にハードウェアクロック(RTC)に書き込むようにします。これにより、システム停止中にRTCの時刻がずれても、起動後にシステムクロックと同期した正確な時刻がRTCにも反映されます。これは特に、Windowsとのデュアルブート環境でRTCの時刻がUTCかローカルタイムかで問題になる場合に役立ちます(通常はRTCをUTCに設定するのが推奨されますが、Windowsはデフォルトでローカルタイムを使用するため設定が必要です。詳しくは後述)。

    • 書式: rtcsync (引数なし)
  • makestep: システムクロックと参照元サーバーの時刻とのずれが一定値を超えた場合に、時刻を段階的に調整(ジャンプ)するのではなく、一気に修正することを許可します。通常、chronyはシステムクロックのずれを時間をかけてゆっくりと調整しますが、システムの起動直後などで大きなずれがある場合には、このオプションで指定した閾値を超えた場合に一気に時刻を修正します。

    • 書式: makestep <閾値> <回数>
    • 例: makestep 1 3 (1秒以上のずれがある場合、最大3回まで時刻をジャンプして修正する)
    • この設定は、特に起動時にネットワークに接続されておらず、後から接続した場合などに有効です。ただし、時刻ジャンプはログの整合性などに影響を与える可能性があるため、本番サーバーなどでは慎重に設定する必要があります。デフォルト設定ではこのオプションはコメントアウトされていることが多く、起動直後の大きなずれは timedatectl set-ntp true が自動的に makestep 相当の処理を行うか、あるいは手動で chronyc makestep を実行することで対応することになります。
  • allow / deny: chronyをNTPサーバーとして動作させる場合に、特定のネットワークからの時刻問い合わせを許可または拒否するための設定です(NTPサーバーとしての設定については後述)。

    • 書式:
      ini
      allow <ネットワークアドレスまたはIPアドレス>
      deny <ネットワークアドレスまたはIPアドレス>
    • 例: allow 192.168.1.0/24 (192.168.1.0/24ネットワークからの問い合わせを許可)
  • local stratum: chronyがNTPサーバーと同期できない場合に、自身のシステム時刻を「孤立した」時刻源としてローカルネットワーク内の他のマシンに提供するための設定です。この場合、通常は local stratum を大きな値(例えば local stratum 10)に設定して、このサーバーがインターネット上の正規のNTPサーバー(Stratumレベルが低い)よりも優先されないようにします。

    • 書式: local stratum <レベル>

上記以外にも多くの設定ディレクティブがありますが、まずはこれらの基本的な設定を理解しておけば、NTPクライアントとして十分機能します。

一般的な /etc/chrony/chrony.conf の例:

“`ini

Welcome to the chrony configuration file. See chrony.conf(5) for more information.

This is the drift file. It is updated chrony every hour, and used

to adjust the system clock’s frequency on start up.

driftfile /var/lib/chrony/chrony.drift

This command prevents chrony from stepping the system clock after the

initial synchronization, unless the offset is larger than 1 second.

If the offset is larger than 1 second, chrony will step the clock

after the first update, unless specified otherwise by the makestep

directive.

Note that using makestep isn’t recommended if you are running an NNTP

service on this machine.

Use makestep 1 3 at launch for faster startup synchronization if needed.

makestep 1.0 3

Enable kernel synchronisation of the real-time clock (RTC).

rtcsync

Most servers in the NTP Pool Project use a client subtype.

Use public servers from the pool.ntp.org project.

Please consider joining the pool (http://www.pool.ntp.org/join.html).

pool 2.debian.pool.ntp.org offline iburst

pool 2.ubuntu.pool.ntp.org offline iburst

pool 0.europe.pool.ntp.org iburst

pool 1.europe.pool.ntp.org iburst

pool 2.europe.pool.ntp.org iburst

pool 3.europe.pool.ntp.org iburst

日本のサーバープールとNICTのサーバーを使用する場合

pool jp.pool.ntp.org iburst
server ntp.nict.jp iburst prefer

This directive adds a server to the server list.

server 192.168.1.254 iburst

This directive specifies a host that can be used as a reference if the server

list becomes empty or un-reachable.

local stratum 10

Allow NTP client access from local network.

allow 192.168.1.0/24

Serve time even if not synchronized to a time source.

local stratum 10

Specify file containing keys for NTP authentication.

keyfile /etc/chrony/chrony.keys

Specify directory for log files.

logdir /var/log/chrony

Select which information is logged.

log measurements statistics tracking

“`

設定ファイルを編集・保存したら、chronyサービスを再起動して変更を適用します。

4.3 chrony サービスの管理

chronyサービスは systemd によって管理されます。サービスの起動、停止、再起動、状態確認には systemctl コマンドを使用します。

  • サービスの再起動(設定変更の反映など):
    bash
    sudo systemctl restart chrony

  • サービスの起動:
    bash
    sudo systemctl start chrony

  • サービスの停止:
    bash
    sudo systemctl stop chrony

  • サービスの状態確認:
    bash
    systemctl status chrony

    このコマンドで、サービスがアクティブ(active (running))になっているか、エラーが出ていないかなどを確認できます。

  • システムの起動時に自動的にサービスを開始するように設定:
    bash
    sudo systemctl enable chrony

  • システムの起動時に自動的にサービスを開始しないように設定:
    bash
    sudo systemctl disable chrony

5. chrony の状態確認とトラブルシューティング

chronyサービスが正常に動作しているか、NTPサーバーと同期できているかなどを確認するには、chronyc というコマンドラインユーティリティを使用します。これはchronyデーモン (chronyd) と通信して情報を取得します。

5.1 chronyc コマンドの主な使い方

chronyc コマンドは、通常、引数なしで実行すると対話モードに入りますが、コマンドを直接引数として渡すこともできます。ここでは、非対話モードでのよく使うコマンドを紹介します。

  • chronyc sources: chronyが同期しようとしている、または同期しているNTPサーバー(ソース)のリストと、それぞれの状態を表示します。

    bash
    chronyc sources

    実行例:
    210 Number of sources = 2
    MS Name/IP address Stratum Poll Reach LastRx KLS Cfg Mode Gty ? SourcePf
    ===============================================================================
    ^+ ntp.nict.jp 1 6 377 25 11 ** S 0 -0.000
    ^* 133.243.238.243 2 6 377 26 11 ** S 0 -0.000

    出力の各列の意味は以下の通りです。
    * MS: Source State (ソースの状態)。
    * ^: Up (サーバーへの接続が可能)。
    * ?: Unknown (不明)。
    * x: Demobilized (選択から除外された)。
    * -: Rejected (不正として拒否された)。
    * #: Selected, but distance too high (選択されたが距離が大きすぎる)。
    * *: Synchronized (同期に使用されている)。
    * +: Selected (同期元として選択候補)。
    * ~: Orphan mode (ローカルクロックを同期元としている)。
    * Name/IP address: ソースのホスト名またはIPアドレス。
    * Stratum: ソースのStratumレベル(0は原子時計など、1は直接接続、2はStratum 1から取得… 数字が小さいほど正確な時刻源に近い)。
    * Poll: ポーリング間隔(2^Poll 秒)。
    * Reach: 過去8回のNTPパケット送受信の成功/失敗を8ビットの2進数で表したもの(例: 377は8進数で、2進数だと11111111、つまり8回全て成功)。
    * LastRx: 最後にパケットを受信してからの秒数。
    * KLS: Kerning Leaps Stratum – chrony内部の状態情報。通常は気にしなくて良い。
    * Cfg: ソースが設定ファイルから追加されたか(** は設定ファイルから)。
    * Mode: ソースのモード(S はサーバー、P はピアなど)。
    * Gty: Burst / Interleaved モードの状態(通常は0)。
    * ?: Unresolved/Unreachable – ソースが解決されていないか、到達不能か。
    * SourcePf: offset (秒). システムクロックとソース間の推定オフセット。+/-は符号。

    * が付いているソースがあれば、chronyはそのサーバーと同期できていることを示します。+ は同期候補ですが、現在同期には使用されていないソースです。

  • chronyc tracking: chronyがシステムクロックをどのように管理しているか、現在の同期状態の詳細を表示します。

    bash
    chronyc tracking

    実行例:
    Reference ID : D016E3EF (ntp.nict.jp)
    Stratum : 2
    Leap status : Normal
    RTT : 0.0123 seconds
    Offset : -0.000000005 seconds
    Root delay : 0.0156 seconds
    Root dispersion : 0.0008 seconds
    Update interval : 64.0 seconds
    Peak offset : -0.000000005 seconds
    Frequency : 12.345 ppm
    Residual freq : 0.001 ppm
    Skew : 0.002 ppm
    System time : 0.000000000 seconds slow of NTP time
    Last offset : -0.000000005 seconds

    出力の主な項目の意味:
    * Reference ID: 現在同期しているサーバーのIDまたはホスト名/IPアドレス。
    * Stratum: システムの現在のStratumレベル。同期元ソースのStratum + 1 になります。
    * Leap status: うるう秒に関する情報(Normal, Insert second, Delete second, Not synchronized)。
    * RTT: Reference Time Transfer – 参照元のサーバーとの通信往復時間(Latency)。
    * Offset: システムクロックと参照元サーバーの時刻との現在の差(秒)。これが0に近いほど正確に同期できています。
    * Root delay: システムから最も上位の参照元(Stratum 1など)までの合計遅延。
    * Root dispersion: 最も上位の参照元からの時刻の信頼性を示す指標。
    * Update interval: 次に時刻情報を取得するまでの間隔(秒)。
    * Frequency: システムクロックの周波数誤差(ppm – parts per million)。chronyはこの値を調整して、システムクロックが単独でも正確に進むようにします。
    * System time: システムクロックがNTP時間に対してどのくらいずれているか。通常は非常に小さな値になります。

    この出力で、Stratum が1以上の値(同期元のStratum + 1)になっており、System timeOffset が非常に小さな値(ミリ秒以下)であれば、正常に同期できています。

  • chronyc activity: chronyが現在アクティブに使用しているソースと、待機しているソースの数を表示します。

    bash
    chronyc activity

    実行例:
    200 OK
    5 sources have measurements (5 measurements since last poll)
    2 sources have been selected to synchronize
    0 sources have been deselected by user
    0 sources have been marked as invalid
    1 sources have been deemed inaccessible by tests
    0 sources have been deemed unreachable by tests
    0 sources have been deemed malformed by tests

    この出力は、chronyがどれくらいのソースを認識し、いくつを同期に使用しているかなどの概要を示します。

  • chronyc clients: chronyをNTPサーバーとして動作させている場合に、時刻を取得しているクライアントのリストを表示します。

    bash
    chronyc clients

    実行例 (NTPサーバーとして動作していない場合は何も表示されないかエラーになります):
    Hostname NTP-Version Drop Int Last Rx Last sample <=> +/- Avg Min Max Phi
    ===================================================================================================================
    192.168.1.10 4 0 4 0.002422 -0.000001000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000

  • chronyc ntpdata <server>: 特定のNTPサーバーとの最後の通信の詳細を表示します。トラブルシューティングに役立ちます。

    bash
    chronyc ntpdata ntp.nict.jp

    実行例:
    Remote address : 2001:380:c100:2::b
    Remote port : 123
    Local address : 2001:db8:1234::5678
    Local port : 123
    Leap status : Normal
    Version : 4
    Mode : Server
    Stratum : 1
    Poll interval : 6 (64s)
    Precision : -20 (0.95µs)
    Root delay : 0.0000 seconds
    Root dispersion : 0.0000 seconds
    Reference ID : JST (0x4A535400)
    Originate Tx Timestamp : 2023-09-12 10:00:00.123456 UTC
    Receive Timestamp : 2023-09-12 19:00:00.234567 Local time
    Transmit Timestamp : 2023-09-12 19:00:00.234570 Local time
    Synchronised time : 2023-09-12 10:00:00.123456 UTC

5.2 chrony トラブルシューティング

chronyが正常に同期できない場合、以下の点をチェックしてみてください。

  1. chronyサービスは起動していますか?
    bash
    systemctl status chrony

    active (running) と表示されていることを確認します。もし inactive (dead) などであれば、sudo systemctl start chrony で起動します。エラーが出ている場合は、次のログ確認へ進みます。

  2. chronyのログを確認します。
    bash
    journalctl -u chrony

    または、設定ファイルで logdir を指定している場合は、そのディレクトリ内のログファイルを確認します (/var/log/chrony/chrony.log など)。エラーメッセージや警告が出ていないか確認し、原因を探ります。

  3. 設定ファイル (/etc/chrony/chrony.conf) は正しいですか?
    指定したNTPサーバーのアドレスは間違っていませんか? サーバーアドレスの前に poolserver は正しく書かれていますか? 編集後にサービスを再起動しましたか?

  4. ファイアウォールはUDPポート123をブロックしていませんか?
    NTPは通常、UDPポート123を使用します。クライアントとして外部のNTPサーバーに接続する場合、ローカルから外部へのUDP 123番ポートへの通信が許可されている必要があります。サーバーとして動作させる場合は、外部からのUDP 123番ポートへの通信を許可する必要があります。
    UbuntuのデフォルトファイアウォールであるUFWを使っている場合、以下のコマンドでNTPを許可できます。
    bash
    sudo ufw status # UFWの状態を確認
    sudo ufw allow ntp # NTPポート (UDP 123) を許可
    sudo ufw reload # 設定を再読み込み

  5. NTPサーバーに到達可能ですか?
    ネットワーク接続自体に問題がないか確認します。指定したNTPサーバーのホスト名に対して ping コマンドを実行してみます。
    bash
    ping ntp.nict.jp

    ping が成功しても、NTPパケットが正しく送受信できるとは限りません。NTPパケット自体の疎通確認には、ntpdate コマンドの -q オプション(chronyがインストールされていると ntpdate は chrony に置き換えられることがあります)を使うか、chronyc ntpdata を使います。
    “`bash
    # ntpdate -q コマンド(chronyがインストールされている場合は chrony版が実行される)
    sudo ntpdate -q ntp.nict.jp

    chronyc ntpdata コマンド

    chronyc ntpdata ntp.nict.jp
    “`
    これらのコマンドでサーバーから応答が得られるか確認します。もし応答がない場合、サーバー側でNTPサービスが動いていないか、間にファイアウォールなどがある可能性があります。

  6. 指定したNTPサーバーは現在利用可能ですか?
    一時的にサーバー側の問題でNTPサービスが停止している可能性もあります。他のNTPサーバーを指定してみるか、複数のサーバーを指定している場合は chronyc sources で他のサーバーの状態を確認します。

  7. システム時刻が極端にずれていませんか?
    システムクロックが実際の時刻から数分〜数時間以上ずれている場合、NTP同期がすぐに成功しないことがあります。chronyはデフォルトではゆっくり時刻を調整しますが、起動時に大きなずれがある場合は makestep オプションを一時的に有効にするか、手動で一度時刻を合わせることで同期を早めることができます(ただし手動での時刻合わせはログなどに影響を与える可能性があるため注意が必要です)。
    手動で一度だけ時刻を大きくジャンプさせる場合は、chronyサービスを停止した状態で行う必要があります。
    bash
    sudo systemctl stop chrony
    sudo ntpdate -u ntp.nict.jp # -u オプションはUDPポート123を使用
    # または、timedatectl で大まかに手動設定 (非推奨)
    # sudo timedatectl set-time "YYYY-MM-DD HH:MM:SS"
    sudo systemctl start chrony

    makestep ディレクティブを恒久的に設定ファイルに追加する場合は、前述の「makestep <閾値> <回数>」の解説を参照してください。

これらのステップを踏むことで、多くのchrony同期の問題は解決できるはずです。

6. ntpd による NTPクライアント設定(代替)

chronyではなく、より伝統的なntpdを使用したい場合の設定方法です。chronyと同様、まずはインストールし、設定ファイルを編集します。

6.1 ntpd のインストール

ntpdパッケージをインストールします。

bash
sudo apt update
sudo apt install ntp

インストールが完了すると、ntpdサービス (ntpd) が起動し、デフォルトの設定ファイルに基づいて時刻同期を開始しようとします。もし systemd-timesyncd が有効だった場合は、競合を避けるためにntpdのインストール時に systemd-timesyncd が自動的に無効化されるか、あるいはntpdサービスが起動しない場合があります。念のため、timedatectl set-ntp false を実行して systemd-timesyncd が無効になっていることを確認しておくと良いでしょう。

6.2 ntpd の設定ファイル (/etc/ntp.conf)

ntpdの全ての動作設定は、/etc/ntp.conf というファイルで行います。

設定ファイルを編集するには、管理者権限が必要です。

bash
sudo nano /etc/ntp.conf

このファイルも、インストール時に作成され、デフォルトの設定が含まれています。chronyの設定ファイルと似ていますが、一部のディレクティブ名や構文が異なります。

主な設定ディレクティブ:

  • server または pool: 同期対象のNTPサーバーを指定します。

    • chronyと同様、pool はプール内のサーバーから自動選択、server は特定のサーバーを指定します。
    • 書式:
      ini
      pool <ホスト名またはIPアドレス> [オプション]
      server <ホスト名またはIPアドレス> [オプション]
    • オプション例:

      • iburst: chronyと同様、起動時高速同期。推奨されます。
      • prefer: chronyと同様、優先サーバー。
      • minpoll <数>, maxpoll <数>: ポーリング間隔(2^<数> 秒)。chronyと同様の意味です。
      • burst: iburst と似ていますが、ntpdでは起動時だけでなく、再選択時などにも連続ポーリングを行います。
    • 設定例:
      “`ini
      # Ubuntuのデフォルトプール
      pool 0.ubuntu.pool.ntp.org iburst
      pool 1.ubuntu.pool.ntp.org iburst
      pool 2.ubuntu.pool.ntp.org iburst
      pool 3.ubuntu.pool.ntp.org iburst

      日本のサーバープールとNICTのサーバーを使用する場合

      pool jp.pool.ntp.org iburst

      server ntp.nict.jp iburst

      特定のIPアドレスのサーバーを指定

      server 192.168.1.10 iburst

      ``
      * chronyと同様、日本の公開NTPサーバー/プール (
      jp.pool.ntp.org,ntp.nict.jp` など) を使用できます。

  • driftfile: システムクロックの周波数誤差(ドリフト)を記録しておくファイルを指定します。chronyと同様の意味です。

    • 書式: driftfile <ファイルのパス>
    • 例: driftfile /var/lib/ntp/ntp.drift (デフォルトで指定されていることが多いです)
  • restrict: NTPアクセスを制御するための最も重要なディレクティブです。誰からのどの種類のNTPリクエストを許可/拒否するかを定義します。デフォルト設定では、ローカルホストからの全てのアクセスは許可され、他の全てからのアクセスは一部機能(特に古いMonlist機能など)が制限されています。

    • 書式: restrict <アドレス> [mask <ネットマスク>] [オプション]
    • <アドレス> には、default (全て)、127.0.0.1 (IPv4ローカルホスト), ::1 (IPv6ローカルホスト)、ネットワークアドレス(例: 192.168.1.0)、IPアドレス、ホスト名などを指定できます。
    • 主なオプション:

      • ignore: 全てのNTPリクエストを拒否します。
      • kod: “Kiss-o’-Death” パケットを送信します。無効なリクエストに対して理由を通知するために使われます。通常、default 設定で指定されています。
      • nomodify: 設定の変更やランタイム状態のクエリ(ntpq, ntpdc コマンドなど)を拒否します。時刻の問い合わせ(同期)は許可されます。
      • noquery: NTPクエリ(ntpq, ntpdc コマンドなど)を全て拒否します。時刻の問い合わせ(同期)は許可されます。
      • notrap: トラップサービス(リモートイベントロギング)を拒否します。
      • nostead: ステップモードでのクロック調整を無効化します。
      • nopeer: このアドレスをピアとして扱うことを無効化します。
      • noauthenticate: NTP認証を無効化します。
    • デフォルト設定例:
      “`ini
      # Local users may send all commands
      restrict 127.0.0.1
      restrict ::1

      Clients from this (default) universe are permitted to poll

      unless explicit restrict clauses apply.

      restrict default kod notrap nomodify nopeer noquery
      ``
      この例では、ローカルホスト(127.0.0.1と::1)からは全てのアクセスが許可されています。
      defaultに対するkod,notrap,nomodify,nopeer,noquery` オプションは、外部からの不要なアクセスや悪用を防ぐための基本的なセキュリティ設定です。

    • NTPサーバーとしてローカルネットワークに時刻を提供する設定例:
      ini
      # 自分のネットワーク (192.168.1.0/24) からの時刻問い合わせを許可
      restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

      この行を追加することで、指定したネットワーク内のマシンがこのntpdサーバーから時刻を取得できるようになります。nomodifynotrap は、それ以外の操作(設定変更など)は許可しないためのオプションです。

  • includefile: 他の設定ファイルを読み込みます。大規模な設定などでファイルを分割する場合に使用します。

    • 例: includefile /etc/ntp.keys
  • keys, trustedkey, controlkey: NTP認証(同期元サーバーと同期先クライアント間で認証を行い、なりすましを防ぐ)に関する設定です。鍵ファイルや信頼する鍵IDなどを指定します。初心者向けとしては高度な設定であり、通常は必要ありません。

  • disable: 特定の機能を無効化します。例えば、disable kernel はカーネルによる時刻同期を無効にします。

一般的な /etc/ntp.conf の例:

“`ini

/etc/ntp.conf, configured by ntp-config; see ntp-config(8)

manual for details

Based on the settings in the ntp package from Debian, which are

based on the recommendations of the NTP Pool Project.

Pool of NTP servers. See http://www.pool.ntp.org/

pool 0.ubuntu.pool.ntp.org iburst
pool 1.ubuntu.pool.ntp.org iburst
pool 2.ubuntu.pool.ntp.org iburst
pool 3.ubuntu.pool.ntp.org iburst

You can also call servers directly, but it’s usually better to use

a pool.

server ntp.nict.jp iburst

If you want to provide time to your local network, add a restrict

line like the following (replace 192.168.1.0 with your network):

restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html

for details. The following restrictions would work for most installations.

restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery

Local users may send all commands

restrict 127.0.0.1
restrict ::1

If you want to enable logging, add a logfile line like the following:

logfile /var/log/ntp

If you want to use a hardware clock, see the ntp.conf(5) manual page.

Usually not necessary on modern systems with ‘rtcsync’ in chrony or

systemd-timesyncd managing the hardware clock.

This driftfile is updated hourly by the ntp daemon. It is used to

adjust the system clock’s frequency on startup.

driftfile /var/lib/ntp/ntp.drift
“`

設定ファイルを編集・保存したら、ntpdサービスを再起動して変更を適用します。

6.3 ntpd サービスの管理

ntpdサービスも systemd によって管理されます。サービスの起動、停止、再起動、状態確認には systemctl コマンドを使用します。

  • サービスの再起動(設定変更の反映など):
    bash
    sudo systemctl restart ntp

  • サービスの起動:
    bash
    sudo systemctl start ntp

  • サービスの停止:
    bash
    sudo systemctl stop ntp

  • サービスの状態確認:
    bash
    systemctl status ntp

    active (running) と表示されていることを確認します。

  • システムの起動時に自動的にサービスを開始するように設定:
    bash
    sudo systemctl enable ntp

  • システムの起動時に自動的にサービスを開始しないように設定:
    bash
    sudo systemctl disable ntp

7. ntpd の状態確認とトラブルシューティング

ntpdサービスが正常に動作しているか、NTPサーバーと同期できているかなどを確認するには、ntpq というコマンドラインユーティリティを使用します。

7.1 ntpq コマンドの主な使い方

  • ntpq -p: ntpdが同期しようとしている、または同期しているNTPサーバー(ピア)のリストと、それぞれの状態を表示します。

    bash
    ntpq -p

    実行例:
    remote refid st t when poll reach delay offset jitter
    ==============================================================================
    +ntp.nict.jp .INIT. 16 u - 64 0 0.000 0.000 0.000
    *ntp.ubuntu.com 185.125.190.57 2 u 18 64 377 23.456 0.123 0.045
    +ntp.jst.mfeed.ad 133.243.238.243 2 u 20 64 377 15.789 -0.050 0.020

    出力の各列の意味は以下の通りです。
    * remote: ピアのホスト名またはIPアドレス。
    * refid: ピアが同期している参照元のID。通常はIPアドレスまたはStratum 1サーバーのユニークなID(例: GPS, PPS, 国コードなど)。
    * st: Stratumレベル。chronyと同様の意味です。
    * t: タイプ(u=unicast, m=multicast, l=local, s=symmetric, b=broadcast)。通常は u です。
    * when: 最後に有効な応答を受信してからの秒数。
    * poll: ポーリング間隔(秒)。
    * reach: 過去8回の通信の成功/失敗を8ビットの8進数で表したもの。377 は8回連続成功を示します。
    * delay: システムとピア間のネットワーク遅延(ミリ秒)。
    * offset: システムクロックとピアの時刻との現在の差(ミリ秒)。これが0に近いほど正確に同期できています。
    * jitter: 時刻オフセットの変動のばらつき(ミリ秒)。同期が安定しているほど小さな値になります。

    remote の先頭に付く文字は、そのピアの状態を示します。
    * *: 現在同期に使用されているプライマリーソース。
    * +: 同期に使用可能なセカンダリーソース。
    * -: 除外された(良くない)ソース。
    * x: デッドな(到達不能またはエラーのある)ソース。
    * #: 距離が大きすぎるソース。
    * (スペース): まだ評価中のソース。

    * が付いているサーバーがあれば、ntpdはそのサーバーと同期できています。同期が確立されるまでには、サービス起動後しばらく(数分〜数十分)かかる場合があります。

  • ntpstat: システムがNTPサーバーと同期できているかどうかの概要を表示します。

    bash
    ntpstat

    実行例 (同期できている場合):
    synchronised to NTP server (91.189.89.199) at stratum 3
    time correct to within 75 ms
    polling server every 64 s

    実行例 (同期できていない場合):
    unsynchronised
    polling server every 64 s

    synchronised と表示されていれば正常に同期できています。

  • ntptime: システムクロックとハードウェアクロックに関する情報を表示します。

    bash
    ntptime

    実行例:
    ntp_gettime() returns code 0 (OK)
    time 1678886400.000000 (approx Tue, Mar 14 2023 10:00:00.000 +0900)
    maximum error 0.000000 us, estimated error 0.000000 us
    ... (他の情報)

7.2 ntpd トラブルシューティング

ntpdが正常に同期できない場合、chronyの場合と同様に以下の点をチェックしてみてください。

  1. ntpサービスは起動していますか?
    bash
    systemctl status ntp

    active (running) と表示されているか確認します。エラーが出ていないか確認します。

  2. ntpdのログを確認します。
    bash
    journalctl -u ntp

    または、設定ファイルで logfile を指定している場合は、そのファイルを確認します。エラーメッセージや警告がないか確認します。よくあるエラーとして “no server suitable for synchronization found” などがあります。

  3. 設定ファイル (/etc/ntp.conf) は正しいですか?
    指定したNTPサーバーのアドレス、poolserver の記述、restrict 設定に間違いはありませんか? 設定変更後にサービスを再起動しましたか?

  4. ファイアウォールはUDPポート123をブロックしていませんか?
    chronyと同様、NTPはUDPポート123を使用します。必要な通信が許可されているか確認します。UFWの場合、sudo ufw allow ntp を実行します。

  5. NTPサーバーに到達可能ですか?
    ping コマンドで指定したサーバーに到達できるか確認します。また、NTPパケット自体の疎通確認には ntpdate -q コマンドが利用できます(ntpパッケージに含まれています)。
    bash
    sudo ntpdate -q ntp.nict.jp

    このコマンドがサーバーから応答を受信できれば、NTPパケットの基本的な疎通はできています。

  6. 指定したNTPサーバーは現在利用可能ですか?
    他のNTPサーバーを試してみるか、設定ファイルに複数のサーバーを指定している場合は ntpq -p の出力で各サーバーの状態を確認します。

  7. システム時刻が極端にずれていませんか?
    ntpdはchronyほど時刻ジャンプが得意ではありません。システム時刻が大きくずれている場合、手動で一度時刻を合わせる必要がある場合があります。
    bash
    sudo systemctl stop ntp
    sudo ntpdate -u ntp.nict.jp # -u オプションはUDPポート123を使用
    sudo systemctl start ntp

    ntpdateでの時刻合わせは、サービスの停止中に行う必要があります。

8. ハードウェアクロック(RTC)との同期

先述の通り、システムクロック(OSの時刻)とハードウェアクロック(RTC)は別のものです。通常、NTPで同期されるのはシステムクロックです。しかし、システム停止中も時刻を保持するRTCも正確に保つことが望ましいです。

  • なぜRTCも正確にする必要があるのか?
    システムの起動時、システムクロックはRTCの時刻を読み込んで初期化されることが多いです。もしRTCが大きくずれていると、起動直後のシステムクロックもずれた状態から始まり、NTP同期が始まるまでそのずれが維持されてしまいます。また、後述のデュアルブート環境では特にRTCの設定が重要になります。

  • chronyの場合:
    rtcsync ディレクティブを設定ファイル (chrony.conf) に記述することで、chronyはシステムクロックの時刻を定期的にRTCに書き込みます。
    ini
    rtcsync

    これにより、システムクロックで維持されている正確な時刻がRTCにも反映されます。

  • ntpdの場合:
    ntpd自体は直接RTCを管理する機能は持っていません。しかし、systemd-timesyncd がインストールされていない環境では、ntpパッケージに含まれるスクリプトや設定により、システムのシャットダウン時や起動時に自動的にシステムクロックとRTCの間で時刻が同期されるようになっています(例えば /etc/default/hwclock の設定など)。
    また、システムの起動スクリプト([email protected] など)が hwclock -s (RTC -> システムクロック)や hwclock -w (システムクロック -> RTC)を実行します。

  • timedatectl set-local-rtc コマンド:
    timedatectl コマンドの set-local-rtc オプションは、ハードウェアクロック(RTC)をローカルタイムとして扱うか、UTCとして扱うかを設定します。
    “`bash
    # RTCをローカルタイムとして扱う(Windowsとのデュアルブート時など)
    sudo timedatectl set-local-rtc true –adjust-system-clock

    RTCをUTCとして扱う(Linux単独や推奨設定)

    sudo timedatectl set-local-rtc false –adjust-system-clock
    ``
    **重要:** WindowsはデフォルトでRTCをローカルタイムとして扱います。一方、Linux(Ubuntu)は通常UTCとして扱うことを推奨します。もしWindowsとUbuntuをデュアルブートしている環境で、UbuntuをシャットダウンしてからWindowsを起動するとWindowsの時刻がずれる、あるいはその逆の現象が発生する場合、原因はRTCの扱い方の違いにある可能性が高いです。この場合、Ubuntu側で
    sudo timedatectl set-local-rtc true` を実行し、RTCをWindowsに合わせてローカルタイムとして扱うように設定することで問題が解決することがあります。ただし、UTCとして扱う方がサマータイムなどの問題を避けやすいため、可能であればWindows側でRTCをUTCとして扱うように設定する方が理想的です(Windowsのレジストリ設定が必要です)。

--adjust-system-clock オプションは、設定変更時にシステムクロックも同時に調整するかどうかを指定します。通常は指定することが推奨されます。

9. NTPサーバーとして動作させる

あなたのUbuntuマシンをローカルネットワーク内の他のマシンに時刻を提供するNTPサーバーとして設定することも可能です。これは、インターネットへのNTPアクセスが制限されている環境や、複数のマシンがあるネットワークで外部NTPサーバーへの負荷を減らしたい場合などに便利です。

NTPサーバーとして動作させる場合、信頼できる上位のNTPサーバーと同期できていること が前提となります。上位サーバーから正確な時刻を取得し、それを下位のクライアントに提供するという階層構造になります。

NTPサーバー機能は、systemd-timesyncd には含まれていません。chronyまたはntpdを使用する必要があります。

9.1 chrony を NTPサーバーとして設定

chronyをNTPサーバーとして動作させるには、設定ファイル (/etc/chrony/chrony.conf) に allow ディレクティブを追加し、時刻を提供するネットワークやホストを指定します。

“`ini

日本の公開サーバーと同期(NTPクライアント設定)

pool jp.pool.ntp.org iburst
server ntp.nict.jp iburst prefer

以下を追加して、ローカルネットワーク (例: 192.168.1.0/24) からのNTPリクエストを許可

allow 192.168.1.0/24

または特定のホストからのリクエストを許可

allow 192.168.1.100

allow client1.local

“`

allow ディレクティブを追加したら、chronyサービスを再起動します。

bash
sudo systemctl restart chrony

さらに、ファイアウォール(UFWなど)で外部からのUDPポート123へのアクセスを許可する必要があります。

“`bash
sudo ufw allow from 192.168.1.0/24 to any port 123 proto udp # 例: 192.168.1.0/24 からのUDP 123を許可

または特定のホストから

sudo ufw allow from 192.168.1.100 to any port 123 proto udp

sudo ufw reload
“`

クライアント側では、このUbuntuサーバーのIPアドレスまたはホスト名をNTPサーバーとして設定します。

9.2 ntpd を NTPサーバーとして設定

ntpdをNTPサーバーとして動作させるには、設定ファイル (/etc/ntp.conf) に restrict ディレクティブを追加し、時刻を提供するネットワークやホストからのNTPリクエストを許可する設定を記述します。

デフォルト設定には restrict default kod notrap nomodify nopeer noquery のような行が含まれており、これはデフォルトでは外部からの様々なリクエストを拒否しています。NTPサーバーとして機能させるためには、このデフォルト制限よりも優先される、許可のための restrict 行を追加する必要があります

“`ini

日本の公開サーバーと同期(NTPクライアント設定)

pool jp.pool.ntp.org iburst
server ntp.nict.jp iburst

デフォルトの制限設定(通常は変更しない)

restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery

ローカルホストからのアクセス許可(通常はデフォルトで含まれている)

restrict 127.0.0.1
restrict ::1

以下を追加して、ローカルネットワーク (例: 192.168.1.0/24) からのNTPリクエストを許可

restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

または特定のホストからのリクエストを許可

restrict 192.168.1.100 nomodify notrap

“`

restrict 行を追加したら、ntpdサービスを再起動します。

bash
sudo systemctl restart ntp

chronyと同様、ファイアウォール(UFWなど)で外部からのUDPポート123へのアクセスを許可する必要があります。設定方法はchronyの場合と同じです。

クライアント側では、このUbuntuサーバーのIPアドレスまたはホスト名をNTPサーバーとして設定します。

9.3 Stratumレベルについて

NTPのStratumレベルは、時刻源からの距離を示す階層構造です。

  • Stratum 0: 原子時計などの高精度な一次時刻源。ネットワーク経由ではアクセスできません。
  • Stratum 1: Stratum 0に直接接続しているNTPサーバー。
  • Stratum 2: Stratum 1サーバーと同期しているNTPサーバー。
  • Stratum 3: Stratum 2サーバーと同期しているNTPサーバー。
  • … と続いていきます。

NTPクライアントは、同期元サーバーのStratumレベルよりも1つ大きいStratumレベルになります。あなたが設定したUbuntuマシンがStratum 2サーバー(例:ntp.nict.jp はStratum 1)と同期している場合、そのUbuntuマシンはStratum 3として機能します。そして、そのUbuntuマシンから時刻を取得するクライアントはStratum 4となります。

サーバーとして設定する場合、chronyc trackingntpq -p コマンドで自身のStratumレベルを確認できます。自身のStratumレベルよりも数値の大きいクライアントに時刻を提供する形になります。

10. オフライン環境や特殊な環境での時刻同期

インターネットに接続できないオフライン環境では、NTPによる自動同期は利用できません。このような場合や、仮想マシンなど特殊な環境では、別の方法で時刻を管理する必要があります。

10.1 オフライン環境での時刻設定

インターネットに接続できない環境では、システム時刻はハードウェアクロック(RTC)に依存するか、手動で設定することになります。

  • 手動での時刻設定 (date コマンド):
    最も単純な方法は、手動で正確な時刻を設定することです。しかし、これは一度きりの設定であり、その後システムクロックは単独で進むため徐々にずれていきます。
    bash
    # システム時刻を手動で設定(例:2023年9月12日 10時00分00秒)
    sudo date -s "2023-09-12 10:00:00"

    時刻を設定したら、その時刻をハードウェアクロックにも書き込んでおくことで、次回起動時のずれを軽減できます。
    bash
    # システム時刻をハードウェアクロックに書き込む
    sudo hwclock -w

  • BIOS/UEFI設定:
    システムの起動時にBIOSまたはUEFI設定画面に入り、そこでハードウェアクロック(System Time/Date)を手動で設定することもできます。

  • ローカルな時刻源:
    より厳密なオフライン環境では、GPSレシーバー(PPS信号を含む)や専用のハードウェアクロックデバイスなど、外部の高精度時刻源を接続し、chronyやntpdをそれらのデバイスと連携させて同期させる方法もあります。これは高度な設定となるため、初心者向けの記事では詳細を割愛します。

10.2 仮想マシン環境

仮想マシン(VMware, VirtualBox, KVM, Hyper-Vなど)の場合、ホストOSがVMに時刻を提供していることがあります。この機能は、VMのシステムクロックが大きくずれるのを防ぐのに役立ちますが、ホストOSの時刻精度に依存します。

多くの仮想化プラットフォームでは、ゲストOS(Ubuntu)内でNTPクライアント(chronyやntpd)を動作させ、ホストOSから提供される時刻や外部NTPサーバーと同期させるのが推奨されます。ホストOSからの時刻同期機能とゲストOS内のNTPサービスが競合しないように、通常はゲストOS内のNTPサービスを優先させ、ホストOSからの時刻同期機能は無効にするか、NTPサービスのバックアップとしてのみ利用するように設定します。

VMware ToolsやGuest Additionsなどがインストールされている場合、それらの設定を確認してみてください。Ubuntuでは、systemd-timesyncdchrony は仮想環境でも問題なく動作します。

11. セキュリティに関する考慮事項

NTPは時刻を提供するプロトコルですが、セキュリティ上の注意点もいくつか存在します。

  1. 信頼できるNTPサーバーの選択: インターネット上の公開NTPサーバーを利用する場合、信頼できるソースを選択することが重要です。pool.ntp.org プロジェクトや、NICT、インターネットマルチフィードなど、よく知られた信頼性の高い組織が提供するサーバーを利用しましょう。悪意のあるNTPサーバーから偽の時刻情報を受け取ると、システムの時刻が狂わされ、ログの改ざんや証明書の検証失敗など、様々な問題を引き起こす可能性があります。
  2. NTPサーバーとして動作させる場合のアクセス制御: サーバーとして外部に時刻を提供する場合は、restrict (ntpd) や allow/deny (chrony) ディレクティブを使って、アクセスを許可するネットワークやホストを明確に指定しましょう。意図しないネットワークからのアクセスを全て拒否することで、不要なトラフィックや悪用を防ぎます。
  3. Monlist機能の脆弱性: 古いバージョンの ntpd には、monlist という機能に関する脆弱性が存在しました。これは、NTPサーバーに接続したクライアントのリストを取得する機能ですが、これを悪用されると、少量のNTPリクエストで大量の応答を生成させることができ、DDoS攻撃(NTP Amplification Attack)に利用される危険性がありました。現在のバージョンのntpdでは、この機能はデフォルトで無効化されているか、完全に削除されています。しかし、古いシステムを運用している場合は注意が必要です。デフォルトの restrict default noquery 設定は、この種のクエリをブロックします。
  4. NTP認証: より高いセキュリティが必要な環境(例えば、組織内のプライベートNTPサーバーなど)では、NTP認証を導入することを検討できます。これは、MD5やSHA1などのハッシュ関数や、NTPv4で導入されたAutokeyプロトコルを使用して、NTPパケットの正当性を検証する仕組みです。これにより、中間者攻撃による時刻情報の改ざんを防ぐことができます。ただし、認証設定はやや高度になり、サーバーとクライアントの両方で設定が必要です。初心者向けの記事としては詳細な解説は割愛しますが、このようなセキュリティ機能が存在することは覚えておくと良いでしょう。

12. まとめ

この記事では、UbuntuにおけるNTP設定について、その重要性から始まり、デフォルトの systemd-timesyncd、より高機能な chrony と ntpd の設定と管理、状態確認方法、そしてトラブルシューティングに至るまでを網羅的に解説しました。

  • 正確な時刻 は、システム運用、ログ分析、セキュリティ、ネットワーク通信など、コンピューターシステムのあらゆる側面に不可欠です。
  • NTP は、この正確な時刻を自動的に維持するための標準的なプロトコルです。
  • Ubuntuでは、デフォルトで軽量な systemd-timesyncd が有効になっており、一般的なデスクトップ用途にはこれで十分です。
  • サーバー用途やより高精度な同期、他のマシンへの時刻提供が必要な場合は、より高機能な chrony または ntpd を導入します。特別な理由がなければ、chrony が推奨されます。
  • これらのサービスは設定ファイル (/etc/chrony/chrony.conf または /etc/ntp.conf) で同期対象のNTPサーバーなどを指定し、systemctl コマンドで管理します。
  • 設定が正しく適用され、正常に同期できているかは、chronycntpq/ntpstat コマンドで確認します。同期できない場合は、ログやファイアウォール、ネットワーク接続などをチェックして原因を特定します。
  • システムクロックだけでなく、ハードウェアクロック(RTC)の設定も重要であり、特にデュアルブート環境では timedatectl set-local-rtc の設定に注意が必要です。
  • NTPサーバーとして動作させる場合は、設定ファイルでのアクセス制御とファイアウォール設定が必要です。
  • 信頼できるNTPサーバーの選択やアクセス制御は、セキュリティ上重要な考慮事項です。

正確な時刻同期は、安定した信頼性の高いシステムを構築するための基本的な一歩です。この記事を参考に、あなたのUbuntu環境のNTP設定を適切に行い、安心してコンピューターを活用してください。

これで、UbuntuのNTP設定に関する基本的な知識と具体的な手順を習得できたはずです。さらに高度な設定や特定の環境におけるチューニングが必要になった場合は、各サービスの公式ドキュメントや関連情報を参照してみてください。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール