mattintosh note

どこかのエンジニアモドキの備忘録

Hyper-V 上の Ubuntu で Time has been changed が止まらない

会社の仮想環境で Ubuntu を使っているのだけど、いつからか

  • bmon の表示が「止まったと思ったら一気に流れだした」
  • htop や glances が途中で止まる

と言ったことが起こるようになってしまった。

で、gnuplot で timestamp を使ってグラフを作ると何故か逆走するポイントがあったりしたので、watch date してみたら時間が一時的に20分先に進んでしまうという症状を発見した。

hwclock や timedatectl で見てみると、ハードウェアクロックがおかしいようで、20分先に進んだり20分前に戻ったりしている。酷い時は当日の 00:00:00 まで戻る。

f:id:mattintosh4:20170521000608p:plain

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

仮想マシンは仕組み上、システム時間とハードウェアクロックがどんどんずれていくものなので定期的にハードウェアクロックの調整が必要のようだが、今回はちょっと違った問題だったので直すのに手間取った…。