Linux
 Computer >> コンピューター >  >> システム >> Linux

CentOSで日付・時刻・タイムゾーンの設定とNTP時刻同期を行う完全ガイド

本記事では、CentOS Linuxにおける日付・時刻の設定方法、タイムゾーンの変更方法、NTPサーバーとの自動時刻同期の設定、さらに運用中によく発生する問題の解決策までを詳しく解説します。

サーバーには2種類のクロックが存在する

サーバーには2種類の時計があります。1つはハードウェアクロック(リアルタイムクロック)で、サーバーの電源が切れていても動作し続けます。もう1つはOSが管理するソフトウェアクロックです。これら2つの時計の時刻は異なる場合があります。OS起動後、ソフトウェアクロックはハードウェアクロックを基準に初期化され、その後OSによって調整されます。
ほとんどのアプリケーションは、動作時にソフトウェアクロックの時刻を使用します。

Hwclock:ハードウェア時刻の確認と設定

Linuxでハードウェアクロックの時刻を確認するにはhwclockコマンドを使用します。

  • hwclock --localtime — 補正なしでハードウェア時刻を表示
  • hwclock --utc — ハードウェアクロックがUTC時刻を保持している場合の時刻を表示

# hwclock --localtime

2020-10-12 06:12:02.912866-04:00

# hwclock --utc

2020-10-12 02:12:18.915319-04:00

ハードウェアクロックをシステム時刻に合わせるには、以下のコマンドを実行します。

# hwclock --systohc

任意の日時を直接設定する場合は、次のコマンドを使用します。

# hwclock --set --date "11 Oct 2020 17:30"

CentOSでの手動による時刻設定

Linuxでは、dateまたはtimedatectlコマンドを使ってソフトウェアクロックの時刻を確認・設定できます。パラメータを付けずにdateを実行すると、サーバーの現在時刻が表示されます。

# date

Sun Oct 11 22:14:54 EDT 2020

時刻を手動で設定したい場合は、dateに追加の引数を指定します。

# date MMDDhhmm

実行例:

# date 10261740

この例では、10月26日の17時40分に設定されます。

日付、時刻、タイムゾーン、同期設定、サマータイム(DST)設定などの詳細情報を取得するにはtimedatectlを使用します。サーバーの時刻設定に関するより詳細な情報を確認できます。

timedatectlでは時刻の変更も可能です。

# timedatectl set-time '2020-10-11 17:51:00'

CentOSでタイムゾーンを設定する方法

CentOS Linuxで自分の地域のタイムゾーンに合わせて時刻を設定するには、タイムゾーンを手動で変更します。利用できるツールは主に2つあります。

  • timedatectl
  • tzdata

timedatectlでタイムゾーンを変更するには、以下のコマンドを実行します。

# timedatectl set-timezone Canada/Pacific
# date

またはtzdataを使う方法もあります。この方法では、/etc/localtimeファイルを目的のタイムゾーンファイルに置き換えます。すべてのタイムゾーンの一覧は/usr/share/zoneinfo/ディレクトリに格納されています。ここではタイムゾーンをCanada/Pacificに変更してみましょう。まず現在のlocaltimeファイルをバックアップします。

# mv /etc/localtime /etc/localtime.bak

次に、設定したいタイムゾーンへのシンボリックリンクを作成します。

# ln -s /usr/share/zoneinfo/Canada/Pacific /etc/localtime

CentOSをNTPサーバーと時刻同期させる設定

ホストの時刻を外部のNTP(Network Time Protocol)サーバーと自動的に同期させることができます。そのためにはntpサービスをインストールする必要があります。CentOS 7ではyumを使ってインストールできます。

# yum install ntp -y

インストール後、ntpdサービスを起動し、自動起動を有効にします。

# systemctl start ntpd.service
# systemctl enable ntpd.service

サービスが正常に稼働しているか確認しましょう。

# service ntpd status

