問題

問題

私のホストでは、libvirt と KVM ゲストを使用しています。ホストがシャットダウンすると、libvirt はゲストを一時停止します。ホストが起動すると、libvirt はゲストを再開します。問題は、たとえばゲストが一時停止され、24 時間後に再開された場合、ゲストの時間は 24 時間前になってしまうことです。

問題はクロックソースにあるのではないかと考えましたが、すでに「kvm-clock」に設定されています。

$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
kvm-clock tsc hpet acpi_pm 

$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource
kvm-clock

答え1

問題

私も同じ問題を抱えていますが、良い解決策が見つかりません。私が見つけたのは次のことです:

問題は、再開後にゲストのシステム クロックの時刻とハードウェア クロックの時刻が異なることです。

root@guest:~# date; hwclock
Sat Oct 11 13:09:38 UTC 2014
Sat Oct 11 13:10:42 2014  -0.454380 seconds

ホストに関しては、彼らは同意しています。

root@four:~# date; hwclock
Sat Oct 11 13:11:35 UTC 2014
Sat Oct 11 13:11:36 2014  -1.000372 seconds

解決策としては、ゲストが再開された後にゲスト上で実行することですhwclock --hctosys。ただし、ゲストは一時停止されて再開されたことに気付かないため、ゲスト システムのみの変更でこれを行う方法は見つかりませんでした。

QEmu ゲストエージェント

というソフトウェアを実行する可能性がありますQEmu ゲストエージェントゲスト上でホストから通知してゲストのハードウェアクロックからゲストのシステムクロックを更新する。ただし、ページには、ゲストエージェントはホストとゲストを攻撃に対して脆弱にするJSON パーサーの問題により、互いに分離されています (少なくとも、影響を受けるコードはホストでも実行されると思いますが、その点についてはよくわかりません)。とにかく、設定方法は次のとおりです。

  1. エージェントのvirtioシリアルチャネルを、libvirt ウィキ(参照libvirt ドメインフォーマットのドキュメント)。

  2. シリアル チャネルが利用可能になったら、ゲストに QEmu ゲスト エージェントをインストールして起動します。(Debian: apt-get install --no-install-recommends qemu-guest-agent.)

  3. 一時停止、待機、再開によってクロックオフセットをトリガーします。次に、ホストで次のコマンドを実行して修正します。virsh qemu-agent-command backup '{"execute":"guest-set-time"}'使用しているWikiページvirsh qemu-agent-commandサポートされていないしかし、この目的を果たす他のコマンドは見つかりませんでした。

guest-set-timelibvirt 内でのサスペンドからの再開時の呼び出しを自動化することに関する 2 つの議論を見つけました。

しかし、私が見た限りでは、まだ何も実装されていません。

ゲストエージェントにコマンドを送信する方法については、stoney-cloud.org のウィキ

私はまたtickpolicy="catchup"libvirt タイマー設定しかし、これでは問題は解決しませんでした。

NTPA の

