
在我的主機上,我使用 libvirt 和 KVM guest 虛擬機器。當主機關閉時,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 解析器的問題(至少我相信受影響的程式碼也在主機上運行,我對此不確定)。無論如何,設定方法如下:
為代理程式設定 virtio 串列通道,如libvirt 維基(也可以看看libvirt 域格式文檔)。
序列通道可用後,在客戶機上安裝並啟動 QEmu Guest Agent。 (德班:
apt-get install --no-install-recommends qemu-guest-agent
。)透過掛起、等待和恢復來觸發時鐘偏移。然後在主機上執行以下命令進行更正:
virsh qemu-agent-command backup '{"execute":"guest-set-time"}'
使用的 wiki 頁面virsh qemu-agent-command
是不支援的,但我還沒有找到任何其他可以完成這項工作的命令。
我發現了兩個關於在 libvirt 中自動呼叫guest-set-time
掛起恢復的討論:
- http://thread.gmane.org/gmane.comp.emulators.libvirt/92431(2014 年 2 月)
- http://thread.gmane.org/gmane.comp.emulators.libvirt.user/7051(2014 年 9 月)
然而,據我所知,尚未實施任何措施。
我找到了有關如何向訪客代理提交命令的信息Stoney-cloud.org 的 wiki。
我也嘗試過tickpolicy="catchup"
設定libvirt定時器配置但這並沒有解決問題。
NTP
使用代理程式的替代方法是使用 ntp 守護程序或從 cron 作業定期呼叫 ntpdate。我不推薦後者,因為它可能導致時間倒退,這可能會混淆程序(例如,Dovecot IMAP 伺服器不會嘗試處理倒退的時間並可以終止)。
我嘗試了以下 ntp 守護程式:
打開ntpd:在我的測試中,以每 60 分鐘約 2 秒的速度校正時間。時間偏移為 120 秒。也,打開ntpd如果時間偏移太大,則會拋出錯誤,並且在我的測試中,在這種情況下完全無法修正時間。 openntpd 的優點: 可以在 chroot 中以普通使用者身分執行。
慢性的:修正了我的測試中 30 分鐘內 120 秒的時間偏移。 chrony 可以設定為以普通使用者身分執行。 chroot 支援尚未實現。可以為每個 NTP 伺服器設定 NTP 伺服器輪詢間隔。
systemd-時間同步:在我的測試中修正了 30 秒 120 秒的時間偏移。預設以普通用戶身份運行。然而,NTP 伺服器的輪詢間隔增加到 2048 秒,因此在最壞的情況下,直到恢復後 34 分鐘才能偵測到掛起/恢復。這似乎不可配置。另外,我觀察到 timesyncd 使時間倒退,這會導致與在 cron 中調用 ntpdate 相同的問題(見上文)。
chrony 解決了這個問題。 Openntpd 不適合,因為它的修正率太低,而且似乎無法設定。 systemd-timesyncd 也沒有完全解決問題,因為它的輪詢間隔是不可設定的。
我測試了以下 Debian 版本的 NTP 守護程式:openntpd 20080406p-10、chrony 1.30-1 和 systemd 215-5+b1。
答案2
來賓上的許多虛擬化主機操作可能會導致暫停-恢復。這將對來賓的系統時鐘產生負面影響。例如,克隆虛擬機會導致克隆時暫停。之後客人的時鐘落後了。要讓 NTP 同步時鐘,您需要重新啟動來賓——這在所有情況下都不是一個好的解決方案。或者,您可以在來賓中重新啟動 ntpd,但這也不是最佳選擇。理想情況下,需要有一個可用的事件(VM 復原),您可以選擇使用該事件對來賓進行此類修正。
在花了一些時間研究之後,我決定直接使用主機時鐘作為 CentOS 7 客戶作業系統系統時鐘的參考。
我決定每 15 分鐘透過 crontab 根據客戶機的硬體時鐘設定客戶機系統時鐘,而不是在客戶機中執行 ntpd。來賓的硬體時鐘反映了虛擬化主機上的時間,該時間透過虛擬化主機上執行的 ntpd 進行控制。這為我在客戶作業系統中提供了可靠的時間。最糟糕的情況是,時鐘可能會關閉長達 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
從 Linux Kernel 4.11 開始,有PTP-KVM
(精確時間協定 - 核心虛擬機器):點對點相當於NTP,但精度更高且適用於本地網路。 Linux 主機系統將其目前時間匯出到任何來賓系統,以便以/dev/ptp_kvm
(或/dev/ptp0
) 形式有效讀取。
慢性的能夠在虛擬機器內部使用它:
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 -
根據您願意容忍的差異進行配置:對於本範例,將透過加快 VM 時脈來調整低於 10 秒的差異,而較大的差異將承擔所有(不良)後果。
我在紅帽文檔,所以向他們致敬。