会社の仮想環境で Ubuntu を使っているのだけど、いつからか
- bmon の表示が「止まったと思ったら一気に流れだした」
- htop や glances が途中で止まる
と言ったことが起こるようになってしまった。
で、gnuplot で timestamp を使ってグラフを作ると何故か逆走するポイントがあったりしたので、watch date してみたら時間が一時的に20分先に進んでしまうという症状を発見した。
hwclock や timedatectl で見てみると、ハードウェアクロックがおかしいようで、20分先に進んだり20分前に戻ったりしている。酷い時は当日の 00:00:00 まで戻る。
systemd-timesyncd は有効になっているし、ntpdate で時間を調整しても症状は改善せず。
一旦、ntp 関連をすべて切ってみるとハードウェアクロックが20分進んだ状態でシステムクロックも安定しだした。その状態で ntpdate、hwclock してもまたすぐ20分進んでしまう。
Hyper-V を稼働しているマシンで Time synchronization を有効にしている場合、Linux の場合は起動時に影響があるようだが、起動後は NTP による制御になる。
と、ずっと思っていたのだが、journalctl を見てみると5秒おきに Time has been changed が出る。NTP も切っているのに何故だ???
色々探してみてようやく答えを見つけた。
I have a lot of "Time has been changed" in the journal of my linux boxes
どうもゲストマシンに Hyper-V 用のモジュールを入れていると勝手に時間をハードウェアクロックに合わせようとしてしまうらしい。
Time Synchronization のデバイスIDは決まっているようなので unbind すれば同期が止まる。
echo 2dd1ce17-079e-403c-b352-a1921ee207ee > /sys/bus/vmbus/drivers/hv_util/unbind
Time Synchronization は hv_vmbus に含まれていそうだけど下手に抜いて止まると厄介なので上のコマンドを rc.local にでも書いておくか…。
$ lsmod | grep hv hv_netvsc 40960 0 hv_utils 28672 0 hv_storvsc 20480 2 scsi_transport_fc 61440 1 hv_storvsc hv_vmbus 90112 6 hyperv_keyboard,hv_netvsc,hid_hyperv,hv_utils,hyperv_fb,hv_storvsc
とりあえず ntp をインストール。Ubuntu デフォルトだと Ubuntu の NTP サーバを使うようになっているので他のサーバに変更。
$ sudo apt-get install ntp $ sudo -e /etc/ntp.conf
server ntp.nict.jp server time1.google.com iburst server time2.google.com iburst server time3.google.com iburst server time4.google.com iburst
systemd-timesyncd はオフにして ntp だけにしとく。
$ sudo systemctl stop systemd-timesyncd $ ^stop^disable $ sudo systemctl start ntp $ ^start^enable
ようやく安定。
$ watch timedatectl Local time: Sun 2017-05-21 00:36:26 JST Universal time: Sat 2017-05-20 15:36:26 UTC RTC time: Sat 2017-05-20 15:36:26 Time zone: Japan (JST, +0900) Network time on: no NTP synchronized: yes RTC in local TZ: no
仮想マシンは仕組み上、システム時間とハードウェアクロックがどんどんずれていくものなので定期的にハードウェアクロックの調整が必要のようだが、今回はちょっと違った問題だったので直すのに手間取った…。