qemu虚拟机的关闭方式主要包括如下几种方式:通过qemu monitor的system_powerdown命令进行关闭,

在libvirt对qemu进行管理的情况下,通过virsh shutdown命令进行关闭。

在虚拟机内使用Guest OS自带的关机按钮进行关闭。

通过qemu monitor的quit命令进行关闭。

在libvirt对qemu进行管理的情况下,通过virsh destroy命令进行关闭。

在主机端通过Ctrl+C强制关闭qemu进程关闭虚拟机。

kill/pkill命令结束进程

1. qemu monitor的system_powerdown命令

system_powerdown是qemu monitor中支持的一个命令。

qemu进程的主循环位于vl.c:main_loop(),在主循环会循环调用main_loop_should_exit()判断是否结束主循环。

main_loog_should_exit()函数中会通过qemu_powerdown_requested()函数判断qemu虚拟机是否接收到了powerdown的请求,如果有该请求,则调用qemu_system_powerdown(),该函数先发出POWERDOWN的事件,然后通知注册到powerdown的notifier函数

不同的主板,会注册不同的powerdown notifier

以piix4为例,在piix4_pm_realize函数中,会将piix4_pm_powerdwon_req()这个notify handler注册到qemu虚拟机的powerdown notifier中。

该notifier handler主要是调用acpi_pm1_evt_power_down()函数,在该函数中,会检测在该虚拟机主板上,电源键(Power Button)是否被使能,如果被使能了,则模拟该电源键被按下,发送SCI(System Control Interrupt)中断,触发Guest OS进行关机。

所以qemu monitor的system_powerdown命令本质上是模拟电源键被按下触发SCI中断的动作。至于Guest OS是否会关机,则由Guest OS的行为配置决定的,如在Windows中,如果在电源设置中,将Windows的电源按键设置为不响应,则发送system_powrdown命令后,Windows将不做响应,无法实现虚拟机关机,除非Windows中将电源键功能设置为关机。

2. virsh shutdown命令

virsh shutdown命令会调用到libvirt的virDomainShutdown()函数,该函数会继续调用不同类型hypervisor的shutdown函数,如对于qemu而言,它会调用到qemu dirver对应的domainShutdown,即qemuDomainShutdown(),在该函数中,会执行如下操作:检测Qemu Guest Agent是否存在,如果存在并且可用,则通过Qemu Guest Agent告知Guest OS进行关机操作。

如果Qemu Guest Agent不存在,则检测qemu虚拟机是否支持ACPI Power Button,如果支持,则调用qemuMonitorSystemPowerdown()函数,即在qemu monitor中,发送system_powerdown命令,模拟电源键被按下并出发SCI的动作,触发Guest OS进行关机。

所以,在不用Qemu Guest Agent的情况下,virsh shutdown命令其实就对应到qemu monitor中的system_powerdown命令,只是该命令由libvirt发送。

3. Guest OS关机接口

在虚拟机内使用Guest OS自带的关机按钮/功能进行关机,以Ubuntu为例,通过systemctl poweroff命令对Ubuntu进行关机,该命令会调用到kernel/power/poweroff.c文件中定义个poweroff_work对应的工作,该工作主要是执行do_poweroff()对系统进行关机。

kernel/power/poweroff.c:do_poweroff() -> kernel_power_off() ,该函数关闭所有的用户程序和设备,最后调用machine_power_off()函数。

machine_power_off() -> power_off() -> native_machine_poweroff() -> pm_power_off() 若该Ubuntu运行的虚拟机支持ACPI标准,则pm_power_off将指向acpi_power_off()函数。

acpi_power_off() -> acpi_enter_sleep_state()

该函数将会往ACPI标准中规定的寄存器PM1 Control Registers Fixed Hardware Feature Control Bits中的SLP_TYPE和SLP_EN域写相应的数据,让虚拟机主板进入到指定的睡眠状态,即ACPI标准中定义的S0 ~ S5状态。

而在qemu模拟器方面,在hw/acpi/core.c中会对PM1 Control Registers Fixed Hardware Feature Control Bits的写进行监控,当向SLY_TYP和SLY_EN写特定值的时候,会触发qemu调用qemu_system_shutdown_request()发出shutdown的请求。

qemu进程的主要循环函数main_loop()中,会循环调用main_loop_should_exit()函数,该函数会检测系统中是否有shutdown的请求发出。若有shutdown的请求,则qemu进程退出主循环,结束并退出qemu虚拟机。

4. qemu monitor的quit命令

qemu monitor的quit命令让qemu进程直接退出。

直接在qemu monitor中输入quit命令,将触发qemu虚拟机直接退出,Guest OS完全不知道虚拟机即将关闭,所以对Guest OS来说,将会直接闪退,类似物理机的直接掉电。

quit命令将调度到qemu的hmp_quit()函数,该函数将会告知qemu进程在虚拟机关闭的时候退出,同时发出shutdown的请求,qemu进程的主循环main_loop()在执行main_loop_should_exit()检查是否需要退出主循环的时候,将检测到该事件,然后直接退出。

5. virsh destroy命令

libvirt提供的virsh destroy命令,将调用到qemu driver的qemuDomainDestroy() -> qemuDomainDestroyFlags() -> qemuProcessStop() -> qemuProcessKill()接口,将qemu进程关掉。

qemuProcessKill()中,将会向qemu进程发送SIGKILL或SIGTERM信号,让qemu进程退出。

在qemu这边,qemu的主进程中,会通过os_setup_signal_handling()设置对信号的响应。

termsig_handler() -> qemu_system_killed(),在qemu_system_killed()中,将会生成shutdown的请求,并且shutdown请求的原因是host signal。该请求将会让qemu进程的主循环退出,不等Guest OS准备好关机。

