18 июня 2010 г.

Продолжение про kvm

Продолжим записи про kvm.
Чтобы виртуальная система загружалась автоматически при старте основной системы, надо выполнить:

#virsh autostart name_domain

Чтобы корректно выключить (эмулируется нажатие на клавишу питания, что для современных дебианов с поддержкой acpi обеспечивает корректное завершение работы) виртуальную машину выполните:

#virsh shutdown name_domain

Ну и чтобы запустить, выполните:

#virsh start name_domain

Теперь про выключение/перезагрузку основной системы и соответственное выключение виртуальных машин (может очень полезным при выключении основной системы с помощью apcupsd (управление питанием в зависимости от состояния бесперебойника APC).


Создаем скрипт /etc/init.d/vmshutdown

  1. #!/bin/bash  
  2.   
  3. # Original Author :  
  4. #    Joern http://www.linux-kvm.com/content/stop-script-running-vms-using-virsh  
  5. #  
  6. # Modified by : Vivek Kapoor http://exain.com  
  7. # Date: 22 May 2009  
  8.   
  9. # Parameters you can modify :: START  
  10.   
  11. TIMEOUT=90  
  12. LISTFILE=/root/runvm.lst  
  13. LOGFILE=/var/log/kvmshutdown.log  
  14. # Parameters you can modify :: STOP  
  15.   
  16. PS=/bin/ps  
  17. SSH=/usr/bin/ssh  
  18. GREP=/bin/grep  
  19. CUT=/usr/bin/cut  
  20. VIRSH=/usr/bin/virsh  
  21. TR=/usr/bin/tr  
  22. CAT=/bin/cat  
  23. DATE=/bin/date  
  24.   
  25. # Function to shutdown the virtual machine  
  26. kvmshutdown () {  
  27. COUNT=0  
  28. PID=$($PS ax|$GREP $1|$GREP kvm|$CUT -c 1-6)  
  29.   
  30. echo kvmshutdown \: Shutting down $1 with pid $PID  
  31.   
  32. #$VIRSH shutdown $1  
  33. $($SSH root@$1 halt)  
  34.   
  35. while [ "$COUNT" -lt "$TIMEOUT" ]  
  36. do  
  37.  $PS --pid $PID  
  38.  if [ "$?" -eq "1" ]  
  39.  then  
  40.  return 0  
  41.  else  
  42.  sleep 5  
  43.  COUNT=$(($COUNT+5))  
  44.  fi  
  45. done  
  46.   
  47. echo kvmshutdown \: Timeout happened. Destroying VM $1  
  48.   
  49. $VIRSH destroy $1  
  50.   
  51. return 1  
  52.   
  53. }  
  54.   
  55. # The program begins here  
  56.   
  57. $VIRSH list 2>/dev/null|$GREP running|$TR -s \ |$CUT -f3 -d\  > $LISTFILE  
  58.   
  59. VMN=`$CAT $LISTFILE`  
  60.   
  61. for vm in $VMN  
  62. do  
  63.  echo "$vm" is running  
  64.  kvmshutdown "$vm"  
  65.  if [ "$?" -eq "0" ]  
  66.  then  
  67.  echo VM "$vm" normally shutdown  
  68.  echo `$DATE +%Y-%m-%d\ %H:%M:%S` VM $vm normally shutdown >> $LOGFILE  
  69.  else  
  70.  echo VM "$vm" destroyed !  
  71.  echo `$DATE +%Y-%m-%d\ %H:%M:%S` VM $vm destroyed >> $LOGFILE  
  72.  fi;  
  73. done  


Далее, права запуска:
#chmod 755 vmshutdown

Проверяем выключение по ssh (как в скрипте, есть вариант через virsh - пробуйте), не забыв прописать хост в /etc/hosts.

server:/etc/init.d# ./vmshutdown stop

У меня спросил разрешения на отпечаток ключа RSA, после пароль рута, и только тогда выключился. Наверное метод через ssh требует беспарольного доверенного соединение, поэтому вернемся к virsh (закомментируем $($SSH root@$1 halt) и раскомментируем $VIRSH shutdown $1).

Пробуем:

server:/etc/init.d# ./vmshutdown stop

У меня все получилось - скрипт выключил все виртуальные машины. Остается внедрить его в rc.d.

Смотрим на уровень запуска самого kwm на основной системе.

/etc/rc0.d# ls | grep kvm
K20qemu-kvm

Посему выставляем 18 уровень для завершения виртуальных машин.

  1. #ln -s /etc/init.d/vmshutdown /etc/rc0.d/K18vmshutdown  
  2. #ln -s /etc/init.d/vmshutdown /etc/rc6.d/K18vmshutdown  


Теперь подключаемся по ssh к виртуальным машинам и к основному хосту. На основном выполняем:
#poweroff
или:
#reboot
и наблюдаем за виртуальными машинами.

Они должны выключиться раньше основной.

Ну а выключение с помощью apcupsd или позже или не буду описывать, ибо мануалов много, посмотрим.

Комментариев нет:

Отправить комментарий