【基礎】Linuxの時間いろいろ(NTPのしくみ&時刻同期実現手段の紹介) | 若手エンジニアのブログ

若手エンジニアのブログ

文系出身の若手女子エンジニアによる技術ブログ。
日々の経験や学びをアウトプットするためにブログを書いています。
バックエンド(Java+SpringFramework)を経てインフラエンジニアになりました。
今は育休中につき、本で勉強したことを中心にアウトプットしています。

おしごとにて、今度は時刻同期の設計をすることになりました。

時刻同期とか、NTP(Network Time Protocol)は、言葉としては聞いたことあるけど、

そういえば同期の仕組みはよく知らないと思い、記事にしてみます。

ついでにタイムゾーンのお話も。

 

 

目次

1.なぜ時刻同期が必要なのか?

2.時刻同期のしくみ(システムクロックとハードウェアクロック / NTP

3.タイムゾーンの変更

4.時刻同期ツール (ntpd / ntpdate / chrony

5.正確な時刻の取得元外部NTPサーバ / GPS

6.時刻同期のタイミング

参考サイト様

 

 

なぜ時刻同期が必要なのか?

ここでいう時刻同期とは、サーバが刻む時間を、世界・日本標準の時刻と同じにすることを指す。

 

時刻同期が必要な理由として、よく引き合いに出されるのが、ログである。

 

ふつう企業のシステムでは、複数のサーバが結集して1つのシステムを成していることが多い。

そのため障害発生時に、原因究明のためログを解析する場合、複数のサーバに蓄積されたログを見ていくこともある。

そんな時、各サーバの時刻設定がバラバラで、ログに残っている障害発生時間にずれが生じていたら…。

解析しづらいというのは言うまでもないし、

どの時刻が正しいのか分からず、ログ自体の信頼性も揺らいでしまう。

そのため、同じネットワーク内の各サーバで、時刻を同期させておくことが必要となる。

 

 

では、同じネットワーク内で時間を合わせてさえおけば、

外部ネットワークとは異なる時間でも良いのかというと。

 

決してそうではない。

例えばメールを扱うシステムなら、外部ネットワークに接続している相手方とやりとりをすることもあるだろう。

そんな時に、メールの受信時刻や送信時刻が相手とずれていたら、トラブルのもとになりかねない。

 

また認証機能のあるシステムでは、一定のセッション有効時間を超えると、再度ログインする仕組みをとっているものも多い。

時刻のずれによって、意図しないセッション時間となり、ログインできなくなってしまうといったこともあるかもしれない。

 

 

さらに外部とは全く通信しない、閉鎖ネットワークに属したシステムであっても、

利便性という点で、正しい時刻に合わせていたほうが良い。

 

先ほど書いたログの時刻や、ジョブの実行時刻など、

「このシステムは時間が5分遅いから、14:03と書かれているこの障害発生時刻は、正しくは14:08で…」などと毎回計算するのは面倒である。

新しくシステム保守担当となった人が、5分の遅れを知らずに困るといった可能性もある。

 

 

長々と書いたが、要は、時刻が合っていないことに、何のメリットもないのである。

 

時刻同期のしくみ

時刻同期の重要性が分かったところで、Linuxで時刻同期が行われるしくみを見ていきたい。

しくみ① システムクロックとハードウェアクロック

Linuxでは、システムクロックとハードウェアクロックが存在する。

 

システムクロックとは、OSが管理している時間であり、

メモリを用いて時を刻んでいるものである。

先ほど述べた、ログやメールやセッション...etcに使われる時間は、このシステムクロックとなる。

 

ただ、OSのメモリは、いわゆる「揮発性」のものであり、

従ってOSの電源が切れると時も刻めなくなってしまう。

そのため、いくら正確に時間を刻んでいても、

OSをシャットダウンし、再び起動する毎に、時間がずれてしまうことになる。

 

そこで重要なのが、ハードウェアクロックの存在である。

ハードウェアクロックは、名前の通りハードウェア上で時を刻んでいるものであり、OSの電源が切れても時を刻み続けることができる。

そのため、OSの再起動後、ハードウェアクロックの時間をシステムクロックが参照して同期し、

正しい時間のままで、再び時を刻んでいける仕組みがとられている。

 

OSを起動する時:

 

 

しくみ② NTP

OS動作時における、システムクロックおよびハードウェアクロックの時刻同期のしくみも見ていきたい。

 

NTP(Network Time Protocol)とは、ネットワークに接続された各機器の時刻を合わせるためのプロトコル。

以下のようにNTPを利用することで、システムクロック、ハードウェアクロックを正確な状態に保つことができる。

 

1.NTPサーバと呼ばれる、正確な時刻を刻んでいるサーバに、自サーバからNTP通信を行って時刻を参照し、システムクロックの時刻を同期する

2.システムクロックの時刻をハードウェアクロックの時刻に同期させる

 

ちなみに参照するNTPサーバ(NTP通信先)は、NTPサーバ自体の時刻のずれを鑑みて、

複数設定することが一般的である。

 

OS動作時:

 

 

 

次に、NTP通信を行い、システムクロックの時刻を同期するための手段(ツール)を紹介していきたい。

※確認環境はCentOS8とする。

 

タイムゾーンの変更

時刻同期に先立ち、OSのタイムゾーンを設定する。

タイムゾーンを指定しておかないと、時刻そのものは正しくても、表している時刻はロンドンのもの、、など、想定と異なってしまうかもしれないためである。

 

まずは現在のタイムゾーンの設定を確認。

$ timedatectl show

Timezone=America/Los_Angeles  # タイムゾーンがアメリカのロサンゼルスとなっている
LocalRTC=no
CanNTP=yes
NTP=yes
NTPSynchronized=yes
TimeUSec=Sat 2020-11-21 02:03:53 PST
RTCTimeUSec=Sat 2020-11-21 02:03:53 PST

 

タイムゾーンがアメリカのロサンゼルスになっているが、これを日本時間(アジア/東京)に変えてみる。

なお、操作はrootユーザで行う。

$ timedatectl set-timezone Asia/Tokyo # タイムゾーンをAsia/Tokyoに指定。

$ timedatectl show  # 確認

Timezone=Asia/Tokyo  # ←Asia/Tokyoとなっていることを確認
LocalRTC=no
CanNTP=yes
NTP=yes
NTPSynchronized=yes
TimeUSec=Sat 2020-11-21 02:03:53 PST
RTCTimeUSec=Sat 2020-11-21 02:03:53 PST

 

Linuxの環境によっては、システムファイルをいじったりして設定する必要があるようだが、

CentOS8(RedHat8)では、上記のようにたった1つのコマンドでタイムゾーンを変更することができる。

変更は、OSのシャットダウン・再起動後も有効である。

(実機では未確認だが、RedHat6以降は、同じやり方で変更可能な模様)

 

 

時刻同期ツールたち

ようやく本題。

Linuxで時刻同期を行うためのツール(デーモン、ソフトウェア)=NTPサーバに通信して時刻同期を行ってくれるもの

を紹介していきたい。主なものは3つである。

 

ntpd

NTP Daemonの略で、Linux用のOSS。

このデーモンを起動させておくことで、自動でNTPサーバを見に行き、時刻同期を行うことが可能。

またハードウェアとの時刻同期も行える。

 

ntpdの公式サイト(なんか安っぽい…(-_-;))

 

確認先となるNTPサーバの設定や、ハードウェアとの時刻同期のための自サーバIP登録など、

ntpdの各種設定は以下のファイルに記述する。

 /etc/ntp.conf

 

ちなみに、CentOS8環境ではデフォルトで入っておらず、

代わりに、後進技術のChrony(後述)が入っている。

 

nptdate

手動で指定のNTPサーバに接続し、時刻同期を行う。

先ほどのntpdでは、自動でNTPサーバを見にいく設定ができるのに対し、

手動で1回時刻合わせする性格が強い。(その分手軽)

 

Chrony

RedHat7(6?)以降では、ntpdに代わり、ChronyがNTPサーバ・クライアントソフトのデフォルトとなっている。今回検証したCentOS8の環境では、最初からインストールされていた。

設定ファイルの中身や代表的なコマンドなど書こうと思ったけど、長くなりそうなのでまたの機会に…。

 

Chrony公式サイト

上記公式サイトより説明を抜粋すると、

断続的なネットワーク接続、非常に混雑したネットワーク、温度の変化(通常のコンピューターの時計は温度に敏感です)、継続的に実行されないシステム、または仮想マシンで実行されるシステムなど、さまざまな条件で適切に機能するように設計されています。

とのこと。(日本語訳はGoogleによるもの)

ちなみにLinuxだけでなく、macでも使われているらしい。

 

 

正確な時刻はどこから取得するのか??

ところで、自サーバから時刻を参照しに行く先=NTPサーバは、どうやって正確な時刻を知ることが出来るのだろうか。

NTPサーバそのものが、正しい時刻を刻めていなければ、本末転倒である。

 

 

ここでは、自サーバから時刻を取得しに行く先の候補として、2つ紹介したい。

 

取得候補① 信頼できる外部の上位NTPサーバを利用する

国立研究開発法人情報通信研究機構(NICT)による、日本標準時刻を配信するNTPサーバなど、

信頼できる外部のNTPサーバを利用する方法がある。

外部のNTPサーバを上位NTPサーバとして、その時刻を自サーバに同期させるのである。

 

ちなみにNICTが配置するNTPサーバは以下の通り。

NTPサーバ名: ntp.nict.jp

 

上記の公式サイトにも書いてあるが、

外部のNTPサーバを利用する際は、インターネット環境によって、わずかだが正確性に欠ける可能性もあるため、注意が必要。

またそもそも、インターネット環境に接続できないサーバでは、当然、外部NTPサーバとの通信、時刻同期は不可となる。

 

インターネット接続可能なシステムにおいて、時刻同期したいときに便利。

 

 

取得候補② GPSを利用する

インターネット接続ができず、1つ上で紹介した上位NTPサーバとの通信が出来ない時にお勧めの方法。

 

ローカルネットワーク内に、NTPサーバとして見立てる2台程度のサーバを設け、

GPSを利用して正確な時刻を取得する方法である。

(やり方はググってください。けっこう大変そう…)

 

ちなみにローカルネットワーク内の他のサーバは、NTPサーバとして見立てたサーバにNTP通信を行い、

時刻同期を行うとよい。

その際は、上で紹介したような、ntpdやntpdateやchronyといったツールを用いることができる。

 

 

時刻同期を行うタイミング

時刻同期は、1日1回や、1週間に1回など、一定間隔をあけて行うことが推奨される。

というのも、時刻同期を頻繁にやりすぎると、ネットワークやサーバに多少の負荷がかかるためである。

 

負荷をどこまで許容するか、時刻のズレの恐れをどこまで許容するかは、

システムや環境によってもまちまちだと思うので、適切に検討する必要がある。

 

 

 

参考サイト様

・NTPとは

https://www.nic.ad.jp/ja/basics/terms/ntp.html

 

・【 ntpdate 】コマンド――時刻をNTPサーバと同期する

https://www.atmarkit.co.jp/ait/articles/1906/21/news013.html

 

・【CentOS8】chronyの仕様や設定~[chrony.conf] や[chronyc sources] 表示結果の見方~

 

・時刻の確認と変更(date, hwclock, ntpd)

https://www.wakuwakubank.com/posts/390-linux-time/