6. Ctrl+C组合键

在主机端通过Ctrl+C组合键,让qemu进程退出,其实是向qemu进程发送SIGINT信号,该信号的处理方式和SIGTERM是一样的,也就是最后调用到qemu_system_killed()函数,发出shutdown请求,让qemu主进程退出,同时记录下shutdown的原因为host signal。

7. kill/pkill命令

在主机端使用kill -9 pid或者pkill -9 pname的方式,也是向主机进程发送SIGKILL信号,让进程退出的。

退出qemu_qemu虚拟机的关机方式相关推荐

  1. 虚拟机服务器关机命令,linux虚拟机怎么关机命令

    linux虚拟机怎么关机命令 内容精选 换一换 可以在虚拟机操作系统中执行sudo poweroff进行关机.如果无效则在virt-manager中关闭虚拟机,单击"Virtual Mach ...

  2. Android:销毁所有的Activity退出应用程序几种方式

    Android:销毁所有的Activity退出应用程序几种方式 author:DRC工作室 我们都知道,Activity是存放在栈中.在默认的情况下(standard)Activity在栈中是以先进后 ...

  3. 虚拟机服务器如何关机命令行,安卓虚拟机如何关机命令行

    安卓虚拟机如何关机命令行 内容精选 换一换 华为鲲鹏云手机是运行在云端虚拟出带有原生安卓操作系统,具有虚拟手机功能的云服务器.免费云手机0元领取体验,可发放60台云手机实例!云手机业务数据提供云端数据 ...

  4. VMware 虚拟机无法关机,无法开机问题记录

    情形: 下班之后,没有手动关闭虚拟机,直接合上笔记本(笔记本会进入休眠状态),回到宿舍打开电脑,发现虚拟机无法关机,也无法启动. 症状: 关闭虚拟机,卡在黑框框不动. 关闭VMware,提示:&quo ...

  5. 虚拟机网络连接方式linuxcentos

    20210910 https://www.cnblogs.com/luxiaodai/p/9947343.html NAT 方式配置固定ipvmnet8 这块网卡的ip地址和虚拟机的ip地址要不一样 ...

  6. win7怎么关闭虚拟机服务器,大师教您Win7系统怎么彻底关闭退出vmware虚拟机的处理要领...

    windows系统由于出色的稳定性,深受大家的喜爱,但是还是难免会到Win7系统怎么彻底关闭退出vmware虚拟机的问题,有可能我们都会遇到Win7系统怎么彻底关闭退出vmware虚拟机这样的情况吧, ...

  7. android 退出应用没有走ondestory方法,Android退出应用最优雅的方式(改进版)

    我们先来看看几种常见的退出方法(不优雅的方式) 一.容器式 建立一个全局容器,把所有的Activity存储起来,退出时循环遍历finish所有Activity import java.util.Arr ...

  8. Vmware虚拟机使用Nat方式连接笔记本无线网卡

    Vmware虚拟机使用Nat方式连接笔记本无线网卡 虚拟机环境centos7,固定ip 192.168.80.130,网关 192.168.80.1 主机环境无线网卡,网段192.168.1.103 ...

  9. 苹果xsmax怎么开机_苹果iPhone12怎么关机和开机 iPhone12开关机方式快捷键

    有很多刚入手iPhone12的小伙伴不知道怎么关机,小编就为大家带来了iPhone12的关机方法以及教程,感兴趣的朋友不要错过了哦,快来看看吧. iPhone12关机方式 1.iPhone12的电源键 ...

  10. 怎么关闭win10虚拟机服务器,win10系统彻底关闭退出vmware虚拟机的步骤

    有关win10系统彻底关闭退出vmware虚拟机的操作方法想必大家有所耳闻.但是能够对win10系统彻底关闭退出vmware虚拟机进行实际操作的人却不多.其实解决win10系统彻底关闭退出vmware ...

最新文章

  1. mysql密码遗忘和登陆报错问题
  2. JAVA写的爬虫小工具
  3. 重装IDEA再也不愁了,一招搞定同步个人配置!
  4. vscode插件列表及配置信息
  5. mt4服务器显示无连接,mt4怎样连接服务器地址
  6. SpringBoot(配置druid数据源、配置MyBatis、事务控制、druid 监控)
  7. VVC专利池最新进展:MC-IF正在召集专利拥有者
  8. IO流和集合的交集Properties类的介绍。
  9. Linux uart程序
  10. 第4周第4课:gzip、bzip2、xz
  11. Xshell下载和连接Linux
  12. linux 系统分区及格式化
  13. Rust : ref下的match
  14. SPSS数据分析全套教程(2)—— 变量处理
  15. python保存路径_Python模块的正确存放位置
  16. 基于EAS的报销业务开展的先决条件
  17. 英语听说计算机查分,2018中考第二次英语听说考明日查分,附查分常见问答
  18. 都挺好 苏大强C位出道的不只表情包 还有大眼袋
  19. Java---设计【超市商品管理系统】
  20. 【PyTorch】下载的预训练模型的保存位置(Windows)

热门文章

  1. IT-RS-OSPF-V-link_Looped
  2. Access数据库修复 压缩
  3. Golang——Go语言发展史(一)
  4. The CDB process terminated
  5. 用牛顿迭代法求方程2x^3-4x^2+3x-6=0在1.5附近的解,要求误差小于1e-5
  6. 计算机网络什么是p2p,计算机网络-p2p(示例代码)
  7. docker配置国内加速器的两种方法
  8. SecureCRT界面的菜单栏不见了怎么办?
  9. 法制博览杂志法制博览杂志社法制博览编辑部2022年第24期目录
  10. 如何快速将多个文件合并为一个文件?