はい、承知いたしました。UbuntuにおけるNTP設定について、初心者向けに約5000語の詳細な解説記事を記述します。
【初心者向け】Ubuntu NTP設定完全ガイド:時刻合わせの基本
はじめに:なぜ正確な時刻がそんなに重要なのか?
コンピューターにおける「時刻」は、私たちが普段考えている以上にシステム全体の安定性、セキュリティ、そして正確なデータ管理において極めて重要な役割を果たしています。特に、UbuntuのようなサーバーOSや開発環境では、正確な時刻が必須となります。
では、具体的にどのような場面で正確な時刻が必要になるのでしょうか?
- システムログとデバッグ: システムやアプリケーションの動作状況を記録するログファイルには、必ずタイムスタンプが付与されます。複数のログファイルを参照して問題の原因を特定したり、特定のイベントの発生順序を追跡したりする場合、ログのタイムスタンプが正確でなければ、原因究明は非常に困難になります。例えば、Webサーバーとデータベースサーバーでそれぞれログを確認する際に、両者の時刻が大きくずれていると、どのリクエストがどのデータベースクエリに対応するのかを正確に判断できません。
- ファイルシステム: ファイルの作成時刻、更新時刻、アクセス時刻は、ファイルの同期、バックアップ、バージョン管理など、さまざまな操作で利用されます。これらのタイムスタンプが不正確だと、ファイルが正しく同期されなかったり、バックアップが期待通りに機能しなかったりする可能性があります。
- ネットワーク通信と分散システム: 多くのネットワークプロトコルや分散システム(例えば、データベースクラスタ、メッセージキュー、コンテナオーケストレーションなど)は、参加している全てのノードで時刻が同期していることを前提としています。時刻がずれていると、通信エラーが発生したり、データの一貫性が損なわれたり、デッドロックが発生したりする可能性があります。
- 認証とセキュリティ: KerberosやTLS/SSL証明書など、多くの認証プロトコルやセキュリティ技術は、時刻情報に依存しています。例えば、TLS証明書は有効期限を持っており、システム時刻が正確でないと、有効な証明書が無効と判断されたり、期限切れの証明書が有効と判断されたりする可能性があります。また、一度きりのパスワード(OTP)など、時間ベースの認証システムも正確な時刻に依存します。
- スケジューリングされたタスク: 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 iburstNICTの公開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.org
とntp.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 time
やOffset
が非常に小さな値(ミリ秒以下)であれば、正常に同期できています。 -
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が正常に同期できない場合、以下の点をチェックしてみてください。
-
chronyサービスは起動していますか?
bash
systemctl status chrony
active (running)
と表示されていることを確認します。もしinactive (dead)
などであれば、sudo systemctl start chrony
で起動します。エラーが出ている場合は、次のログ確認へ進みます。 -
chronyのログを確認します。
bash
journalctl -u chrony
または、設定ファイルでlogdir
を指定している場合は、そのディレクトリ内のログファイルを確認します (/var/log/chrony/chrony.log
など)。エラーメッセージや警告が出ていないか確認し、原因を探ります。 -
設定ファイル (
/etc/chrony/chrony.conf
) は正しいですか?
指定したNTPサーバーのアドレスは間違っていませんか? サーバーアドレスの前にpool
やserver
は正しく書かれていますか? 編集後にサービスを再起動しましたか? -
ファイアウォールは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 # 設定を再読み込み -
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.jpchronyc ntpdata コマンド
chronyc ntpdata ntp.nict.jp
“`
これらのコマンドでサーバーから応答が得られるか確認します。もし応答がない場合、サーバー側でNTPサービスが動いていないか、間にファイアウォールなどがある可能性があります。 -
指定したNTPサーバーは現在利用可能ですか?
一時的にサーバー側の問題でNTPサービスが停止している可能性もあります。他のNTPサーバーを指定してみるか、複数のサーバーを指定している場合はchronyc sources
で他のサーバーの状態を確認します。 -
システム時刻が極端にずれていませんか?
システムクロックが実際の時刻から数分〜数時間以上ずれている場合、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
``
jp.pool.ntp.org
* chronyと同様、日本の公開NTPサーバー/プール (,
ntp.nict.jp` など) を使用できます。
- chronyと同様、
-
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 ::1Clients from this (default) universe are permitted to poll
unless explicit restrict clauses apply.
restrict default kod notrap nomodify nopeer noquery
``
default
この例では、ローカルホスト(127.0.0.1と::1)からは全てのアクセスが許可されています。に対する
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サーバーから時刻を取得できるようになります。nomodify
とnotrap
は、それ以外の操作(設定変更など)は許可しないためのオプションです。
- 書式:
-
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 ssynchronised
と表示されていれば正常に同期できています。 -
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の場合と同様に以下の点をチェックしてみてください。
-
ntpサービスは起動していますか?
bash
systemctl status ntp
active (running)
と表示されているか確認します。エラーが出ていないか確認します。 -
ntpdのログを確認します。
bash
journalctl -u ntp
または、設定ファイルでlogfile
を指定している場合は、そのファイルを確認します。エラーメッセージや警告がないか確認します。よくあるエラーとして “no server suitable for synchronization found” などがあります。 -
設定ファイル (
/etc/ntp.conf
) は正しいですか?
指定したNTPサーバーのアドレス、pool
やserver
の記述、restrict
設定に間違いはありませんか? 設定変更後にサービスを再起動しましたか? -
ファイアウォールはUDPポート123をブロックしていませんか?
chronyと同様、NTPはUDPポート123を使用します。必要な通信が許可されているか確認します。UFWの場合、sudo ufw allow ntp
を実行します。 -
NTPサーバーに到達可能ですか?
ping
コマンドで指定したサーバーに到達できるか確認します。また、NTPパケット自体の疎通確認にはntpdate -q
コマンドが利用できます(ntpパッケージに含まれています)。
bash
sudo ntpdate -q ntp.nict.jp
このコマンドがサーバーから応答を受信できれば、NTPパケットの基本的な疎通はできています。 -
指定したNTPサーバーは現在利用可能ですか?
他のNTPサーバーを試してみるか、設定ファイルに複数のサーバーを指定している場合はntpq -p
の出力で各サーバーの状態を確認します。 -
システム時刻が極端にずれていませんか?
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-clockRTCをUTCとして扱う(Linux単独や推奨設定)
sudo timedatectl set-local-rtc false –adjust-system-clock
``
sudo timedatectl set-local-rtc true` を実行し、RTCをWindowsに合わせてローカルタイムとして扱うように設定することで問題が解決することがあります。ただし、UTCとして扱う方がサマータイムなどの問題を避けやすいため、可能であればWindows側でRTCをUTCとして扱うように設定する方が理想的です(Windowsのレジストリ設定が必要です)。
**重要:** WindowsはデフォルトでRTCをローカルタイムとして扱います。一方、Linux(Ubuntu)は通常UTCとして扱うことを推奨します。もしWindowsとUbuntuをデュアルブートしている環境で、UbuntuをシャットダウンしてからWindowsを起動するとWindowsの時刻がずれる、あるいはその逆の現象が発生する場合、原因はRTCの扱い方の違いにある可能性が高いです。この場合、Ubuntu側で
--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 tracking
や ntpq -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-timesyncd
や chrony
は仮想環境でも問題なく動作します。
11. セキュリティに関する考慮事項
NTPは時刻を提供するプロトコルですが、セキュリティ上の注意点もいくつか存在します。
- 信頼できるNTPサーバーの選択: インターネット上の公開NTPサーバーを利用する場合、信頼できるソースを選択することが重要です。
pool.ntp.org
プロジェクトや、NICT、インターネットマルチフィードなど、よく知られた信頼性の高い組織が提供するサーバーを利用しましょう。悪意のあるNTPサーバーから偽の時刻情報を受け取ると、システムの時刻が狂わされ、ログの改ざんや証明書の検証失敗など、様々な問題を引き起こす可能性があります。 - NTPサーバーとして動作させる場合のアクセス制御: サーバーとして外部に時刻を提供する場合は、
restrict
(ntpd) やallow
/deny
(chrony) ディレクティブを使って、アクセスを許可するネットワークやホストを明確に指定しましょう。意図しないネットワークからのアクセスを全て拒否することで、不要なトラフィックや悪用を防ぎます。 - Monlist機能の脆弱性: 古いバージョンの
ntpd
には、monlist
という機能に関する脆弱性が存在しました。これは、NTPサーバーに接続したクライアントのリストを取得する機能ですが、これを悪用されると、少量のNTPリクエストで大量の応答を生成させることができ、DDoS攻撃(NTP Amplification Attack)に利用される危険性がありました。現在のバージョンのntpdでは、この機能はデフォルトで無効化されているか、完全に削除されています。しかし、古いシステムを運用している場合は注意が必要です。デフォルトのrestrict default noquery
設定は、この種のクエリをブロックします。 - 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
コマンドで管理します。 - 設定が正しく適用され、正常に同期できているかは、
chronyc
やntpq
/ntpstat
コマンドで確認します。同期できない場合は、ログやファイアウォール、ネットワーク接続などをチェックして原因を特定します。 - システムクロックだけでなく、ハードウェアクロック(RTC)の設定も重要であり、特にデュアルブート環境では
timedatectl set-local-rtc
の設定に注意が必要です。 - NTPサーバーとして動作させる場合は、設定ファイルでのアクセス制御とファイアウォール設定が必要です。
- 信頼できるNTPサーバーの選択やアクセス制御は、セキュリティ上重要な考慮事項です。
正確な時刻同期は、安定した信頼性の高いシステムを構築するための基本的な一歩です。この記事を参考に、あなたのUbuntu環境のNTP設定を適切に行い、安心してコンピューターを活用してください。
これで、UbuntuのNTP設定に関する基本的な知識と具体的な手順を習得できたはずです。さらに高度な設定や特定の環境におけるチューニングが必要になった場合は、各サービスの公式ドキュメントや関連情報を参照してみてください。