はじめに
2016年11月、Raspberry Pi2にRTCモジュールを接続しました。
「Raspberry PiにRTC(DS1307)を接続」に記載した手順では、正常に動作しませんでした。この問題が解決したので、その方法を記載します。
NTPサービスを停止してみる
NTPサービスが原因らしいので、「chkconfig」コマンドでNTPサービスを停止します。
pi@pi2note:~ $ sudo chkconfig --list |grep ntp ntp 0:off 1:off 2:on 3:on 4:on 5:on 6:off pi@pi2note:~ $ sudo chkconfig ntp off pi@pi2note:~ $ sudo chkconfig --list |grep ntp ntp 0:off 1:off 2:off 3:off 4:off 5:off 6:off
もう一度、テストしてみます。しばらく時間を空けて、ネットワーク切断状態で電源を入れます。NTPサービスが停止しているので、ブート時に正しく時刻が設定されるはずです。
pi@pi2note:~ $ date 2016年 11月 8日 火曜日 14:35:49 JST pi@pi2note:~ $ sudo hwclock -r 2016年11月08日 14時36分07秒 -0.104642 seconds
ハードウェア・クロックに設定された日時が、システム・クロックに設定できました。
これで想定通りの動作をしましたが、ネットワーク接続状態ではNTPサーバーの日時を設定したいという思いがあります。
ここで、前回説明したLinux時計に関するコマンドの説明図をもう一度掲載します。
NTPクライアントの利用
NTPクライアントとして、「ntpdate」コマンドがありますのでインストールします。
sudo apt-get install ntpdate
/etc/rc.local は、RTCの登録のみとします。
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
「ntpdate」コマンドで時刻を取得した後、「date」コマンドと「hwclock -r」コマンドで、システム・クロックとハードウェア・クロックを確認します。
ネットワーク切断状態の場合
pi@pi2note:~ $ date 2016年 11月 8日 火曜日 15:14:49 JST pi@pi2note:~ $ sudo hwclock -r 2016年11月08日 15時20分33秒 -0.459156 seconds pi@pi2note:~ $ sudo ntpdate -v ntp.nict.jp 8 Nov 15:15:42 ntpdate[899]: ntpdate 4.2.6p5@1.2349-o Mon Jul 25 22:35:35 UTC 2016 (1) Error resolving ntp.nict.jp: Name or service not known (-2) 8 Nov 15:15:42 ntpdate[899]: Can't find host ntp.nict.jp: Name or service not known (-2) 8 Nov 15:15:42 ntpdate[899]: no servers can be used, exiting pi@pi2note:~ $ date 2016年 11月 8日 火曜日 15:15:47 JST pi@pi2note:~ $ sudo hwclock -r 2016年11月08日 15時21分13秒 -0.533089 seconds
NTPサーバーからの時刻取得に失敗しても、RTCのハードウェア・クロックは変更されません。
ネットワーク接続状態の場合
pi@pi2note:~ $ date 2016年 11月 8日 火曜日 15:16:16 JST pi@pi2note:~ $ sudo hwclock -r 2016年11月08日 15時21分40秒 -0.201920 seconds pi@pi2note:~ $ sudo ntpdate -v ntp.nict.jp 8 Nov 15:16:26 ntpdate[1047]: ntpdate 4.2.6p5@1.2349-o Mon Jul 25 22:35:35 UTC 2016 (1) 8 Nov 15:21:56 ntpdate[1047]: step time server 133.243.238.244 offset 321.085190 sec pi@pi2note:~ $ date 2016年 11月 8日 火曜日 15:21:59 JST pi@pi2note:~ $ sudo hwclock -r 2016年11月08日 15時22分10秒 -0.759603 seconds
NTPサーバーからの取得した時刻がシステム・クロックに設定され、RTCハードウェア・クロックには影響していません。
うまく動作しそうです!!
ブート時にNTPクライアントかRTCで時刻設定する
ブート時に、時刻を設定するようにします。
/etc/rc.local に直接記述せずに、別のシェルを呼び出すようにします。
sh /root/bootup/setsystime.sh exit 0
/root/bootup ディレクトリに setsystime.sh を作成します。
pi@pi2note:~ $ sudo ls -l /root/bootup 合計 4 -rwxr-xr-x 1 root root 221 11月 6 11:57 setsystime.sh
pi@pi2note:~ $ sudo cat /root/bootup/setsystime.sh #!/bin/sh # # --- RTC device echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device # ntpdate -v ntp.nict.jp if [ $? = 0 ]; then hwclock -w # system time --> rtc else hwclock -s # system time <-- rtc fi # date
ネットワーク切断状態の場合
NTPクライアントの時刻取得できませんので終了コードは「1」となり、「hwclock -s」でシステム・クロックにRTCハードウェア・クロックを設定します。
ネットワーク接続状態の場合
NTPクライアントから時刻取得しますので終了コードは「0」となり、「hwclock -w」で取得した時刻をRTCハードウェア・クロックに設定します。
@pi2note:~ $ date 2016年 11月 8日 火曜日 15:59:55 JST pi@pi2note:~ $ sudo hwclock -r 2016年11月08日 16時00分00秒 -0.177556 seconds
これで、問題が解決してRTC接続が完了しました。