virsh shutdown 命令无效

问题描述

virsh shutdown <domain> 后虚拟机依然是 runnning 状态。

virsh shutdown 默认发的是 acpi 命令到虚拟机。 虚拟机需要监听 ACPI 事件通知。如果没有监听,并做对应的处理,就不会有反应。

解决方案

# 安装 acpid 服务
apt install acpid

# 确认服务已启动
systemctl status acpid

# 配置事件 handler
cat <<EOF > /etc/acpi/events/powerbtn
event=button/power.*
action=/etc/acpi/power.sh "%e"
EOF

cat <<'EOF' > /etc/acpi/power.sh
KEY=$(echo "$1" | awk '{printf $2}')

case "$KEY" in
  PBTN)
    /sbin/shutdown -h -P now "Power button pressed"
    ;;
  *)
    logger "ACPI action undefined: $KEY | $*"
    ;;
esac
EOF

# 注意,action 对应的脚本必须是可执行的,否则不会执行。
chmod +x /etc/acpi/power.sh

# 设置开机自启动
systemctl enable acpid
# 重启服务
systemctl restart acpid

# 检查服务是否已加载规则
journalctl -u acpid
# Nov 13 23:01:38 NAS systemd[1]: Started ACPI event daemon.
# Nov 13 23:01:38 NAS acpid[881]: starting up with netlink and the input layer
# Nov 13 23:01:38 NAS acpid[881]: 1 rule loaded
# Nov 13 23:01:38 NAS acpid[881]: waiting for events: event logging is off

virsh shutdownvirsh reboot 都会产生相同的 %e,内容如下

button/power PBTN 00000080 00000000
button/power LNXPWRBN:00 00000080 0000000b

实际上 virsh reboot 是可以正常重启的。没弄明白原理,可能是 virsh reboot 监听到 vm 已关机后就 virsh start 了。

参考