LinuC Level1 v10.0 対策コース(パート2)17/29
Linuxの時刻管理
こちらの記事ではLinuxの時刻管理について説明します。コンピュータの時刻が不正確だと、ログやメールなどに記録される時刻も不正確となり、様々な不具合が生じる可能性があります。この記事の内容をよく理解して、Linuxコンピュータの時刻を正確に保つようにしましょう。
ハードウェアクロックとシステムクロック
コンピュータにはハードウェアクロックとシステムクロックの2種類の時計があります。ハードウェアクロックは、コンピュータの内部回路(IC)で動いている時計で、コンピュータがシャットダウン状態でも動き続けます。システムクロックは、OSが管理している時計で、コンピュータがシャットダウンすると時計の時刻もリセットされます。 コンピュータが起動時に、OSはハードウェアクロックを参照してシステムクロックの時刻を設定します。2つの時計は進む速さが異なるので時間が経つに連れて少しずつ時刻がずれていきますが、コマンドを使用して修正できます。
dateコマンド
date
コマンドを用いると、現在のシステムクロックの時刻とタイムゾーンを確認できます。
date
Fri Jun 24 00:09:02 UTC 2022
次のように書式を指定することもできます。
date "+%Y/%m/%d (%a)"
2022/06/24 (Fri)
hwclockコマンド
hwclock
コマンドを用いると、ハードウェアクロックの参照や設定ができます。
hwclock
コマンドの使用例は以下の通りです。
sudo hwclock -r
2022-06-24 00:14:17.578448+00:00
タイムゾーンの設定
インターネット上でコンピュータ同士が通信する際はUTC(Universal Time Coodinated:協定世界時)を用います。しかし、人間にとっては現地時間を直感的に理解することが重要です。そのためには、タイムゾーンを設定し、時刻の表示を現地時間に変換する必要があります。日本の場合JST(Japan Standard Time:日本標準時)を使用します。
タイムゾーンの設定方法
タイムゾーンの設定方法には以下のように5通りあります。
タイムゾーン設定例
/usr/share/zoneinfo
ディレクトリ内のファイルを/etc/localtime
にコピーする
date
Fri Jun 24 20:23:26 UTC 2022
sudo cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
date
Sat Jun 25 05:24:13 JST 2022
例えばJSTに設定するには/usr/share/zoneinfo/Asia/Tokyo
のファイルを用います。
/usr/share/zoneinfo
ディレクトリには多数のファイルが存在し、目的のファイルの場所がわからない場合は、 tzselect
コマンドを使い対話的にファイルを探すことができます。
/etc/localtime
に/usr/share/zoneinfo
内のファイルへのシンボリックファイルを作成する
date
Fri Jun 24 20:38:44 UTC 2022
sudo ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
date
Sat Jun 25 05:39:12 JST 2022
- 環境変数
TZ
を書き換える ただし、この方法は一時的な変更であり、永続的な変更を行うには上記の1または2の方法を利用します。
date
Fri Jun 24 20:51:45 UTC 2022
export TZ="Asia/Tokyo"
date
Sat Jun 25 05:52:10 JST 2022
- DebianやUbuntuでは
/etc/timezone
を書き換えることでタイムゾーンを変更することもできますが、/etc/localtime
の設定が優先される点に注意が必要です
cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04 LTS"
#省略
date
Sat Jun 25 09:27:45 JST 2022
cat /etc/timezone
Etc/UTC
-
timedatectl
コマンドを使用するsystemdを採用しているシステムでは
timedatectl
コマンドを用いてタイムゾーンを変更することが出来ます。
date
Sat Jun 25 04:59:54 UTC 2022
sudo timedatectl set-timezone Asia/Tokyo
date
Sat Jun 25 14:00:05 JST 2022
NTPを用いた時刻の同期
NTP(Network Time Protocol)
ネットワークの世界にはNTPサーバーというものが多数存在し、正確な時刻を提供しています。NTPサーバーとやり取りし正確な時刻を取得するプロトコルをNTP(Network Time Protocol)といいます。
NTPサーバーの階層構造
NTPサーバーはStratumと呼ばれる階層構造を形成します。最上位のStratum0は原子時計やGPSなどの極めて正確な時刻を提供する機器を基に時刻を設定します。Stratum0へのアクセスはStratum1のサーバーからに限定され、Stratum1以下は順にStratum2、Stratum3、Stratum4となっていき、上位の層から時刻情報が共有されていきます。
社内ネットワークに多数のコンピュータがある場合は自前のNTPサーバーを立て、公共のNTPサーバーの負荷を軽減することも必要となります。
ntpdとchrony
NTPでの管理にはntpd
かchrony
を用います。
ntpd
はデーモンプログラムで、システム起動時に設定ファイル /etc/ntp.conf
を読み込みます。
chrony
はNTPの新しい実装で、軽量さと精度の高さを特徴としており、最近の多くのディストリビューションで標準的に利用されています。 chrony
はサーバー機能を持つchronyd
とクライアント機能を持つchronyc
がありますが、どちらの設定も/etc/chrony.conf
に記述します。
pool.ntp.org
接続するNTPサーバーが決まっていない場合は pool.ntp.org を利用しましょう。 pool.ntp.orgはNTPサーバーの仮想クラスタで、接続するとランダムで選ばれたサーバーから、時刻を取得できます。サーバーがランダムに選ばれることで一つのサーバーに負荷が集中されることを防いでいます。接続先は/etc/ntp.conf
や/etc/chrony.conf
等の設定ファイルに記述します。
以下はUbuntuのchrony.conf
のデフォルト設定から一部抜粋したものです。
# 接続するサーバーを指定
pool ntp.ubuntu.com iburst maxsources 4
pool 0.ubuntu.pool.ntp.org iburst maxsources 1
pool 1.ubuntu.pool.ntp.org iburst maxsources 1
pool 2.ubuntu.pool.ntp.org iburst maxsources 2
# ドリフトファイルの場所
driftfile /var/lib/chrony/chrony.drift
# ログファイルの場所
logdir /var/log/chrony
# ハードウェアクロックと同期させる
rtcsync
ntpqコマンド
ntpq
でNTPサーバーの状態を確認することが出来ます。
ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
0.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.000
1.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.000
2.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.000
3.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.000
ntp.ubuntu.com .POOL. 16 p - 64 0 0.000 +0.000 0.000
+138.3.216.120 133.243.238.243 2 u 11 64 77 4.584 -5.104 6.109
#time.cloudflare 10.23.8.4 3 u 12 64 77 52.689 -11.971 7.604
+vodka.sublink.O 193.204.114.233 2 u 11 64 77 243.707 -5.777 7.230
+ipv4.ntp3.rbaum 10.84.87.146 2 u 10 64 77 2.375 -4.533 5.866
#ntp1.edu-zg.io 85.158.27.31 2 u 6 64 77 217.881 -3.090 4.220
*ntp-a2.nict.go. .NICT. 1 u 11 64 77 2.974 -5.430 6.311
+any.time.nl 133.243.238.243 2 u 12 64 77 1.613 -4.987 6.219
ntpq
コマンドで表示される項目
remote | 参照しているサーバー |
refid | remoteの参照先 |
st | Stratumの第何層か |
t | 通信方式の種類 |
when | 前回の参照からの経過時間(秒) |
poll | 参照する時間間隔(秒) |
reach | 過去8回の参照の成功・失敗を8進数で表示している。8回全て成功していれば、'11111111'(2進数)が'377'(8進数)と表示される |
delay | 問い合わせの往復にかかる時間(ミリ秒) |
offset | サーバーとクライアントのズレ(ミリ秒) |
jitter | サーバーの時刻のゆらぎの程度 |
* | 参照中のサーバー |
+ | 参照可能なサーバー |
# | 同期可能だが、距離が遠いサーバー |
時刻管理のまとめ
Linuxの時刻管理について学びました。サーバーの時刻が正確でない場合はシステムが期待通りに動作しなかったり、ログの内容が不正確になるなど様々な問題が生じる可能性があります。今回学んだ内容をしっかりと理解してコンピューターの時刻を正確に保てるようにしましょう。
記事の内容は理解できましたか?