Armadilloフォーラム

ハードウェアクロックの同期について

salt_009

2023年12月1日 10時24分

Armadilloの時刻設定について調査しており、
systemd-timesyncdがシステムクロックを更新していることは
把握できております。

そこで質問なのですが、
systemd-timesyncdはシステムクロックとハードウェアクロックを
自動で同期する機能を持っているのでしょうか?

コメント

at_shinya.koga

2023年12月1日 10時59分

アットマークテクノの古賀です。

salt_009さん:
>Armadilloの時刻設定について調査しており、
>systemd-timesyncdがシステムクロックを更新していることは
>把握できております。
>
>そこで質問なのですが、
>systemd-timesyncdはシステムクロックとハードウェアクロックを
>自動で同期する機能を持っているのでしょうか?

ハードウェアクロックとの自動同期機能は、持たないのではないかと思います。
このフォーラムの、以下のスレッドをご覧になってみてください:

 デフォルト時刻について
 https://armadillo.atmark-techno.com/forum/armadillo/10248

 ArmadilloのRTCの動作について
 https://armadillo.atmark-techno.com/forum/armadillo/3740

salt_009

2023年12月1日 13時55分

古賀様
返信ありがとうございます。

> ハードウェアクロックとの自動同期機能は、持たないのではないかと思います。
では、systemd-timesyncd以外で自動で同期するシステム等はございますか?

先ほど下記ログのように
ネットワークに接続しない状態で、
ハードウェアクロックを任意の日時に書き換えた後、
訳14分後に再度ハードウェアクロックの確認したところ
同期した時刻になっておりました。

root@armadillo:~# date
Fri Dec  1 13:31:02 JST 2023
root@armadillo:~# hwclock --set --date "30 Nov 2022 11:11"
root@armadillo:~# date
Fri Dec  1 13:31:15 JST 2023
root@armadillo:~# hwclock
2022-11-30 11:11:11.496360+09:00
root@armadillo:~# date
Fri Dec  1 13:45:14 JST 2023
root@armadillo:~# hwclock
2023-12-01 13:45:18.128304+09:00

at_shinya.koga

2023年12月1日 15時42分

アットマークテクノの古賀です。

salt_009さん:
>>ハードウェアクロックとの自動同期機能は、持たないのではないかと思います。
>
>では、systemd-timesyncd以外で自動で同期するシステム等はございますか?
>
>先ほど下記ログのように
>ネットワークに接続しない状態で、
>ハードウェアクロックを任意の日時に書き換えた後、
>訳14分後に再度ハードウェアクロックの確認したところ
>同期した時刻になっておりました。

手元に Armadillo-610 がないため、取り急ぎ Armadill-IoT A6 (Debian buster) で確認してみたのですが、ご提示の挙動にはなりませんでした。
ご提示のように、システム日時よりも古い日時をハードウェアクロックに設定した後、待ってみたのですが、20分ほど経過しても、ハードウェアクロックの日時はシステム日時に同期しません。

一点確認です。
お使いの Armadillo は Armadillo-610 とのことですが、その認識で合っているでしょうか?
合っている場合、Armadillo-610 開発セットをお使いでしょうか:
 https://armadillo.atmark-techno.com/armadillo-610/A6100-D00Z
開発セットをお使いの場合、RTC バックアップ電池を装着していらっしゃるかどうかも教えてくださいませ。
https://manual.atmark-techno.com/armadillo-610/armadillo-610_product_ma…

salt_009

2023年12月1日 16時27分

古賀様

> 手元に Armadillo-610 がないため、取り急ぎ Armadill-IoT A6 (Debian buster) で確認してみたのですが、ご提示の挙動にはなりませんでした。
> ご提示のように、システム日時よりも古い日時をハードウェアクロックに設定した後、待ってみたのですが、20分ほど経過しても、ハードウェアクロックの日時はシステム日時に同期しません。
ご確認ありがとうございます。

> お使いの Armadillo は Armadillo-610 とのことですが、その認識で合っているでしょうか?
ご認識の通り、610を使用しております。

