時刻が戻らない
Raspbianで、dateで未来の時刻を設定すると、rebootしてもその時刻が記憶されるのに、過去を設定すると、前に設定した未来に戻ってしまう、と聞いた。
何でそんなことを、というのは置いておいて、やってみたら、確かにそうなる。
面白いじゃないか。
RTCが無い
そもそも、Raspberry Piには、RTCが無い。なのに何故時刻が記憶されるのか?
ググった結果、fake-hwclockにたどり着いた。システムの起動終了時に、時刻をファイルへ読み書きするらしい。debianのパッケージはここ。
fake-hwckockのforceオプション
fake-hwclock(8)によると、forceオプションを付けないと、過去には戻れないらしい。
COMMANDS
save Save the time to the file. If force is specified fake-hwclock will move the saved clock either backwards or forwards. Otherwise it will only move it forwards.
load Load the time from the file. If force is specified fake-hwclock will move the clock either backwards or forwards. Otherwise it will only move it forwards.
このmanは親切で、設定ファイル/etc/default/fake-hwclock
の存在を知り、中身を見る。
# Uncomment to set clock even if saved value appears to be in the past
#FORCE=force
Uncommentすれば、forceになりそうだ。
# Uncomment to set clock even if saved value appears to be in the past
FORCE=force
実験
date
で過去を設定し、fake-hwclock再起動。
root@raspberrypi:/home/pi# cat /etc/fake-hwclock.data
2017-01-25 23:42:01
root@raspberrypi:/home/pi# date 012523422015
Sun 25 Jan 23:42:00 UTC 2015
root@raspberrypi:/home/pi# systemctl restart fake-hwclock
root@raspberrypi:/home/pi# cat /etc/fake-hwclock.data
2017-01-25 23:42:01
/etc/fake-hwclock.data
を見ても、過去が保存された気配はない。
そこで、/lib/systemd/system/fake-hwclock.service
を確認する。
ExecStart=/sbin/fake-hwclock load $FORCE
ExecStop=/sbin/fake-hwclock save
save側に$FORCEが無い。過去は記憶されなさそうだ。
そこで、saveにも$FORCEを付けてしまう。
ExecStart=/sbin/fake-hwclock load $FORCE
ExecStop=/sbin/fake-hwclock save $FORCE
再実験
root@raspberrypi:/home/pi# systemctl daemon-reload
root@raspberrypi:/home/pi# date 012523422015
Sun 25 Jan 23:42:00 UTC 2015
root@raspberrypi:/home/pi# systemctl restart fake-hwclock
root@raspberrypi:/home/pi# cat /etc/fake-hwclock.data
2015-01-25 23:42:06
おお、過去が保存された。
saveに$FORCEが無い理由
本家の歴史を見ると、途中でsaveにforceを追加した模様。
その時に、fake-hwclock.service
のsaveに追加し忘れた?
まあそもそもdate
で設定した過去の時刻を保存するという機能は、仕様外というだけかもしれない。
いまさら確認環境
- 2017-01-11-raspbian-jessie-lite
- Raspberry Pi 1 Model A+
- NTPサーバーにアクセスできないローカルネットワーク
宿題
本題とずれるが、fake-hwclock.service
編集後、systemctl daemon-reload
した後に、systemctl stop fake-hwclock
としたが、どうもfake-hwclock
が呼ばれない模様。restartだとうまく行く。
systemdの仕様と思われるが、何でだろう。Type=oneshot
かつRemainAfterExit=yes
との関係は? などの調査。