SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【LPIC102】システムクロックとNTP LPICで学ぶLinux8

Linuxにおけるクロック設定

システムクロックとハードウェアクロック

前提としてLinuxにおけるクロック(時計)は大きくハードウェアクロックシステムクロックがあります。

私はLPICをやるまではシステムクロックしか意識できていませんでした。
というか2種の区別があるとということを知らなかった。

ハードウェアクロックはハードウェアに組み込まれた時計のことで、
システムクロックLinuxカーネル内で管理している時計のことです。

ハードウェアクロックの特徴としてはシステム電源がオフの状態でも動作を続けるため、Linux起動時にハードウェアクロックからソフトウェアクロックに時刻同期が行われます。
その後システムが稼働し続けるとクロック自体が別々に動作するので時刻のずれが発生することになります。

この時刻のずれはコマンドによって訂正することができます。コマンドについては後述します。

f:id:wantanBlog:20201208232533p:plain

試験的には2つの時計を扱っていることを把握しておくのは必須です。

dateコマンド

dateコマンドはシステムクロックを扱うコマンドです。
用途的には日時の表示と変更ですが、感覚的には表示コマンドとして使用することの方が多いのではないかと思います。

■日時変更
dateコマンドでは、日付を指定することによって日時を変更することができます。
-sオプションを付与することによって変更できます。
日時の変更には権限が必要になるのが一般的だと思います。(以下ではrootユーザで実行)

[root@localhost wantan]# date -s "2020/12/10 10:10:00"
20201210日 木曜日 10:10:00 JST

フォーマットについては一般的なものであればある程度許容されるようです。
少し調べた感じだと入力フォーマットとしては以下の形式もわりと一般的?

[root@localhost wantan]# date -s "10/10 10:00 2020"
20201010日 土曜日 10:00:00 JST

またはオプションを指定せずに以下の形式で入力します。

[root@localhost wantan]# date 121010002020
20201210日 木曜日 10:00:00 JST

■日時表示
dateコマンドとしてはこちらの表示用途の方が広く使われているんじゃないでしょうか。

[wantan@localhost ~]$ date
2020128日 火曜日 23:40:15 JST

また、ただ出力するだけではなく出力フォーマットの指定は試験的にも実践的にも重要度は高いと思います。

書式 内容
%Y
%m
%d
%H
%M
%a 曜日
%b 月名

・yyy/MM/dd形式で出力

[root@localhost wantan]# date "+%Y/%m/%d"
2020/12/10

・yyyMMddhhmmss形式で出力

[root@localhost wantan]# date "+%Y%m%d%H%M%S"
20201210100935

日付や時刻付きのファイル作成やシェルスクリプト内での使用されることが多いでしょうか。

hwclockコマンド

hwclockコマンドはその名の通り、ハードウェアクロックに関するコマンドで、ハードウェアクロックの確認や、ハードウェアクロックとシステムクロックの相互同期を行うコマンドです。

なお、ハードウェアクロックに関わるコマンドなので、一定の実行権限が必要になるようです。

■オプション

オプション 内容
-r ハードウェアクロックの時刻を表示
-w システムクロック⇒ハードウェアクロックの設定
-s ハードウェアクロック⇒システムクロックの設定

・ハードウェアクロックを表示する

[root@localhost wantan]# hwclock -r
20201209234110-0.693410

・ハードウェアクロックの時刻をシステムクロックに反映する
上記で示したのは-sオプションですが、同様のことを「-hctosys」(ハードウェアからシステム)オプションでも実行できます。

[root@localhost wantan]# hwclock -s

・システムクロックの時刻をハードウェアクロックに反映する
こちらは「-systohc」オプションも同様です。

[root@localhost wantan]# hwclock -w

オプションは時刻同期先の対象を見て、システムの「s」、ハードウェアの「w」で覚えて問題なさそうです。

timedatectlコマンド

systemdのLinuxシステムではtimedatectlコマンドによってタイムゾーンの管理を行うことができます。

オプションなしでコマンドを実行するとタイムゾーンに関する情報が出力されます。
※UTC=協定世界時
協定世界時 - Wikipedia

※RTC=リアルタイムクロック
リアルタイムクロック - Wikipedia

[root@localhost wantan]# timedatectl
      Local time: 木 2020-12-10 22:34:09 JST
  Universal time: 木 2020-12-10 13:34:09 UTC
        RTC time: 木 2020-12-10 13:34:09
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