> 合っている場合、Armadillo-610 開発セットをお使いでしょうか:
>  https://armadillo.atmark-techno.com/armadillo-610/A6100-D00Z
開発セットにSWやLED等を拡張したものを使用しおります。

> 開発セットをお使いの場合、RTC バックアップ電池を装着していらっしゃるかどうかも教えてくださいませ。
> https://manual.atmark-techno.com/armadillo-610/armadillo-610_product_ma…
RTCですが、開発キットに備え付けれているものではなく、
「RX-8025NB」を接続し使用しております。(元から接続されているRTCは接続されていない状態になっています。)
以前フォーラムに問い合わせていただいた内容に沿ってハードウェアクロックとして設定しております。
https://armadillo.atmark-techno.com/forum/armadillo/16322

salt_009

2023年12月1日 16時29分

記載漏れがありました申し訳ございません。
接続したRTCの「RX-8025NB」にはバックアップ電池が接続されております。

at_shinya.koga

2023年12月1日 17時11分

アットマークテクノの古賀です。

salt_009さん(2023年12月1日 16時27分):
>>お使いの Armadillo は Armadillo-610 とのことですが、その認識で合っているでしょうか?
>
>ご認識の通り、610を使用しております。
>
>>合っている場合、Armadillo-610 開発セットをお使いでしょうか:
>> https://armadillo.atmark-techno.com/armadillo-610/A6100-D00Z
>
>開発セットにSWやLED等を拡張したものを使用しおります。

>RTCですが、開発キットに備え付けれているものではなく、
>「RX-8025NB」を接続し使用しております。(元から接続されているRTCは接続されていない状態になっています。)
>以前フォーラムに問い合わせていただいた内容に沿ってハードウェアクロックとして設定しております。
>https://armadillo.atmark-techno.com/forum/armadillo/16322

了解しました。開発セットの拡張ボード搭載の RTC とは違うものをお使いなのですね。

>>開発セットをお使いの場合、RTC バックアップ電池を装着していらっしゃるかどうかも教えてくださいませ。
>> https://manual.atmark-techno.com/armadillo-610/armadillo-610_product_ma…

salt_009さん(2023年12月1日 16時29分):
>記載漏れがありました申し訳ございません。
>接続したRTCの「RX-8025NB」にはバックアップ電池が接続されております。

これについても、了解しました。
試しに、ですが、poweroff して AC 電源を切った後、RTC バックアップ電池を抜いてから起動し直した場合、ご提示頂いたのと同じ手順を行うと、どうなるでしょうか?

salt_009

2023年12月1日 17時45分

古賀様

> 試しに、ですが、poweroff して AC 電源を切った後、RTC バックアップ電池を抜いてから起動し直した場合、ご提示頂いたのと同じ手順を行うと、どうなるでしょうか?
実施してみました。ログを記載いたします。

// v-起動直後から
permitted by applicable law.
root@armadillo:~# hwclock
hwclock: ioctl(RTC_RD_TIME) to /dev/rtc0 to read the time failed: Invalid argument
root@armadillo:~# date
Fri Dec  1 17:25:28 JST 2023
root@armadillo:~# hwclock --set --date "30 Nov 2022 11:11"
root@armadillo:~# hwclock
2022-11-30 11:11:05.515999+09:00
root@armadillo:~# date
Fri Dec  1 17:25:57 JST 2023
root@armadillo:~# date
Fri Dec  1 17:39:15 JST 2023
root@armadillo:~# hwclock
2023-12-01 17:39:18.015789+09:00   // ← 時刻が書き換わっている

結果として時刻が同期しております。

at_shinya.koga

2023年12月1日 18時04分

アットマークテクノの古賀です。

salt_009さん:
>>試しに、ですが、poweroff して AC 電源を切った後、RTC バックアップ電池を抜いてから起動
>>し直した場合、ご提示頂いたのと同じ手順を行うと、どうなるでしょうか?
>
>実施してみました。ログを記載いたします。

>結果として時刻が同期しております。

了解しました。ご確認有り難うございます。

