前言:KVM虚拟机系统是榨取服务器最大性能的一种好方法,但是谁也不想让服务器启动的时候要等待5分钟甚至以上的时间。 为了减轻服务器开机时的任务数量,需要虚拟机在开机后一段时间内,按顺序逐次启动,以达到各个服务间的依赖和功能衔接。
一、先上代码:kvm-vm.service
[Unit]
Description=Start KVM Guests
After=network-online.target
[Service]
Type=simple
ExecStart=/bin/bash -c 'while ! ping -c1 192.168.1.240 &>/dev/null; do sleep 1; done; for guest in NFS Mysql PHP Nginx; do virsh start $guest; sleep 1m; done'
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
说明:
a. ping -c1 192.168.1.240 ,这一句表示在ping出KVM主机的ip回应后,开始执行后继的命令;240是KVM主机的IP。
b. NFS Mysql PHP Nginx 这是我的四个vm的名称,因为这几个服务又一定的依赖性,所以按顺序启动。NFS为其他三个服务提供存储功能;Mysql 为wordpress、nextcloud提供数据库功能;PHP服务器开了多个pool,最后被nginx反向代理.
c. sleep 1m 表示间隔1分钟开启一个虚拟机。
特别说明: 这个service是一直保持运行的,如果进入虚拟机,运行poweroff,则1分钟以后,该虚拟机还会被启动起来。 下面的是进阶版,服务器启动5分钟后再开始运行 kvm-vm.service, 并且运行5分钟后,自己会关闭, systemctl status kvm-vm.service 的状态也是inactive的
二、进阶版
[Unit]
Description=Start KVM Guests
After=network-online.target
[Service]
TimeoutStartSec=infinity
ExecStartPre=/bin/sleep 300
ExecStart=/bin/bash -c 'while ! ping -c1 192.168.1.240 &>/dev/null; do sleep 1; done; for guest in NFS Mysql PHP Nginx; do virsh start $guest; sleep 1m; done'
TimeoutStopSec=1
KillSignal=SIGINT
[Install]
WantedBy=multi-user.target
以上内容设定了KVM系统开机后300秒后该服务的具体功能才开始执行,在任务完成后,再过1分钟,该服务自动关闭。
三、rc.local 系统的顺序启动脚本
1. 当然,系统首先要又rc.local程序,或者本身就是rc.local管理的,例如Alpine Linux.
Alpine Linux的半自动安装和桌面、远程登录、frp、aria2服务等的配置_alpinelinux安装桌面_lggirls的博客-CSDN博客
2. vim vms-start.sh
#!/bin/bash
# 一个控制KVM虚拟机在KVM宿主机启动后,按照1.5分钟启动一个的频率,顺序启动的脚本;
# 总计6个虚拟机,名称分别是: NFS,Rides,Mysql,Only,PHP,Nginx;
# 用虚拟机的名称设定一个数组,要按照启动顺序编写,空格隔开;
guests=(NFS Rides Mysql PHP Nginx)
# 轮询数组中的虚拟机名称,间隔1.5分钟启动一次;
for guest in "${guests[@]}";
do
# 使用virsh 命令启动虚拟机
virsh start "$guest"
# 检查退出状态,并输出一个消息
if [ $? -eq 0 ];
then
echo "Started $guest successfully."
else
echo "Failed to start $guest!"
fi
# 在开始新一个虚拟机的轮询前,等待90秒;
sleep 90
done
# 退出该脚本
exit 0
3. 加入rc.local 启动项
update-rc.d kvm-start