自由気ままに書いちゃおう

好きなことをつらつらと・・・

【RHEL8】ハードウェアクロック(RTC)とソフトウェアクロックについて

前回、timedatectlコマンドについて記載しております。 

www.guri2o1667.work

 前回の記事で取り上げなかった、「ハードウェアクロック」と「ソフトウェアクロック」について記載しております。

■ハードウェアクロックについて

ハードウェアクロックはマザーボード上の時計のことです。
OS停止しても、マザーボードから独自で電源供給されるため、ひっそりと動き続けています。

ハードウェアクロックは別名が多いです。
下記3つはどれもハードウェアクロックのことです。
① RTC(Real Time Clock)
② BIOSクロック
③ マザボの時刻(※こんな風に呼んでいる人がいたので、一応記載)

ハードウェアクロックにはタイムゾーンの概念はありません。
※単なる時刻の設定です。後々重要になってきます。

ハードウェアクロックを設定する場合は、通常はBIOS/UEFI画面を利用します。

■ソフトウェアクロックについて

LinuxOS(=カーネル)で動いている時計です。
電源を停止すれば、OSが停止するので必然的に時計は停まります。
ソフトウェアクロックにも別名があります。
下記2つはどれもソフトウェアクロックのことです。
① システムクロック
② カーネルクロック(※こんな風に呼んでいる人がいたので、一応記載)

ソフトウェアクロックはタイムゾーン(JST、等)の概念があります。

■ハードウェアクロックとソフトウェアクロックの関係性

ここからはRHEL8のみの話です。
※RHEL5、6は対象外です。RHEL7は通ずるものがあると思いますが、確認が取れていません。

ハードウェアクロックとソフトウェアクロックは密接にかかわっております。
OS上からコマンド(timedatectl , hwclock)で
「ハードウェアクロックをソフトウェアクロックに反映する」ことも、
その逆の「ソフトウェアクロックをハードウェアクロックに反映する」ことも可能です。

ただし、RHELでの推奨設定があるため、それに則ったほうが安全です。
※推奨なだけであり、理由がある場合にはそちらを優先していただければと。

確認方法を下記します。

■推奨設定の確認方法

RHEL8をインストールした当初はNTP時刻同期が設定されていないことが大半のため、
NTP時刻同期が設定されていないことを前提で話を進めます。

timedatectl statusコマンドを実行し、「RTC in local TZ:」の値を確認します。
※期待する値は「no」です。「yes」だった場合、変更を検討した方が良いかも。

f:id:guri2o1667:20210107174639p:plain

 

【「RTC in local TZ:」が「no」の場合の挙動について】※推奨設定

①「ソフトウェアクロックをハードウェアクロックに反映する」
② 反映する際のソフトウェアクロックの時刻はUTCを用いる。

【「RTC in local TZ:」が「yes」の場合の挙動について】

① 「ソフトウェアクロックをハードウェアクロックに反映する」
② 反映する際のソフトウェアクロック時刻はLocal time(タイムゾーンのもの)を用いる。

no/yesどちらでも①は同じです。異なるのは②の部分です。

■「RTC in local TZ:」の変更方法

「RTC in local TZ:」が「yes」だった場合、下記方法で「no」に変更できます。
timedatectl set-local-rtc 0 を実行します。

f:id:guri2o1667:20210107181307p:plain

尚、参考までですが、
「RTC in local TZ:」が「yes」だった場合のtimedatectl status結果は以下の通りです。
"Warning"が出ており、最後の文章で前述のコマンドを実行するように記載されております。

f:id:guri2o1667:20210107181418p:plain

■timedatectl set-local-rtc コマンドで変更されるファイルについて

/etc/adjtimeの3行目が変更されます。
/etc/adjtimeはハードウェアクロックを「UTC」としてみなすか、「LocalTime」としてみなすかが設定されているファイルです。

「RTC in local TZ:」が「no」だった場合は以下の通り、「UTC」と記載されます。

f:id:guri2o1667:20210107181704p:plain

「RTC in local TZ:」が「yes」だった場合、「LOCAL」と記載されます。

f:id:guri2o1667:20210107181639p:plain

■/etc/adjtimeの各行について

前述の通り、timedatectl set-local-rtcコマンドによる結果が、/etc/adjtimeの3行目に反映されています。

f:id:guri2o1667:20210108100446p:plain


各行で下記の意味を持っています。
①1行目
 半角空白区切りで3つの数値で構成されます。
  1列目 
  ⇒ 一日あたりに生じる時刻ずれを秒で表したもの (浮動小数点型の10進数)

  2列目
  ⇒ 最後に時計合わせあるいは補正を行った時刻を 1969 UTC からの経過秒数で表したもの (10進数)

  3列目
  ⇒ 互換性のためのもの(気にしないでよい)


②2行目
 数値は一つです。
 最後に時計を合わせた時刻を 1969 UTC からの経過秒数で表したものです。
 ※時刻合わせが一度もされていなかったり、
  過去の時刻合わせで問題があった場合には 0 が入ります。(10進数)


③3行目
 "UTC" または "LOCAL"が記載されます。
 ハードウェアクロックがUTC、もしくはローカルタイム(Local time)のどちらを利用するかを表しています。
 ※RHEL8ではUTCが推奨です。

 

■RHEL8起動時のハードウェアクロックとソフトウェアクロックの関係性

OS起動時にハードウェアクロックがソフトウェアクロック(=システムクロック)に設定されます。

下記はdmesgコマンドの一部です。
メッセージを見ると、設定されていることがわかります。

f:id:guri2o1667:20210108101939p:plain

その後、タイムゾーンの設定が反映され、最終的にtimedatectlコマンドの出力結果のようになります。

■RHEL8停止時のハードウェアクロックとソフトウェアクロックの関係性

確認がとれてません。。。
OS停止時にソフトウェアクロック(=システムクロック)がハードウェアクロックに設定されるようですが、自信がなく。。。
また、NTP時刻同期時には11分モードにより、システムクロックをハードウェアクロックに同期する(上書きする)ようです。※1

※1 man 8 hwclockの「 Automatic Hardware Clock Synchronization by the Kernel」引用
システムによってはハードウェアクロックを同期させる別の方法があることを知っておく必要があります。
Linux カーネルには、11 分ごとにシステム時刻をハードウェアクロックにコピーするモードがあります。


以上です。