我已经部署了 2 个 kvm guest 虚拟机(D b和应用程序) 在 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
但事实证明这不起作用。实际上,在更改链接名称后,它们甚至不再自动启动。问题是什么?
有一个类似问题给出了答案,但是并没有解释为什么符号链接方法不起作用。
另外,我尝试使用 init start 脚本来确保顺序,但也没有用。我不是一个 shell 脚本专家,所以我的脚本可能存在一些问题,例如:
#! /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
答案1
恕我直言,我认为你不能通过更改符号链接的名称来控制启动顺序。但有一个解决方法
在/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
这是应用程序级别的问题,而不是基础设施级别的问题。
实际上启动 2 个 KVM 实例意味着你打开电源,从 KVM 角度来看,无法保证这两个 KVM 实例内的两个操作系统的启动顺序。
但是,您可以自己做。逻辑如下:
- 启动名为D b,确保此虚拟机内的数据库应用程序正常运行
- 然后启动名为应用程序。也许您需要确保应用程序已连接到您的数据库。
以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