エージェントを使用する代わりに、ntpデーモンを使用するか、cronジョブから定期的にntpdateを呼び出すことができます。後者は時間を逆戻りさせ、プログラムを混乱させる可能性があるため、お勧めしません(たとえば、Dovecot IMAPサーバーは時間の逆戻りを処理しようとしない終了することができます。

次の ntp デーモンを試しました:

  • オープンntpd: 私のテストでは、60分あたり約2秒の速度で非常にゆっくりと時間を修正しました。時間オフセットは120秒でした。また、オープンntpd時間オフセットが大きすぎる場合はエラーをスローし、私のテストではその場合には時間を完全に修正できません。openntpd の利点: chroot で通常のユーザーとして実行できます。

  • クロニー: 私のテストでは、30 分で 120 秒の時間オフセットを修正しました。chrony は通常のユーザーとして実行するように構成できます。chroot サポートは実装されていません。NTP サーバー ポーリング間隔は、NTP サーバーごとに構成できます。

  • システム時刻同期: 私のテストでは、120 秒の時間オフセットを 30 秒で修正しました。デフォルトでは、通常のユーザーとして実行されます。ただし、NTP サーバーのポーリング間隔は最大 2048 秒まで増加するため、最悪の場合、サスペンド/再開は再開後 34 分まで検出されません。これは構成できないようです。また、timesyncd が時間を遡るのを観察しましたが、これは cron で ntpdate を呼び出す場合と同じ問題を引き起こします (上記を参照)。

chrony は問題を解決します。Openntpd は修正率が低すぎる上に設定できないため適していません。systemd-timesyncd もポーリング間隔が設定できないため問題を完全には解決しません。

私は、NTP デーモンの次の Debian バージョンをテストしました: openntpd 20080406p-10、chrony 1.30-1、systemd 215-5+b1。

答え2

ゲスト上の仮想化ホスト操作の多くは、一時停止と再開を繰り返す結果になります。これは、ゲストのシステム クロックに悪影響を及ぼします。たとえば、VM のクローンを作成すると、クローン作成中に一時停止が発生します。その後、ゲストのクロックは遅れます。NTP でクロックを同期するには、ゲストを再起動する必要がありますが、これはすべてのケースで適切な解決策とは言えません。代わりに、ゲストで ntpd を再起動することもできますが、これも最適ではありません。理想的には、ゲストに対するこの種の修正にオプションで使用できるイベント (VM の再開) が必要です。

これについてしばらく調査した後、CentOS 7 ゲスト OS システム クロックの参照としてホスト クロックを直接使用することにしました。

ゲストで ntpd を実行する代わりに、crontab 経由で 15 分ごとにゲストのハードウェア クロックからゲストのシステム クロックを設定することにしました。ゲストのハードウェア クロックは、仮想化ホストで実行されている ntpd 経由で制御される仮想化ホストの時刻を反映します。これにより、ゲスト OS で信頼性の高い時刻が提供されます。最悪の場合、ゲストを再開した後に適切な時刻に同期されるまでに、クロックが最大 15 分間ずれることがあります。

# crontab -e

0,15,30,45 * * * * /sbin/hwclock --hctosys

ゲストが再開されたときに時刻同期を開始するイベントをゲストで利用できるようにしておくと、はるかに良いのですが、どうやらそれは利用できないようです。crontab アプローチは、15 分ごとに hwclock 呼び出しを行うという点で回避策です。これで目的は達成されますが、私が望むほどエレガントではありません。

答え3

libvirtはゲストの時刻同期をサポートしています。2015. Debian Stretch 以降では、次のオプションを探しSYNC_TIMEます/etc/default/libvirt-guests:

# If non-zero, try to sync guest time on domain resume. Be aware, that
# this requires guest agent with support for time synchronization
# running in the guest. For instance, qemu-ga doesn't support guest time
# synchronization on Windows guests, but Linux ones. By default, this
# functionality is turned off.
#SYNC_TIME=1

ホスト システム内から時刻同期をテストするには、次の操作を実行します。

virsh qemu-agent-command INSERT_YOUR_DOMAIN_HERE '{"execute":"guest-set-time"}'

このコマンドは{"return":{}}成功すると返されます。

答え4

PTP-KVMLinux カーネル 4.11 以降には(Precision Time Protocol - カーネル仮想マシン)があります。PTTPに匹敵するNTPA の/dev/ptp_kvmですが、精度が高く、ローカル ネットワーク用です。Linux ホスト システムは、現在の時刻を(または)としてゲスト システムにエクスポートし、効率的に読み取ることができます/dev/ptp0クロニーVM 内でそれを使用することができます:

modprobe ptp_kvm
echo ptp_kvm >/etc/modules-load.d/ptp_kvm.conf
apt-get install chrony
echo "refclock PHC /dev/ptp0 poll 2" >/etc/chrony/conf.d/ptp.conf
systemctl restart chronyd

必要条件として、ホスト上の時刻も同期する必要があります。

makestep 10 -許容できる差に応じて設定することもできます。この例では、10 秒未満の差は VM クロックを高速化することで調整され、それより大きい差はすべての (悪い) 結果で調整されます。

私はこれを見つけましたRedHat ドキュメントなので、彼らに敬意を表します。

関連情報