時間をそのままにするよう強制する

時間をそのままにするよう強制する

私のLinuxコンピュータでは時間が止まりません。土曜日にのみ発生する問題についてサーバーをテストする必要があります。

  • CentOS 6.5 64ビット
  • NTPDをオフにしました。 (service ntpd stopそしてchkconfig ntpd off
  • 仮想BIOS/ハードウェア時計を2015年5月2日に設定しました。
  • 時間を未来または過去に変更しても同じ効果があります。
  • コマンドラインで日付を設定しました。date --set "02 May 2015 11:00:00"
  • date正解と表示日は2015年5月2日です。
  • cron.d、などcron.dailycron.hourlytime / ntpとは関係ありません。

数分後、時間は自動的に正しい日付に戻ります。

時間を絶えず変えることができるもう一つのことは何ですか?情報はどこで入手できますか? ?

ベストアンサー1

この答えについては、タイミングを調整するのに役立ついくつかの要因があるとします。本当にランダムに推測したくないからどれあなたに害を与えても、私はあなたが自分で見つけるのに役立つ答えを提供しようとします。

UNIXシステムでは、通常、システムコールを使用して時計を設定できますstime。状況が進むにつれて、呼び出しを使用して時計をより正確に設定することも可能になりましたclock_settime。あなたもそれに会うことができますsettimeofdaydate --setCentOSシステムでstrace実行するとclock_settime

これを知っている解決策は、これらのシステムコールを追跡することです。良いニュースは、Linuxにdebugfsというメカニズムがあるということです。自分のシステムで呼び出すと、次のmount場所でその機能を使用できることがわかります/sys/kernel/debug

$ mount
none on /sys/kernel/debug type debugfs (rw)
...

ただし、一部のシステム(RedHatおよびCentOSを含む)では、起動時にインストールされない。それでは走る必要があります...

# mount -t debugfs nodev /sys/kernel/debug

また、インストールする前にこのディレクトリにあった場合は、ファイルがここに表示され始める前に終了して戻る必要があるかもしれません。

これで私たちは行く準備ができました。システムコールトレースを有効にしてみましょう。実際にどれが使われているのか確認したくないので、みんな追跡しています。システムコールトレースはで設定できます/sys/kernel/debug/tracing/events/syscalls。このディレクトリで次を見つける必要があります...

  • sys_enter_stime
  • sys_enter_clock_settime
  • sys_enter_settimeofday

...システムで利用可能な項目によって異なります。

これに対応するイベント入力する私たちのシステムコールは私たちが追跡したいものです(sys_exit_*ディレクトリも見つけることができます)。各ディレクトリには0のファイルがありますenable。その内容はゼロでなければなりません。これらの通貨を追跡するには、この値を1に設定してください。

# echo 1 > /sys/kernel/debug/tracing/events/syscalls/sys_enter_stime/enable
# echo 1 > /sys/kernel/debug/tracing/events/syscalls/sys_enter_clock_settime/enable
# echo 1 > /sys/kernel/debug/tracing/events/syscalls/sys_enter_settimeofday/enable

トラップを設定したので、時間が正しい値に設定されるのを待つだけです。この問題が発生した場合は、次のトレースログを実行します。

# cat /sys/kernel/debug/tracing/trace 

これでエラーが発生しない限り、次のいずれかの行が表示されます。

stime-xxxxx [xxx] .... x.x: sys_stime(...)
clock_settime-xxxxx [xxx] .... x.x: sys_clock_settime(...)
settimeofday-xxxxx [xxx] .... x.x: sys_settimeofday(...)

直後の数字stime-(または他の呼び出しの名前)は、システム呼び出しを実行するプロセスのPIDです。今行ってインポートします。

# ps -fp xxxxx
UID        PID  PPID  C STIME TTY          TIME CMD
root     XXXXX XXXXX  0 hh:mm ?        hh:mm:ss time_warrior

これで、システムが正しい時間を取得するのを止めるために必要なものがすべて揃っています。最も簡単な方法は、プロセスを終了し、起動時にプロセスが生成されないようにすることです。もちろん、もはやサービスを提供しないようにしてください。重要これを行う前の目的は、システムが完全にクラッシュしたくないことです。

また、作業が終わったら、以前に編集したファイルにゼロを書き込んでトレースを無効にすることを忘れないでください。ショートカットは次のとおりです。

# echo 0 > /sys/kernel/debug/tracing/events/syscalls/enable

(このファイルは次の役割を果たします。メインスイッチ他のすべてのケースでは、すべてのシステムコールトレースをオフにできます。


メモ:Mark Plotnickがコメントで述べたように、これはsystemtap同様の結果を得るためのやや簡単な方法かもしれません。私はスクリプトに全く慣れていないstapので、彼が望むなら答えを書くようにします。stap

おすすめ記事