「ラズパイにリアルタイムクロック (2016/09/12)」「ラズパイのリアルタイムクロック (2017/11/22)」の続き。(もう少し区別しやすいタイトルをつけるべきだったな。)
どうも納得できなかったのは、「リアルタイムクロックなんて、OS の基本的な機能の一つなのに、なんでこんなめんどくさいんだ?」という点だった。いや、もちろんラズパイのハードウェアが RTC を搭載してないのはわかるんですよ。コストも上がるし、電池ってけっこうかさばるし。でも、RTC を外付けにしたら、OS は「あいよっ」って認識してくれて、あとはよろしくやってくれる、と、普通は期待するじゃないですか。今まで見てきた方法が、ぜんぜんそういう感じじゃなかったので、もやもやしていた。
で、いろいろ探していて、"Adding a Real Time Clock to Raspberry Pi" (Adafruit) という記事を見つけた。これの "Raspbian Jessie (Systemd)" の項が、自分が探していたものじゃないかと。
1. sudo raspi-config
で i2c を有効にする。
2. /boot/config.txt
の末尾に次の一行を追記。
dtoverlay=i2c-rtc,ds1307
3. fake-hwclock
を無効化。
sudo apt-get -y remove fake-hwclock
sudo update-rc.d -f fake-hwclock remove
4. /lib/udev/hwclock-set
を編集して、以下の3行をコメントアウト。
#if [ -e /run/systemd/system ] ; then
# exit 0
#fi
5. もし(以前の実験で)ntpd
を切っていたなら、改めて有効にする。
sudo chkconfig ntp on
再起動する。RTC にアクセスできるかどうかチェック。
pi@raspberrypi:~$ sudo hwclock -r
Thu 30 Nov 2017 21:47:19 JST -0.409684 seconds
でたらめな日付を RTC に書き込んで、再起動してみる。
pi@raspberrypi:~$ sudo date -s "2017/11/29 00:00:00"
Wed 29 Nov 00:00:00 JST 2017
pi@raspberrypi:~$ sudo hwclock -w
pi@raspberrypi:~$ sudo hwclock -r
Wed 29 Nov 2017 00:00:42 JST -0.969959 seconds
pi@raspberrypi:~$ sudo reboot
pi@raspberrypi:~$ date
Thu 30 Nov 21:51:10 JST 2017
pi@raspberrypi:~$ sudo hwclock -r
Wed 29 Nov 2017 00:02:44 JST -0.104352 seconds
システムクロックは ntpd
の働きで正常になったが、RTC はそのまま。自動的に書き込むことはしないようだ。
このまま、LAN を OFF にして再起動。
pi@raspberrypi:~$ date
Wed 29 Nov 00:05:29 JST 2017
pi@raspberrypi:~$ sudo hwclock -r
Wed 29 Nov 2017 00:05:37 JST -0.840893 seconds
RTC の日付が保持されている。
もう一度、LAN を ON にして再起動。システムクロックが ntpd
で NTP サーバに合うのを待って、RTC に手動で書き込んでみる。
pi@raspberrypi:~$ sudo hwclock -r
Wed 29 Nov 2017 00:08:40 JST -0.915298 seconds
pi@raspberrypi:~$ date
Thu 30 Nov 21:57:20 JST 2017
pi@raspberrypi:~$ sudo hwclock -w
pi@raspberrypi:~$ sudo hwclock -r
Thu 30 Nov 2017 21:57:38 JST -0.794143 seconds
期待した動作はしている。あとは、ntpd
で同期している時刻を RTC に記録してくれると万全なのだが、どこかにそういう設定がありそうな気がする。探してみよう。