システム時刻の管理 - date/timedatectl/NTP/chrony【LPIC-1 108.1】

システム時刻の管理 - date/timedatectl/NTP/chrony【LPIC-1 108.1】

この記事で達成できること

  • date で現在時刻を表示し、書式と設定を使い分けられる
  • システムクロックとハードウェアクロック(RTC)の関係を hwclock で説明できる
  • timedatectl でタイムゾーンと時刻同期をまとめて管理できる
  • NTP(ntpd / chrony)で時刻同期を構成し、状態を確認できる
  • 試験頻出の「UTC とローカル時刻」「手動設定と NTP の競合」を根拠付きで答えられる

LPIC-1 主題 108.1「システム時刻を保守する」の中核。ログの突合、cron の正確な起動、TLS 証明書の検証はすべて正しい時刻が前提になる。

システム時刻はどの層で管理されるのか

Linux の時刻は「システムクロック(カーネルが保持するソフトウェア時計)」と「ハードウェアクロック(マザーボード上の RTC)」の 2 層で管理される。日常の時刻同期はシステムクロックに対して行い、RTC は起動時の初期値として使う。

時計 実体 操作コマンド 電源OFF時
システムクロック カーネル内部のソフトウェア時計 date / timedatectl 失われる
ハードウェアクロック(RTC) マザーボードの電池駆動チップ hwclock 保持される

起動時に RTC からシステムクロックへ時刻が読み込まれ(hctosys)、運用中は NTP がシステムクロックを補正する。hwclock --systohc でシステムクロックを RTC に書き戻すことで、次回起動時の初期値を正確に保つ。

systemd 環境では起動時の RTC 読み込みと書き戻しは systemd が自動で行うため、手動の hwclock 操作は通常不要。NTP 同期が有効なら timedatectl が定期的に RTC を更新する。

date で時刻を表示・設定する

date は現在のシステム時刻を表示・設定するコマンド。+ で始まる書式指定子で出力形式を自由に整形できる。設定には root 権限が必要だが、NTP 同期中の手動設定は避ける。

時刻の表示と書式指定

date
date '+%Y-%m-%d %H:%M:%S'
date '+%Y%m%d'
date -u
2026年  5月 30日 土曜日 14:23:07 JST
2026-05-30 14:23:07
20260530
2026年  5月 30日 土曜日 05:23:07 UTC

主要な書式指定子は %Y(4桁の年)、%m(月)、%d(日)、%H(時、24時間)、%M(分)、%S(秒)。-u を付けると UTC で表示する。バックアップのファイル名生成などで date '+%Y%m%d' が定番。

時刻の手動設定

sudo date -s '2026-05-30 14:30:00'
2026年  5月 30日 土曜日 14:30:00 JST

-s--set)で時刻を直接設定する。ただし NTP 同期が有効な環境では、設定してもすぐ NTP に上書きされる。手動設定する場合は先に同期を止める(後述)。

hwclock でハードウェアクロックを操作する

hwclock は RTC を読み書きするコマンド。--systohc でシステム時刻を RTC に、--hctosys で RTC をシステム時刻にコピーする。RTC を UTC で持つかローカル時刻で持つかが試験の頻出ポイント。

RTC の参照と同期方向

sudo hwclock --show
sudo hwclock --systohc
sudo hwclock --hctosys
2026-05-30 14:31:05.123456+09:00

--show-r)で RTC の現在値を表示する。同期方向は名前で覚える。

オプション 方向 用途
--systohc-w システム → RTC 正しいシステム時刻を RTC に保存
--hctosys-s RTC → システム RTC の値でシステム時刻を初期化

UTC とローカル時刻

sudo hwclock --systohc --utc
sudo hwclock --systohc --localtime

--utc を付けると RTC を UTC として扱い、--localtime ならローカル時刻として扱う。Linux 単独運用では UTC を強く推奨。RTC をローカル時刻にすると、夏時間の切り替えやタイムゾーン変更で二重補正・ずれが起きやすい。

Windows とのデュアルブートでは Windows が既定で RTC をローカル時刻として扱うため、Linux 側も --localtime に合わせるか、Windows 側を UTC 運用に変更する。混在すると起動のたびに時刻がずれる。

