문제

문제

내 호스트에서는 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 게스트 에이전트를 설치하고 시작합니다. (데비안: apt-get install --no-install-recommends qemu-guest-agent.)

  3. 일시 중지, 대기 및 재개를 통해 클럭 오프셋을 트리거합니다. 그런 다음 호스트에서 다음 명령을 실행하여 이를 수정합니다. virsh qemu-agent-command backup '{"execute":"guest-set-time"}'사용하는 위키 페이지 virsh qemu-agent-command는 다음과 같습니다 .지원되지 않는, 그러나 작업을 수행하는 다른 명령을 찾지 못했습니다.

guest-set-timelibvirt 내에서 일시 중지 후 재개 호출을 자동화하는 방법에 대한 두 가지 토론을 찾았습니다 .

그러나 제가 볼 수 있는 한 아직 아무것도 구현되지 않았습니다.

게스트 에이전트에 명령을 제출하는 방법에 대한 정보를 찾았습니다.Stoney-cloud.org 위키.

나는 tickpolicy="catchup"또한libvirt 타이머 구성그러나 이것은 문제를 해결하지 못했습니다.

NTP

에이전트 사용의 대안은 ntp 데몬을 사용하거나 cron 작업에서 주기적으로 ntpdate를 호출하는 것입니다. 나는 후자를 권장하지 않습니다. 왜냐하면 시간이 거꾸로 흘러 프로그램을 혼란스럽게 할 수 있기 때문입니다(예를 들어,Dovecot IMAP 서버는 뒤로 가는 시간을 처리하려고 시도하지 않습니다.종료할 수 있습니다.)

다음 ntp 데몬을 시도했습니다.

  • openntpd: 테스트에서는 60분당 약 2초의 속도로 매우 천천히 시간을 수정합니다. 시간 오프셋은 120초였습니다. 또한,openntpd시간 오프셋이 너무 크면 오류가 발생하고, 테스트에서는 이 경우 시간을 수정하는 데 완전히 실패했습니다. openntpd의 장점: chroot에서 일반 사용자로 실행할 수 있습니다.

  • 크로니: 내 테스트에서 30분 동안 120초의 시간 오프셋을 수정했습니다. chrony는 일반 사용자로 실행되도록 구성할 수 있습니다. chroot 지원이 구현되지 않았습니다. NTP 서버 폴링 간격은 각 NTP 서버에 대해 구성할 수 있습니다.

  • systemd-timesyncd: 내 테스트에서 30초에 120초의 시간 오프셋을 수정했습니다. 기본적으로 일반 사용자로 실행됩니다. 그러나 NTP 서버의 폴링 간격은 최대 2048초까지 증가하므로 최악의 경우 재개 후 34분까지 일시 중지/재개가 감지되지 않습니다. 이는 구성할 수 없는 것 같습니다. 또한, 나는 timesyncd가 시간을 거꾸로 진행하는 것을 관찰했는데, 이는 cron에서 ntpdate를 호출하는 것과 동일한 문제를 야기합니다(위 참조).

크로니가 문제를 해결해 드립니다. 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를 실행하는 대신 15분마다 crontab을 통해 게스트의 하드웨어 시계에서 게스트 시스템 시계를 설정하기로 결정했습니다. 게스트의 하드웨어 시계는 가상화 호스트에서 실행되는 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 Kernel 4.11부터 (Precision Time Protocol - Kernel Virtual Machine)이 있습니다 .PTP와 비슷하다NTP, 그러나 더 높은 정밀도와 로컬 네트워크용입니다. Linux 호스트 시스템은 효율적인 읽기를 위해 /dev/ptp_kvm(또는 /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 시계 속도를 높여 조정하는 반면, 더 큰 차이는 모든 (나쁜) 결과를 감수하면서 조정됩니다.

나는 이것을 에서 찾았습니다.레드햇 문서, 정말 감사합니다.

관련 정보