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を使うなら、
# Edisonセットアップ直後のタイムゾーンにする
timedatectl set-timezone Universal
# 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デーモンを入れる必要はありません。ネットがつながっていればね!
時刻合わせサーバの設定
参照するサーバなどの設定は以下のファイルにあります。
# 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のバッテリーバックアップ方法。インターネットにつながらないで使う前提だとどうしても必要ですよね……
Esdison pin No. | 信号名 | 説明 |
---|---|---|
23 | V_VBAT_BKUP | Real-time clock (RTC) backup battery input |
とあるので、ここでしょうか。ネットだと2.5V入れるとか書いているけれども……