6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Raspberry Piの時刻を手動設定すると過去に戻れない

Last updated at Posted at 2017-01-25

時刻が戻らない

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の存在を知り、中身を見る。

/etc/default/fake-hwclock
# Uncomment to set clock even if saved value appears to be in the past
#FORCE=force

Uncommentすれば、forceになりそうだ。

/etc/default/fake-hwclock
# 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を確認する。

/lib/systemd/system/fake-hwclock.service
ExecStart=/sbin/fake-hwclock load $FORCE
ExecStop=/sbin/fake-hwclock save

save側に$FORCEが無い。過去は記憶されなさそうだ。
そこで、saveにも$FORCEを付けてしまう。

/lib/systemd/system/fake-hwclock.service
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との関係は? などの調査。

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?