Linuxのクロックの取り扱い
LinuxはWindowsとは異なり、システムクロックとハードウェアクロックを分離して管理しています。
ハードウェアクロックは『マザーボードに存在する、電源OFFにしても動き続けるもの』、システムクロックは『OS等が起動時にハードウェアクロックからコピーし、その後はOS上で独自に動き続けるもの』です。ciscoも同様に動作しています。
もう少し細かく分類すると、Linuxでは以下3種類の時刻を管理しています。
2. Universal Time(UTC)
3. RTC Time(ハードウェアクロック)
ハードウェアクロック自体にLocation情報はありませんが、OS(Linux)からは管理が可能です。コマンドとしては hwclock があります。また、管理ファイルとしては
/etc/adjtime に { UTC or LOCAL }
/etc/sysconfig/clock に UTC= { True or False }
というパラメータがセットされています。UTC = False にすると、ハードウェアクロックをLocal Timeとして解釈します。
一方、システムクロックはUTCでの管理が前提となります。
/etc/localtime というbinary ファイルでローカル情報を持っており、 /usr/share/zoneinfo/ 配下にあるファイルと置き換えることで変更が可能です。
Chronyの仕様・設定について
CentOS7やRHEL7以降ではNTPクライアント・サーバは Chronyがデフォルトとなっています。NTPクライアントの機能をchronyc , NTPサーバの機能を chronyd と呼びますが、設定ファイルは/etc/chrony.conf の1つのみです。
Chronyはntpdに代わるもので、機能的に大きな変更はありませんが、chronyではconfファイルにrtcsyncという設定で、ハードウェアクロックとの同期が可能となっています。
/etc/chrony.conf はデフォルトで以下のようになっています。
# 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
# Ignore stratum in source selection.
stratumweight 0
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
# Enable kernel RTC synchronization.
rtcsync
# In first three updates step the system clock instead of slew
# if the adjustment is larger than 10 seconds.
makestep 10 3
# Allow NTP client access from local network.
#allow 192.168/16
# Listen for commands only on localhost.
bindcmdaddress 127.0.0.1
bindcmdaddress ::1
# Serve time even if not synchronized to any NTP server.
#local stratum 10
keyfile /etc/chrony.keys
# Specify the key used as password for chronyc.
commandkey 1
# Generate command key if missing.
generatecommandkey
# Disable logging of client accesses.
noclientlog
# Send a message to syslog if a clock adjustment is larger than 0.5 seconds.
logchange 0.5
logdir /var/log/chrony
#log measurements statistics tracking
server 0.centos.pool.ntp.org iburst
chronyc における 同期NTPサーバを指定します。iburstオプションは Initial Burst の意味です。『NTPプロトコルの概要・仕組み』で記載している通り、NTPは統計情報を扱うため、1回だけ時刻同期のやり取りをしても精度の高い時刻を測れません。そのため、起動時は短い時間に4回連続NTPサーバへ問い合わせに行き、統計情報のためのサンプルを少しでも多く集めるように動作します。
stratumweight 0
一般にNTPクライアントはNTPサーバからのNTPパケットにある[ Root Delay および Root Dispersion ]から、NTPサーバとの距離=Distanceを計算しています。
また、NTPクライアントは複数あるNTPサーバから、Distance値の小さいNTPサーバ3台を選定して同期しますが、この設定ではその選定基準としてDistance値だけでなくStratumも考慮する設定をすることができます。
例えば『stratumweight 2』 と設定した場合、chronyc は Stratum が1上がる毎に、Distance値に2を加える操作をし、Distanceの近い3台を選定します。
driftfile /var/lib/chrony/drift
driftファイルを配置するファイルのフルパスを指定します。
drift とは、ハードウェアクロックが本来的にどのくらいズレる傾向にあるかを測り、それを自動で補正するものです。例えばハードウェアクロックが1日に0.001秒速く進むのであればその情報をこのファイルに保管しておき、例えNTPサーバに通信できない場合であってもこのファイルを元に自動で補正する動きをします。
このハードウェアクロックのズレは、CPUやシステムのクロック周波数と関連があり、その特性に応じて生じるものです。
rtcsync
前述の通り、同期した時刻をハードウェアクロックに上書きします。
makestep 10 3
chronycが起動し、最初の3回のNTPパケットの往復の中で、10秒以上ズレている場合はSTEPモードで一気に時刻を修正します。それ以外の場合はSLEWモードで緩やかに時刻修正を行います。
#allow 192.168/16
NTPクライアントからのアクセスを受け付ける範囲を限定します。デフォルトでは全て拒否されるため、NTPサーバとして動作させるためには設定変更が必要です。
bindcmdaddress 127.0.0.1
chronyd がNTPクライアントからのアクセスを受け付けるIPアドレスを指定します。NTPサーバとして動作させるためには設定変更が必要です。
#local stratum 10
デフォルト設定の場合、上位NTPサーバから時刻同期できていない場合はStratum 16 となり、下位NTPクライアントに時刻提供ができません。
例えば『local stratum 10』と設定した場合、上記NTPサーバから時刻同期できていない場合であっても自身を『Stratum 10』と定義し、下位NTPクライアントへの時刻提供が可能となります。
keyfile /etc/chrony.keys
NTP version 3以降で利用可能である、NTPの認証で使う鍵ファイルを指定します。
NTPの認証は、クライアントからサーバに対して行うものです。
commandkey 1
NTPサーバとしては複数のクライアントに対応できるようたくさん鍵を持っておく必要があるケースもありますので、鍵ファイルには複数の鍵を登録することができます。
一方、chronyではchronyc とchronydが同一ファイルで設定されているが故、セキュリティ的にユーザ空間で利用可能なchronyc は保護しておかないと、chronydの設定を書き換えるなどの影響も出る可能性があります。
chronyc コマンドは、この鍵で保護することが可能で、このパラメータでどの鍵を使うかを設定できます。
generatecommandkey
前述のコマンドキーはわざわざ作らなくても、デフォルトのこの設定により自動で生成されます。
noclientlog
NTPクライアントのアクセスログを記録しない設定です。
logchange 0.5
時刻調整時に、ズレが0.5秒以上だった場合にsyslog出力を行う設定す。
logdir /var/log/chrony
ログを配置するディレクトリを指定する設定です。