システム時刻の管理 - 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 モードを一元管理する。引数なしの timedatectl は status と同じ出力を返す。
現在の状態を確認する
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 synchronized と NTP 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 つの実装の違い
| 実装 | 設定ファイル | 確認コマンド | 特徴 |
|---|---|---|---|
ntpd(ntp.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.conf の server 行で指定する。
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 sources の M 列は時刻源の種別(^ はサーバ)、S 列は選択状態(* が同期中)。Stratum は基準時計からのホップ数、Reach は到達性レジスタ。chronyc tracking は Reference ID・Stratum・System time(NTP 時計とシステム時計の現在のオフセット)・Last offset・RMS offset など同期品質の詳細を表示する。設定は /etc/chrony.conf の server / 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 -sやhwclock --systohcで手動設定しても、すぐ NTP に上書きされる。手動設定するなら先にtimedatectl set-ntp false(または該当デーモン停止)で同期を止める。 - 複数の時刻同期デーモンの同時起動:
ntpdとchronydを両方起動すると同じポートと役割を奪い合い同期が不安定になる。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 を押さえたら、時刻に依存するログ管理やジョブスケジューリングと合わせて運用知識が完成する。