// v-起動直後から
permitted by applicable law.
root@armadillo:~# hwclock
hwclock: ioctl(RTC_RD_TIME) to /dev/rtc0 to read the time failed: Invalid argument
root@armadillo:~# date
Fri Dec  1 17:25:28 JST 2023
root@armadillo:~# hwclock --set --date "30 Nov 2022 11:11"
root@armadillo:~# hwclock
2022-11-30 11:11:05.515999+09:00
root@armadillo:~# date
Fri Dec  1 17:25:57 JST 2023
root@armadillo:~# date
Fri Dec  1 17:39:15 JST 2023
root@armadillo:~# hwclock
2023-12-01 17:39:18.015789+09:00   // ← 時刻が書き換わっている

RTC 日時が無効な状態で起動しても、その後システムクロックに同期する、ということですね。
他に切り分けして試すとしたら、起動後に、systemd-timesyncd サービスを systemctl で
停止してから同じ操作を行った場合にどうなるか見る、くらいでしょうか。

こちらで確認せずに逆質問ばかりになってしまい、ごめんなさい。

at_dominique.m…

2023年12月4日 9時46分

salt_009さん、

よこからすみません、
マルティネです。

ntp で時間が取得された状態は systemd-timesyncd ではなく、カーネルがやく11分毎に rtc に時間を記録します。
(具体的なコードは linux カーネルの kernel/time/ntp.c の sync_cmos_clock() を参考にできます: https://github.com/atmark-techno/linux-4.14-at/blob/master/kernel/time/… - 新しいカーネルでは sync_hw_clock にリネームされています)

確認のために無効化を試したい場合は、ntp サービス停止だけでは unsync のフラグが設定されないかもしれませんので、systemd-timesyncd が無効な状態で再起動するか、サービス停止後に date -s などでシステムクロックも一度ぶらしてから試してください。

よろしくお願いします。

at_dominique.m…

2023年12月4日 10時03分

連続返事ですみません、以下の文書に日本語になっていなかったので訂正します:
> 確認のために無効化を試したい場合は、ntp サービス停止だけでは unsync のフラグが設定されないかもしれませんので、systemd-timesyncd が無効な状態で再起動するか、サービス停止後に date -s などでシステムクロックも一度ぶらしてから試してください。
の「date -s などでシステムクロックも一度ぶらしてから」
を「date -s などでシステムクロックを一度ずらしてから」のつもりで書いてました。
システムクロックの ntp が取得されている状態をクリアーしないとサービスを停止してもカーネルが rtc を更新し続けるおそれがありますので、たとえば 「date -s "$(date)"」で ntp 取得状態がリセットされるはずです。

よろしくおねがいします。

salt_009

2023年12月4日 13時15分

マルティネ様

返信ありがとうございます。

> ntp で時間が取得された状態は systemd-timesyncd ではなく、カーネルがやく11分毎に rtc に時間を記録します。
デーモン等の機能ではなく、カーネルそのものが待つ機能でRTCとの同期が行われていたという認識でよろしいでしょうか。

>確認のために無効化を試したい場合は、ntp サービス停止だけでは unsync のフラグが設定されないかもしれませんので、
>systemd-timesyncd が無効な状態で再起動するか、サービス停止後に date -s などでシステムクロックも一度ぶらしてから試してください。
同期しなくなることを確認できました。
ありがとうございます。

at_dominique.m…

2023年12月4日 15時04分

salt_009さん

> > ntp で時間が取得された状態は systemd-timesyncd ではなく、カーネルがやく11分毎に rtc に時間を記録します。
> デーモン等の機能ではなく、カーネルそのものが待つ機能でRTCとの同期が行われていたという認識でよろしいでしょうか。

はい、デーモンにかかわらず Linux カーネルが 11 分ぐらいの間隔で RTC との同期を繰り替えしています。
ただし、NTP が取得された状態でしか行っていませんで、何かの ntp クライアントが必要です。

よろしくお願いします。

salt_009

2023年12月5日 9時02分

マルティネ様

> はい、デーモンにかかわらず Linux カーネルが 11 分ぐらいの間隔で RTC との同期を繰り替えしています。
> ただし、NTP が取得された状態でしか行っていませんで、何かの ntp クライアントが必要です。
承知いたしました。ありがとうございます。

マルティネ様
古賀様

対応いただきありがとうございます。
今後ともよろしくお願い致します。