Как правильно выключать гостевые ОС KVM?

Добрый день! Имеется сервак(centos 7) в офисе + ups must 3000VA с консольным СОМ портом. Все это дело подключил друг к другу и установил nut. На сервере имеется kvm, на котором крутятся машинки windows и linux. Собственно задача: при выключении света упс дает сигнал что она работает от батарей, потом когда разряд доходит до минимума посылает команду nut-monitor который в свою очередь выполняет скрипт выключения машинок и выключения хост машины. Собственно вся проблема в том что именно windows машины получая сигнал выключения зависают и не хотят выключатся. Что было сделанно:
установил груповые политики в windows, чтобы выключался сервер не входя в систему и не выводиk окошко о том как завершить работу сервера. Установил в реестре значение ShutdownWarningDialogTimeout=00000001
не помогло
установил настройки в файле /etc/sysconfig/libvirt-guests
ON_SHUTDOWN=shutdown
PARALLEL_SHUTDOWN=1
SHUTDOWN_TIMEOUT=90

не помогло
конфиг /etc/ups/ups.conf
[Must]
        driver = blazer_ser
        port = /dev/ttyS0
        desc = "server"
        offdelay = 300
        ondelay = 0

конфиг /etc/ups/upsmon.conf
RUN_AS_USER nut
MONITOR Must@localhost 1 monuser password master
MINSUPPLIES 1
SHUTDOWNCMD "sudo /etc/ups/shutdown.sh --shutdown"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/ups/killpower
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 0

конфиг /etc/ups/upsd.users
[monuser]
   password = password
   actions = SET
   instcmds = ALL
   upsmon master

ну и сам скрипт выключения
#!/bin/bash
shutdown_quests(){
LIST_VM=`virsh list | grep running | awk '{print $2}'`
TIMEOUT=90
DATE=`date -R`
LOGFILE="/etc/ups/kvm-quest-shutdown.log"
if [[ ! -e $LOGFILE ]]; then
        touch $LOGFILE
        #echo "$LOGFILE created" 1>&2
elif [[ ! -d $LOGFILE ]]; then
        echo "$DATE : Start script" >> $LOGFILE
fi


for activevm in $LIST_VM
do
        PIDNO=`ps ax | grep $activevm | grep kvm | cut -c 1-6 | head -n1`
        echo "$DATE : Shutdown : $activevm : $PIDNO" >> $LOGFILE
        virsh shutdown $activevm > /dev/null
        COUNT=0
        while [ "$COUNT" -lt "$TIMEOUT" ]
        do
                ps --pid $PIDNO > /dev/null
                if [ "$?" -eq "1" ]
                        then
                        COUNT=110
                else
                        sleep 5
                        COUNT=$(($COUNT+5))
                fi
        done
        if [ $COUNT -lt 110 ]
                then
                echo "$DATE : $activevm not successful force shutdown" >> $LOGFILE
                virsh destroy $activevm > /dev/null
        fi
done
}
note(){
        echo -e "--------------------------------------------------------\n"
        echo -e "\nYou need usage script with arguments: --reboot ot --shutdown:\n\n $0 --shutdown\n"
        exit 1
}
reboot_node(){
        reboot
}

shutdown_node(){
        systemctl poweroff -i
}


if [ $# -ne 1 ]; then
    note
fi

for i in "$@" ; do

    if [[ $i == "--reboot" ]] ; then
        shutdown_quests
        reboot_node
        break
    fi

    if [[ $i == "--shutdown" ]] ; then
        shutdown_quests
        shutdown_node
        break
    fi

done

изменил sudo файл
Defaults    !requiretty
nut ALL=(ALL) NOPASSWD: /etc/ups/shutdown.sh

Подскажите что я делаю нее так?! Почему при обычном systemctl poweroff -i машинки не выключаются а уничтожаются kvm? Заранее всем спасибо

удалось найти службу, которая следит за гостевыми машинами, libvirt-guests.service, запустил ее. Теперь если ее остановить, то машинки выключаются как положено. А если послать сигнал выключения хост машине, то выключение не дожидается окончания выключения гостевых машин. Попробую сделать скрипт, который будет останавливать службу libvirt-guests.service, проверять не осталось ли запущеных машин и выключать хост машину
  • Вопрос задан
  • 4530 просмотров
Решения вопроса 1
Scarfase1989
@Scarfase1989 Автор вопроса
Опытным путем было выявленно, что при завершении работы window server 2008 открытые пользовательские программы ждали завершения работы, но так как команда virsh shutdown vm посылает сигнал завершения работы от имени пользователя "система", у которой нет прав на завершение работы сервера с принудительным завершением работы терминальных пользователей, необходимо:
1. Дать необходимые права учетной записи "система" на завершение работы(делается в групповых политиках)
или
2. установить агента kvm который будет завершать работы сервера инструкция
в принципе все. Какой вариант удобен для вас тот и используйте, я остановился на установке агента
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы