Linuxにおける時刻管理

date command & NTP settting

公開日: 2021-05-07
更新日: 2023-08-08
所要時間: 10 min

  Table of Contents

Why system clock is important?

Def: System Clock

OSが内部に持っている時計をシステムクロックといいます. ファイルのタイムスタンプやユーザーの利用記録などを正確に管理するためにシステムクロックの適正管理は重要.

Linuxシステムの時刻はシステムクロックによって管理されています. システムクロックはLinuxカーネルのメモリ上に次の2つのデータとして保持されています:

  • 1970-01-01 00:00:00からの経過秒数
  • 現在秒からの経過ナノ秒数

そして, インターバルタイマーの割り込みにより時計が進みます.

システムクロックの確認

dateコマンドはシステムクロックの設定, 表示をするコマンドです. 引数なしで実行すると現在のシステムクロックが表示されます

1
2
3
4
5
6
% date
Sat May 30 08:19:29 PM JST 2020

% date -u
Sat May 30 11:19:29 AM UTC 2020

時刻の表示にはUTCとローカルタイムの2種類があります. ローカルタイム時差情報はetc/localtimeファイルに格納されています. 時差情報自体は/usr/share/zoneinfoディレクトリに各タイムゾーンごとで格納されています.

システムのローカルタイムゾーンを変更する場合は/usr/share/zoneinfoからファイルをetc/localtimeへシンボリックリンクする形で実施されます.

dateコマンドによる表示形式の調整

dateコマンドは表示形式の設定もできます. 表示形式の書式指定では最初に+を付け, そのあとにパターンを指定します.

フォーマット コマンド例 出力サンプル
YYYY/MM/DD hh:mm:ss date "+%Y/%m/%d %H:%M:%S" 2017/09/07 07:16:51
YYYY-MM-DDThh:mm:ss date +%Y-%m-%dT%H:%M:%S 2017-09-07T07:16:51
YYYYMMDD-hhmmss date +%Y%m%d-%H%M%S 20170907-071651
Month DD hh:mm:ss date '+%B %d %T' August 12 21:30:57
1
2
% date '+%b %d %T'
May 30 20:19:29

UNIX時間の取得も +%s を指定することによって可能

1
2
3
4
5
6
7
# UNIX時間の取得
% date --date="2020-05-01 18:36:10" +%s
1588325770

# UNIX時間からreadableな時刻表記へ再変換
% date --date="2020-05-01 18:36:10" +%s |xargs -i date --date @{}
Fri May  1 06:36:10 PM JST 2020

ハードウェアクロック

Def: ハードウェアクロック

ハードウェアクロックは, マザーボード上のICによって提供される時計.

  • この時計はバッテリーのバックアップがあるので, PCの電源を切っても時計が進む
  • RTC(Real Time Clock)あるいはCMOSクロックとも呼ばれる

hwclockコマンド(CentOSではclockコマンドはhwclockへのシンボリックリンク)でRTCを確認することができます.

1
2
% sudo hwclock --show
2020-05-30 20:30:53.608967+09:00

RTCはCMOSメモリ上にデータを保持しています. ハードウェアクロックの時刻はLinuxシステム立ち上げ時にhwclockコマンドで読み取られ, システムクロックに設定されます. また, システムの停止時に, hwclockコマンドによってシステムクロックの時刻がハードウェアクロックに設定されます.

sequenceDiagram
    participant hardware clock
    participant interval timer

    hardware clock->>system clock: boot時に<br>hardware clockを反映
    NTP->>system clock: NTPによる時刻同期
    interval timer->>system clock: 割り込みにより<br>system clockを進める
    system clock->>hardware clock: システム停止時に<br>system clockを反映

Column: hwclock コマンド

1
2
3
4
5
# システムクロックの時刻をハードウェアクロックへ設定
% hwclock --systohc

# ハードウェアクロックの時刻をシステムクロックへ設定
% hwclock --hctosys

上記コマンドに -u コマンドを付与するとUTC時間でクロック設定を実施します

NTPによる時刻管理

Def: Network Time Protocol

NTPはコンピュータが, ネットワーク上のほかのコンピュータの時刻を参照して時刻の同期を取るためのプロトコル. ネットワーク上の他のコンピューターの時刻を参照して時刻の同期を実施してくれる.

NTPでは時刻をstratumと呼ばれる階層で管理します. 原子時計/GPS/標準電波が最上位の階層stratum0になり、それを時刻源とするNTPサーバがstratum1となります. stratum1のNTPサーバから時刻を受信するコンピュータ(NTPサーバあるいはNTPクライアント)はstratum2となります. 最下位の階層stratum16まで階層化できます.

