Howto

時刻を同期する方法

このHowtoでは、Armadillo-IoT G3/G3L,Armadillo-X1(以下Armadilloと記載)にて時刻を同期する方法についてご紹介します。

システム運用を行う上で、ログにタイムスタンプを記載する,指定の時間に処理を実行するなど、時刻を用いる処理は多く発生すると思われます。
時刻は正確な値を求められることが多いため、正確な時刻とArmadilloのクロックを同期させる必要があります。

システムクロック,ハードウェアクロック

Linuxでは、時間はシステムクロック,ハードウェアクロックで管理されています。

システムクロックはLinuxカーネルが管理している時計で、i.MXのタイマーコア割り込みによって動作します。
UTC 1970年1月1日 00時00分00秒 からの経過秒数で管理されています。
システムクロックを参照,設定するには、dateコマンドを使用します。

[armadillo ~]# date
Fri Dec 19 17:36:34 JST 2014

ハードウェアクロックは、CPUとは独立したRTCによって管理される時計です。
システムに電源が供給されていない間も、バッテリや外部電源で動作させることが可能です。
Armadilloはsystemdを利用して起動時にハードウェアクロックを参照し、システムクロックを設定します。
RTCが保持している時刻を参照したり、RTCに時刻を設定するにはhwclockコマンドを使用します。

[armadillo ~]# hwclock
Fri Dec 19 17:36:36 2014  -0.173615 seconds

RTCについての詳細はマニュアル「RTC」を参照してください。

正確な時刻の取得

今回は参考として以下の方法で正確な時刻を取得する方法をご紹介します。

  • NTPサーバ
  • 3G/LTE(NITZ)
  • GPS

NTPサーバ

NTPサーバとは、正確な時刻情報を取得・配信しているサーバです。
TCP/IPネットワークを通じて通信を行い、時刻取得と同期を同時に行うことができます。

NPTサーバとの同期方法として、今回はchronyをご紹介します。

chrony

chronyはapt-getでインストールすることができます。

[armadillo ~]# apt-get install chrony

chronyはインストール後、サービスとして自動で起動しており、systemctlコマンドで確認できます。

[armadillo ~]# systemctl status chrony
● chrony.service - chrony, an NTP client/server
   Loaded: loaded (/lib/systemd/system/chrony.service; enabled; vendor preset: e
   Active: active (running) since Mon 2019-06-03 07:39:42 UTC; 12s ago
     Docs: man:chronyd(8)
           man:chronyc(1)
           man:chrony.conf(5)
 Main PID: 3271 (chronyd)
   CGroup: /system.slice/chrony.service
           mq3271 /usr/sbin/chronyd

Jun 03 07:39:42 armadillo systemd[1]: Starting chrony, an NTP client/server...
Jun 03 07:39:42 armadillo chronyd[3271]: chronyd version 3.0 starting (+CMDMON +
Jun 03 07:39:42 armadillo chronyd[3271]: Frequency -35.274 +/- 2.083 ppm read fr
Jun 03 07:39:42 armadillo systemd[1]: Started chrony, an NTP client/server.
Jun 03 07:39:43 armadillo chronyd[3271]: Could not set SO_TIMESTAMPING socket op
Jun 03 07:39:48 armadillo chronyd[3271]: Selected source 133.243.238.244

chronyの設定ファイルは/etc/chrony/chrony.confです。
同期するNTPサーバを指定したい場合は設定ファイルを編集します。
時刻同期したいNTPサーバに指定がない場合は、修正する必要はありません。

[armadillo ~]# vi /etc/chrony/chrony.conf
# Welcome to the chrony configuration file. See chrony.conf(5) for more
# information about usuable directives.
pool 2.debian.pool.ntp.org iburst

# This directive specify the location of the file containing ID/key pairs for
# NTP authentication.
keyfile /etc/chrony/chrony.keys

# This directive specify the file into which chronyd will store the rate
# information.
driftfile /var/lib/chrony/chrony.drift

# Uncomment the following line to turn logging on.
#log tracking measurements statistics

# Log files location.
logdir /var/log/chrony

# Stop bad estimates upsetting machine clock.
maxupdateskew 100.0

# This directive tells 'chronyd' to parse the 'adjtime' file to find out if the
# real-time clock keeps local time or UTC. It overrides the 'rtconutc' directive.
hwclockfile /etc/adjtime

# This directive enables kernel synchronisation (every 11 minutes) of the
# real-time clock. Note that it can磬@~Yt be used along with the 'rtcfile' directive.
rtcsync

# Step the system clock instead of slewing it if the adjustment is larger than
# one second, but only in the first three clock updates.
makestep 1 3

設定ファイル編集後、サービスchronyを再起動することで設定が適用されます。

[armadillo ~]# systemctl restart chrony

NTPサーバから時刻同期しているかの確認は、chronyc コマンドで確認可能です。

[armadillo ~]# chronyc sources
210 Number of sources = 5
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp-b3.nict.go.jp             1   7   377   128    +88us[ +156us] +/-   10ms
^- y.ns.gin.ntt.net              2   7   377     1   -215us[ -215us] +/-  112ms
^- ec2-54-64-6-78.ap-northe>     2   7   377   129   -453us[ -453us] +/-   35ms
^- ntp.paina.net                 2   7   377   128  +1313us[+1313us] +/-   60ms
^+ ntp-a3.nict.go.jp             1   7   377   129    +27us[  +27us] +/-   10ms

設定ファイルの編集方法など、詳細はchrony Manualを参照してください。

3G/LTE(NITZ)

3G/LTEを利用している場合、NITZを取得することで正確な時刻を把握できます。
NITZとは、キャリアが基地局から電波を通じて現在日時とタイムゾーン等の情報を提供する仕組みです。

2019/05現在、Armadillo-IoT G3L/G3 M1のみ、ModemManagerのコマンド mmcli を用いてNITZを取得できます。

[armadillo ~]# mmcli -m 0 --time

/org/freedesktop/ModemManager1/Modem/0
  ----------------------------
  Time     |      Current: '2019-05-23T13:38:13+09:00'
  ----------------------------
  Timezone |       Offset: '0'
           |   DST offset: 'not available'
           | Leap seconds: 'not available'

コマンド結果から時刻を取り出し、システムクロックやハードウェアクロックに設定してください。

GPS

GPSデータを取得する場合は、NMEAフォーマットのデータから時刻を取得できます。
NMEAフォーマットはいくつか種類が存在し、GPRMCなどの時刻を含むデータ群を取得し解析することで時刻取得が可能です。

NMEAフォーマットの詳細については外部サイト等を参考にしてください。

時刻の同期

3G/LTEやGPSで取得した時刻はシステムクロック,ハードウェアクロックに同期させることができます。
詳細な同期方法はマニュアル「RTC」に記載されています。

関連ページ

Howto : RTCを利用する方法