1. ホーム
  2. コース一覧
  3. LinuC Level1 v10.0 対策コース(パート2)
  4. Linuxの時刻管理

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

タイムゾーンの設定

インターネット上でコンピュータ同士が通信する際はUTCUniversal Time Coodinated:協定世界時)を用います。しかし、人間にとっては現地時間を直感的に理解することが重要です。そのためには、タイムゾーンを設定し、時刻の表示を現地時間に変換する必要があります。日本の場合JSTJapan Standard Time:日本標準時)を使用します。

タイムゾーンの設定方法

タイムゾーンの設定方法には以下のように5通りあります。

タイムゾーン設定例

  1. /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 コマンドを使い対話的にファイルを探すことができます。

  1. /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
  1. 環境変数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
  1. 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
  1. 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サーバーとやり取りし正確な時刻を取得するプロトコルをNTPNetwork Time Protocol)といいます。

NTPサーバーの階層構造

NTPサーバーはStratumと呼ばれる階層構造を形成します。最上位のStratum0は原子時計やGPSなどの極めて正確な時刻を提供する機器を基に時刻を設定します。Stratum0へのアクセスはStratum1のサーバーからに限定され、Stratum1以下は順にStratum2、Stratum3、Stratum4となっていき、上位の層から時刻情報が共有されていきます。

社内ネットワークに多数のコンピュータがある場合は自前のNTPサーバーを立て、公共のNTPサーバーの負荷を軽減することも必要となります。

ntpdとchrony

NTPでの管理にはntpdchronyを用います。 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参照しているサーバー
refidremoteの参照先
stStratumの第何層か
t通信方式の種類
when前回の参照からの経過時間(秒)
poll参照する時間間隔(秒)
reach過去8回の参照の成功・失敗を8進数で表示している。8回全て成功していれば、'11111111'(2進数)が'377'(8進数)と表示される
delay問い合わせの往復にかかる時間(ミリ秒)
offsetサーバーとクライアントのズレ(ミリ秒)
jitterサーバーの時刻のゆらぎの程度
*参照中のサーバー
+参照可能なサーバー
#同期可能だが、距離が遠いサーバー

時刻管理のまとめ

Linuxの時刻管理について学びました。サーバーの時刻が正確でない場合はシステムが期待通りに動作しなかったり、ログの内容が不正確になるなど様々な問題が生じる可能性があります。今回学んだ内容をしっかりと理解してコンピューターの時刻を正確に保てるようにしましょう。

記事の内容は理解できましたか?