treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

障害の影響でRaspberry Piの時計設定

前回の障害「Raspberry Piで問題発生? - treedown’s Report」で対処したRaspberry Pi。時計が正常に時刻を刻んでいない状態になりました。
障害の影響ですが、再設定のための予備知識をご報告します。

時間が止まっている

障害発生時からどうもシステムクロックが止まっているように見えました。発生とおぼしき日時から時間が進んでいない状況。
ファイルシステムが"read-only"となってしまった影響で時間が更新出来なくなったと考えられました。

いつもの調子で「hwclock」コマンドで確認してみると、そもそもhwclockは存在していないエラーが。例えば、
--------------------------------------------------------------
$ sudo hwclock --show
2021-01-29 18:05:16.713629+0900
--------------------------------------------------------------
こういうのを期待していたのですが、実際に実行すると、
--------------------------------------------------------------
$ hwclock --show
hwclock: Cannot access the Hardware Clock via any known method.
hwclock: Use the --debug option to see the details of our search for an access method.
--------------------------------------------------------------
「hwclock:既知の方法でハードウェアクロックにアクセスすることはできません。
hwclock:-debugオプションを使用して、アクセス方法の検索の詳細を確認します。」
とエラーになってしまいます。

ひとまず、2021年1月29日AM10:30現在の時刻を手動で

# date --set="2021-01-29 10:30:00"

※# date -s "2021-01-29 10:30:00" でも可

とコマンド実行し、時刻を合わせることにしました。
ファイルシステムが修正済だったので、無事時刻は修正され、再起動やコールドスタートでも正しい時刻が刻まれるようになりました。

Raspberry Piではhwclockではない

しかし、いつものIntelアーキテクチャのPCにインストールしたDebianとRaspberry PiのRaspbianでは時計の部分の勝手が違うようです。(Raspberry Piではなんとなくネットワーク経由で時刻合わせを自動で実行しているというのは頭にあったのですが)

Raspberry Piでは「fake-hwclock」が使われており、hwclockの代替をしているようです。これはhwclockの代わりにファイルに時刻を記憶して起動時にこれを読み込んで代替としているようです。そのファイルとは「/etc/fake-hwclock.data」ファイル。これを開いてみると

f:id:treedown:20210202013001p:plain

※画面はイメージです。

--------------------------------------------------------------
$ cat /etc/fake-hwclock.data
2021-01-29 08:17:01
--------------------------------------------------------------
このように、システムの起動時や時刻設定を実施した年月日&時間が書き込まれています。

どんな動きをしているか調べてみる

Raspberry Piをシャットダウンした時は、このファイルにシャットダウン時の時間を保存して起動時に表示するのに使われているようです。もう一つ確認コマンド
--------------------------------------------------------------
$ timedatectl status
Local time: 金 2021-01-29 17:52:29 JST
Universal time: 金 2021-01-29 08:52:29 UTC
RTC time: n/a
Time zone: Asia/Tokyo (JST, +0900)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
--------------------------------------------------------------
コマンド「timedatectl status」で時刻の設定状態を確認出来ます。
自動的にNTP経由で時刻を参照して時刻合わせをしてくれるように設定されていることが分ります。
おそらく、fake-hwclock+NTP(timesyncd)の併用でRaspberry Piでは時刻を正確に保っていると思われます。
これ、例えば、x86(Intelアーキテクチャ)のPCで稼働するLinuxだとどう表示されるかというと、
--------------------------------------------------------------
$ timedatectl status
Local time: 金 2021-01-29 17:58:40 JST
Universal time: 金 2021-01-29 08:58:40 UTC
RTC time: 金 2021-01-29 08:58:40
Time zone: Asia/Tokyo (JST, +0900)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
--------------------------------------------------------------
こう表示されます。
Raspberry Piが「RTC time: n/a」と表示されるのに対して、IAでは「RTC time: 金 2021-01-29 08:58:40」という具合に日付が表示されます。

RTC(リアルタイムクロック=Real Time Clock)対応じゃない

以前<Debian8 jessieでもclockspeedが使いたい。 - treedown’s Report>のときに結構調べたこの辺の知識。
よく考えてみると、Raspberry Piではそもそもマザーボードにバックアップ電池がないので、RTC=BIOS時計(CMOSクロック)がない、ということにもっと早く気づくべきでした。

つまり、Raspberry Piではカーネル内部の時計=システムクロックだけで時刻を管理しており、hwclockの代替としてfake-hwclockでファイル保存することでそれっぽい動作をしている、と言うことになります。そうなると合点がいきます。
足りない分はネットワーク経由でNTP(かtimesyncd)による時刻同期を実施すれば時刻は事足りるということなんだと。

「Raspberry Pi RTCモジュール」で検索すると、GPIOに装着するRTC拡張モジュール(電池別売り)がいくつか見つかったことから考えると、それなりにリアルタイムクロックをRaspRaspberry Piで使いたいユーザが存在しているようにも感じます。

つまりRaspberry Piではシャットダウン時の時間だけ記憶しておいて、後はNTP(かtimesyncd)にお任せ、という考え方のようです。