Говорят, что поддержка системы виртуализации XEN в RHEL и, соответственно, CentOS продлится не позднее, чем до 2014 г. А посему админы дружною толпой должны пойти на
водопой KVM, официально объявленный базовым. Хорошо, пробуем, поднимаем виртуалку, ставим туда систему, глушим из virt-manager'а, запускаем... опаньки, а там проверка файловой системы началась. Т.е. вместо того, чтобы корректно заглушить виртуалку, её грубо уронили мордой в салат. Идём во глубину конфига, обнаруживаем там для режима on_poweroff параметр destroy. Фигеем, меняем destroy на shutdown, глушим, радуемся, запускаем -- фигвам, не стартует и гнусно матерится. Возвращаем destroy на место -- всё стартует, ну вот так оно сейчас реализовано.
Оказывается, в XEN для того, чтобы корректно глушить виртуалки, используется отдельный стартстопный скрипт, до сих пор почему-то отсутствующий в KVM из коробки. Ну что ж, можно написать аналог, а можно и найти готовый работающий вариант -- например, тут:
http://www.salstar.sk/pub/salpack/etc/rc.d/init.d/virt-shutdown
(найдено в списке рассылки
http://www.mail-archive.com/libvir-list@redhat.com/msg14754.html)
Ставим, радуемся, пробуем перезагрузить хост-машину, видим, как начинает выполняться наша самоделка, и как ея лихо и грубо прерывает скрипт остановки libvirtd с криком "Кто не спрятался, я не виноват!" Говорим нехорошие слова и добавляем в заголовок оного /etc/init.d/libvirtd (хотя бы перед строкой "# Default-Start: 3 4 5") строчку
# Required-Stop: virt-shutdown
Собственно, и всё: праздник души и именины сердца. 8-)
А вышеупомянутый скрипт выглядит так:
#!/bin/sh
# the following is the LSB init header see
#
http://www.linux-foundation.org/spec//booksets/LSB...re-generic.html#INITSCRCOMCONV
#
### BEGIN INIT INFO
# Provides: virt-shutdown
# Should-Start: libvirtd
# Default-Start: 3 4 5
# Short-Description: shutdown libvirt domains
# Description: This is a script for shutting down virtual machines
# on shutdown of host system.
### END INIT INFO
# the following is chkconfig init header
#
# virt-shutdown: shutdown libvirt domains
#
# chkconfig: 345 97 01
# description: This is a scripts for shutting down virtual machines
# on shutdown of host system.
#
# Source function library.
. /etc/rc.d/init.d/functions
LC_ALL=C
VIRSH="virsh -c qemu:///system"
WAIT_SECONDS=300
post_script() {
true
}
RETVAL=0
[ -e /etc/sysconfig/virt-shutdown ] && . /etc/sysconfig/virt-shutdown
stop() {
echo -n $"Shutting down virtual machines: "
DOM_LIST=`$VIRSH list | grep running | awk '{ print $1 }'`
for DOM_ID in $DOM_LIST; do
echo -n "`$VIRSH domname $DOM_ID | head -n 1` "
$VIRSH shutdown $DOM_ID >/dev/null
done
N=`$VIRSH list | grep running | wc -l`
WAIT_SECONDS=$((WAIT_SECONDS*N))
for i in `seq $WAIT_SECONDS`; do
N=`$VIRSH list | grep running | wc -l`
if [ $N -eq 0 ]; then
break
fi
sleep 1
echo -n "$N "
done
if [ $N -eq 0 ]; then
RETVAL=0
echo
else
echo
echo "These virtual machines are still running:"
$VIRSH list | grep running
RETVAL=1
fi
post_script stop
}
# See how we were called.
case "$1" in
start)
touch /var/lock/subsys/virt-shutdown
RETVAL=0
;;
stop)
stop
rm -f /var/lock/subsys/virt-shutdown
;;
status)
status virt-shutdown
$VIRSH list
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|status}"
exit 1
;;
esac
exit $RETVAL