Redirecting to /bin/systemctl status ntpd.service
● ntpd.service - Network Time Service
Loaded: loaded (/usr/lib/systemd/system/ntpd.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-10-11 15:37:33 +06; 5min ago
Main PID: 3057 (ntpd)
CGroup: /system.slice/ntpd.service
└─3057 /usr/sbin/ntpd -u ntp:ntp -g

同期先のNTPサーバーは/etc/ntp.confで指定します。

server 0.pool.ntp.org
server 1.pool.ntp.org
server 2.pool.ntp.org

時刻は上から順番に同期されます。最初のNTPサーバーが利用できない場合、2番目のサーバーが使用され、以降も同様にフォールバックされます。

指定したNTPサーバーと手動で時刻を同期するには、以下のコマンドを使用します。

# ntpdate 192.168.1.23

デフォルトではntpdは「11分モード」が有効になっており、約11分ごとに時刻が同期されます。ntpdデーモンが使えない環境では、cronを使った時刻同期も可能です。以下のコマンドをcronに登録してください。

# ntpdate pool.ntp.org

CentOS 8でChronydを使って時刻を同期する方法

CentOS 8では、ntpおよびntpdateが公式リポジトリから削除されているため、時刻同期にはchronyを使用する必要があります。

chronyの主なメリットは以下の通りです。

  • 高速かつ高精度な時刻同期
  • マスタークロックへの常時アクセスがない環境でも正常に動作(ntpdは定期的な問い合わせが必要)
  • デフォルトでは同期直後に時刻を強制的に変更しないため、実行中のプログラムへの影響を防止
  • 消費リソースが少ない

デフォルトでchronyはCentOS Linuxにインストールされていますが、何らかの理由で導入されていない場合はインストールしてください。

# dnf install chrony

他のサービスと同様に、インストール後にchronyを起動し、自動起動を有効にします。

# systemctl start chronyd
# systemctl enable chronyd

chronydサービスの状態を確認します。

# systemctl status chronyd

時刻同期が正しく機能していることを確認するには、以下のコマンドを実行します。

# timedatectl status

NTP Service: active

Chronyの設定ファイルは/etc/chrony.confです。同期に使用するNTPサーバーのリストをここに指定します。ntpと同様に、chronyにもchronycというコマンドラインインターフェースが用意されています。現在の時刻同期状況を確認するには、以下のコマンドを実行します。

# chronyc tracking

同期先サーバーの情報を表示するには:

# chronyc sources

特定の日時を手動で設定したい場合はdateコマンドが使えますが、その前にchronydデーモンを停止しておく必要があります。

CentOSでよく発生する時刻同期の問題と対処法

ここでは、timedatectlやntpの操作時に発生しがちな典型的なエラーとその対処方法について説明します。

手動で時刻同期を行おうとした際、次のようなエラーに遭遇することがあります。

# ntpdate pool.ntp.org

ntpdate [26214]: the NTP socket is in use, exiting

これはntpdデーモンが稼働中のため、手動の時刻同期が妨げられていることを意味します。手動で同期するには、まずntpdデーモンを停止します。

# service ntpd stop

その後、再度同期コマンドを実行してください。

timedatectlでも同様のエラーが発生することがあります。

Failed to set time: Automatic time synchronization is enabled.

この場合は、timedatectlの自動同期を無効にする必要があります。

# timedatectl set-ntp 0

その後、希望の日時を設定します。

# timedatectl set-time '2020-11-12 17:41:00'

タイムゾーン関連では、サーバーにタイムゾーンデータがインストールされておらず、localtimeのシンボリックリンクを作成できないケースがあります。タイムゾーンを利用可能にするには、tzdataツールをインストールしてください。

# yum install tzdata -y

また、手動同期時に次のようなエラーが発生することもあります。

11 Oct 21:11:19 ntpdate[897482]: sendto(xx.xx.xx.98): Operation not permitted

この場合は、firewalld/iptablesのルールを確認し、サーバー上でUDPポート123が開放されていることを確認してください。また、検証時に一部のNTPホストへ一時的に接続できない場合もあります。

  1. Linuxでシャットダウンと再起動の日時を確認する方法

    Linuxマシンがいつシャットダウンしたのか、いつ再起動したのか、あるいはどのくらいの時間稼働し続けているのかを知りたい場面は多々あります。特に、誰も見ていない間に発生したトラブルの原因を調査する際には、こうした情報が非常に役立ちます。幸いなことに、多くのディストリビューションではシステムイベントが自動的に詳細に記録されており、コマンドラインからそのログ情報へ簡単にアクセスできます。 最後の起動日時を確認する コンピュータが最後に起動した日時を確認したい場合は、whoコマンドに-bオプションを付けて実行します。ターミナルに正確な日付と時刻が表示されます。root権限は不要なので、気軽に試し

  2. 【Windows 10】日付と時刻の表示形式を変更する2つの方法をわかりやすく解説

    タスクバーに表示される日付と時刻は、初期設定では「月/日/年」の順(例:05/16/2018)、時刻は12時間表示(例:午後8:02)になっています。しかし、これらの表示形式を自分好みに変えたいと思ったことはありませんか?実は、Windows 10の「設定」または「コントロールパネル」から、いつでも好みの形式に変更できます。たとえば、「日/月/年」の順(例:16/05/2018)にしたり、時刻を24時間表示(例:21:02)にしたりすることも可能です。 日付と時刻にはそれぞれ多数の形式が用意されているため、目的に合ったものを選ぶことが大切です。「短い日付」「長い日付」「短い時刻」「長い時刻