通过HA的去关闭PVE服务器以及下面的虚拟机
# 新建PVE脚本
脚本要求先关闭102 虚拟机 在关闭PVE服务器宿主机
-
登录到 PVE 宿主机
-
创建脚本文件
使用 nano 或 vim 创建一个新脚本:
nano /root/shutdown_with_vm.sh
-
脚本内容粘贴如下:
#!/bin/bash
# 定义要关闭的虚拟机ID
VMID=102
# 定义最大等待时间(秒)
TIMEOUT=120
echo "正在关闭 VM $VMID..."
qm shutdown $VMID
# 等待虚拟机关闭
for ((i=0; i<$TIMEOUT; i++)); do
STATUS=$(qm status $VMID | grep -o "status:.*" | awk '{print $2}')
echo "当前状态: $STATUS"
if [ "$STATUS" != "running" ]; then
echo "VM $VMID 已成功关闭"
break
fi
sleep 1
done
# 如果虚拟机仍未关闭,强制关闭
if [ "$STATUS" == "running" ]; then
echo "等待超时,强制关闭 VM $VMID..."
qm stop $VMID
fi
# 延迟 5 秒再关闭宿主机,确保日志输出完整
sleep 5
echo "正在关闭 PVE 宿主机..."
shutdown -h now
保存并退出
按 Ctrl + O 保存
按 Enter 确认文件名
按 Ctrl + X 退出
4.赋予脚本执行权限
执行以下命令使脚本可执行:
chmod +x /root/shutdown_with_vm.sh
5.手动测试脚本是否能成功运行(可选)
在 PVE 中测试脚本执行是否正常(注意:这会立即关机!请谨慎操作):
/root/shutdown_with_vm.sh
你应该会看到类似如下输出:
正在关闭 VM 102...
当前状态: running
当前状态: running
...
VM 102 已成功关闭
正在关闭 PVE 宿主机...
# 生成Homeassistant秘钥
在Homeassistant终端中执行
进入终端后执行:
mkdir -p /config/ssh
ssh-keygen -t rsa -b 2048 -f /config/ssh/id_rsa
会在 /config/ssh/ 下生成以下文件:
id_rsa(私钥)
id_rsa.pub(公钥)
你可以通过 Samba 或 File Editor 插件查看这些文件。
# 配置PVE服务器 上传秘钥
在PVE终端中执行
添加公钥到 PVE 的 root 用户
执行以下命令(确保 .ssh 文件夹存在):
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
粘贴刚刚复制的公钥内容。
保存并退出:按 Ctrl + O,回车,Ctrl + X。
设置权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# 验证 Home Assistant 能否登录 PVE 主机
在 Home Assistant Web 终端中运行:
IP 替换成你的PVE服务器IP地址
ssh -i /config/ssh/id_rsa -o 'StrictHostKeyChecking=no' root@192.168.1.100 'echo success'
如果返回:
success
则说明免密登录已成功,可以远程执行脚本了。
# 在 Home Assistant 中配置按钮来执行 PVE 关机脚本
第一步:在 configuration.yaml 添加 shell_command
打开 File Editor 插件(或你用的任何编辑器),在 configuration.yaml 中添加以下内容:
shell_command:
shutdown_pve_with_vm: ssh -i /config/ssh/id_rsa -o 'StrictHostKeyChecking=no' root@192.168.31.130 '/root/shutdown_with_vm.sh'
请确保 IP 地址与你实际一致(你的是 192.168.31.130)
第二步(推荐):封装为脚本方便 UI 调用
在 configuration.yaml 中继续添加(如果已有 script: 段,则合并):
script:
shutdown_pve_script:
alias: 一键关闭 PVE 和 Unraid
sequence:
- service: shell_command.shutdown_pve_with_vm
第三步:检查配置并重启 Home Assistant
在前端依次点击:
设置 → 系统 → 检查配置
无误后点击 重启 Home Assistant
第四步:添加按钮到 Lovelace 控制面板
进入 Lovelace 仪表盘,添加按钮卡片,YAML 模式如下:
type: button
name: 关闭 PVE 宿主机
icon: mdi:power
tap_action:
action: call-service
service: script.shutdown_pve_script
confirmation:
text: 你确定要关闭 PVE 和 Unraid 虚拟机吗?
完成后,点击该按钮即可远程触发 PVE 执行 /root/shutdown_with_vm.sh:
先关闭 VM-102 → 再关闭 PVE 宿主机。
# 补充内容 增加WOL 唤醒PVE服务器
- 在 configuration.yaml 中添加 wake_on_lan 支持
script:
wake_pve_script:
alias: 唤醒 PVE 服务器
sequence:
- service: wake_on_lan.send_magic_packet
data:
mac: "70:70:4D:6B:05:CE"
broadcast_address: "192.168.31.255"
2.重启 Home Assistant
设置 → 系统 → 检查配置
确认无误后 → 重启 Home Assistant
3.添加 Lovelace 按钮卡片(唤醒)
type: button
name: 唤醒 PVE
icon: mdi:power
tap_action:
action: call-service
service: script.wake_pve_script
confirmation:
text: 你确定要唤醒 PVE 服务器吗?