Leap Second Insertion フラグを受信後にそのフラグを削除する
はじめに
既知の問題などのうるう秒に関する情報は、Resolve Leap Second Issues in Red Hat Enterprise Linux を参照してください。
RHEL カーネルはどの月でもうるう秒の発生に対応できるようになっていますが、RHEL の ntpd がうるう秒を渡せる月は限定されています。ntp のバージョン ntp-4.2.4p8
では、カーネルのうるう秒を設定できるのは 6 月と 12 月だけです。しかし、うるう秒の情報がクライアントに転送される日は限定されていません。バージョン 4.2.6 以降の ntp では、どの月でも月末にカーネルのうるう秒を設定できるようになっていますが、4.2.4 以前のように一つだけでなく、過半数のサーバーがうるう秒に同意することが必要です。
NTP サーバーは、どの月でも、月末にうるう秒を発生させることができます。ntp サーバーを確認して、うるう秒を発生させるように調整されているかどうかを確認する必要があります。
[root@host ~]# ntpq -c "lassoc" -c "mrv &1 &999 leap,srcadr,stratum"
leap=01
が確認できたら、うるう秒は発生します。毎月末に確認するようにして、6 月と 12 月には必ず確認することが推奨されます。
ローカルシステムで現在、うるう秒が設定されているかどうかを確認するには:
[root@host ~]# ntptime |egrep 'INS|DEL'
ntp_gettime() returns code 1 (INS)
ntp_adjtime() returns code 1 (INS)
status 0x2011 (PLL,INS,NANO),
問題の回避方法
最初に、Leap Second Issue Detector Red Hat Labs Tool でアップデートが必要かどうかを確認します。
システムを最新の Red Hat Enterprise カーネルにアップデートすることが強く推奨されます。つまり、以下の 2 つの NTP クライアントの回避策は、「正確」ではなく、「精密」なタイムスタンプ情報を必要とするシステムでのみ有効である場合があるからです。なお、「精密」は、数量が表現される詳細測定を示しています。 「正確」は、真値からの測定誤差を示しています。
-
回避策 1:
- ntpd を停止します。
ntptime -s 0
を実行するとカーネルの状態をリセットします。ntptime
を実行して、ステータス行に INS または DEL が表示されないことを確認します。- ここで、うるう秒発生時に ntp をアクティブにしないでシステムを実行します。
-
その後、システムの時刻同期が必要な場合は、以下の方法を使用できます。
- 時計を即時に修正します:
ntpd
を再度実行すると時計が進みます。 - 時計をゆっくり修正します:
ntpdate -B <some-ntp-server>
を使用すると、修正に約 2000 秒かかります。その後、ntpd が再度開始し、エラーが修正された場合、ntpd
でこれ以上の修正は必要ありません。 -
時計をより速く修正します: これは adjtimex ティック値を使用します。以下のスクリプトは、10.1 秒間で時計を 9% 遅くします。これは、 上述の回避策で ntpdate の代わりに使用できます。
#!/bin/bash tick=$(tickadj | awk '{print $3}') echo initial tick $tick slewtick=$[$tick * 91 / 100] duration=10.1 echo correcting clock for inserted leap second... tickadj $slewtick sleep $duration tickadj $tick
- 時計を即時に修正します:
-
回避策 2:
- ntpd を停止します。
ntptime -s 0 -f 0
を実行するとカーネルの状態と頻度をリセットします。- -x オプション (ntp slew モード) で ntp を設定します。
- (slew モード) になっている ntpd を開始し、うるう秒発生時に実行させておきます。
RHEL 5、RHEL 6、および RHEL 7 の以前のバージョンには、slew モードで既知の問題があります。詳細については、以下のナレッジを参照してください。
- RHEL 5: Time is not adjusted by a leap second when ntpd runs with -x option.
- RHEL 6: Does Red Hat plan to release xleap.patch with ntp?
- RHEL 7: Does Red Hat plan to release xleap.patch with ntp?
注意: カーネルのうるう秒ステータスを設定した後に削除される問題が発生するため、-x
フラグを付けずに ntpd
を実行する RHEL 5 システムでは、6 月 30 日 0:00 の前に ntpd
を停止する必要があります。RHEL 4 には NTP のバグがあり、slew モードを有効にしても、ntpd がカーネルフラグを設定するのを防げません。
詳細については、ナレッジ を参照してください。
最初の回避策では、クライアントでうるう秒の挿入が無視されますが、うるう秒が挿入された後に通常のモードで ntp が安全に再起動します。
2 つ目の回避方法 (slew モード '-x' ) ではうるう秒はカーネルで無視されます (代わりに NTPd は時間を徐々に調整します)。ntp-4.2.6p5-1.el6
、ntp-4.2.6p5-2.el6_6
、および ntp-4.2.6p5-18.el7
以下を実行しているシステムではうるう秒が挿入されますが (slew モードで実行している場合でも一度に変更します)、これは、カーネルではなく ntpd によって行われます。この問題は、RHEL 6 bug 1199978 および RHEL 7 bug 1191122 により発生します。これらのバージョンの ntpd は、真夜中に settimeofday()
または clock_settime()
を呼び出して、自動的に時間を戻します。
正確なタイムスタンプ情報が必要な場合に利用できるように、Red Hat は Red Hat Enterprise Linux 6.1、6.2、および 6.3 に対して、うるう秒の問題を解決するパッチを当てた z-stream カーネルを公開しました。既知の問題を処理するために、次のうるう秒が発生する前に、これらのカーネルをインストールしておく必要があります。
Red Hat Labs のテストツール
うるう秒の脆弱性をテストするためのツールが Access Labs で提供されています。ご利用になるには Leap Second Vulnerability Detector に移動してください。
うるう秒挿入のテスト
このプログラムは実際にうるう秒を挿入し、パッチを当てていないシステムで問題を発生させます。これは、テスト環境で使用することが強く推奨されます。
うるう秒のストレステスト leap-a-day.c
はこのナレッジに添付されており、テスト環境でダウンロードおよびコンパイルできます。以下の手順を実施してください。
-
kernel-headers
パッケージがインストールされていることを確認してください。yum install kernel-headers
-
このナレッジに添付されている
leap-a-day.c
プログラムをダウンロードします。 -
アプリケーションをローカルにビルドします。
gcc leap-a-day.c -o leap-a-day -lrt
-
アプリケーションを実行します。
* Usage: leap-a-day [-s] [-i <num>] * * Options: * -s: Each iteration, set the date to 10 seconds before midnight GMT. * This speeds up the number of leapsecond transitions tested, * but because it calls settimeofday frequently, advancing the * time by 24 hours every ~16 seconds, it may cause application * disruption. * * -i: Number of iterations to run (default: infinite) * * Other notes:Disabling NTP prior to running this is advised, as the two * may conflict in thier commands to the kernel.
テストは、挿入と削除を交互に行い、検出されたエラーを報告します。このテストはシステムの時間を調整するため、適切に計画する必要があります。挿入時の成功と失敗は以下のようになります。
注意: RHEL 4 および RHEL 5 システムの場合は、最初のインターバルだけが有効です。 追加のうるう秒の挿入をテストするには、このテストを繰り返し実行する必要があります。
-
成功時:
# ./leap-a-day -s Setting time to speed up testing This runs continuously.Press ctrl-c to stop Setting time to Tue Mar 10 19:59:50 2015 Scheduling leap second for Tue Mar 10 20:00:00 2015 Sun Mar 8 19:59:57 2015 + 190 us (0) TIME_INS Sun Mar 8 19:59:57 2015 + 500395 us (0) TIME_INS Sun Mar 8 19:59:58 2015 + 604 us (0) TIME_INS Sun Mar 8 19:59:58 2015 + 500808 us (0) TIME_INS Sun Mar 8 19:59:59 2015 + 1011 us (0) TIME_INS Sun Mar 8 19:59:59 2015 + 501219 us (0) TIME_INS Sun Mar 8 19:59:59 2015 + 5731 us (1) TIME_OOP Sun Mar 8 19:59:59 2015 + 505935 us (1) TIME_OOP Sun Mar 8 20:00:00 2015 + 6136 us (1) TIME_WAIT Sun Mar 8 20:00:00 2015 + 506345 us (1) TIME_WAIT Sun Mar 8 20:00:01 2015 + 6551 us (1) TIME_WAIT Sun Mar 8 20:00:01 2015 + 506678 us (1) TIME_WAIT Sun Mar 8 20:00:02 2015 + 6881 us (1) TIME_WAIT Leap complete
-
失敗時:
# ./leap-a-day -s Setting time to speed up testing This runs continuously.Press ctrl-c to stop Setting time to Sun Mar 8 19:59:50 2015 Scheduling leap second for Sun Mar 8 20:00:00 2015 Sun Mar 8 19:59:57 2015 + 190 us (0) TIME_INS Sun Mar 8 19:59:57 2015 + 500395 us (0) TIME_INS Sun Mar 8 19:59:58 2015 + 604 us (0) TIME_INS Sun Mar 8 19:59:58 2015 + 500808 us (0) TIME_INS Sun Mar 8 19:59:59 2015 + 1011 us (0) TIME_INS Sun Mar 8 19:59:59 2015 + 501219 us (0) TIME_INS Sun Mar 8 19:59:59 2015 + 5731 us (1) TIME_OOP Sun Mar 8 19:59:59 2015 + 505935 us (1) TIME_OOP Sun Mar 8 20:00:00 2015 + 6136 us (1) TIME_WAIT Sun Mar 8 20:00:00 2015 + 506345 us (1) TIME_WAIT Sun Mar 8 20:00:01 2015 + 6551 us (1) TIME_WAIT Sun Mar 8 20:00:01 2015 + 506678 us (1) TIME_WAIT Sun Mar 8 20:00:02 2015 + 6881 us (1) TIME_WAIT ERROR: hrtimer early expiration failure observed. Leap complete
Comments