・サブコマンド

timedatectlコマンドでは以下の書式で、サブコマンドをつけ実行することでタイムゾーンの設定などを行うことができます。
なおこのコマンドは普通に実行すると、システムクロックとハードウェアクロックの両方に対して日時変更が行われるようです。

timedatectl [サブコマンド]

以下に主要なサブコマンドを示します。

サブコマンド 内容
status 現在の状態を表示
set-time 日時を設定する(書式による)
set-timezone タイムゾーンを設定する
list-timezones タイムゾーンを一覧表示
set-ntp ntpを使用するか

ntpについては後述します。

・タイムゾーン一覧を表示

[root@localhost wantan]# timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
***省略***

・時刻を変更する

[root@localhost wantan]# timedatectl set-time 10:00:00
[root@localhost wantan]# timedatectl
      Local time: 木 2020-12-10 10:00:04 JST

以下のようなエラーが発生する場合はNTP同期が有効になっていることが原因のようです。
同コマンドでNTPを無効にしましょう。

Failed to set time: Automatic time synchronization is enabled

・日付を変更する

[root@localhost wantan]# timedatectl set-time 2020-12-20
[root@localhost wantan]# timedatectl
      Local time: 日 2020-12-20 00:00:06 JST

日付時刻の両方を設定する場合には「YYYY-MM-DD HH-mm-ss」の書式で指定します。

・タイムゾーンを変更する

[root@localhost wantan]# timedatectl set-timezone Asia/Tokyo

NTPによる時刻同期

通常のコンピュータ上に構築されたLinuxシステムにおける時刻は、システムクロックにしてもハードウェアクロックにしても正確性が不十分です(らしい)。

コンピュータが正確な時刻を維持するための一般的な仕組みとしてNTP(Network Time Protocol)が用いられます。
NTPはその名の通り、正確な時刻を管理するNTPサーバからネットワーク経由で正確な時刻を同期します

ntpdateコマンド

ntpサーバから時刻を取得するコマンドにはntpdateコマンドがあります。
ディストリビューションやインストール設定によってはコマンドが存在しないのでインストールする必要があります。

# インストールコマンド(RHEL系)
yum install ntpdate

・NTPサーバから時刻を同期する
NTPサーバから時刻を同期するにはサーバ名を指定します。

[root@localhost wantan]# ntpdate ntp.nict.jp
10 Dec 23:51:22 ntpdate[1790]: step time server 133.243.238.244 offset -779800.360879 sec

ちなみに「ntp.nict.jp」は独立行政法人情報通信研究機構(NICT)より提供されるNTPサーバです。
詳しくは以下。
日本標準時(JST)グループ

また、「-q」オプションを付与すると時刻の問い合わせのみを行います。

[root@localhost wantan]# ntpdate -q ntp.nict.jp
server 61.205.120.130, stratum 1, offset -0.000318, delay 0.04463
server 133.243.238.243, stratum 1, offset 0.000631, delay 0.03571
server 133.243.238.244, stratum 1, offset -0.000135, delay 0.03360
server 133.243.238.163, stratum 1, offset -0.000822, delay 0.03644
server 133.243.238.164, stratum 1, offset -0.000020, delay 0.03484
10 Dec 23:57:07 ntpdate[1815]: adjust time server 133.243.238.244 offset -0.000135 sec

・NTPから時刻同期はシステムクロックに反映される

普通にNTPから時刻同期を行うとシステムクロックに反映されます。

[root@localhost wantan]# date
20201210日 木曜日 23:59:09 JST
[root@localhost wantan]# hwclock
20201220003553-0.677710

なので、ハードウェアクロックにも反映するためには続けてハードウェアクロックへの反映コマンドも実行する必要があります。

[root@localhost wantan]# hwclock -w
[root@localhost wantan]# date
20201211日 金曜日 00:03:09 JST
[root@localhost wantan]# hwclock
20201211000314-0.255540[root@localhost wantan]#

ここまでのクロック関連の理解をまとめると以下のようなイメージになります。

f:id:wantanBlog:20201211225926p:plain

ntpd

サーバの管理などを行っている場合に、時刻の同期などの日々必要になることを手動で行うよりは自動的に行った方が運用上優れています。
ntpの時刻同期にはntpdデーモンが使用されます。

自環境に入っていない場合はインストールが必要です。

・サービスの起動

[root@localhost etc]# systemctl start ntpd

・取得先の情報を表示する

