Назад | Перейти на главную страницу

Почему не работают символические ссылки в автозапуске kvm

Развернул 2 гостей kvm ( db и приложение) на хосте Debian7.

Я могу настроить их автозапуск

root@mhost:~# virsh autostart db
root@mhost:~# virsh autostart app

Фактически это создает 2 символические ссылки в /etc/libvirt/qemu/autostart/ :

root@mhost:~# ls /etc/libvirt/qemu/autostart/
db.xml app.xml

Затем я подумал, что могу обеспечить порядок запуска двух гостей, просто изменив имя ссылки:

root@mhost:/etc/libvirt/qemu/autostart# mv db.xml 10db.xml
root@mhost:/etc/libvirt/qemu/autostart# mv app.xml 20app.xml

но оказывается, это не работает. На самом деле после изменения названия ссылок они даже больше не запускаются. В чем проблема?

Eсть похожий вопрос с ответом, но он не объяснил, почему метод символических ссылок не работает.

Кроме того, я пытался использовать сценарий запуска инициализации, чтобы обеспечить порядок, но это тоже не сработало. Я не специалист по сценариям оболочки, поэтому в моем сценарии могут быть проблемы, например, следующее:

#! /bin/sh
# /etc/init.d/kvmguests

case "$1" in
    start)
        echo "Starting all kvm guests ..."
        virsh start db
        virsh start app
        echo "Done."
        ;;
    stop)
        echo "Stopping all kvm guests ..."
        virsh shutdown app
        virsh shutdown db
        echo "Done."
        ;;
    *)
        echo "Usage: /etc/init.d/kvmguests {start|stop}"
        exit 1
        ;;
esac
exit 0

IMHO Я не думаю, что вы можете контролировать порядок загрузки, изменяя имена символических ссылок. но есть обходной путь

В /etc/sysconfig/libvirt-guests вариант START_DELAY вы можете установить задержку между загрузками (чтобы не все виртуальные машины запускались одновременно)

Чтобы (вроде) контролировать порядок, который вы можете изменить <emulator> в XML домена и укажите на ваш скрипт, который запустит домен после некоторой задержки

например что-то вроде этого:

<domain type='kvm'>
  <name>test</name>
  ...
  <devices>
    <emulator>/usr/local/bin/qemu-kvm-delay</emulator>
  <devices>
</domain>

содержание /usr/local/bin/qemu-kvm-delay может быть так просто, как:

sleep 1000
exec /usr/bin/qemu-kvm $*

или что-то необычное, например, проверка доступности какой-либо службы и расчет задержки для каждой виртуальной машины

Это проблема на уровне приложений, а не на уровне инфраструктуры.

На самом деле загрузка 2 экземпляров KVM означает, что вы включи их, нет никакой гарантии относительно последовательности загрузки двух операционных систем внутри этих двух экземпляров KVM с точки зрения KVM.

Однако вы можете сделать это самостоятельно. вот логика:

  1. загрузите виртуальную машину с именем dbубедитесь, что приложение базы данных внутри этой виртуальной машины работает
  2. затем загрузите виртуальную машину с именем приложение. Возможно, вам нужно убедиться, что приложения подключены к вашей базе данных.

Возьмем, к примеру, mysql, вот простой сценарий bash:

#!/bin/bash

# start the database VM
sudo virsh start db

# make sure the database is started
IS_DB_DOWN=true
while $IS_DB_DOWN; do
  # test if the DB is up
  nc -z <your-db-host> 3306 > /dev/null 2>&1
  if [ $? -eq 0 ]; then
    IS_DB_DOWN=true
  fi
  sleep 5 # use 5 sec as internal
done

# start your VM that runs application
sudo virsh start app