日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

退出qemu_qemu虚拟机的关机方式

發(fā)布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 退出qemu_qemu虚拟机的关机方式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

qemu虛擬機的關(guān)閉方式主要包括如下幾種方式:通過qemu monitor的system_powerdown命令進行關(guān)閉,

在libvirt對qemu進行管理的情況下,通過virsh shutdown命令進行關(guān)閉。

在虛擬機內(nèi)使用Guest OS自帶的關(guān)機按鈕進行關(guān)閉。

通過qemu monitor的quit命令進行關(guān)閉。

在libvirt對qemu進行管理的情況下,通過virsh destroy命令進行關(guān)閉。

在主機端通過Ctrl+C強制關(guān)閉qemu進程關(guān)閉虛擬機。

kill/pkill命令結(jié)束進程

1. qemu monitor的system_powerdown命令

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

qemu進程的主循環(huán)位于vl.c:main_loop(),在主循環(huán)會循環(huán)調(diào)用main_loop_should_exit()判斷是否結(jié)束主循環(huán)。

main_loog_should_exit()函數(shù)中會通過qemu_powerdown_requested()函數(shù)判斷qemu虛擬機是否接收到了powerdown的請求,如果有該請求,則調(diào)用qemu_system_powerdown(),該函數(shù)先發(fā)出POWERDOWN的事件,然后通知注冊到powerdown的notifier函數(shù)

不同的主板,會注冊不同的powerdown notifier

以piix4為例,在piix4_pm_realize函數(shù)中,會將piix4_pm_powerdwon_req()這個notify handler注冊到qemu虛擬機的powerdown notifier中。

該notifier handler主要是調(diào)用acpi_pm1_evt_power_down()函數(shù),在該函數(shù)中,會檢測在該虛擬機主板上,電源鍵(Power Button)是否被使能,如果被使能了,則模擬該電源鍵被按下,發(fā)送SCI(System Control Interrupt)中斷,觸發(fā)Guest OS進行關(guān)機。

所以qemu monitor的system_powerdown命令本質(zhì)上是模擬電源鍵被按下觸發(fā)SCI中斷的動作。至于Guest OS是否會關(guān)機,則由Guest OS的行為配置決定的,如在Windows中,如果在電源設(shè)置中,將Windows的電源按鍵設(shè)置為不響應(yīng),則發(fā)送system_powrdown命令后,Windows將不做響應(yīng),無法實現(xiàn)虛擬機關(guān)機,除非Windows中將電源鍵功能設(shè)置為關(guān)機。

2. virsh shutdown命令

virsh shutdown命令會調(diào)用到libvirt的virDomainShutdown()函數(shù),該函數(shù)會繼續(xù)調(diào)用不同類型hypervisor的shutdown函數(shù),如對于qemu而言,它會調(diào)用到qemu dirver對應(yīng)的domainShutdown,即qemuDomainShutdown(),在該函數(shù)中,會執(zhí)行如下操作:檢測Qemu Guest Agent是否存在,如果存在并且可用,則通過Qemu Guest Agent告知Guest OS進行關(guān)機操作。

如果Qemu Guest Agent不存在,則檢測qemu虛擬機是否支持ACPI Power Button,如果支持,則調(diào)用qemuMonitorSystemPowerdown()函數(shù),即在qemu monitor中,發(fā)送system_powerdown命令,模擬電源鍵被按下并出發(fā)SCI的動作,觸發(fā)Guest OS進行關(guān)機。

所以,在不用Qemu Guest Agent的情況下,virsh shutdown命令其實就對應(yīng)到qemu monitor中的system_powerdown命令,只是該命令由libvirt發(fā)送。

3. Guest OS關(guān)機接口

在虛擬機內(nèi)使用Guest OS自帶的關(guān)機按鈕/功能進行關(guān)機,以Ubuntu為例,通過systemctl poweroff命令對Ubuntu進行關(guān)機,該命令會調(diào)用到kernel/power/poweroff.c文件中定義個poweroff_work對應(yīng)的工作,該工作主要是執(zhí)行do_poweroff()對系統(tǒng)進行關(guān)機。