timedatectl で時刻とタイムゾーンを管理する

timedatectl は systemd 環境の標準コマンドで、時刻・タイムゾーン・時刻同期・RTC モードを一元管理する。引数なしの timedatectlstatus と同じ出力を返す。

現在の状態を確認する

timedatectl status
               Local time: 土 2026-05-30 14:35:12 JST
           Universal time: 土 2026-05-30 05:35:12 UTC
                 RTC time: 土 2026-05-30 05:35:11
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

System clock synchronizedNTP service で同期状態を確認できる。RTC in local TZ: no は RTC を UTC で保持していることを示す(推奨状態)。

タイムゾーンを設定する

timedatectl list-timezones | grep Tokyo
sudo timedatectl set-timezone Asia/Tokyo
Asia/Tokyo

list-timezones で利用可能なタイムゾーン一覧を表示し、set-timezone で設定する。これにより /etc/localtime のシンボリックリンクが更新される(後述)。

時刻同期を有効化する

sudo timedatectl set-ntp true

set-ntp true は、利用可能な最初の時刻同期サービスを有効化・起動する(systemd 環境では systemd-timesyncd が代表)。false で無効化する。手動で時刻を設定したいときは、まず set-ntp false で同期を止める。

RTC を UTC で保持する

sudo timedatectl set-local-rtc 0

set-local-rtc 0 で RTC を UTC として維持する(推奨)。1 を指定するとローカル時刻になるが、公式ドキュメントは「ローカル時刻での RTC 保持は完全にはサポートされず、タイムゾーン変更や夏時間調整で問題を起こす。可能な限り UTC モードを維持せよ」と明記している。

タイムゾーンはどのファイルで決まるのか

システムのタイムゾーンは /etc/localtime/usr/share/zoneinfo/ 配下のどのファイルを指すかで決まる。Debian 系はこれに加えて /etc/timezone にゾーン名をテキストで持つ。

パス 役割
/usr/share/zoneinfo/ 全タイムゾーン定義(バイナリ)の格納場所
/etc/localtime システム TZ を指すシンボリックリンク
/etc/timezone ゾーン名のテキスト(Debian / Ubuntu 系)
ls -l /etc/localtime
lrwxrwxrwx 1 root root 30 May 30 14:00 /etc/localtime -> /usr/share/zoneinfo/Asia/Tokyo

timedatectl set-timezone を使えばこのリンクと /etc/timezone の整合性を自動で保てる。手動でリンクを張り替えるより timedatectl を使うのが安全。個別ユーザーの一時的な変更は環境変数 TZ でも可能。

NTP で時刻を同期する

NTP(Network Time Protocol)は上位サーバから正確な時刻を取得してシステムクロックを補正するプロトコル。実装は古典的な ntpd、後継の chrony、軽量な systemd-timesyncd の 3 系統がある。

3 つの実装の違い

実装 設定ファイル 確認コマンド 特徴
ntpdntp.org 参照実装) /etc/ntp.conf ntpq -p 歴史が長く資料が豊富
chrony(chronyd) /etc/chrony.conf chronyc sources / chronyc tracking 断続的な接続や仮想環境に強い
systemd-timesyncd /etc/systemd/timesyncd.conf timedatectl status SNTP クライアントのみ、軽量

同一ホストで複数の時刻同期デーモンを同時に動かすと互いに競合するため、使うのは 1 つだけにする。

ntpd の確認

ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp1.example.com 133.243.x.x      2 u   45   64  377    8.123    0.512   0.087
+ntp2.example.com 133.243.x.x      2 u   38   64  377   12.456   -0.231   0.142

ntpq -p(peers)は対向サーバ一覧を表示する。行頭の * が現在同期中のサーバ、+ が同期候補。reach は到達性(8進数、377 が直近 8 回すべて成功)、offset がローカルとの時刻差(ミリ秒)。設定は /etc/ntp.confserver 行で指定する。

chrony の確認

chronyc sources
chronyc tracking
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp1.example.com              2   6   377    23    +12us[  +18us] +/-   14ms
^- ntp2.example.com              2   6   377    21   -103us[ -103us] +/-   21ms

