Bagaimana cara menjaga waktu pada tamu KVM melanjutkan dengan libvirt?

18

Di host saya, saya menggunakan libvirt dan tamu KVM. Ketika tuan rumah dimatikan, libvirt menangguhkan tamu. Ketika tuan rumah memulai, libvirt melanjutkan tamu. Masalahnya adalah, jika tamu ditangguhkan dan dilanjutkan setelah 24 jam misalnya, maka waktu tamu adalah 24 jam di masa lalu.

Saya pikir mungkin masalahnya adalah dengan clocksource, tetapi sudah diatur ke "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
Hristo Hristov
sumber

Jawaban:

11

Masalah

Saya punya masalah yang sama dan saya belum menemukan solusi yang baik. Inilah yang saya temukan:

Masalahnya adalah bahwa setelah melanjutkan, waktu jam sistem dan perangkat keras pada tamu berbeda:

root @ guest: ~ # date; jam
Sabtu 11 Oktober 13:09:38 UTC 2014
Sabtu 11 Oktober 13:10:42 2014 -0.454380 detik

Di tuan rumah, mereka setuju:

root @ four: ~ # date; jam
Sabtu 11 Oktober 13:11:35 UTC 2014
Sabtu 11 Oktober 13:11:36 2014 -1.000372 detik

Solusinya adalah menjalankan hwclock --hctosyspada tamu setelah itu dilanjutkan. Namun, saya belum menemukan cara untuk melakukan ini dengan perubahan pada sistem tamu saja, karena tamu tidak menyadari bahwa itu ditangguhkan dan dilanjutkan.

Agen Tamu QEmu

Ada kemungkinan untuk menjalankan perangkat lunak yang disebut QEmu Guest Agent pada tamu dan memberi tahu dari tuan rumah untuk memperbarui jam sistem tamu dari jam perangkat keras tamu. Namun, halaman tersebut menyebutkan bahwa agen tamu membuat tuan rumah dan tamu rentan terhadap serangan satu sama lain karena masalah dengan parser JSON (setidaknya saya percaya bahwa kode yang terpengaruh juga berjalan di host, saya tidak yakin tentang itu ). Bagaimanapun, inilah cara mengaturnya:

  1. Siapkan saluran serial virtio untuk agen sebagaimana disebutkan dalam wiki libvirt (lihat juga dokumentasi format domain libvirt ).

  2. Setelah saluran serial tersedia, instal dan mulai Agen Tamu QEmu pada tamu. (Debian:. apt-get install --no-install-recommends qemu-guest-agent)

  3. Memicu jam diimbangi dengan menangguhkan, menunggu, dan melanjutkan. Kemudian jalankan perintah berikut pada host untuk memperbaikinya: virsh qemu-agent-command backup '{"execute":"guest-set-time"}'The wiki halaman yang menggunakan virsh qemu-agent-commandadalah tidak didukung , tapi saya belum menemukan perintah lain yang melakukan pekerjaan.

Saya menemukan dua diskusi tentang mengotomatisasi dalam libvirt panggilan untuk guest-set-timemelanjutkan dari penundaan:

Namun, sejauh ini belum ada yang dilaksanakan.

Saya menemukan informasi tentang cara mengirimkan perintah ke agen tamu di wiki dari stoney-cloud.org .

Saya juga sudah mencoba pengaturan tickpolicy="catchup"dalam pengaturan waktu libvirt tetapi ini tidak menyelesaikan masalah.

NTP

Alternatif untuk menggunakan agen adalah dengan menggunakan daemon ntp atau untuk memanggil ntpdate secara berkala dari pekerjaan cron. Saya tidak akan merekomendasikan yang terakhir, karena dapat menyebabkan waktu untuk mundur, yang dapat membingungkan program (misalnya, server IMAP Dovecot tidak mencoba untuk menangani waktu mundur dan dapat mengakhiri).

Saya mencoba daemon ntp berikut:

  • openntpd : Mengoreksi waktu dengan sangat lambat dengan laju sekitar 2 detik per 60 menit dalam pengujian saya. Offset waktu adalah 120 detik. Juga, openntpd melempar kesalahan jika waktu offset terlalu besar dan, dalam pengujian saya, gagal untuk memperbaiki waktu dalam kasus itu. Keuntungan dari openntpd: Dapat dijalankan sebagai pengguna biasa di chroot.

  • Chrony : Mengoreksi waktu offset 120 detik dalam 30 menit dalam pengujian saya. Kronik dapat dikonfigurasi untuk dijalankan sebagai pengguna biasa. dukungan chroot tidak diterapkan. Interval polling server NTP dapat dikonfigurasi untuk setiap server NTP.

  • systemd-timesyncd : Mengoreksi offset waktu 120 detik dalam 30 detik dalam pengujian saya. Berjalan sebagai pengguna biasa secara default. Namun, interval polling server NTP meningkat hingga 2048 detik, sehingga penangguhan / resume tidak akan terdeteksi hingga 34 menit setelah resume dalam kasus terburuk. Ini sepertinya tidak dapat dikonfigurasi. Juga, saya telah mengamati timesyncd langkah mundur waktu, yang menyebabkan masalah yang sama seperti memanggil ntpdate dalam cron (lihat di atas).

