Linuxにおけるクロック設定
システムクロックとハードウェアクロック
前提としてLinuxにおけるクロック(時計)は大きくハードウェアクロックとシステムクロックがあります。
私はLPICをやるまではシステムクロックしか意識できていませんでした。
というか2種の区別があるとということを知らなかった。
ハードウェアクロックはハードウェアに組み込まれた時計のことで、
システムクロックはLinuxカーネル内で管理している時計のことです。
ハードウェアクロックの特徴としてはシステム電源がオフの状態でも動作を続けるため、Linux起動時にハードウェアクロックからソフトウェアクロックに時刻同期が行われます。
その後システムが稼働し続けるとクロック自体が別々に動作するので時刻のずれが発生することになります。
この時刻のずれはコマンドによって訂正することができます。コマンドについては後述します。
試験的には2つの時計を扱っていることを把握しておくのは必須です。
dateコマンド
dateコマンドはシステムクロックを扱うコマンドです。
用途的には日時の表示と変更ですが、感覚的には表示コマンドとして使用することの方が多いのではないかと思います。
■日時変更
dateコマンドでは、日付を指定することによって日時を変更することができます。
-sオプションを付与することによって変更できます。
日時の変更には権限が必要になるのが一般的だと思います。(以下ではrootユーザで実行)
[root@localhost wantan]# date -s "2020/12/10 10:10:00" 2020年 12月 10日 木曜日 10:10:00 JST
フォーマットについては一般的なものであればある程度許容されるようです。
少し調べた感じだと入力フォーマットとしては以下の形式もわりと一般的?
[root@localhost wantan]# date -s "10/10 10:00 2020" 2020年 10月 10日 土曜日 10:00:00 JST
またはオプションを指定せずに以下の形式で入力します。
[root@localhost wantan]# date 121010002020 2020年 12月 10日 木曜日 10:00:00 JST
■日時表示
dateコマンドとしてはこちらの表示用途の方が広く使われているんじゃないでしょうか。
[wantan@localhost ~]$ date 2020年 12月 8日 火曜日 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 2020年12月09日 23時41分10秒 -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 2020年 12月 10日 木曜日 23:59:09 JST [root@localhost wantan]# hwclock 2020年12月20日 00時35分53秒 -0.677710 秒
なので、ハードウェアクロックにも反映するためには続けてハードウェアクロックへの反映コマンドも実行する必要があります。
[root@localhost wantan]# hwclock -w [root@localhost wantan]# date 2020年 12月 11日 金曜日 00:03:09 JST [root@localhost wantan]# hwclock 2020年12月11日 00時03分14秒 -0.255540 秒 [root@localhost wantan]#
ここまでのクロック関連の理解をまとめると以下のようなイメージになります。
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で学習するまで知りませんでした。
ntpdやntpdateコマンドに代わる仕組みで、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