Help us understand the problem. What is going on with this article?

Intel Edisonの時刻合わせ(systemd-timesyncd,timedatectl)

More than 5 years have passed since last update.

Intel Edisonの標準ブートLinux(Yocto)は、サービス起動・停止・管理システムSystemdを採用しています。これは、従来のLinuxディストリビューションで採用されていたSysVinitやUpstartよりも機能が増えていて、特に、今までほかのパッケージや仕組みに頼っていた、ファイルシステムのマウント(fstab・mountd)・時刻(ntpd)・ホスト名の設定(hostname)・ログ記録(rsyslogd)・言語ロケール情報・定時実行(cron)まで管理できるようになっています。

IoTデバイスやメイカーズの組み込み用途、ホビー用途として使われるであろうIntel Edisonにおいては、上に挙げたSystemdの管理項目の中でも特に時刻に関するSystemdでの流儀を確認しておく必要があると考えます。

なお、Systemdは、最近リリースされたCentOS 7/RHEL 7でも採用されたので、そちらでのSystemdの情報も増えてきていますね。

※RHEL7/CentOS 7では、時刻合わせはsystemd-timesyncdでは行わず、Chronydで行うとのこと。→See Also: CentOS - 新しいNTPクライアント&サーバ、chrony - Qiita

Systemdでの時刻の取扱いコマンド(timedatectl)

Intel EdisonのLinuxに限らず、Systemdでは、従来のLinuxディストリビューションでは個別に存在したhwclock、date、ntpdate、ntpdではなく、Systemdの機能で操作します。

timedatectl status

現在のシステムの時刻情報を表示します。

Intel Edison初期化直後状態のデフォルト(timedatectl set-timezone Universalに設定したのと同じ状態)だと、日本時間2015-02-06T23:00:00+09:00(←ISO 8601表記)にtimedatectlをすると、

root@edison:~# timedatectl
      Local time: Fri 2015-02-06 14:00:00 UTC
  Universal time: Fri 2015-02-06 14:00:00 UTC
        RTC time: Fri 2015-02-06 14:00:00
       Time zone: Universal (UTC, +0000)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
root@edison:~#

となります。

なお、日本のタイムゾーンに変更(timedatectl set-timezone Asia/Tokyo)した後は、下記のようになります。

root@edison:~# timedatectl
      Local time: Fri 2015-02-06 23:00:00 JST
  Universal time: Fri 2015-02-06 14:00:00 UTC
        RTC time: Fri 2015-02-06 14:00:00
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
root@edison:~#

Intel Edisonに電力が供給されなくなると、RTCの時刻が維持できず、次回ブート時には、Linuxシステム時刻は2000-01-01T00:00:00+00:00(←ISO 8601表記)になります。

root@edison:~# timedatectl
      Local time: Sat 2000-01-01 09:02:38 JST
  Universal time: Sat 2000-01-01 00:02:38 UTC
        RTC time: Sat 2000-01-01 00:02:38
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
root@edison:~#

補足として、dateコマンド、hwclockコマンドは標準でインストールされますので、現在の設定の参照用として利用可能です。

timedatectl set-timezone

タイムゾーンを設定します。基本的にLinuxが持っているUTC時刻をベースにして、地域ごとのタイムゾーンに合わせた表示をするという考え方です。表示というのは、dateコマンドであったり、各プログラミング言語でローカルタイムを取得するときであったり、アプリケーションやデーモンのログのタイムスタンプであったりです。

日本でIntel Edisonを使うなら、

set-timezone-universal.sh
# Edisonセットアップ直後のタイムゾーンにする
timedatectl set-timezone Universal
set-timezone-japan.sh
# Edisonのタイムゾーンを日本にする
timedatectl set-timezone Asia/Tokyo

あたりが必要なところだと思います。

ほかのタイムゾーンが必要なら、

root@edison:~# timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
Africa/Blantyre
Africa/Brazzaville
Africa/Bujumbura
...
Pacific/Palau
Pacific/Pitcairn
Pacific/Pohnpei
Pacific/Port_Moresby
Pacific/Rarotonga
Pacific/Saipan
Pacific/Tahiti
Pacific/Tarawa
Pacific/Tongatapu
Pacific/Wake
Pacific/Wallis

とタイムゾーンリストが得られます。

timedatectl set-time

現在のタイムゾーン設定で、現在時刻2014-02-08T23:00:00(←ISO 8601表記)を設定するには、以下のようにします。

timedatectl set-time "2014-02-08 23:00:00"

ただ、自動時刻合わせが有効、かつインターネット接続が有効だと、たちどころに元の時刻に戻ってしまいます。

自動時刻合わせ(systemd-timesyncd)

Systemdには、NTPクライアントが組み込まれているので、外部サーバを参照して時刻を合わせるために、従来のようにntpdデーモンを入れる必要はありません。ネットがつながっていればね!

時刻合わせサーバの設定

参照するサーバなどの設定は以下のファイルにあります。

/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

Intel Edison初期化直後状態ではGoogleのNTPサーバを参照するようになっています。

国内のNICTなどのNTPサーバに変更することもできますが、Intel Edisonの用途を考えると、GoogleのNTPで問題ないと思います。

起動状態の確認

root@edison:~# systemctl status systemd-timesyncd
● systemd-timesyncd.service - Network Time Synchronization
   Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled)
   Active: active (running) since Fri 2015-02-06 14:10:01 UTC; 21min ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 154 (systemd-timesyn)
   CGroup: /system.slice/systemd-timesyncd.service
           └─154 /lib/systemd/systemd-timesyncd

Feb 06 14:10:01 edison systemd[1]: Starting Network Time Synchronization...
Feb 06 14:10:01 edison systemd[1]: Started Network Time Synchronization.
root@edison:~#

以上より、システム起動時に自動起動すること(/lib/systemd/system/systemd-timesyncd.service; enabled)、過去にネットワーク経由で時刻合わせが行われたことがわかります。

なお、Intel Edison初期化直後状態では、自動起動になっていますが、インターネット接続がされていないので、時刻合わせは未動作になっています。

systemd-timesyncdを止めたい

systemctl stop systemd-timesyncd

systemd-timesyncdの自動起動をやめたい

systemctl disable systemd-timesyncd

systemd-timesyncdを自動起動させたい

systemctl enable systemd-timesyncd

systemd-timesyncdを動作させたい(時刻合わせしたい)

systemctl start systemd-timesyncd

以上、Systemdの作法で設定できます。

Intel Edisonではどう設定するべきか

Linuxのシステムとしては、時刻を取り扱うプログラム的な観点から、タイムゾーンを現地時刻、つまり日本ならAsia/Tokyoに設定する必要があります。

Intel Edisonをセットアップしたら、いの一番に

timedatectl set-timezone Asia/Tokyo

を打ち込み、日本時間にしましょう。

あとは、systemd-timesyncdにより、インターネットがつながるところであれば、時刻サーバに自動的に問い合わせが走ります。現在の時刻の状況は timedatectl status、問い合わせの状況は、systemctl status systemd-timesyncd で確認できます。

未確認事項

Intel Edison内部のRTCのバッテリーバックアップ方法。インターネットにつながらないで使う前提だとどうしても必要ですよね……

http://download.intel.com/support/edison/sb/edisonmodule_hg_331189002.pdf

Esdison pin No. 信号名 説明
23 V_VBAT_BKUP Real-time clock (RTC) backup battery input

とあるので、ここでしょうか。ネットだと2.5V入れるとか書いているけれども……

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away