1-BIOS设定,开启ACPI

这块没法截图,每块主板的设定也不一样,总之一个原则:电源,节能里面有ACPI的尽量都打开,设定为由OS自动管控。我的主板是铭瑄MS-C Farm B660i,记得有好几个地方设定,我是提前都打开了。

2-屏蔽默认电源按钮事件

修改logind.conf

使用PVEweb界面或任意ssh工具连上pve,修改logind.conf。这一步修改完,你按电源按键,就不会自动关闭PVE宿主机了。 注意,我只在PVE8.2下实践,其他版本应该类似。这一步如果没有这个文件,那就直接跳转到下一步。

#先备份

cp /etc/systemd/logind.conf /etc/systemd/logind.conf.bak

#编辑

nano /etc/systemd/logind.conf

文件内容如下,注意前面没有#的行是修改的结果,就是设置 HandlePowerKey=ignore和PowerKeyIgnoreInhibited=no。 这两个值原本都是off。 看了这么多设置项,你们应该有所猜测,如果有reset按钮,或者是笔记本合上盖子,应该也能屏蔽掉把。

[Login]

HandlePowerKey=ignore

PowerKeyIgnoreInhibited=no

重启服务和系统

systemctl restart systemd-logind
reboot

3-监听获取电源按钮事件ID

安装ACPI支持

apt install acpid acpi-support

如果报依赖冲突,没安装成功,请安装aptitude解决

监听电源按钮事件

执行acpi_listen,然后按下电源按钮

acpi_listen

#按下电源按钮,不用担心会关闭电脑。不出意外,会有下面的反馈

root@pve:~# acpi_listen

button/power PBTN 00000080 00000000

button/power PBTN 00000080 00000000

button/power LNXPWRBN:00 00000080 00000032

这里00000080就是id

4-拦截并自定义电源按钮事件

编辑ACPI事件文件

编辑ACPI事件

nano /etc/acpi/events/powerbtn

黏贴一下内容: 根据上一步监听的内容来修改

event=button/power PBTN 00000080 00000000

action=/etc/acpi/power_btn.sh

编写关机按键触发的脚本,即上一步的的power_btn.sh

nano /etc/acpi/power_btn.sh

脚本内容如下,可以按需修改,这里的102就是虚拟机的id

#!/bin/bash

output=$(qm status 102)

if [[ $output == "stopped" ]]; then

qm start 102

else

qm status 102

fi

如果要按电源按钮还可以关机,则脚本需要修改成下面的样子。

qm shutdown 这部分,如果不生效,可以改成 qm stop

#!/bin/bash

output=$(qm status 102)

if [[ $output == "running" ]]; then

qm shutdown 102

else

qm start 102

fi

赋予执行权限

chmod +x /etc/acpi/power_btn.sh

重启acpi服务

systemctl restart acpid

5-虚拟机安装 agent

对按下按钮开机来说,这一步不是必须的。要电源按钮关机,还需要再虚拟机里面安装QEMU-guset-agent。 对于Windows来说,在https:/ / Index of

/groups/virt/virtio-win/direct-downloads,可以下载,在iso里面可以找到agent。windows就能响应宿主机PVE发出的关机命令了。

安装后,在虚拟机的选项界面,就可以看到启用了agent