KVM корректная остановка виртуальных машин

Материал из База знаний
Перейти к: навигация, поиск

Как корректно остановить виртуальные машины KVM Для начала в /etc/rc.d/init.d создадим скрипт shutdownkvm:

#!/bin/bash
#
# chkconfig: 03456 99 01
# description: Shut down KVM virtual machines
# processname: shutdownkvm
#
# Original Author :
#    Joern http://www.linux-kvm.com/content/stop-script-running-vms-using-virsh
#
# Modified by : Andrey Mundirov http://pclovers.ru
# Date: 18 March 2011 

# Parameters you can modify :: START
TIMEOUT=300
LISTFILE=/root/runvm.lst
LOGFILE=/var/log/kvmshutdown.log
# Parameters you can modify :: STOP

PS=/bin/ps
SSH=/usr/bin/ssh
GREP=/bin/grep
CUT=/usr/bin/cut
VIRSH=/usr/bin/virsh
TR=/usr/bin/tr
CAT=/bin/cat
DATE=/bin/date

# Function to shutdown the virtual machine
kvmshutdown () {
   COUNT=0
   PID=$($PS ax|$GREP $1|$GREP kvm|$CUT -c 1-6)

   echo kvmshutdown \: Shutting down $1 with pid $PID

   $VIRSH shutdown $1
   #$($SSH root@$1 halt)

   while [ "$COUNT" -lt "$TIMEOUT" ] ; do
       echo -n "."
       $PS --pid $PID > /dev/null 2>&1
       if [ "$?" -eq "1" ] ; then
           return 0
       else
           sleep 5
           COUNT=$(($COUNT+5))
       fi
   done

   echo kvmshutdown \: Timeout happened. Destroying VM $1

   $VIRSH destroy $1

   return 1
}

start()
{
   touch /var/lock/subsys/shutdownvm
}

stop()
{
   echo `$DATE +%Y-%m-%d\ %H:%M:%S` Starting script $0  >> $LOGFILE

   rm -f /var/lock/subsys/shutdownvm

   LANG=en $VIRSH list 2>/dev/null | $GREP running | $TR -s \ |$CUT -f3 -d\  > $LISTFILE

   VMN=`$CAT $LISTFILE`

   for vm in $VMN ; do
       echo "$vm" is running
       kvmshutdown "$vm"
       if [ "$?" -eq "0" ] ; then
           echo VM "$vm" normally shutdown
           echo `$DATE +%Y-%m-%d\ %H:%M:%S` VM $vm normally shutdown >> $LOGFILE
       else
           echo VM "$vm" destroyed !
           echo `$DATE +%Y-%m-%d\ %H:%M:%S` VM $vm destroyed >> $LOGFILE
       fi
   done
}

# The program begins here

case "$1" in
   *start)
       start
       ;;
   stop)
       stop
       ;;
   *)
       echo "Use: $0 (start|stop)"
       ;;
esac

затем выполняем последовательно:

chmod +x shutdownkvm
chkconfig shutdownkvm on
service shutdownkvm start