LinuC レベル1(LPIC-1対応)対策
時刻とNTP
サーバーの時刻がずれていると、ログの前後関係が読めなくなり、証明書は期限切れと判定され、バックアップの世代管理も壊れます。この分野は暗記で確実に取れるので、落とすと痛い場所です。なお、この学習環境は dbus が動いておらず ntpd も chronyd も入っていないため、実機演習は用意していません。
時計は2つある
| 呼び名 | 実体 | 電源を切ると |
|---|---|---|
| ハードウェアクロック (RTC) | マザーボード上の時計チップ。電池で動く | 動き続ける |
| システムクロック | カーネルが管理するメモリ上の時刻 | 消える |
起動時にハードウェアクロックからシステムクロックへ値が読み込まれ、以後は Linux 自身がシステムクロックを進めます。シャットダウン時には逆方向へ書き戻されます。この2つが別物だと分かっていないと、次の引っかけにやられます。
hwclock の -w と -s はどちら向きか
| オプション | 何をするか |
|---|---|
hwclock -r (--show) | ハードウェアクロックを表示する |
hwclock -w (--systohc) | システムクロック から ハードウェアクロック へ |
hwclock -s (--hctosys) | ハードウェアクロック から システムクロック へ |
--utc / --localtime | ハードウェアクロックを UTC / ローカル時刻として扱う |
向きは定番の引っかけです。長い形の別名で覚えるのが確実で、--systohc は sys to hc、--hctosys は hc to sys です。短い形は -w が write でハードウェアに書き込む、-s が set でシステムを設定する、と結び付けると迷いません。
date はシステムクロックを表示・設定します。書式は + に続けて %Y が西暦年、%m が月、%d が日、%H が時、%M が分、%S が秒、%A が曜日名、%s が UNIX 時間です。ただし date -s で変わるのはシステムクロックだけなので、ハードウェアクロックにも残すなら続けて hwclock -w が要ります。
タイムゾーンの実体は /etc/localtime
| パス | 役割 |
|---|---|
/usr/share/zoneinfo/ | 世界中のタイムゾーン定義の置き場。Asia/Tokyo など |
/etc/localtime | 現在のタイムゾーン。zoneinfo 内のファイルへのシンボリックリンク |
/etc/timezone | Debian 系でタイムゾーン名を文字列で持つ。TZ 変数はシェル単位の上書き |
/etc/timezone は Debian 系の文字列表記であって、これだけ書き換えても切り替わりません。実体は /etc/localtime です。
systemd 環境の正面口は timedatectl です。status で現在の時刻とタイムゾーンと NTP 同期状態、set-time で時刻、set-timezone Asia/Tokyo でタイムゾーン、list-timezones で一覧、set-ntp true で自動同期の有効化です。同期が有効な間は set-time が拒否される点も押さえてください。
Stratum 0 はサーバーではない
NTP は UDP の 123 番を使い、階層構造で時刻を配ります。この階層を Stratum と呼びます。Stratum 0 は原子時計や GPS 受信機などの基準時刻源そのもので、ネットワーク上のサーバーではありません。Stratum 1 がそれに直結した最上位のサーバー、Stratum 2 がそこから時刻をもらうサーバーで、1つ下位へ行くごとに数字が増え、精度は少しずつ落ちます。
状態を見るコマンドは実装ごとに違います。ntpd なら ntpq -p が参照中の時刻源と状態を出し、ntpdate <サーバー> は一度だけ強制的に合わせます (ntpd 稼働中はポートが競合して使えません)。chrony なら chronyc sources と chronyc tracking、systemd-timesyncd なら timedatectl timesync-status です。
設定ファイルは、ntpd が /etc/ntp.conf、chrony が /etc/chrony/chrony.conf、systemd-timesyncd が /etc/systemd/timesyncd.conf です。ntpd と chrony はどちらも server 行で参照先を書き、pool 行なら複数台をまとめて指定できます。systemd-timesyncd だけ書式が違い、[Time] セクションの NTP= に並べます。
試験で狙われるところ
hwclock -w はハードウェアへ書き、-s はシステムを設定します。date -s はハードウェアクロックに反映されません。タイムゾーンの実体は /etc/localtime です。Stratum 0 は一番上の NTP サーバーではなく原子時計や GPS そのものです。そして NTP は UDP の 123 番で、TCP ではありません。
復習ミニクイズ
システムクロックを正しい時刻に合わせたあと、その値をハードウェアクロック (RTC) にも書き込みたい。正しいコマンドはどれですか。