GeekFactory

int128.hatenablog.com

Amazon Linuxの時刻同期にchronyを使う

Amazon Linuxではntpdによる時刻同期が用意されていますが、EPEL(Extra Packages for Enterprise Linuxリポジトリに入っているchronyも使えます。

chronyはFedora 16から採用されている時刻同期デーモンです。設定ファイルや引数がシンプルで分かりやすいので好きです。

Chrony は、ノートPCのように常時ネットワーク接続がないシステムにおいてもうまく動作するよう設計されてます。また、標準的な ntp よりも速く時刻同期できます。Chrony は、仮想マシンで実行しているシステムにおいて使用されるとき、すぐに狂う時刻を訂正する助けにするために時刻の訂正のためのより大きな範囲や、時刻の素早い変更へのよりよい反応のような、いくつかの優位性があります。

http://docs.fedoraproject.org/ja-JP/Fedora/16/html/Release_Notes/sect-Release_Notes-Changes_for_Sysadmin.html

私の環境ではntpdが動かないためchronydを使っています。ntpdが動かない原因はOpenVPNのtunインタフェースみたいですが、解決方法がいまだ分からず。IPv6無効化とか、引数に-I loとか-Lとか-U 0とか渡してもダメでした><

ec2$ sudo ntpd -u ntp:ntp -p /var/run/ntpd.pid -g -n -D5
ntpd 4.2.4p8@1.1612-o Tue Aug  9 20:11:55 UTC 2011 (1)
addto_syslog: set_process_priority: Leave priority alone: priority_done is <2>
addto_syslog: precision = 0.773 usec
create_sockets(123)
addto_syslog: ntp_io: estimated max descriptors: 1024, initial socket boundary: 16
setsockopt SO_TIMESTAMP enabled on fd 16 address 0.0.0.0
bind() fd 16, family 2, port 123, addr 0.0.0.0, flags=0x89
flags for fd 16: 0x802
Searching for addr 0.0.0.0 in list of addresses - NOT FOUND
Added addr 0.0.0.0 to list of addresses
addto_syslog: Listening on interface #0 wildcard, 0.0.0.0#123 Disabled
setsockopt SO_TIMESTAMP enabled on fd 17 address ::
bind() fd 17, family 10, port 123, addr ::, flags=0x81
flags for fd 17: 0x802
Searching for addr :: in list of addresses - NOT FOUND
Added addr :: to list of addresses
addto_syslog: Listening on interface #1 wildcard, ::#123 Disabled
update_interfaces(123)
./../libisc/ifiter_getifaddrs.c:108: INSIST(ifa->ifa_addr != ((void *)0)) failed.

ちなみに、Gentoo LinuxではOpenVPNとntpdの組合せでも問題なく動いています。

Amazon Linux 2012.03とchrony

Amazon Linux 2012.03からkernel 3.2が採用されています。EPELにあるchrony 1.25はkernel 3.xをサポートしないため、そのままでは動きません。chrony 1.26以降にアップデートする必要があります。

今回は、EPELのSRPMをリビルドすることにしました。tar ballを1.26に差し替えるだけでOKでした。

cd ~/tmp
wget http://download.fedoraproject.org/pub/epel/6/SRPMS/chrony-1.25-2.el6.src.rpm
rpm -ivh chrony-1.25-2.el6.src.rpm
cd ~/rpm/SPECS
cp -a chrony.spec chrony.spec.dist
vim chrony.spec

chrony.specは以下のように変更します。

--- chrony.spec.dist    2011-05-19 23:43:27.000000000 +0900
+++ chrony.spec 2012-04-03 23:02:39.790961903 +0900
@@ -1,6 +1,6 @@
 Name:           chrony
-Version:        1.25
-Release:        2%{?gitpatch}%{?dist}
+Version:        1.26
+Release:        1.20120403%{?gitpatch}%{?dist}
 Summary:        An NTP client/server
 
 Group:          System Environment/Daemons

chrony 1.26のtar ballを配置してリビルドします。リビルドできたらRPMをインストールします。

cd ~/rpm/SOURCES
wget http://download.tuxfamily.org/chrony/chrony-1.26.tar.gz
rpmbuild -bb chrony.spec
cd ~/rpm/RPMS/x86_64
sudo yum install chrony-1.26-1.20120403.amzn1.x86_64.rpm
sudo vim /etc/chrony.conf
sudo service chronyd start

chronycコマンドでステータスを確認できます。例えば、以下のように。

ec2$ chronyc tracking
Reference ID    : xxx.xx.xxx.xxx (xxxx.xxxx.xx.xx)
Stratum         : 3
Ref time (UTC)  : Tue Apr  3 15:11:02 2012
System time     : 0.000005183 seconds slow of NTP time
Frequency       : 30.038 ppm slow
Residual freq   : 0.509 ppm
Skew            : 2.341 ppm
Root delay      : 0.034858 seconds
Root dispersion : 0.026567 seconds

これで時刻同期されるようになりました。システム時刻は運用管理の拠り所となる重要なものなので、時刻同期を忘れないでくださいね。