前言
在家庭环境中,考虑到省电问题(服务器晚上也挺吵的),购买了小米的智能插座,设置了一个定时开关插座任务。(9:00开启23:00关闭)
关于服务器的通电自动开机,在dell poweredge r530的BIOS里就能设置,处于安全考虑我还设置了通电后60秒的延迟开机。(在米家app自己有时会手残误操作)
但,这仅仅只解决了自动通断电和自动开机的问题,如果esxi上的虚拟机在定时断电之前没有关机的话,一定程度上可能会造成数据丢失、系统文件损毁等问题。
由于VMware esxi并没有提供定时关机的设置,只能通过脚本来实现。
实验目的:
让服务器可以按照以下时间流程自动运行:
09:00 小米插座自动通电
09:01 自动开机
09:06 自动向esxi写入定时关机系统计划任务(预计时间)
22:40 关闭全部正在运行的虚拟机
22:45 正常关机
23:00 小米插座自动断电
实验环境:
硬件:dell poweredge r530
OS:esxi 7.0 u2
一、启用esxi的ssh连接
登录esxi管理界面,然后如图启用ssh连接。
二、设置开机自动脚本
在esxi的shell命令行中不支持cron命令,只能修改计划任务文件(/var/spool/crontab/root),但由于这个文件每次重启后会被自动重置,所以我们需要设置开机自动向计划任务文件里添加定时关机。
我们只需要修改(/etc/rc.local.d./local.sh),在[exit 0]这一行之前添加如下的脚本,使其每次开机都自动添加定时任务。
1.用vim文本编辑打开/etc/rc.local.d./local.sh
vi /etc/rc.local.d./local.sh
2.在[exit 0]这一行之前添加如下的脚本并退出保存:
#关闭cron进程(关闭进程后修改计划任务root文件)
/bin/kill $(cat /var/run/crond.pid)
#向/var/spool/crontab/root里添加关闭虚拟机、关机的计划任务
/bin/echo '40 13 * * * /vmfs/volumes/datastore1/vm-shutdown.sh' >> /var/spool/cron/crontabs/root
/bin/echo '45 13 * * * /vmfs/volumes/datastore1/esxi-shutdown.sh' >> /var/spool/cron/crontabs/root
#重启cron进程(将加载修改后的root文件)
/usr/lib/vmware/busybox/bin/busybox crond
注:
- [#] 符号后为注释,并非命令。
- 40 13 、45 13 处表示任务执行时间,格式为[分] [时] [日] [月份] [星期],由于esxi的系统时间采用的是UTC时间(国际标准时间),而中国是UTC+8,所以想要在北京时间22:40时关闭虚拟机的话,就只需要用22-8算出UTC时间为14,任务执行时间填写为40 14 、45 14 就可以了。(由于博主是在日社畜,命令使用的是日本时间,国内的小伙伴请自行替换)
- datastore1处为esxi的本地存储的名称,请按实际情况自行替换。
- vm-shutdown.sh、esxi-shutdown.sh处分别为关闭虚拟机、关机脚本的名称。可自行命名定义。
- 关于vi命令的使用方法,请另行谷歌、百度查找。
三、保存开机自动命令设置
由于/etc/rc.local.d./local.sh文件重启后会丢失,所以需要手动执行一次下面的命令。(local.sh文件每次更改后想要永久保存设置的话,就需要手动执行一次。)
/sbin/auto-backup.sh
四、esxi关于关闭虚拟机命令的使用方法以及注意事项
由于esxi的特性,每次重启后系统文件都会被重置,如果把脚本存放在这些地方就需要每次开机后手动再创建一次脚本。但/vmfs/volumes/datastore1/目录里的文件不会被重置。所以我们需要在这个目录下创建关闭虚拟机和关机两个脚本。在此之前我们需要了解一下esxi关于关闭虚拟机命令的使用方法以及注意事项。在本次实验中将会用到以下命令:
#查询现有的虚拟机一览,可以查询到VMID
vim-cmd vmsvc/getallvms
#关闭虚拟机电源(等同于拔插头,无需VMware tools的配合)
#例:vim-cmd vmsvc/power.off 1
vim-cmd vmsvc/power.off [VMID]
#关闭虚拟机(系统级别正常关机,需要VMware tools的配合)
#例:vim-cmd vmsvc/power.shutdown 1
vim-cmd vmsvc/power.shutdown [VMID]
#关闭esxi主机电源。
/sbin/poweroff
以下是相关命令,感兴趣的小伙伴们可以尝试一下。
#查询虚拟机的电源状态。(开机、关机)
#例:vim-cmd vmsvc/power.getstate 1
vim-cmd vmsvc/power.getstate [VMID]
#打开虚拟机电源(开机)
#例:vim-cmd vmsvc/power.on 1
vim-cmd vmsvc/power.on [VMID]
#重启虚拟机(系统级别正常重启,需要VMware tools的配合)
#例:vim-cmd vmsvc/power.reboot 1
vim-cmd vmsvc/power.reboot [VMID]
#显示虚拟机构成信息
#例:vim-cmd vmsvc/get.summary 1
vim-cmd vmsvc/get.summary [VMID]
五、创建关闭虚拟机、关机的脚本
1.获取需要自动关机的虚拟机VMID
vim-cmd vmsvc/getallvms
2.创建关闭虚拟机脚本文件
vi /vmfs/volumes/datastore1/vm-shutdown.sh
3.向脚本文件添加命令并保存
#!/bin/sh
#关闭虚拟机(有安装VMware tools的虚拟机使用power.shutdown,没有的就只能使用power.off来进行强制关机。)
vim-cmd vmsvc/power.shutdown 2
vim-cmd vmsvc/power.shutdown 3
vim-cmd vmsvc/power.shutdown 4
vim-cmd vmsvc/power.off 5
4.创建关机脚本文件
vi /vmfs/volumes/datastore1/esxi-shutdown.sh
5.向脚本文件添加命令并保存
#!/bin/sh
#关闭esxi主机电源
/sbin/poweroff
6.给关闭虚拟机、关机的脚本添加可执行权限
chmod +x /vmfs/volumes/datastore1/vm-shutdown.sh
chmod +x /vmfs/volumes/datastore1/esxi-shutdown.sh
注:
- [#] 符号后为注释,并非命令。
- datastore1处为esxi的本地存储的名称,请按实际情况自行替换。
- vm-shutdown.sh、esxi-shutdown.sh处分别为关闭虚拟机、关机脚本的名称。可自行命名定义。注意要和/etc/rc.local.d./local.sh文件里填入的文件名一致。
- 关于vi命令的使用方法,请另行谷歌、百度查找。
六、使关闭虚拟机、关机的脚本生效
到第五部分为止,已经完成了大部分设置,但脚本还暂时未生效。以下分两种方法介绍如何使脚本生效。
1.关机重启生效法
通过esxi管理界面手动重启,并再次启用ssh后输入以下命令:
cat /var/spool/cron/crontabs/root
会输出如下结果,可以看到成功添加了定时关机命令(输出结果可能会有变动,请按照实际情况判断。)
#min hour day mon dow command
1 1 * * * /sbin/tmpwatch.py
1 * * * * /sbin/auto-backup.sh
0 * * * * /usr/lib/vmware/vmksummary/log-heartbeat.py
*/5 * * * * /bin/hostd-probe.sh ++group=host/vim/vmvisor/hostd-probe/stats/sh
00 1 * * * localcli storage core device purge
*/10 * * * * /bin/crx-cli gc
40 13 * * * /vmfs/volumes/datastore1/vm-shutdown.sh
45 13 * * * /vmfs/volumes/datastore1/esxi01-shutdown.sh
2.手动命令生效法
在esxi启用了ssh的情况输入以下命令(请按照第二部分设置的代码,自行变更以下命令):
/bin/kill $(cat /var/run/crond.pid)
/bin/echo '40 13 * * * /vmfs/volumes/datastore1/vm-shutdown.sh' >> /var/spool/cron/crontabs/root
/bin/echo '45 13 * * * /vmfs/volumes/datastore1/esxi-shutdown.sh' >> /var/spool/cron/crontabs/root
/usr/lib/vmware/busybox/bin/busybox crond
cat /var/spool/cron/crontabs/root
会输出如下结果,可以看到成功添加了定时关机命令(输出结果可能会有变动,请按照实际情况判断。)
#min hour day mon dow command
1 1 * * * /sbin/tmpwatch.py
1 * * * * /sbin/auto-backup.sh
0 * * * * /usr/lib/vmware/vmksummary/log-heartbeat.py
*/5 * * * * /bin/hostd-probe.sh ++group=host/vim/vmvisor/hostd-probe/stats/sh
00 1 * * * localcli storage core device purge
*/10 * * * * /bin/crx-cli gc
40 13 * * * /vmfs/volumes/datastore1/vm-shutdown.sh
45 13 * * * /vmfs/volumes/datastore1/esxi01-shutdown.sh
到此为止,已经完成了ESXI7.0下的定时关闭虚拟机并自动关机的目的,感兴趣小伙伴可以自行尝试一下。如果有什么问题,请在下方留言。
10 comments
感谢分享,写的太棒了,
我是ESXI6.7 updata3 第一步 vi /etc/rc.local.d./local.sh 不一样, rc.local.d后面没有点
然后我设置好后一直没生效,排查发现是ESXI系统时间不对,还在2019年呢。。。
在 管理》系统》时间和日期选项中,NTP服务器填了阿里的203.107.6.88, 120.25.115.20之后就好了
ヾ(≧∇≦*)ゝ
[root@localhost:~] cat /var/spool/cron/crontabs/root
#min hour day mon dow command
1 1 * * * /sbin/tmpwatch.py
1 * * * * /sbin/auto-backup.sh ++group=host/vim/vmvisor/backup.sh
0 * * * * /usr/lib/vmware/vmksummary/log-heartbeat.py
*/5 * * * * /bin/hostd-probe.sh ++group=host/vim/vmvisor/hostd-probe/stats/sh
00 1 * * * localcli storage core device purge
*/10 * * * * /bin/crx-cli gc
“00 18 altbootbank bin bootbank bootpart.gz bootpart4kn.gz dev etc include lib lib64 local.tgz local.tgz.ve locker opt proc productLocker sbin scratch store tardisks tardisks.noauto tmp usr var vmfs vmimages altbootbank bin bootbank bootpart.gz bootpart4kn.gz dev etc include lib lib64 local.tgz local.tgz.ve locker opt proc productLocker sbin scratch store tardisks tardisks.noauto tmp usr var vmfs vmimages altbootbank bin bootbank bootpart.gz bootpart4kn.gz dev etc include lib lib64 local.tgz local.tgz.ve locker opt proc productLocker sbin scratch store tardisks tardisks.noauto tmp usr var vmfs vmimages /vmfs/volumes/56873b06-6b28a730-f494-a0369f030bd0/shutdown.sh”
为什么我的执行后是这样 多了好几行不是路径的字符串
→→ “00 18 altbootbank bin bootbank bootpart.gz bootpart4kn.gz dev etc include lib lib64 local.tgz local.tgz.ve locker opt proc productLocker sbin scratch store tardisks tardisks.noauto tmp usr var vmfs vmimages altbootbank bin bootbank bootpart.gz bootpart4kn.gz dev etc include lib lib64 local.tgz local.tgz.ve locker opt proc productLocker sbin scratch store tardisks tardisks.noauto tmp usr var vmfs vmimages altbootbank bin bootbank bootpart.gz bootpart4kn.gz dev etc include lib lib64 local.tgz local.tgz.ve locker opt proc productLocker sbin scratch store tardisks tardisks.noauto tmp usr var vmfs vmimages /vmfs/volumes/56873b06-6b28a730-f494-a0369f030bd0/shutdown.sh”
你可能是填写错了?
重启执行
cat /var/spool/cron/crontabs/root
没有添加定时命令,手动输入命令也不执行
esxi版本是VMware ESXi 7.0.3 build-20036589
请问大佬是什么原因
重启前有手动执行一次/sbin/auto-backup.sh来保存/etc/rc.local.d./local.sh文件的变更吗?
而且手动执行命令修改cron进程后,必须重启cron进程才能加载成功。
#重启cron进程(将加载修改后的root文件)
/usr/lib/vmware/busybox/bin/busybox crond
感谢大佬 实测好用
谢谢大佬,解决了很大问题,你写笔记好详细啊 膜拜膜拜!!!啥时候才能写出和你一样的笔记呀~
感谢,这个最全乎。
谢谢,参照你的文档我解决了一个大问题哈哈。
哈哈,能帮上忙就行。