호스트를 종료할 때 kvm 가상 머신을 정상적으로 종료하려면 어떻게 해야 합니까?

호스트를 종료할 때 kvm 가상 머신을 정상적으로 종료하려면 어떻게 해야 합니까?

이 질문을 바로 가져오면여기에서.

나는 Archlinux를 실행하고 있으며 시스템과 함께 VM이 자주 실행되고 있습니다. 실제로 대부분의 경우.

내 목표는 다음과 같은 동작을 생성하는 것입니다.

  • 종료/전원 끄기/재부팅/중지 신호가 시스템에 전송됩니다.
  • 가상 머신을 정상적으로 종료하는 것 외에는 아무 조치도 취하지 않습니다.
  • X초 후에 VM이 정상적으로 종료되면 호스트 시스템도 종료됩니다.
  • 그렇지 않은 경우 다른 명령을 실행하십시오.

어디서부터 시작해야 할지 모르기 때문에 무엇을 해야 할지에 대한 좋은 아이디어만 알려주십시오. 살펴볼 수 있는 커널에 대한 호출이 있는 것 같습니다.

알려줘요.


내 현재 코드

현재 저는 이 스크립트를 사용하여 kvm 가상 머신을 정상적으로 종료하고 있으며 작동합니다! 하지만 내 사용자가일시 휴업또는재부팅그의 껍질을 사용합니다. 다른 경우에는 작동하지 않습니다.

이러한 별칭은 다음과 같습니다.

alias sudocheck="/bin/bash /home/damiano/.script/sudocheck"
alias sudo="sudocheck "

이 기능을 트리거하고 있습니다:

#!/bin/bash

# This script checks for what is being passed to sudo.
# If the command passed is poweroff or reboot, it
# launches a custom script instead, that also looks
# fur currently running virtual machines and shuts them.

sudocheck() {
    if [ $1 == "poweroff" ] || [ $1 == "reboot" ]; then
        eval "sudo /home/damiano/.script/graceful $@"
    else
        eval "sudo $@"
    fi
}
sudocheck $@

필요한 경우 이 스크립트가 시작됩니다.

#!/bin/bash
i=0
e=0
## if virsh finds VMs running
virsh -c qemu:///system list | awk '{ print $3}' | \
if grep running > /dev/null ; then
    virsh -c qemu:///system list --all | grep running | awk '{print "-c qemu:///system shutdown "$2}' | \
## shuts them dow gracefully
    xargs -L1 virsh
## wait 30 seconds for them to go down
    until (( i >= 30 || e == 1 )) ; do
## check every second for their status
        virsh -c qemu:///system list --all | awk '{ print $3}' | \
        if grep -E '(running|shutdown)' > /dev/null ; then
## keep waiting if still running
            if (( i <= 30 )) ; then
                sleep 1 && let i++ && echo $i
            else
                e=1 && notify-send 'Shutdown has been canceled' 'Please check the status of your virtual machines: seems like even though a stop signal has been sent, some are still running.' --urgency=critical
            fi
        else
## if no machine is running anymore, original power command can be executed
            e=1 && eval $@
        fi
    done
fi

시스템 단위

또한 VM 실행을 관리하기 위해 다음 초안을 만들었습니다.

[이메일 보호됨]

[Unit]
Description=This service manages the execution of the %i virtual machine
Documentation=https://libvirt.org/manpages/virsh.html

[Service]
ExecStartPre=virsh -c qemu:///system
ExecStart=virsh start %i
ExecStop=virsh -c qemu:///system
ExecStop=virsh shutdown %i 
TimeoutStopSec=30
KillMode=none

[Install]
WantedBy=multi-user.target

하지만 데스크탑 환경을 종료하지 않고 그대로 유지하도록 시스템에 어떻게 지시할 수 있습니까?까지VM이 성공적으로 종료되었습니까? 시스템이 VM을 종료할 수 없으면 DE에 있는 동안 종료하고 싶기 때문입니다. 나는 컴퓨터가 모든 서비스를 중지하기 시작하고 강제로 종료될 때까지 정지 상태를 유지하는 것을 원하지 않습니다.

답변1

VM을 제어하는 ​​이상한 방법. 좋은 방법 - VM을 자동으로 시작하고 중지하려면 systemd를 사용하세요. 예를 들어:

/etc/systemd/system/[이메일 보호됨]

[Unit]
Description=QEMU virtual machine

[Service]
Environment="type=system-x86_64" "haltcmd=kill -INT $MAINPID"
EnvironmentFile=/etc/conf.d/qemu.d/%i
ExecStart=/usr/bin/qemu-${type} -name %i -nographic $args
ExecStop=/bin/sh -c ${haltcmd}
TimeoutStopSec=30
KillMode=none

[Install]
WantedBy=multi-user.target

... 그리고 물론 VM 실행을 위한 구성은 다음과 같습니다.

/etc/conf.d/qemu.d/one

type="system-x86_64"

args="-enable-kvm -m 512 -hda /dev/vg0/vm1 -net nic,macaddr=DE:AD:BE:EF:E0:00 \
 -net tap,ifname=tap0 -serial telnet:localhost:7000,server,nowait,nodelay \
 -monitor telnet:localhost:7100,server,nowait,nodelay -vnc :0"

haltcmd="echo 'system_powerdown' | nc localhost 7100" # or netcat/ncat

# You can use other ways to shut down your VM correctly
#haltcmd="ssh powermanager@vm1 sudo poweroff"

...그리고 또 다른 VM 구성:

/etc/conf.d/qemu.d/two

args="-enable-kvm -m 512 -hda /srv/kvm/vm2.img -net nic,macaddr=DE:AD:BE:EF:E0:01 \
 -net tap,ifname=tap1 -serial telnet:localhost:7001,server,nowait,nodelay \
 -monitor telnet:localhost:7101,server,nowait,nodelay -vnc :1"

haltcmd="echo 'system_powerdown' | nc localhost 7101"

등등. ArchWiki 기여자들에게 감사드립니다이 기사에 대한.

답변2

원본 게시물의 초안과 @Oxyd의 답변은 각 가상 머신을 개별적으로 제어해야 할 때 유용합니다.

그러나 종료/시작을 원하는 경우모든 VM위에서 언급한 libvirt 게스트를 사용할 수 있습니다.Libvirt 문서.

  • 파일을 편집 /etc/conf.d/libvirt-guests하거나 /etc/sysconfig/libvirt-guestsCentOS의 경우 다음을 설정 ON_SHUTDOWN=shutdown하고SHUTDOWN_TIMEOUT=0
  • libvirt-guests예를 들어 서비스를 활성화해야 한다고 생각합니다 systemctl enable libvirt-guests.systemctl start libvirt-guests

관련 정보