kernel/power/poweroff.c:do_poweroff() -> kernel_power_off() ,該函數(shù)關(guān)閉所有的用戶程序和設(shè)備,最后調(diào)用machine_power_off()函數(shù)。

machine_power_off() -> power_off() -> native_machine_poweroff() -> pm_power_off() 若該Ubuntu運行的虛擬機支持ACPI標準,則pm_power_off將指向acpi_power_off()函數(shù)。

acpi_power_off() -> acpi_enter_sleep_state()

該函數(shù)將會往ACPI標準中規(guī)定的寄存器PM1 Control Registers Fixed Hardware Feature Control Bits中的SLP_TYPE和SLP_EN域?qū)懴鄳?yīng)的數(shù)據(jù),讓虛擬機主板進入到指定的睡眠狀態(tài),即ACPI標準中定義的S0 ~ S5狀態(tài)。

而在qemu模擬器方面,在hw/acpi/core.c中會對PM1 Control Registers Fixed Hardware Feature Control Bits的寫進行監(jiān)控,當向SLY_TYP和SLY_EN寫特定值的時候,會觸發(fā)qemu調(diào)用qemu_system_shutdown_request()發(fā)出shutdown的請求。

qemu進程的主要循環(huán)函數(shù)main_loop()中,會循環(huán)調(diào)用main_loop_should_exit()函數(shù),該函數(shù)會檢測系統(tǒng)中是否有shutdown的請求發(fā)出。若有shutdown的請求,則qemu進程退出主循環(huán),結(jié)束并退出qemu虛擬機。

4. qemu monitor的quit命令

qemu monitor的quit命令讓qemu進程直接退出。

直接在qemu monitor中輸入quit命令,將觸發(fā)qemu虛擬機直接退出,Guest OS完全不知道虛擬機即將關(guān)閉,所以對Guest OS來說,將會直接閃退,類似物理機的直接掉電。

quit命令將調(diào)度到qemu的hmp_quit()函數(shù),該函數(shù)將會告知qemu進程在虛擬機關(guān)閉的時候退出,同時發(fā)出shutdown的請求,qemu進程的主循環(huán)main_loop()在執(zhí)行main_loop_should_exit()檢查是否需要退出主循環(huán)的時候,將檢測到該事件,然后直接退出。

5. virsh destroy命令

libvirt提供的virsh destroy命令,將調(diào)用到qemu driver的qemuDomainDestroy() -> qemuDomainDestroyFlags() -> qemuProcessStop() -> qemuProcessKill()接口,將qemu進程關(guān)掉。

qemuProcessKill()中,將會向qemu進程發(fā)送SIGKILL或SIGTERM信號,讓qemu進程退出。

在qemu這邊,qemu的主進程中,會通過os_setup_signal_handling()設(shè)置對信號的響應(yīng)。

termsig_handler() -> qemu_system_killed(),在qemu_system_killed()中,將會生成shutdown的請求,并且shutdown請求的原因是host signal。該請求將會讓qemu進程的主循環(huán)退出,不等Guest OS準備好關(guān)機。

6. Ctrl+C組合鍵

在主機端通過Ctrl+C組合鍵,讓qemu進程退出,其實是向qemu進程發(fā)送SIGINT信號,該信號的處理方式和SIGTERM是一樣的,也就是最后調(diào)用到qemu_system_killed()函數(shù),發(fā)出shutdown請求,讓qemu主進程退出,同時記錄下shutdown的原因為host signal。

7. kill/pkill命令

在主機端使用kill -9 pid或者pkill -9 pname的方式,也是向主機進程發(fā)送SIGKILL信號,讓進程退出的。

總結(jié)

以上是生活随笔為你收集整理的退出qemu_qemu虚拟机的关机方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。