chronyc sourcesM 列は時刻源の種別(^ はサーバ)、S 列は選択状態(* が同期中)。Stratum は基準時計からのホップ数、Reach は到達性レジスタ。chronyc trackingReference IDStratumSystem time(NTP 時計とシステム時計の現在のオフセット)・Last offsetRMS offset など同期品質の詳細を表示する。設定は /etc/chrony.confserver / pool 行で指定する。

試験対策では「chronyc sources で時刻源、chronyc tracking で同期状態の詳細」「ntpq -p は ntpd の対向サーバ一覧」という対応を押さえる。設定ファイル名(/etc/ntp.conf/etc/chrony.conf)も頻出。

よくあるミスと対処

時刻管理は設定間の競合や UTC/ローカルの取り違えでトラブルが起きやすい。試験でも実務でも問われる典型例を挙げる。

  • UTC とローカル時刻の混同: RTC を UTC で持つ前提なのに --localtime で書き込み、起動のたびにタイムゾーン分(日本なら 9 時間)ずれる。Linux 単独なら UTC で統一する。
  • NTP と手動設定の競合: NTP 同期中に date -shwclock --systohc で手動設定しても、すぐ NTP に上書きされる。手動設定するなら先に timedatectl set-ntp false(または該当デーモン停止)で同期を止める。
  • 複数の時刻同期デーモンの同時起動: ntpdchronyd を両方起動すると同じポートと役割を奪い合い同期が不安定になる。1 つだけ有効化する。
  • タイムゾーン変更が反映されない: /etc/localtime を手動で書き換えたが /etc/timezone(Debian 系)と食い違う。timedatectl set-timezone を使えば両者の整合性が保たれる。
  • 稼働中プロセスに TZ 変更が効かない: タイムゾーンを変えても、起動済みのデーモン(cron・アプリ)は古い TZ を保持し続けることがある。変更後はサービスを再起動する。

トラブルシューティング

時刻同期の不具合は「症状 → 原因 → 確認 → 対処」の順で切り分けると速い。

症状: timedatectl で同期されない(System clock synchronized: no)

原因: 時刻同期サービスが無効、または NTP サーバへ到達できていない

確認:

timedatectl status
sudo systemctl status systemd-timesyncd

対処: sudo timedatectl set-ntp true で同期を有効化する。それでも no のままなら、ファイアウォールで UDP 123 番が塞がれていないか、設定ファイルの server 行が正しいかを確認する。

症状: date -s で設定してもすぐ時刻が戻る

原因: NTP 同期が有効で、手動設定が即座に上書きされている

確認:

timedatectl status

対処: System clock synchronized: yes なら正常動作。意図的に手動設定したい場合は sudo timedatectl set-ntp false で同期を止めてから date -s を実行する。

症状: 起動するたびに時刻がタイムゾーン分ずれる

原因: RTC のモード(UTC / ローカル)とシステムの解釈が食い違っている

確認:

timedatectl status
sudo hwclock --show

対処: Linux 単独なら sudo timedatectl set-local-rtc 0 で RTC を UTC に統一する。Windows とのデュアルブートなら、どちらかのモードに揃える。

作業完了チェックリスト

  • [ ] timedatectl status で時刻・TZ・同期状態を確認した
  • [ ] timedatectl set-timezone で正しいタイムゾーンを設定した
  • [ ] timedatectl set-ntp true で時刻同期を有効化した
  • [ ] chronyc sources / ntpq -p で時刻源の到達性を確認した
  • [ ] RTC を UTC(set-local-rtc 0)で保持していることを確認した

まとめ

場面 コマンド 目的
時刻表示 date '+%Y-%m-%d' 書式を指定して表示
状態確認 timedatectl status 時刻・TZ・同期をまとめて確認
TZ 設定 timedatectl set-timezone タイムゾーン変更
同期制御 timedatectl set-ntp true NTP 同期の有効化
RTC 書き戻し hwclock --systohc システム時刻を RTC に保存
chrony 確認 chronyc sources / tracking 時刻源と同期品質
ntpd 確認 ntpq -p 対向サーバ一覧

システム時刻はログ・cron・証明書検証の土台。108.1 を押さえたら、時刻に依存するログ管理やジョブスケジューリングと合わせて運用知識が完成する。

次に読む