понедельник, 4 мая 2009 г.

Скрипт для корректного выключения гостевых хостов в libvirt

Ввиду неспособности libvirt-bin корректно отключать гостевые хосты при выключении/ребуте сервера, решил написать свой скрипт

#!/bin/sh
### BEGIN INIT INFO
# Provides: kvm-shutdown
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Shutdown Guest KVM Hosts
# Description: Shutdown Guest KVM Hosts
### END INIT INFO

# Author: Князь <demiurg (at) propheta.ru>
#

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Shutdown Guest KVM Hosts"
NAME=kvm-shutdown
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "/usr/bin/virsh" ] || exit 0
[ -S "/var/run/libvirt/libvirt-sock" ] || exit 0

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

export LANG=C

#
# Function that stops the daemon/service
#
virsh_list()
{
virsh list 2>/dev/null | grep -E 'running$' | awk '{ print $2 }'
}

do_stop()
{
LIST=$(virsh_list)
for i in $LIST;
do
virsh shutdown $i 1>/dev/null 2>/dev/null
echo
echo -n "Shutdown $i ";
while [ "$(virsh_list | grep $i)" ];
do
echo -n '.'
sleep 2
done;
done;
if [ "$LIST" ]; then echo; fi;
}

case "$1" in
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Activating $DESC" "$NAME"
do_stop
case "$?" in
0|1)
[ "$VERBOSE" != no ] && log_end_msg 0
break
;;
2)
[ "$VERBOSE" != no ] && log_end_msg 1
break
;;
esac
break
;;
*)
echo "Usage: $SCRIPTNAME stop" >&2
exit 3
;;
esac
Сохраняем скрипт в файл «/etc/init.d/kvm-shutdown» и делаем его исполняемым
$ sudo chmod +x /etc/init.d/kvm-shutdown
Создаем символические ссылки в rc0, rc1, rc6
$ sudo ln -s ../init.d/kvm-shutdown /etc/rc0.d/K19kvm-shutdown
$ sudo ln -s ../init.d/kvm-shutdown /etc/rc1.d/K19kvm-shutdown
$ sudo ln -s ../init.d/kvm-shutdown /etc/rc6.d/K19kvm-shutdown
Префикс K19 выбран для того, чтобы скрипт запускался перед «/etc/init.d/libvirt-bin» (префикс K20)

2 комментария:

Sergey комментирует...

Вот это то, что я искал!!!! Респект!!! А не подскажешь следующий момент - точно то же самое, но для перезапуска сети? У меня, к примеру, гости хостятся на Debian Lenny и к сети привязаны через бридж. При попытке на хостовой системе перегрузить сетку /etc/init.d/networking restart сеть намертво умирает в гостевом виндосе... Помогает перезапуск libvirt /etc/init.d/libvirt-bin restart Что делать?

netc комментирует...

лучше
update-rc.d kvm-shutdown defaults 19 19