Intel Edisonの時刻合わせ（systemd-timesyncd,timedatectl）

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](http://qiita.com/yunano/items/7883cf295f91f4ef716b)

# 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入れるとか書いているけれども……