Linux 時刻

# はじめに

Linux には **ハードウェアクロック** と **システムクロック** の 2 種類の時計が存在する。

OS は主にシステムクロックを扱っている。

# ハードウェアクロック（RTC）

マザーボード上に内蔵された物理的な時計。**RTC**（Real Time Clock）とも呼ばれる。

PC 電源が OFF された後もボタン電池により動作し続ける。

ハードウェアクロックは、[BIOS](https://qiita.com/AsahinaKei/items/e354a3814639aeac4138#%E3%83%95%E3%82%A1%E3%83%BC%E3%83%A0%E3%82%A6%E3%82%A7%E3%82%A2) や [UEFI](https://qiita.com/AsahinaKei/items/e354a3814639aeac4138#%E3%83%95%E3%82%A1%E3%83%BC%E3%83%A0%E3%82%A6%E3%82%A7%E3%82%A2) の画面で表示される。OS とは独立しているため、マシン上に Linux 以外の OS（Windowsなど）がインストールされている場合にも、各種 OS ハードウェアクロックを共有する。

## `$ hwclock`

```console:ハードウェアクロックを表示する
$ hwclock -r
```


```console:ハードウェアクロックをシステムクロックに同期させる（hardware clock to system clock）
$ hwclock --hctosys
```


```console:システムクロックをハードウェアクロックに同期させる（system clock to hardware clock）
$ hwclock --systohc
```


# システムクロック

Linux（OS） が起動後、内部（カーネル）的に保持され、存在するソフトウェアの時計。

Linux 起動時にハードウェアクロックを参照することによって初期化され、その後、ハードウェアクロックとは独立して動き続ける。ただし、起動後に [NTP](#ntp) などでネットワーク上のサーバと同期して調整されることがある。

カーネルが管理していて、Linux 上で動作する各種アプリ、ログ、ファイルのタイムスタンプで使用される。

PC 電源を OFF した後、時刻は保持されない。

`$ date` コマンドで表示されるのは、このシステムクロックの時刻。

## `$ date`

```console:システムクロックを表示する
$ date
```

書式を指定して表示したい場合、書式指定文字列の先頭に `+` を入力する。

```console:書式を指定して表示する
$ date "+時刻指定文字列"
```

```console:例（2025年5月11日）
$ date "+%Y%m%d"
20250511
```

| 書式指定文字列 | 説明 |
|:-|:-|
| `%Y` | 年 |
| `%m` | 月 |
| `%d` | 日 |
| `%H` | 時 |
| `%M` | 分 |
| `%a` | 曜日 |
| `%b` | 月の名前 |


```console:システムクロックを設定する
$ date MMDDhhmmYY   # MM:月、DD:日、hh:時、mm:分、YY:西暦
$ date MMDDhhmmCC.ss   # CC:西暦の下2桁、ss:秒
```

設定したシステムクロックは電源 OFF によって消滅する。

# NTP

`ntpd` は NTP クライアントとしても NTP サーバとしても機能する NTP デーモン（サービス）。

多くの一般的な PC やサーバは、クライアントとして `ntpd` を使用することが多い。

NTP については [こちら](https://qiita.com/AsahinaKei/items/627f0076fecc107ac686#ntp)。


## `$ ntpdate`

指定した NTP サーバから時刻を取得する。

```console:NTP サーバから時刻を取得して、システムクロックを補正する
$ ntpdate NTPサーバ名
```

```console:NTP サーバから時刻を取得する（補正はせずに、システムクロックとの差分だけ確認する（query））
$ ntpdate -q NTPサーバ名
```

## `/etc/ntp.conf`

`ntpd` デーモンの設定ファイル。

設定項目がそのままコマンド名になっている。

```text:/etc/ntp.conf
設定用コマンド 引数
```

```text:/etc/ntp.conf（例）
driftfile ...
restrict ...   # 自身が NTP サーバとして機能している
server ...   # 自身が NTP クライアントとして機能している
```

# ハードウェアクロックとシステムクロックの違い

| 比較対象 | ハードウェアクロック | システムクロック |
|:-|:-|:-|
| 管理 | マザーボード | カーネル |
| 電源 OFF 時 | 稼働し続ける | 停止する |
| 初期設定 | BIOS / UEFI | 起動時にハードウェアクロックをコピー |
| 用途 | OS 起動時のシステムクロック初期化 | 日常的に使用 |
| 時刻調整 | [`$ hwclock`](-hwclock) | [NTP](#ntp) |
| 表示方法 | [`$ hwclock`](#-hwclock) | [`$ date`](#-date) |

# `$ timedatectl`
clock time, calender date, control

時刻やタイムゾーンを管理するためのコマンド。[`systemd`](https://qiita.com/AsahinaKei/items/e354a3814639aeac4138#systemd) を採用している Linux ディストリビューションで使用される。

[`$ hwclock`](#-hwclock) や [`$ date`](#-date) よりも高レベルな操作が可能。

```console:基本構文
$ timedatectl サブコマンド
```

```console:現在の時刻、ハードウェアクロック、タイムゾーンなどを表示する
$ timedatectl
$ timedatectl status
```

```console:タイムゾーンを一覧表示する
$ timedatectl list-timezones
```

```console:タイムゾーンを設定する
$ sudo timedatectl set-timezone タイムゾーン   # Asia/Tokyo など
```

```console:システムクロックの時刻・日付設定
$ sudo timedatectl set-time "HH:MM:SS"
$ sudo timedatectl set-time "YYYY-MM-DD HH:MM:SS"
$ sudo timedatectl set-time "YYYY-MM-DD"
```

時刻設定は [NTP](#ntp) が有効化されている場合、コマンドが失敗する。

```console:NTP を有効化する
$ timedatectl set-ntp yes
```

```console:NTP を無効化する
$ timedatectl set-ntp no
```


# `Chrony`
クロニー

従来の `ntpd` に代わる、新しい軽量かつ高精度な NTP 実装。現在では `ntpd` よりも `chrony` の使用が推奨されている。

chrony は、プロジェクト名でもあり、コマンド名でもある。

- サーバ
    - `chronyd` デーモン
    - NTP サーバとして機能する
- クライアント
    - [`$ chronyc`](#-chronyc) コマンド
    - `chronyd` デーモンの管理を行う

## `/etc/chrony.conf`

`chronyd` デーモンの設定ファイル。

設定項目がそのままコマンド名になっている。

```text:/etc/chrony.conf
設定用コマンド 引数
```

設定変更後は [`$ systemctl`](https://qiita.com/AsahinaKei/items/e354a3814639aeac4138#-systemctl) で `chronyd` デーモンを再起動する。

```console:chronyd デーモンを再起動する
$ sudo systemctl restart chronyd
```

## `$ chronyc`

`chronyd` デーモンと対話するための NTP クライアント側のコマンド。

```console:基本構文
$ chronyc サブコマンド
```

```console:使用中の NTP サーバーとその状態を表示する
$ chronyc sources
```

```console:現在の同期状態を表示する
$ chronyc tracking
```