前置き
Linuxサーバを操作していた際に、時間が大幅にずれていたことがありました。
時刻を修正する際に、クロックについて調べたら2つのクロックがあり、違いについて具体的にイメージできなかったため備忘録としてまとめたものです。
システムクロックとは
システムクロックは,Linuxが管理する時計です
特徴は以下です
・OSが稼働中に使用される時計
・メモリ上に保持され、OSによって時間が刻まれる
・システム起動時にハードウェアクロックから初期値を取得する
・ファイルのタイムスタンプなど、OSの各種機能で使用される
例: date コマンドで表示される時刻はシステムクロックの時刻です。
# コマンド
date
#出力結果
2024年 9月 6日 金曜日 16:23:34 JST
ハードクロックとは
ハードウェアクロックは、コンピュータのマザーボード上に搭載された物理的な時計です。
特徴は以下です
・PCの電源がOFFでも時刻を刻み続ける
・CMOS電池で駆動されるため、「CMOS時計」とも呼ばれる
・システム起動時にOSに時刻情報を提供する
例: BIOSの設定画面で確認できる時刻がハードウェアクロックの時刻です。
具体的な動作の違い
システム起動時
ハードウェアクロック: 2024年9月6日 10:00:00
システムクロック: ハードウェアクロックから時刻を取得し、2024年9月6日 10:00:00に設定
システム稼働中(1時間後)
・ハードウェアクロック: 2024年9月6日 11:00:00 (独立して時を刻む)
・システムクロック: 2024年9月6日 11:00:00 (OSが管理)
システムシャットダウン後
ハードウェアクロック: 引き続き時を刻む
システムクロック: 消失 (次回起動時に再度ハードウェアクロックから時刻を取得)
両方の精度が高くないため、NTPサーバーを使用して定期的に正確な時刻に同期することが推奨されます!
システムクロックとハードクロックの同期を自動化
Network Time Protocol (NTP)を使った同期が最も一般的で効果的。
NTPデーモンのインストール:
多くのLinuxディストリビューションでは、ntpdまたはchronydがNTPデーモンとして使用されます。
まだインストールされていない場合は、パッケージマネージャーを使用してインストールします。
NTPサービスの設定:
/etc/ntp.confまたは/etc/chrony.confファイルを編集して、使用するNTPサーバーを指定します。
サービスの有効化と起動:
下記コマンド実行
sudo systemctl enable ntpd
sudo systemctl start ntpd
または
sudo systemctl enable chronyd
sudo systemctl start chronyd
これにより、システムクロックが定期的にNTPサーバーと同期されます
ハードウェアクロックとの同期
システムクロックがNTPで同期された後、ハードウェアクロックとの同期を自動化するには以下を実行する
hwclockコマンドを定期的に実行するようにスケジュールします。例えば、cronジョブを使用する
sudo crontab -e
エディタ上に以下を追加
0 * * * * /sbin/hwclock --systohc
これにより、毎時0分にシステムクロックからハードウェアクロックへ時刻が同期されます!
または、システムの起動時と終了時にハードウェアクロックを更新するスクリプトを作成し、システムの起動/終了プロセスに組み込みます。
私の方でcron設定について別記事を書いています。
cronについて確認したい方は参考にどうぞ!
補足
下記は同期における補足です
・ほとんどの現代のLinuxシステムでは、NTPサービスが既定で有効になってます。
システムクロックとハードウェアクロックの同期が自動的に行われます。
・タイムゾーンの設定が正しいことを確認してください。
これはUTCとローカル時間の変換に影響します。
・仮想マシンや一部のクラウド環境では、ハードウェアクロックへのアクセスが制限されている場合があります。
そのような環境では、システムクロックの同期のみに焦点を当てる必要があります。
これらの方法を使用することで、システムクロックとハードウェアクロックの同期を効果的に自動化できます。
以上になります。お疲れ様ででした。
学習の参考になれば幸いです。