今天笔者在对kvm虚拟机进行管理时,使用virsh shutdown命令关闭指定的虚拟机时,发现虽然有如下的提示,但其实虚拟机却一直不会真正的关闭。

kvm虚拟机不能使用virsh shutdownw命令关闭虚拟机的解决方法-LMLPHP

经过查看virsh命令帮助和上网查询,才得知virsh shutdown命令使用发送acpi指令来控制虚拟机的电源

而kvm虚拟机安装linux系统时默认是没有安装acpi服务的,所以并不会做处理。据说安装windows会自动安装acpi服务,没测试过。

知道了原因、解决方法也就简单了、我们只需要在虚拟机里安装和启动acpid服务即可,执行命令如下:

[root@kvm_client_00 ~]# yum install acpid -y
[root@kvm_client_00 ~]# /etc/init.d/acpid restart //重新启动acpic服务,安装后默认会加入到开机启动的

最后这里笔者简单讲一下关于apcpid服务的工作原理。

ACPId服务是AdvancedConfigurationandPowerInterface缩写,acpid中的d则代表daemon。

Acpid是一个用户空间的服务进程,它充当Linux内核与应用程序之间通信的接口,负责将kernel中的电源管理事件转发给应用程序。

ACPId服务与内核的通信方式:acpid用poll函数挂在/proc/acpi/event文件上。内核在drivers/acpi /event.c中实现了该文件的接口,

一旦总线事件列表(acpi_bus_event_list)上有电源管理事件发生,内核就会唤醒挂在/proc /acpi/event上的acpid,acpid再从/proc/acpi/event中读取相应的事件。

acpid与应用程序的通信方式有两种,

其一是通过本地socket,其文件名为/var/run/acpid.socket,应用程序只要连接到这个socket上,不用发送任何命令就可以接收到acpid转发的电源管理事件。

其二是通过配置文件。在acpid收到来自内核的电源管理事件时,根据配置文件中的规则执行指定的命令。

ACPId服务配置文件为/etc/acpi/events/power.conf,下面是一个示例:

event=button/power.*

action=/sbin/shutdown-hnow

ACPId服务事件的格式为:

device_classbus_idtypedata。device_class和bus_id是字符串,type和data是十六制整数。在配置文件中可以使用通配符,来匹配指定的事件。

尊重别人的劳动成果 转载请务必注明出处:http://www.cnblogs.com/5201351/p/4462541.html

05-11 15:12