[root@localhost etc]# ntpq -p localhost
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+atl0.fairy.matt 163.237.218.19   2 u   42   64    3  175.323    1.096   3.366
-ntp1.omdc.pl    194.146.251.100  2 u   36   64    7  266.508   20.144  11.230
*50-47-106-71.ev 216.239.35.8     2 u   34   64    7  130.660    3.609   3.151
+login-vlan194.b 121.131.112.137  2 u   11   64   17  277.865   10.639   4.783

・ntpdの設定ファイル

ntpdの設定ファイルは「/etc/ntp.conf」になります。
以下はntp.confの設定例の抜粋です。

server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
driftfile /var/lib/ntp/drift
restrict 192.168.0.0 mask 255.255.255.0 noquery nomodify nopeer notrust notrap

server :時刻同期するサーバを指定
driftfile :時刻変動を記録する
restrict :アクセス制御を行う

試験的にはserver は必須。他はなんとも言えないぐらいの重要度でしょうか。

Chrony

ChronyはNTPクライアントとNTPサーバーの実装のひとつです。
私はNTPは知っていたけどChronyはLPICで学習するまで知りませんでした。

ntpdntpdateコマンドに代わる仕組みで、Chronyに方が新しいものになります。
ntpdの代わりがchronyd(デーモン)、ntpdateの代わりがchronyc(コマンド)になります。

■chronyd

chronydの設定ファイルは「/etc/chrony.conf」になります。
設定ファイルの内容はおおむねntp.confと同じような感じになります。

server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
driftfile /var/lib/chrony/drift
logdir /var/log/chrony
rtcsync

特徴的なのは「rtcsync」でしょうか。
RTCとしてシステムクロックからハードウェアクロックへの反映を自動で行います。これはNTPにはない特徴になります。

■chronyc

chronycはサブコマンドを付与して実行、または対話モードで実行します。

・サブコマンド

サブコマンド 内容
actibity NTPサーバ数を表示
sources 時刻ソースの情報を表示
sourcesstats 時刻ソースの統計情報を表示
tracking トラッキングを表示
quit 対話状態を終了する

・NTPサーバ数を表示

[root@localhost etc]# chronyc activity
200 OK
4 sources online
0 sources offline
0 sources doing burst (return to online)
0 sources doing burst (return to offline)
0 sources with unknown address

・時刻ソースを表示

[root@localhost etc]# chronyc sources
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ clock.xmission.com            1   6   167    55    -15ms[  -15ms] +/-   95ms
^+ tor-relais1.link38.eu         2   6    77    56  +8120us[-6276us] +/-  170ms
^* ntp2.wiktel.com               1   6    77    56  +9401us[-4995us] +/-   87ms
^- www.kashra.com                1   6    77    56    -63us[  -63us] +/-  140ms

・時刻ソースの統計情報を表示

[root@localhost etc]# chronyc sourcestats
210 Number of sources = 4
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
clock.xmission.com          7   6   203    +52.321    231.964    -17ms  6520us
tor-relais1.link38.eu       7   5   202    -23.499     72.104  +3856us  1824us
ntp2.wiktel.com             7   5   202     -6.003    123.002  +8488us  2729us
www.kashra.com              7   5   203    -14.368     87.186  +1358us  3011us

・トラッキング情報を表示

こちらは対話モードで実施。対話モードで実施した方が入力補完がきくので楽ですね。

[root@localhost etc]# chronyc
chrony version 3.4
Copyright (C) 1997-2003, 2007, 2009-2018 Richard P. Curnow and others
chrony comes with ABSOLUTELY NO WARRANTY.  This is free software, and
you are welcome to redistribute it under certain conditions.  See the
GNU General Public License version 2 for details.

chronyc> tracking
Reference ID    : 4559CFC7 (ntp2.wiktel.com)
Stratum         : 2
Ref time (UTC)  : Fri Dec 11 15:22:43 2020
System time     : 0.003284223 seconds slow of NTP time
Last offset     : -0.000202897 seconds
RMS offset      : 0.005260966 seconds
Frequency       : 1.945 ppm slow
Residual freq   : -11.806 ppm
Skew            : 4.119 ppm
Root delay      : 0.174267694 seconds
Root dispersion : 0.005043211 seconds
Update interval : 65.1 seconds
Leap status     : Normal

ーーーーーーーーーーーーーーーーー

・前回(第七回)
www.wantanblog.com

・次回(第九回)
www.wantanblog.com