2016年12月30日金曜日

CentOS 7の新しい時刻同期デーモンchronyを使ってみた

CentOS 7は(Red Hat Enterprise Linux 7も同様だが)、いろいろコマンド体系が変わっていて、時刻同期についても、今まで長い間慣れ親しんだntpdではなく、chronyというデーモンにデフォルトが変更がされている。

ntpdをインストールして今まで通り使い続けることも可能だが、せっかくなのでchronyを使ってみることにした。

そもそもchronyとは

以下URLに詳しく説明が書いてあるので割愛するが、ntpdに比べていろいろ改善されているらしい。ただし、枯れている技術が好きだったり、新しく設定方法を覚えるのが面倒な人は引き続きntpdを使ってもよいとは思う。

・第15章 CHRONY スイートを使用した NTP 設定
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/ch-Configuring_NTP_Using_the_chrony_Suite.html#sect-differences_between_ntpd_and_chronyd

実際、仕事でRHEL7を使う場面が出てきたとき、ntpdにするかchronyにするかは割と悩む気がする。

chronyの設定

設定ファイルは/etc/chrony.confとなる。以下に日本語コメントを付けて説明する。
------------------------------
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
# 同期先のNTPサーバを設定
server 192.168.33.3 iburst

# Ignore stratum in source selection.
# 同期先のstratumの値に応じて優先度の重み付けする設定(0で無視)
stratumweight 0

# Record the rate at which the system clock gains/losses time.
# driftfileの指定
driftfile /var/lib/chrony/drift

# Enable kernel RTC synchronization.
# カーネルのReal-Time Clock(RTC)=ハードウェアクロックを同期する
rtcsync

# In first three updates step the system clock instead of slew
# if the adjustment is larger than 10 seconds.
# stepモードとなる際の時刻のずれ幅(1つめの設定値)と、
# stepが有効になるchronyd起動後の同期回数(2つめの設定値)
#
# デフォルト設定では、10秒以上のずれの場合かつ
# chronyd起動後の3回目までの同期処理であればstepで同期する
#makestep 10 3
# ntpdは128msを閾値としてstepで同期したはずなので、ちょっと設定値を厳しくすると、
# 以下のような設定になる(0.2秒以上のずれで10回目までならstepで同期)
makestep 0.2 10

# Allow NTP client access from local network.
# NTPクライアントからのアクセス許可するアドレスを設定
# デフォルトではすべて拒否(暗黙のdenyがある)
#allow 192.168/16
#
# 以下は同じサブネット内からのNTPクライアントアクセスを許可する設定
allow 192.168.33.0/24

# Listen for commands only on localhost.
# chronycにアクセスできるアドレスを設定
# IPv6は使わないのでコメントアウト
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.
# chronycという設定ユーティリティのセキュリティの設定の模様
commandkey 1

# Generate command key if missing.
generatecommandkey

# Disable logging of client accesses.
# NTPクライアントからの同期のアクセスをログに残さない
noclientlog

# Send a message to syslog if a clock adjustment is larger than 0.5 seconds.
# 時刻調整時のずれが0.5秒以上の場合、syslogにログ出力する
logchange 0.5

# ログ出力先ディレクトリの指定
logdir /var/log/chrony

# ログ出力内容の指定。指定した項目ごとにログファイルが生成される模様
#log measurements statistics tracking
log measurements statistics tracking
------------------------------

コメントを全部消すと以下のようにシンプルになる。

[root@localhost /]# cat /etc/chrony.conf
------------------------------
server 192.168.33.3 iburst
stratumweight 0

driftfile /var/lib/chrony/drift

rtcsync
makestep 0.2 10

allow 192.168.33.0/24

bindcmdaddress 127.0.0.1
keyfile /etc/chrony.keys
commandkey 1
generatecommandkey

noclientlog
logchange 0.5
logdir /var/log/chrony
log measurements statistics tracking
------------------------------

chronyの起動

設定したchrony.confを読み込ませるために、サービス再起動を行う。

[root@localhost /]# systemctl restart chronyd
※サービス再起動時には特に表示なし

サービス再起動後の確認。「active (running)」であることと、特にエラーが発生していなければOK。

[root@localhost /]# systemctl status chronyd
------------------------------
chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
   Active: active (running) since 土 2016-03-05 22:14:12 JST; 31s ago
  Process: 2994 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS)
  Process: 2991 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 2993 (chronyd)
   CGroup: /system.slice/chronyd.service
           mq2993 /usr/sbin/chronyd

 3月 05 22:14:12 localhost.localdomain systemd[1]: Starting NTP client/server...
 3月 05 22:14:12 localhost.localdomain chronyd[2993]: chronyd version 2.1.1 starting (+CMDMON ...H)
 3月 05 22:14:12 localhost.localdomain chronyd[2993]: Generated key 1
 3月 05 22:14:12 localhost.localdomain systemd[1]: Started NTP client/server.
 3月 05 22:14:16 localhost.localdomain chronyd[2993]: Selected source 192.168.11.22
 3月 05 22:14:16 localhost.localdomain chronyd[2993]: System clock wrong by 0.665080 seconds, ...ed
 3月 05 22:14:17 localhost.localdomain chronyd[2993]: System clock was stepped by 0.665080 seconds
Hint: Some lines were ellipsized, use -l to show in full.
------------------------------

時刻同期状態の確認。ntpdと似ていて、先頭2文字目に「*」があれば同期OK。

[root@localhost /]# chronyc sources
------------------------------
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 192.168.33.3                  3   6    17    40  -5893ns[  -24us] +/-   53ms
------------------------------

(参考)ntpdを使いたい場合の対処

やっぱりntpdが使いたい!という人は、CentOS 7のCDのPackagesディレクトリに移動して、以下をインストールすればよい。

[root@localhost Packages]# rpm -ivh ntpdate-4.2.6p5-22.el7.centos.x86_64.rpm
[root@localhost Packages]# rpm -ivh autogen-libopts-5.18-5.el7.x86_64.rpm
[root@localhost Packages]# rpm -ivh ntp-4.2.6p5-22.el7.centos.x86_64.rpm