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

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

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

  1. #!/bin/sh
  2. ### BEGIN INIT INFO
  3. # Provides: kvm-shutdown
  4. # Required-Start: $remote_fs
  5. # Required-Stop: $remote_fs
  6. # Default-Start: 2 3 4 5
  7. # Default-Stop: 0 1 6
  8. # Short-Description: Shutdown Guest KVM Hosts
  9. # Description: Shutdown Guest KVM Hosts
  10. ### END INIT INFO
  11. # Author: Князь <demiurg (at) propheta.ru>
  12. #
  13. # Do NOT "set -e"
  14. # PATH should only include /usr/* if it runs after the mountnfs.sh script
  15. PATH=/sbin:/usr/sbin:/bin:/usr/bin
  16. DESC="Shutdown Guest KVM Hosts"
  17. NAME=kvm-shutdown
  18. SCRIPTNAME=/etc/init.d/$NAME
  19. # Exit if the package is not installed
  20. [ -x "/usr/bin/virsh" ] || exit 0
  21. [ -S "/var/run/libvirt/libvirt-sock" ] || exit 0
  22. # Load the VERBOSE setting and other rcS variables
  23. . /lib/init/vars.sh
  24. # Define LSB log_* functions.
  25. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
  26. . /lib/lsb/init-functions
  27. export LANG=C
  28. #
  29. # Function that stops the daemon/service
  30. #
  31. virsh_list()
  32. {
  33. virsh list 2>/dev/null | grep -E 'running$' | awk '{ print $2 }'
  34. }
  35. do_stop()
  36. {
  37. LIST=$(virsh_list)
  38. for i in $LIST;
  39. do
  40. virsh shutdown $i 1>/dev/null 2>/dev/null
  41. echo
  42. echo -n "Shutdown $i ";
  43. while [ "$(virsh_list | grep $i)" ];
  44. do
  45. echo -n '.'
  46. sleep 2
  47. done;
  48. done;
  49. if [ "$LIST" ]; then echo; fi;
  50. }
  51. case "$1" in
  52. stop)
  53. [ "$VERBOSE" != no ] && log_daemon_msg "Activating $DESC" "$NAME"
  54. do_stop
  55. case "$?" in
  56. 0|1)
  57. [ "$VERBOSE" != no ] && log_end_msg 0
  58. break
  59. ;;
  60. 2)
  61. [ "$VERBOSE" != no ] && log_end_msg 1
  62. break
  63. ;;
  64. esac
  65. break
  66. ;;
  67. *)
  68. echo "Usage: $SCRIPTNAME stop" >&2
  69. exit 3
  70. ;;
  71. 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 комментария:

Сергей комментирует...

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

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

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