У меня есть libvirt / KVM, настроенный на моем Ubuntu, и перед выключением машины я хотел бы, чтобы он попытался выключить виртуальную машину с помощью ACPI poweroff (выключение virsh), затем я хочу, чтобы он останавливал выключение не менее чем на 60 секунд, чтобы дать У виртуальной машины есть шанс синхронизировать все на диск, вот что у меня есть:
pre-stop script
SHUTDOWN_LOG=/var/log/libvirt/qemu/shutdown_vms.log
for RUNNING_VM in `virsh list | grep -E running | awk -F" " '{ print $2 }'`
do
echo "Shutting down ${RUNNING_VM} on `date`" >> $SHUTDOWN_LOG
virsh shutdown ${RUNNING_VM}
done
echo -n "Waiting for VM's to shut down: " >> $SHUTDOWN_LOG
for I in `seq 1 10`
do
RUNNING=`virsh list | grep running | wc -l`
if [[ "$RUNNING" == "0" ]]
then
echo "done." >> $SHUTDOWN_LOG
exit 0
else
/bin/sleep 6 && echo -n " ${RUNNING} " >> $SHUTDOWN_LOG
fi
done
echo " Cleaning up..." >> $SHUTDOWN_LOG
end script
Проблема, с которой я столкнулся, заключается в том, что по какой-то странной причине он никогда не повторяется "готово". даже если все виртуальные машины выключены правильно, она будет продолжать зацикливаться и, таким образом, останавливаться на 60 секунд, ИЛИ она, кажется, полностью игнорирует сон, записывает общую сумму в $SHUTDOWN_LOG
и в любом случае немедленно завершает работу во время синхронизации моей виртуальной машины с диском.
Shutting down FreeBSD-services on Mon Aug 22 02:07:42 MDT 2011
Shutting down FreeBSD-pgsql on Mon Aug 22 02:07:42 MDT 2011
Waiting for VM's to shut down: 1 [EOF]
Выход журнала ... есть ли лучший способ войти в систему из выскочки?
https://bugs.launchpad.net/ubuntu/lucid/+source/libvirt/+bug/350936 была недавно исправлена, поэтому скоро должна быть обновлена libvirt.
К сожалению, вы не можете повторить эхо из сценария-выскочки, лучшим вариантом является тот, который вы уже делаете, а именно создание собственного журнала.
Если вы хотите также выводить данные в системный журнал, вы можете сделать это в выскочке с помощью logger (как в init.d), но отладка Upstart пока что довольно жесткая.
Вы также можете добавить set -x
в начале вашего сценария предварительной остановки, чтобы получить больше результатов через канал журнала выскочки по умолчанию (syslog в Ubuntu)