18: Intel Edisonの時計と時刻同期の仕組み

よく訓練されたアップル信者、都元です。昨日のエントリーはこちらです。本日は軽めのネタにて。

Edisonは内部に時計を持っています。チュートリアルの通りにさっさとWiFi接続をしてしまえば、その時からネットワークを介した時刻同期が行われるためあまり意識せず、現在時刻を扱えます。

しかし、Edisonには内臓のバッテリーは無いため、リアルタイムクロック(RTC)は給電を止めると初期化されてしまいます。それでもまぁ、ネットワークに繋がり次第同期を行うため、問題に気づくことはなかなかありません。

実験

Edisonのファームウェア初期化を行い、時計の状況を見てみましょう。

# reboot ota

この初期化の直後、Edisonはネットワークに繋がってはいません。しかし、電源は継続してONの状態であるため、時刻は正確なものを表示しています。

# date
Thu Dec 18 05:31:48 UTC 2014
# hwclock
Thu Dec 18 05:31:50 2014  0.000000 seconds

ではこのままネットワークに繋がずに、(init 0コマンド等でOSをシャットダウンしてから)電源供給を止めてみましょう。念のため10秒くらい放置してから、再び給電、起動します。その上で時刻を確認すると…

# date
Thu Oct  9 09:23:18 UTC 2014
# hwclock
Sat Jan  1 00:02:26 2000  0.000000 seconds

おお、システムクロック(前者)はどうしてこうなった的な時刻になっています。ハードウェアクロック(後者)は、恐らく起動時に2000/01/01 0:00 (UTC)から刻み始めた時刻でしょう。

ここでネットワークに繋いでみます。

# systemctl -l status systemd-timesyncd
● systemd-timesyncd.service - Network Time Synchronization
   Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled)
   Active: active (running) since Thu 2014-10-09 09:22:29 UTC; 2 months 8 days ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 152 (systemd-timesyn)
   Status: "Using Time Server 216.239.32.15:123 (time1.google.com)."
   CGroup: /system.slice/systemd-timesyncd.service
           └─152 /lib/systemd/systemd-timesyncd

Jan 01 00:00:13 edison systemd[1]: Starting Network Time Synchronization...
Jan 01 00:00:13 edison systemd-timesyncd[152]: System clock time unset or jumped backwards, restoring from recorded timestamp: Thu 2014-10-09 09:22:29 UTC
Oct 09 09:22:29 edison systemd[1]: Started Network Time Synchronization.
Oct 09 09:22:32 edison systemd-timesyncd[152]: Network configuration changed, trying to establish connection.
Oct 09 09:22:32 edison systemd-timesyncd[152]: Network configuration changed, trying to establish connection.
Oct 09 09:35:26 edison-miyamoto-x systemd-timesyncd[152]: Network configuration changed, trying to establish connection.
Oct 09 09:35:26 edison-miyamoto-x systemd-timesyncd[152]: Network configuration changed, trying to establish connection.
Oct 09 09:35:28 edison-miyamoto-x systemd-timesyncd[152]: Network configuration changed, trying to establish connection.
Oct 09 09:35:53 edison-miyamoto-x systemd-timesyncd[152]: Network configuration changed, trying to establish connection.
Oct 09 09:35:53 edison-miyamoto-x systemd-timesyncd[152]: Network configuration changed, trying to establish connection.
Oct 09 09:35:54 edison-miyamoto-x systemd-timesyncd[152]: Network configuration changed, trying to establish connection.
Oct 09 09:35:56 edison-miyamoto-x systemd-timesyncd[152]: Network configuration changed, trying to establish connection.
Oct 09 09:35:56 edison-miyamoto-x systemd-timesyncd[152]: Network configuration changed, trying to establish connection.
Oct 09 09:36:27 edison-miyamoto-x systemd-timesyncd[152]: Using NTP server 216.239.32.15:123 (time1.google.com).
Dec 18 05:37:06 edison-miyamoto-x systemd-timesyncd[152]: interval/delta/delay/jitter/drift 32s/+6033639.712s/0.040s/0.000s/+0ppm
# date
Thu Dec 18 05:37:48 UTC 2014
# hwclock
Thu Dec 18 05:37:50 2014  0.000000 seconds

というわけで、systemd-timesyncdというデーモンにより、即座に時刻同期が行われました。ntpdじゃないんですね。

ちなみにsystemd-timesyncdの設定ファイルは/etc/systemd/timesyncd.confで、同期先はGoogleのタイムサーバのようです。

# cat /etc/systemd/timesyncd.conf
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# See timesyncd.conf(5) for details

[Time]
Servers=time1.google.com time2.google.com time3.google.com time4.google.com

まとめ

Edisonを運用する上で、恐らく時刻同期はおろそかにすることができません。対策として「電源を絶やさない」「電源断後の起動時にネットワーク接続する」「別途電源を搭載したRTCモジュールを装備し、時刻同期を行う」等の対応が必要となると思います。

明日のエントリーはこちらです。