NTPによる時刻修正方法

ntpdateコマンドは, NTPクライアントプログラムで, 日付と時刻を NTP サーバーと同期することができます

1
% sudo ntpdate [option] NTP-server
  • DNS名前解決により, IPアドレスはリクエストごとに変わるので, DNS名の指定をすることが推奨されています
  • 実行にはroot権限が必要

時刻の修正方法はslewとstepの2つがあります

option 説明 リクエストごとに変わるので
-B slewモード(徐々に時刻を合わせる、微調整する際に使用)で時刻を修正する  
-b stepモード(即座に時刻を合わせる)で時刻を修正する  

時刻のずれが500ミリ秒(0.5秒)より小さい場合はslewモードで徐々に時刻を調整し, それ以外の場合はstepモードですぐに時刻を合わせます.

Column: system clockとNTPサーバーの時刻ズレの確認

ntp.nict.jpとsystem clockの時刻の差分を確認する場合は, ntpdate -qコマンドを用います

1
2
3
% sudo ntpdate -q ntp.nict.jp
31 MAy 02:19:09 ntpdate[5393]: step time server 133.243.238.243
offset 99.535574 sec

offsetが時刻差分を意味しており, 今回の例では約99秒ほどsystem clockが遅れていることがわかります. 先行している場合は-(マイナス)で表現されます.

daemon(デーモン)を用いた時刻調整

ntpをインストールするとntpdというNTPデーモンが利用できるようになります. /etc/ntp.confが設定ファイルで,

  • NTP server
  • 同期タイミング

を指定します. 設定方法は

1
2
3
4
5
6
7
8
9
10
11
12
% cat /etc/ntp.conf

# /etc/ntp.conf, configuration for ntpd
driftfile /var/lib/ntp/ntp.drift
statsdir /var/log/ntpstats/

# You do need to talk to an NTP server or two (or three).
#server ntp.ubuntu.com
server ntp.nict.jp iburst

#localhostをNTPサーバに設定 & アクセス制限なし
restrict 127.0.0.1
configuration 意味
driftfile ntpd が時刻の調整を行う際に NTP サーバーから入手した時刻と ntpd が動作しているマシンとの時刻のずれを記録するファイルを指定
server 時刻を同期する NTP サーバーを指定
statsdir 統計ログファイルを指定
restrict access control listの指定. NTP通信の動作をフラッグと組み合わせて設定

iburstserverコマンドと組みわせて使用するオプションで, NTPサーバーとの初期の同期にかかる時間を短縮します. iburstを指定しない場合は, 64秒間隔でポーリングしますが, 指定時にはNTPサーバーとの初期同期時に 2秒間隔で8個のパケットを送信して同期を取ります = 初期の同期にかかる時間を短縮.

UbuntuにおけるNTP server時刻同期

Ubuntu 16.04以降ではtimedatectl/timesyncntpdate/ntpの代わりに用いられています. そのためntpdateはデフォルトではインストールされていません.

1
2
3
4
5
6
7
8
9
## 現在時刻や設定の表示
% timedatectl
               Local time: Sun 2021-08-13 00:23:45 JST
           Universal time: Sat 2021-08-12 15:23:45 UTC
                 RTC time: Sat 2021-08-12 15:23:45
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Ubuntuではntpdateに代わって, timesyncdが常にPCのlocal timeのcheckとupdateを行っています. config fileは/etc/systemd/timesyncd.confに存在します.

サービス稼働状況を確認する場合は以下のコマンドで確認します:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
% systemctl status systemd-timesyncd
      systemd-timesyncd.service - Network Time Synchronization
       Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
       Active: active (running) since Fri 2018-02-23 08:55:46 UTC; 10s ago
         Docs: man:systemd-timesyncd.service(8)
     Main PID: 3744 (systemd-timesyn)
       Status: "Synchronized to time server 91.189.89.198:123 (ntp.ubuntu.com)."
        Tasks: 2 (limit: 4915)
       CGroup: /system.slice/systemd-timesyncd.service
               |-3744 /lib/systemd/systemd-timesyncd
    
    Feb 23 08:55:46 bionic-test systemd[1]: Starting Network Time Synchronization...
    Feb 23 08:55:46 bionic-test systemd[1]: Started Network Time Synchronization.
    Feb 23 08:55:46 bionic-test systemd-timesyncd[3744]: Synchronized to time server

REMARKS: chronyとの優先関係

chronyがインストールされている場合は, chronyが時刻同期を担当する挙動になっています. これはchronytimedatectlの二重時刻同期によるconflictを避けるためです.

References



Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)