我正在使用 CentOS 7 guest 虚拟机运行。 ACPI 守护进程已启动。
当我关闭虚拟机管理程序时,来宾操作系统就会关闭。我可以在访客的系统日志中看到,它已收到按下电源按钮的通知,但它并没有停止所有服务。来宾操作系统刚刚停止。
有没有办法让管理程序等待来宾操作系统中的所有服务都停止?
答案1
通常当我看到这种情况发生时,这是因为虚拟机的管理员没有正确配置或启动服务。
在 RHEL/CentOS 6 中,除非启动脚本创建了特定于服务的标志文件来指示该服务已启动,否则关闭过程将跳过关闭该服务,因为它会假设服务器已停止或未在以下时间启动:第一名。但这仍然允许以管理员希望的方式停止和重新启动最初在启动时启动的服务。
systemctl
在 RHEL/CentOS 7 中,如果您使用命令或兼容性包装器启动服务service
,服务进程将被放置在自己的进程中控制组由 跟踪systemd
。如果您只是/etc/init.d/name-of-service start
在命令行上运行,则不会发生这种情况。即使服务最初是在启动时启动的,如果您手动停止并重新启动它,一旦其中不再有任何活动进程,特定于服务的控制组就会消失。
当系统关闭时,systemd
将遍历所有特定于服务的控制组,ExecStop
对它们运行操作,并等到该控制组中的所有进程都死亡或达到超时。 “默认”控制组中剩余的任何进程都被假定为不与任何特定服务关联,并且只是可杀死的,这可能不是停止以/etc/init.d/name-of-service start
.
因此,在任何具有 的系统中systemd
,使用正确的命令来启动服务(= 使用systemctl start <name>
或 兼容性包装器service <name> start
)以一种新的方式变得很重要。
答案2
首先,您确定来宾在等待服务停止足够长的时间后没有自行关闭吗?
我假设您正在使用 libvirt 来管理您的 qemu 虚拟机。如果您想自定义本地 systemd 给予 libvirtd 关闭来宾的时间,我相信您可以在与 libvirtd.service 相对应的 systemd 插入单元中定义 TimeoutStopSec。看这里了解更多相关信息。