libvirt로 재개 된 KVM 게스트에 시간을 유지하는 방법?


18

내 호스트에서 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

답변:


11

문제

나는 같은 문제를 겪었고 좋은 해결책을 찾지 못했습니다. 내가 찾은 것은 다음과 같습니다.

문제는 다시 시작한 후 게스트의 시스템 및 하드웨어 시계 시간이 다르다는 것입니다.

root @ guest : ~ # 날짜; hwclock
토 10 월 11 일 13:09:38 UTC 2014
토 10 월 11 일 13:10:42 2014 -0.454380 초

호스트에서 그들은 다음에 동의합니다.

root @ four : ~ # 날짜; hwclock
토 10 월 11 일 13:11:35 UTC 2014
토 10 월 11 일 13:11:36 2014 -1.000372 초

해결책은 hwclock --hctosys게스트가 재개 된 후에 게스트 에서 실행 하는 것 입니다. 그러나 게스트가 시스템을 일시 중지했다가 다시 시작한다는 사실을 알지 못하므로 게스트 시스템에서만 변경하는 방법을 찾지 못했습니다.

QEmu 게스트 에이전트

게스트 에서 QEmu Guest Agent 라는 소프트웨어를 실행 하고 게스트 하드웨어 시계에서 게스트 시스템 시계를 업데이트하도록 호스트에게 알릴 수 있습니다. 그러나이 페이지는 게스트 에이전트가 JSON 파서 문제로 인해 호스트와 게스트 가 서로의 공격에 취약 하다고 언급합니다 (적어도 영향을받는 코드가 호스트에서 실행된다고 생각합니다. ). 어쨌든, 설정 방법은 다음과 같습니다.

  1. libvirt 위키에 언급 된대로 에이전트의 virtio 직렬 채널을 설정 하십시오 ( libvirt 도메인 형식 문서 참조 ).

  2. 직렬 채널을 사용할 수있게되면 게스트에서 QEmu Guest Agent를 설치하고 시작하십시오. (데비안 : apt-get install --no-install-recommends qemu-guest-agent.)

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

libvirt 내 guest-set-time에서 일시 중단에서 다시 시작할 때 호출하는 자동화에 대한 두 가지 토론이 있습니다 .

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

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

libvirt 타이머 구성tickpolicy="catchup" 에서 설정 을 시도했지만 문제가 해결되지 않았습니다.

NTP

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

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

  • openntpd : 테스트에서 60 분마다 약 2 초의 속도로 시간을 매우 느리게 수정합니다. 시간 오프셋은 120 초입니다. 또한 시간 오프셋이 너무 커서 내 테스트에서 해당 시간의 시간을 완전히 수정하지 못하면 openntpd에서 오류가 발생합니다 . openntpd의 장점 : chroot에서 일반 사용자로 실행할 수 있습니다.

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

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

chrony는 문제를 해결합니다. Openntpd는 보정 속도가 너무 낮아 구성 할 수없는 것 같아서 적합하지 않습니다. 폴링 간격을 구성 할 수 없기 때문에 systemd-timesyncd도 문제를 완전히 해결하지는 않습니다.

NTP 데몬의 데비안 버전 openntpd 20080406p-10, chrony 1.30-1 및 systemd 215-5 + b1을 테스트했습니다.


3

게스트의 많은 가상화 호스트 작업으로 인해 일시 중지-다시 시작이 발생할 수 있습니다. 이는 게스트의 시스템 시계에 부정적인 영향을 미칩니다. 예를 들어 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 호출을 수행하는 해결 방법입니다. 그것은 일을 끝내지 만 내가 원하는만큼 우아하지는 않습니다.


2

kvm-clock은 게스트 시작시 게스트 시간을 호스트 시간과 동기화합니다 . 게스트에서 및 ntp 클라이언트를 사용하고 suspend / resume을 사용하는 대신 shutdown / startup을 사용해야합니다.


예, 게스트를 종료 / 시작하면 모든 것이 정상이기 때문에 시작시 동기화되는 것을 확인할 수 있습니다. ntp를 사용하는 것은 여러 가지 이유로 해결책이 아닙니다 (해결 방법입니다. 시차가 클 때 패닉 상태가되고 시간 서버에 액세스해야합니다). libvirt 의 흥미롭고 기본 옵션 이므로 suspend / resume 문제를 해결하는 방법을 찾고 있습니다.
Hristo Hristov

일시 중단은 1) VM 상태를 파일로 마이그레이션하고 2) 삭제입니다. 일시 중단에서 다시 시작하면 VM 상태가 복원됩니다 (파일에서 VM 메모리로 다시 마이그레이션). 이 상태에는 현재 타임 스탬프가 포함됩니다. 따라서 그렇습니다. 기본 설정은 아닙니다. 타이밍은 여전히 ​​중요하며 시간은 어딘가에서 와야합니다. NTP가 들어오는 곳입니다. 다른 클럭 소스가 도움이 될지 의심 스럽지만 acpi_pm으로 시도해 볼 수 있습니다.
dyasny


4
@ 브라이언 가인 (Brian Cain) 이것은 진술에 대한 설명이나 추론없이 특히 논쟁의 여지가있다. profflink를 제공하려면 : docs.redhat.com/docs/en-US/…
dyasny

2

libvirt는 2015 년 부터 게스트 시간 동기화를 지원합니다 . 데비안 스트레치에서는 다음에서 옵션 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":{}}성공 하면 돌아옵니다 .


0

VM 일시 중단 / 재개 후 시간 동기화에 비슷한 방법을 사용하지만 올바른 방향으로 동기화해야하고 짧은 차이보다 길어서 NTPD로 해결할 수 있다고 추측하는 것이 좋습니다.

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

추신. 새로운 centos 6.7 changelog에 따르면 이것은 kvm-clock clock source로만 자동으로 수행 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.