Chrony memecahkan masalah. Openntpd tidak cocok karena tingkat koreksinya terlalu rendah dan tampaknya tidak dapat dikonfigurasi. systemd-timesyncd tidak sepenuhnya menyelesaikan masalah, karena interval pollingnya tidak dapat dikonfigurasi.

Saya menguji versi Debian dari daemon NTP: openntpd 20080406p-10, chrony 1.30-1 dan systemd 215-5 + b1.

Milan
sumber
3

Banyak operasi host virtualisasi pada tamu dapat menghasilkan jeda - resume. Ini akan berdampak negatif pada jam sistem pada tamu. Sebagai contoh, kloning VM menghasilkan jeda saat kloning. Jam tamu sesudahnya ada di belakang. Untuk mendapatkan NTP untuk menyinkronkan jam, Anda perlu me-restart tamu - bukan solusi yang baik dalam semua kasus pasti. Alternatif, Anda bisa memulai kembali ntpd di tamu, tetapi itu juga tidak optimal. Idealnya perlu ada acara (VM dilanjutkan) tersedia yang Anda dapat gunakan untuk jenis koreksi untuk tamu.

Setelah menghabiskan waktu meneliti ini, saya memutuskan untuk menggunakan jam tuan rumah secara langsung sebagai referensi untuk jam sistem OS tamu CentOS 7.

Alih-alih menjalankan ntpd di tamu, saya memutuskan bahwa setiap 15 menit saya akan mengatur, melalui crontab, jam sistem tamu dari jam perangkat keras tamu. Jam perangkat keras tamu mencerminkan waktu di host virtualisasi yang dikendalikan melalui ntpd yang berjalan pada host virtualisasi. Ini memberi saya waktu yang dapat diandalkan di OS tamu. Kasus terburuk, jam mungkin mati hingga 15 menit sebelum disinkronkan ke waktu yang tepat setelah melanjutkan tamu.

# crontab -e

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

Akan jauh lebih baik untuk memiliki acara yang tersedia di tamu yang akan memulai sinkronisasi waktu ketika tamu kembali, tetapi ternyata itu tidak tersedia. Pendekatan crontab adalah solusi untuk membuat panggilan jam setiap 15 menit. Ini menyelesaikan pekerjaan, tetapi tidak seanggun yang saya inginkan.

zman58
sumber
2

kvm-clock menyinkronkan waktu tamu dengan waktu host pada startup tamu . Anda harus menggunakan dan ntp klien di tamu, dan mematikan / memulai alih-alih menggunakan penangguhan / melanjutkan.

dyasny
sumber
Ya, saya dapat mengonfirmasi sinkronisasi pada startup, karena ketika saya melakukan shutdown / startup semua tamu baik-baik saja. Menggunakan ntp bukan solusi karena berbagai alasan (ini merupakan solusi, panik ketika perbedaan waktu sangat besar, memerlukan akses ke server waktu). Saya mencari cara untuk menyelesaikan masalah dengan menangguhkan / melanjutkan, karena ini merupakan opsi yang menarik, bagus dan default di libvirt.
Hristo Hristov
menangguhkan adalah 1) bermigrasi negara VM ke file dan 2) menghancurkan. Ketika Anda melanjutkan dari penangguhan, status VM dipulihkan (dimigrasi dari file kembali ke memori VM). Keadaan ini akan mencakup cap waktu saat ini. Jadi ya, ini adalah default, tetapi tidak, waktu masih penting, dan waktunya harus datang dari suatu tempat, dan ini adalah di mana NTP harus masuk. Saya ragu sumber jam lain akan membantu tetapi Anda dapat mencoba dengan acpi_pm.
dyasny
Anda tidak harus menggunakan NTP di tamu .
Brian Cain
4
@Brian Cain ini sangat bisa diperdebatkan, terutama tanpa penjelasan atau alasan di balik pernyataan itu. Untuk memberikan profflink: docs.redhat.com/docs/en-US/…
dyasny
2

libvirt mendukung sinkronisasi waktu tamu sejak 2015 . Pada Debian Stretch dan nanti cari opsi SYNC_TIMEdi /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

Anda dapat menguji sinkronisasi waktu dari dalam sistem host dengan:

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

Perintah ini harus kembali {"return":{}}dengan sukses.

Jakob
sumber
0

Saya menggunakan cara yang sama untuk menyinkronkan waktu setelah VM menangguhkan / melanjutkan, tetapi saya pikir lebih baik untuk mencoba menebak, bahwa itu harus disinkronkan ke arah yang benar dan lebih lama dari perbedaan pendek, yang dapat diperbaiki oleh NTPD.

https://gist.github.com/jhrcz/7138803

PS. Changelog centos 6.7 baru mengatakan ini bisa dilakukan secara otomatis dengan hanya sumber jam kvm-jam.

Jan Horacek
sumber