108.1 レッスン 2
Certificate: |
LPIC-1 (102) |
---|---|
Version: |
5.0 |
Topic: |
108 基本的なシステムサービス |
Objective: |
108.1 システムの時刻を保守する |
Lesson: |
2 of 2 |
はじめに
パーソナルコンピューターはそれ自体でかなり正確な時刻を維持することができますが、ネットワーク環境で稼働するコンピューターシステムは、より正確な時刻を維持する必要があります。最も正確な時刻を刻む原子時計が 基準時計 として使われています。現在では、インターネットに接続されたすべてのコンピュータをこの基準時計に同期させる、Network Time Protocol(NTP)と呼ばれるシステムが考案されて使われています。NTPを実行するコンピュータは、そのシステムクロックを基準時計から提供される時刻に同期させることができます。システムクロックとNTPサーバーから提供された時刻が異なる場合、コンピューターは、システムクロックがネットワーク時刻に一致するまで、内部のシステムクロックを段階的に調整します。
NTPは階層構造で時刻を配信します。階層の一番上にあるサーバーには、基準時計が接続されます。最上位のサーバーは Stratum 1 (訳注: 地層、階層の意)と呼ばれ、一般には公開されません。Stratum 1のマシンは Stratum 2 マシンと同期し、Stratam 2のマシンは Stratum 3 のマシンと同期します。Stratum 2以下の階層のサーバーは、広く一般に公開されます。大きなネットワーク用にNTPを設定する場合、少数のコンピュータがStratum 2以下のサーバーに接続し、そのマシンが他のマシンすべてにNTPを提供するのが一般的です。これにより、Stratum 2のマシンに対するリクエストを最低限に抑えることができます。
NTPを理解するに当たって、重要な用語がいくつかあります。これらの用語のいくつかは、それぞれのマシンにおけるNTPのステータスを追跡するためのコマンドで使用されます。
- Offset(オフセット)
-
システムクロックとNTPクロックの絶対差を指します。たとえば、システムクロックが12:00:02で、NTPクロックが11:59:58の場合、2つのクロック間のオフセットは4秒です。
- Step(ステップ)
-
NTPプロバイダー(正確な時刻を提供する側)とコンシューマー(時刻を受け取って利用する側)の間のオフセットが128msより大きい場合、NTPはシステム時刻を徐々に調整するのではなく、1回でシステム時刻を大きく変更します。これを stepping(ステッピング) と呼びます。
- Slew(スルー)
-
システム時刻とNTPの間のオフセットが128ms未満の場合に、システム時刻を徐々に変更することを Slewing(スルーイング) と言います。
- Insane Time(不適切な時刻)
-
システム時刻とNTPの間のオフセットが17分より大きい場合、システム時刻は 不適切 であると見なされ、NTPはシステム時刻を変更しません。システム時刻を適切な時刻から17分以内にするには、特別な手順(手動設定など)を実行する必要があります。
- Drift(ドリフト)
-
2つのクロックが時間の経過とともに同期しなくなる現象をドリフトと呼びます。同期していた2つのクロックが、時間の経過とともに同期しなくなる場合に、クロックドリフトが発生していると言います。
- Jitter(ジッター)
-
最後にクロックが同期されてからのドリフト量をジッターと呼びます。例えば、17分前に最後のNTP同期が行われて、NTPプロバイダーとコンシューマーの間のオフセットが3ミリ秒である場合、ジッターは3ミリ秒です。
ここから、LinuxにおけるNTPの実装をいくつか説明します。
timedatectlコマンド
timedatectl
を使用しているLinuxディストリビューションでは、デフォルトではフルセットのNTPではなく SNTP(Simple Network Time Protocol)クライアントを実行します。これはネットワーク時刻の軽便な実装であり、ネットワーク上の他のマシンにNTPを提供することはできません。
SNTP機能を実行するには、timesyncd
サービスを実行する必要があります。他のsystemdサービスと同様に、次のコマンドで実行状態を確認できます。
$ systemctl status systemd-timesyncd ● systemd-timesyncd.service - Network Time Synchronization Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled) Drop-In: /lib/systemd/system/systemd-timesyncd.service.d └─disable-with-time-daemon.conf Active: active (running) since Thu 2020-01-09 21:01:50 EST; 2 weeks 1 days ago Docs: man:systemd-timesyncd.service(8) Main PID: 1032 (systemd-timesyn) Status: "Synchronized to time server for the first time 91.189.89.198:123 (ntp.ubuntu.com)." Tasks: 2 (limit: 4915) Memory: 3.0M CGroup: /system.slice/systemd-timesyncd.service └─1032 /lib/systemd/systemd-timesyncd Jan 11 13:06:18 NeoMex systemd-timesyncd[1032]: Synchronized to time server for the first time 91.189.91.157:123 (ntp.ubuntu.com). ...
timedatectl
によるSNTPの同期状態は、show-timesync
を使用して確認できます。
$ timedatectl show-timesync --all LinkNTPServers= SystemNTPServers= FallbackNTPServers=ntp.ubuntu.com ServerName=ntp.ubuntu.com ServerAddress=91.189.89.198 RootDistanceMaxUSec=5s PollIntervalMinUSec=32s PollIntervalMaxUSec=34min 8s PollIntervalUSec=34min 8s NTPMessage={ Leap=0, Version=4, Mode=4, Stratum=2, Precision=-23, RootDelay=8.270ms, RootDispersion=18.432ms, Reference=91EECB0E, OriginateTimestamp=Sat 2020-01-25 18:35:49 EST, ReceiveTimestamp=Sat 2020-01-25 18:35:49 EST, TransmitTimestamp=Sat 2020-01-25 18:35:49 EST, DestinationTimestamp=Sat 2020-01-25 18:35:49 EST, Ignored=no PacketCount=263, Jitter=2.751ms } Frequency=-211336
システムの時計を正確に保つにはこれだけで十分ですが、前述のようにネットワーク上の複数のクライアントを同期させたい場合には不十分です。そのような場合には、完全なNTPパッケージをインストールします。
NTPデーモン
システムクロックを定期的にネットワーク時刻と比較するには、バックグラウンドで デーモン を実行する必要があります。多くのLinuxシステムでは、ntpd
デーモンが使われています。ntpd
を使用すると、時間を受け取る (つまり、ネットワーク時刻に自分のシステムクロックを同期できる)だけでなく、他のマシンに時間を 提供する こともできます。
systemdベースのシステムにおいて、デーモンを制御するために systemctl
を使用しているとしましょう。パッケージマネージャーで ntp
パッケージをインストールしたら、ステータスをチェックして ntpd
が実行されていることを確認します。
$ systemctl status ntpd ● ntpd.service - Network Time Service Loaded: loaded (/usr/lib/systemd/system/ntpd.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2019-12-06 03:27:21 EST; 7h ago Process: 856 ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS (code=exited, status=0/SUCCESS) Main PID: 867 (ntpd) CGroup: /system.slice/ntpd.service `-867 /usr/sbin/ntpd -u ntp:ntp -g
場合によっては、ntpd
の有効化と起動の両方が必要になることがあります。ほとんどのLinuxマシンでは、次のように実行します。
# systemctl enable ntpd && systemctl start ntpd
NTPのクエリは、TCP/UDPのポート123を使用します(訳注:主にはUDPが使用されますが、必要に応じてTCPが使われることもあります)。NTPが失敗した場合は、これらのポートが開放されていることを確認してください。
NTPの設定
NTPはいくつかの情報源をポーリングして、システムクロックの設定に使用する候補サーバーを選択します。ネットワーク接続が失われた場合、NTPは履歴から必要な調整量を推定し、その後も調整を続けます。
ディストリビューションによって、NTPサーバーのリストが保存される位置が異なります。ntp
がインストールされているものとします。
ネットワーク時間と同期するための情報は、ファイル /etc/ntp.conf
に置かれています。このファイルは、vi
や nano
で編集できます。
デフォルトでは、以下のセクションに使用するNTPサーバーが指定されています。
# Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst
NTPサーバーを追加するには、次の構文を使います:
server IPアドレス server サーバーのホスト名
DNSが適切に設定されていれば、サーバーのアドレスはIPアドレスかホスト名で指定できます(訳注:サーバーの変更などに備えて、ホスト名で指定することが推奨されています)。指定したサーバーには、常にNTPクエリが送られます。
NTPサーバーには、複数のNTPプロバイダーをグループにまとめた pool を指定することもできます。poolには複数のNTPプロバイダーがあり、すべてが同じ時刻に同期されているNTPデーモンを実行していると想定できます。クライアントがプールにクエリを送るたびに、1つのプロバイダーがランダムに選択されます。これにより、プール内の1台のマシンがすべてのNTPクエリを処理するのではなく、ネットワーク負荷を多くのマシンに分散することができます。
一般的に、/etc/ntp.conf
には pool.ntp.org
などのサーバープールを指定します。Linuxディストリビューターが、デフォルトのサーバープールを運用していることもあります。
pool.ntp.org
デフォルトで使用される pool.ntp.org は、オープンソースプロジェクトです。詳細は、 ntppool.org を参照してください。
ntppoolの利用がニーズに合っているかを検討してください。ビジネスや組織、生活が、正しい時間に依存している場合、あるいは時刻が間違っていることで損害を受ける可能性がある場合は、“インターネットから取得する” べきではありません。ntppoolは概して非常に高品質ですが、ボランティアが空き時間を使って運用しているサービスです。信頼性の高いサービスをセットアップしたい場合は、機器やサービスのベンダーに相談してください。利用規約もご覧ください。Meinbergのタイムサーバーをお勧めしますが、End Run、Spectracomなど、他にも多くのタイムサーバーがあります。
(訳注:日本国内から利用する場合は jp.pool.ntp.org を指定するか、ISPが提供しているNTPサーバー(ないしはプール)を使用すると良いでしょう。 国立研究開発法人情報通信機構や、 インターネットマルチフィード株式会社なども、公共のNTPサービスを運用しています)。
ntpdateコマンド
初期セットアップ中など、システムクロックとNTPが大幅に異なることがあります。システムクロックとNTクロックの オフセット が17分を超える場合、NTPデーモンはシステムクロックを変更しません。この場合、手作業による介入が必要です。
まず、ntpd
が実行中であれば、サービスを 停止 します。systemctl stop ntpd
で行えます。
次に、ntpdate pool.ntp.org
コマンドを実行して、最初の1回限りの同期を行います。ここで pool.ntp.org
は、NTPサーバーのIPアドレスまたはホスト名です。複数回の同期が必要な場合もあります。
ntpqコマンド
ntpq
は、NTPの状態を確認するユーティリティです。NTPデーモンを設定し起動した後に、ntpq
を使用してその状態を確認できます。
$ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== +37.44.185.42 91.189.94.4 3 u 86 128 377 126.509 -20.398 6.838 +ntp2.0x00.lv 193.204.114.233 2 u 82 128 377 143.885 -8.105 8.478 *inspektor-vlan1 121.131.112.137 2 u 17 128 377 112.878 -23.619 7.959 b1-66er.matrix. 18.26.4.105 2 u 484 128 10 34.907 -0.811 16.123
ここでの -p
オプションは peer(通信相手) を意味していて、同期相手の要約を出力します。-n
を使用して、ホスト名ではなくIPアドレスを返すこともできます。
remote
-
NTPプロバイダーのホスト名
refid
-
NTPプロバイダーの参照ID
st
-
プロバイダーの階層(Stratum)
when
-
最後のクエリからの秒数
poll
-
クエリ間の秒数(ポーリング間隔)
reach
-
サーバーに到達したかどうかを示すステータスID。直近8回のクエリが成功したか失敗したかを示すビット列の8進数表示。1,3,7,10,11…377と増えていきます。
delay
-
クエリから応答までの時間(ミリ秒単位)
offset
-
システム時刻とNTP時刻の差(ミリ秒単位)
jitter
-
直近のクエリにおけるシステム時刻とNTP時刻のオフセット(ミリ秒単位)
オプションや引数なしで ntpq
を実行すると、対話モードに入ります。?
を入力すると、ntpq
が解釈できるコマンドのリストを表示します。
chrony
chrony
は、もうひとつのNTP実装です。一部のLinuxシステムにはデフォルトでインストールされていて、主要なすべてのディストリビューションでダウンロード可能です。chronyd
はchronyデーモンであり、chronyc
はコマンドラインインターフェイスです。chronyc
を操作する前に、chronyd
を有効にして起動する必要があります。
chronyが設定されていれば、chronyc tracking
コマンドで、NTPとシステムクロックの情報が表示されます。
$ chronyc tracking Reference ID : 3265FB3D (bras-vprn-toroon2638w-lp130-11-50-101-251-61.dsl.) Stratum : 3 Ref time (UTC) : Thu Jan 09 19:18:35 2020 System time : 0.000134029 seconds fast of NTP time Last offset : +0.000166506 seconds RMS offset : 0.000470712 seconds Frequency : 919.818 ppm slow Residual freq : +0.078 ppm Skew : 0.555 ppm Root delay : 0.006151616 seconds Root dispersion : 0.010947504 seconds Update interval : 129.8 seconds Leap status : Normal
他の実装に比べると、この出力には多くの情報が含まれています。
Reference ID
-
コンピューターが同期しているホスト名と参照ID
Stratum
-
NTPプロバイダーの階層
Ref time
-
NTPプロバイダを参照した時のUTC時刻
System time
-
NTP時刻とシステムクロックの差違
Last offset
-
最後のクロック更新における推定オフセット
RMS offset
-
オフセット値の長期的な平均値
Frequency
-
chronydがシステムクロックを修正しない場合に予想されるシステムクロックの誤差レート。ppm(100万分の1秒)単位。
Residual freq
-
基準ソースからの周波数とシステムクロックの周波数との差を示す余剰周波数
Skew
-
周波数の推定誤差限界
Root delay
-
コンピューターが同期している最上位のコンピューターへの、ネットワークによる遅延の合計
Leap status
-
時刻調整のステータス。正常(normal)、秒を挿入(insert second)、秒を削除(delete second)、非同期(not synchronized)のいずれか
最後のNTP更新に関する詳細情報も確認できます。
# chrony ntpdata Remote address : 172.105.97.111 (AC69616F) Remote port : 123 Local address : 192.168.122.81 (C0A87A51) Leap status : Normal Version : 4 Mode : Server Stratum : 2 Poll interval : 6 (64 seconds) Precision : -25 (0.000000030 seconds) Root delay : 0.000381 seconds Root dispersion : 0.000092 seconds Reference ID : 61B7CE58 () Reference time : Mon Jan 13 21:50:03 2020 Offset : +0.000491960 seconds Peer delay : 0.004312567 seconds Peer dispersion : 0.000000068 seconds Response time : 0.000037078 seconds Jitter asymmetry: +0.00 NTP tests : 111 111 1111 Interleaved : No Authenticated : No TX timestamping : Daemon RX timestamping : Kernel Total TX : 15 Total RX : 15 Total valid RX : 15
最後に、chronyc sources
は時刻の同期に使用するNTPサーバーの情報を返します。
$ chronyc sources 210 Number of sources = 0 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== 210 Number of sources = 0
この例では、このマシンには提供元が設定されていません。chronyの設定ファイルを開いて、pool.ntp.org
などのソースを追加できます。設定ファイルは通常、/etc/chrony.conf
です。このファイルを開くと、いくつかのサーバーがデフォルトでリストされていることでしょう。
=============================================================================== # Most computers using chrony will send measurement requests to one or # more 'NTP servers'. You will probably find that your Internet Service # Provider or company have one or more NTP servers that you can specify. # Failing that, there are a lot of public NTP servers. There is a list # you can access at http://support.ntp.org/bin/view/Servers/WebHome or # you can use servers from the 3.arch.pool.ntp.org project. ! server 0.arch.pool.ntp.org iburst iburst ! server 1.arch.pool.ntp.org iburst iburst ! server 2.arch.pool.ntp.org iburst iburst ! pool 3.arch.pool.ntp.org iburst
これらのサーバーは、独自のサーバーを指定する際の構文ガイドとしても有用です。この場合は、各行の先頭にある !
を削除してコメントを削除して、デフォルトの pool.ntp.org
プロジェクトのサーバーを使用します。
また、このファイルで、スキュー、ドリフト、ドリフトファイルとキーファイルの位置などの、デフォルト設定を変更することもできます。
インストール直後など、最初にクロックを大幅に修正する可能性がある時は、次のコメントを解除して大幅な時刻変更を可能としておきます。
! makestep 1.0 3
設定ファイルを変更したら、chronyd
サービスを再起動して、chronyc makestep
でシステムクロックを更新します。
# chronyc makestep 200 OK
さらに前述のように chronyc tracking
を使用して、変更が行われたことを確認するとよいでしょう。
演習
-
定義と用語の表を完成して下さい。
定義 用語 ネットワーク時間を提供するコンピューター
基準時計からの距離(ホップまたはステップ単位)
システム時刻とネットワーク時刻の差
前回のNTPポーリング以降の、システム時刻とネットワーク時刻の差
負荷分散された、ネットワーク時刻を提供するサーバー群
-
以下の値を出力できるコマンドをチェックしてください。
値 chronyc tracking
timedatectl show-timesync --all
ntpq -pn
chrony ntpdata
chronyc sources
Jitter(ジッター)
Drift(ドリフト)
Interval of Poll(ポーリング間隔)
Offset(オフセット)
Stratum(層)
IP Address of Provider(プロバイダーのIPアドレス)
Root Delay(ルートからの遅延)
-
1台のLinuxサーバーと複数のLinuxデスクトップで構成される、企業ネットワークを設定しています。サーバーの固定IPアドレスは192.168.0.101です。サーバーが
pool.ntp.org
に接続し、デスクトップにNTP時刻を提供します。サーバーとデスクトップの設定はどうなりますか?。 -
Linuxマシンの時計があっていません。NTPのトラブルシューティングをどう行いますか?
発展演習
-
SNTPとNTPを比較して下さい。
SNTP NTP -
システム管理者が
pool.ntp.org
を使用 しない のはどんな時ですか? -
システム管理者が、
pool.ntp.org
プロジェクトに参加ないし貢献するにはどうしますか?
まとめ
このレッスンでは、以下の事柄を学びました:
-
NTPとは何か、また、なぜそれが重要なのか
-
pool.ntp.org
プロジェクトを利用するNTPデーモンの構成 -
ntpq
を使用してNTPの設定を確認する方法 -
別のNTPサービスとして
chrony
を使用する方法
このレッスンでは、以下のコマンドを説明しました。
timedatectl show-timesync --all
-
timedatectl
を使用している場合に、SNTP情報を表示します。 ntpdate <address>
-
1回限りのNTPステップを実行します。
ntpq -p
-
最近のNTPポーリング状況を表示します。
-n
オプションはホスト名ではなくIPアドレスを表示します。 chronyc tracking
-
chronyを使用している場合に、NTPの状態を表示します。
chronyc ntpdata
-
直近のポーリングに関するNTP情報を表示します。
chronyc sources
-
NTPプロバイダーに関する情報を表示します。
chronyc makestep
-
chronyを使用している場合に、1回限りのNTPステップを実行します。
演習の解答
-
定義と用語の表を完成して下さい。
定義 用語 ネットワーク時間を提供するコンピューター
Provider (プロバイダー)
基準時計からの距離(ホップまたはステップ単位)
Stratum(ストラタム)
システム時刻とネットワーク時刻の差
Offset(オフセット)
前回のNTPポーリング以降の、システム時刻とネットワーク時刻の差
Jitter(ジッター)
負荷分散された、ネットワーク時刻を提供するサーバー群
Pool(プール)
-
以下の値を出力できるコマンドをチェックしてください。
値 chronyc tracking
timedatectl show-timesync --all
ntpq -pn
chrony ntpdata
chronyc sources
Jitter(ジッター)
✓
✓
Drift(ドリフト)
Interval of Poll(ポーリング間隔)
✓
✓
✓(
when
列)✓
✓
Offset(オフセット)
✓
✓
✓
Stratum(階層)
✓
✓
✓
✓
✓
IP Address of Provider(プロバイダーのIPアドレス)
✓
✓
✓
✓
Root Delay(ルート遅延)
✓
✓
-
1台のLinuxサーバーと複数のLinuxデスクトップで構成される、企業ネットワークを設定しています。サーバーの固定IPアドレスは192.168.0.101です。サーバーが
pool.ntp.org
に接続し、デスクトップにNTP時刻を提供します。サーバーとデスクトップの設定はどうなりますか?。サーバーでSNTPではなくntpdサービスが実行されていることを確認します。
/etc/ntp.conf
ないし/etc/chrony.conf
ファイルに、pool.ntp.org
プールを指定します。クライアントでは、それぞれの/etc/ntp.conf
ないし/etc/chrony.conf
ファイルに192.168.0.101
を指定します。 -
Linuxマシンの時計があっていません。NTPのトラブルシューティングはどう行いますか?
まず、マシンがインターネットに接続されていることを確認します。これには
ping
を使います。systemctl status ntpd
ないしsystemctl status systemd-timesyncd
を使って、ntpdないしSNTPサービスが起動していることを確認します。エラーメッセージが有用な情報を提供することがあります。最後に、ntpq -p
やchrony tracking
などのコマンドを使って、リクエストが行われたことを確認します。システム時刻がネットワーク時刻と大幅に異なる場合は、システム時刻が “不適切” と見なして、手作業による介入が必要です。これには、ntpdate pool.ntp.org
コマンドで1回限りのntp同期を実行するか、前のレッスンのコマンドを使います。
発展演習の解答
-
SNTPとNTPを比較してください。
SNTP NTP 精度が低い
精度が高い
必要なリソースが少ない
多くのリソースが必要
時刻を提供することはできない
時刻を提供することができる
単発変更のみ
単発変更と徐々に同期の両方
1つのソースに時刻を要求
複数のNTPサーバーを調べて最適なプロバイダーを利用
-
システム管理者が pool.ntp.org を使用 しない のはどんな時ですか?
ntppool.orgには次のように書かれています: 正しい時刻を維持することが絶対的に重要な場合は、別の方法を検討する必要があります。例えば、インターネットプロバイダーがNTPサービスを提供している場合は、それを使用した方がよいでしょう。(訳注:ネットワーク的に「近い」サーバーを選択すれば、応答速度のばらつき(ジッター)が少ないために同期の精度の高まると言われています。)
-
システム管理者が、
pool.ntp.org
プロジェクトに参加ないし貢献するにはどうしますか?ntppool.orgには次のように書かれています: サーバーには固定IPアドレスと継続的なインターネット接続が必要です。固定IPアドレスは変更されないことが望ましく、少なくとも1年以上は変更されないことが必要です。それに対して、帯域幅の要件は控えめで、384〜512Kビットの帯域幅が求められます。Stratum 3ないし4のサーバーの参加を歓迎します。