kvm虛擬化解決virsh shutdown關不掉虛擬機的問題

事出有因

最近項目裏需要一個kvm虛擬機狀態監控的功能,比如虛擬機由running狀態變化到stop狀態時記錄事件並且回調函數。
使用virsh指令使得虛擬機由running狀態變化到stop狀態時由兩種方式:destroy和shutdown。destroy是比較暴力的做法,相當於物理機的直接關閉電源;shutdown則是比較優雅地做法,按部就班的關閉虛擬機。
測試時,使用virsh destroy關閉虛擬機沒有問題,可以直接關掉。但是使用shutdown來關閉時就出現了關不掉的情況,如圖:
在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述
究其原因,如果我們使用vnc來連接虛機的話可以發現,在我們執行virsh shutdown命令的時候,虛機彈出了一個確認框來詢問我們是否真的要關掉虛擬機。一方面爲了更安全,另一方面就顯得更優雅了呢。
在這裏插入圖片描述
至此,問題應該描述清楚了,接下來是解決方法。以下四種方法的結果並不是完全相同,需要大家根據自己的需求來酌情選擇合適的方式。

方法一、快捷鍵發起關機請求

方法描述

查詢linux關機快捷鍵,可以看到Ctl-Alt-F1 或Ctl-Alt-Del等結果(錯誤)。基於這個方式,我們可以使用到virsh sendkey這個指令來進行操作。
在vb中有一個模擬鍵盤操作的語句叫做sendkey,通過發送{Ctrl + z}等不同指令來模擬鍵盤操作。virsh sendkey也是類似的作用,只不過是對虛擬機發起的鍵盤模擬操作。
使用方式,宿主機上鍵入:virsh send-key --domain --key就可以了。

方法測試

這裏我測試了Ctl-Alt-Del,它並沒有實現關機,而是實現了註銷。

在虛機登錄的情況下,我們鍵入

virsh send-key basis_ubuntu16 KEY_LEFTCTRL KEY_LEFTALT KEY_DELETE

可以使得虛擬機從登錄狀態轉化爲註銷狀態。

該方法雖然有些作用,但是跟我需求不一致,所以對我來說很雞肋。

方法二、關閉 Ubuntu 中的關機/重啓確認

方法描述

展示如何在每次執行關機、重啓、註銷時禁用確定框。Ubuntu 總是配置好了一個對話框,每當你要關機、重啓或者註銷時提示你。這是一個保護措施,防止你本不打算這樣做卻錯誤關機或重啓。不是所有人都想每次關機的時候被詢問。忙碌的小夥伴們可能就讓自己的電腦那麼醒着,因爲他執行了關閉命令,卻忘了確認那個該死的對話框。

這個教程將會指導你每一次關機的時候如何避免那個對話框。

當這個特性被激活,你將會收到下面的提示。

Are you sure you want to close all programs and shutdown your computer?

運行下面命令關掉它。

按下鍵盤上的Ctrl – Alt – T打開終端。然後敲擊下面的命令

gsettings set com.canonical.indicator.session suppress-logout-restart-shutdown true

就這麼簡單,你再也不會被該死的確認對話框騷擾了。

如果想恢復這個對話框,敲下面的命令就可以了

gsettings set com.canonical.indicator.session suppress-logout-restart-shutdown false

在這裏插入圖片描述
原文鏈接:https://linux.cn/article-2598-1.html

方法測試

按照上述方法描述,我進行了測試。在虛擬機用戶登錄狀態進行可以將虛擬機直接關掉。

virsh shutdown --doamin

但是在虛擬機註銷狀態下,進行shutdown時也會出現同樣的詢問界面。
在這裏插入圖片描述
這一情況的具體原因,我沒有深追到實現。我猜測該方法只是針對用戶來做了一個省事的操作,用戶沒有登錄那肯定不行了。另外該方式還可以進行關機、重啓菜單等選項的隱藏,具體指令如下,大家可以自己進行嘗試了。

suppress-logout-menuitem 隱藏登出菜單
suppress-restart-menuitem 隱藏重啓菜單
suppress-shutdown-menuitem 隱藏關機菜單

該方法雖然已經起到很大的作用了,但是跟我的需求仍然有出入,不僅要在登錄狀態下,在註銷狀態下也要實現實現一步到位的shutdown纔是我的初衷。

方法三、使用acpid服務一步到位shutdown

方法描述

shutdown使用發送acpi指令來控制虛擬機的電源,而KVM虛擬機安裝linux系統時默認沒有安裝acpi服務,反以導致不能關閉虛擬機,需要安裝acpi。據說windows會自動安裝acpi服務,暫時沒有測試。

首先進行acpi的安裝。
centOS

[root@kvm_client_00 ~]# yum install acpid -y
[root@kvm_client_00 ~]# /etc/init.d/acpid restart //重新啓動acpic服務,安裝後默認會加入到開機啓動的

Ubuntu

[root@softinst-KVM:~$ apt-get install acpid -y
[root@softinst-KVM:~$ systemctl restart acpid.service

acpi工作原理:
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服務事件的格式爲:

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

方法測試

安裝啓動acpi之後我直接進行了virsh shutdown測試,但是發現根本不起作用。所謂按照acpi原理我查找了配置文件。
ACPId服務配置文件爲/etc/acpi/events/power.conf,我的虛機是/etc/acpi/events/powerbtn

打開配置文件,看到了電源事件:
在這裏插入圖片描述
可以看到,響應動作是執行腳本文件,所以我又去查看了一下腳本文件。在這裏插入圖片描述
內容較多,大致意思就是滿足一定情況時,我纔會執行shutdown -h now操作。所以看到這裏,我直接做了個粗劣的操作,直接將配置文件裏的事件響應動作改成
/sbin/shutdown -h now那不應該就可以了嘛。這裏配置文件默認是隻讀文件,所以要賦予權限:

sudo chmod 777 /etc/acpi/events/powerbtn

最後配置文件改成了這樣:在這裏插入圖片描述
執行virsh shutdown ,果不其然,虛擬機一步到位被shutdown掉了。

方法四、使用qga(qemu-guest-agent)工具

方法描述

qga是一種宿主機和虛擬機的交互方式,這裏通過它對虛擬機進行關機,確認宿主機有安裝qemu-guest-agent工具,然後在虛擬機的xml配置文件中增加下面代碼。

<channel type="unix">
  <source mode="bind"/>
  <target type="virtio" name="org.qemu.guest_agent.0"/>
</channel>

我的虛擬機可以用virsh shutdown關機,問題解決!

qga的參考鏈接:
原理:
http://www.cnblogs.com/biangbiang/p/3222458.html
示例:
http://serverfault.com/questions/672253/how-to-configure-and-use-qemu-guest-agent-in-ubuntu-12-04-my-main-aim-is-to-get

原文鏈接:https://blog.csdn.net/h807892124/article/details/50600198

方法測試

該方法是看到有的博主介紹的方法,涉及到qemu通信,時間緊張就沒細看,畢竟問題解決了嘛!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章