[QEMU]虛擬 CPU 熱插拔

使用 QMP 和 的 vCPU 熱插拔(和熱拔出)的完整示例。device_add
device_del
vCPU hotplug
按如下方式啟動 QEMU(請注意,“maxcpus”是必需的,以允許 vCPU 熱插拔):
$ qemu-system-x86_64 -display none -no-user-config -m 2048 \ ? ?-nodefaults -monitor stdio -machine pc,accel=kvm,usb=off \ ? ?-smp 1,maxcpus=2 -cpu IvyBridge-IBRS \ ? ?-qmp unix:/tmp/qmp-sock,server=on,wait=off
運行 'qmp-shell'(位于源代碼樹中,在:“scripts/qmp/”下)以連接到剛剛啟動的 QEMU:
$> ./qmp-shell -p -v /tmp/qmp-sock [...] (QEMU)
找出哪些CPU類型可以插入,以及哪些插槽:
(QEMU) query-hotpluggable-cpus{ ? ?"execute": "query-hotpluggable-cpus", ? ?"arguments": {}}{ ? ?"return": [ ? ? ? ?{ ? ? ? ? ? ?"type": "IvyBridge-IBRS-x86_64-cpu", ? ? ? ? ? ?"vcpus-count": 1, ? ? ? ? ? ?"props": { ? ? ? ? ? ? ? ?"socket-id": 1, ? ? ? ? ? ? ? ?"core-id": 0, ? ? ? ? ? ? ? ?"thread-id": 0 ? ? ? ? ? ?} ? ? ? ?}, ? ? ? ?{ ? ? ? ? ? ?"qom-path": "/machine/unattached/device[0]", ? ? ? ? ? ?"type": "IvyBridge-IBRS-x86_64-cpu", ? ? ? ? ? ?"vcpus-count": 1, ? ? ? ? ? ?"props": { ? ? ? ? ? ? ? ?"socket-id": 0, ? ? ? ? ? ? ? ?"core-id": 0, ? ? ? ? ? ? ? ?"thread-id": 0 ? ? ? ? ? ?} ? ? ? ?} ? ?]}(QEMU)
該命令為存在的 CPU(包含“qom-path”成員)或可能已熱插拔(沒有“qom-path”成員)返回一個對象。從其在步驟(3)中的輸出中,我們可以看到插槽0中存在,而將CPU熱插拔到插槽1中需要將列出的屬性傳遞給QMP:
query-hotpluggable-cpus
IvyBridge-IBRS-x86_64-cpu
device_add
(QEMU) device_add id=cpu-2 driver=IvyBridge-IBRS-x86_64-cpu socket-id=1 core-id=0 thread-id=0{ ? ?"execute": "device_add", ? ?"arguments": { ? ? ? ?"socket-id": 1, ? ? ? ?"driver": "IvyBridge-IBRS-x86_64-cpu", ? ? ? ?"id": "cpu-2", ? ? ? ?"core-id": 0, ? ? ? ?"thread-id": 0 ? ?}}{ ? ?"return": {}}(QEMU)
(可選)運行 QMP 以獲取有關(guān) vCPU 的一些詳細信息:
query-cpus-fast
(QEMU) query-cpus-fast{ ? ?"execute": "query-cpus-fast", ? ?"arguments": {}}{ ? ?"return": [ ? ? ? ?{ ? ? ? ? ? ?"qom-path": "/machine/unattached/device[0]", ? ? ? ? ? ?"target": "x86_64", ? ? ? ? ? ?"thread-id": 11534, ? ? ? ? ? ?"cpu-index": 0, ? ? ? ? ? ?"props": { ? ? ? ? ? ? ? ?"socket-id": 0, ? ? ? ? ? ? ? ?"core-id": 0, ? ? ? ? ? ? ? ?"thread-id": 0 ? ? ? ? ? ?}, ? ? ? ? ? ?"arch": "x86" ? ? ? ?}, ? ? ? ?{ ? ? ? ? ? ?"qom-path": "/machine/peripheral/cpu-2", ? ? ? ? ? ?"target": "x86_64", ? ? ? ? ? ?"thread-id": 12106, ? ? ? ? ? ?"cpu-index": 1, ? ? ? ? ? ?"props": { ? ? ? ? ? ? ? ?"socket-id": 1, ? ? ? ? ? ? ? ?"core-id": 0, ? ? ? ? ? ? ? ?"thread-id": 0 ? ? ? ? ? ?}, ? ? ? ? ? ?"arch": "x86" ? ? ? ?} ? ?]}(QEMU)
vCPU 熱拔出
從“qmp-shell”中,調(diào)用 QMP 命令:device_del
(QEMU) device_del id=cpu-2{ ? ?"execute": "device_del", ? ?"arguments": { ? ? ? ?"id": "cpu-2" ? ?}}{ ? ?"return": {}}(QEMU)
注意
vCPU熱拔卡需要客戶合作;所以上面的命令不能保證vCPU刪除 - 這是一個“拔掉插頭的請求”。此時,來賓將獲得系統(tǒng)控制中斷 (SCI),并調(diào)用受影響的 vCPU 設(shè)備的 ACPI 處理程序。然后,來賓內(nèi)核將使 vCPU 脫機,并告訴 QEMU 將其拔出。device_del