從 xend 切換回 libxl 而不重新啟動
我做了一些愚蠢的事情:我啟用
xend
並libxl
使用xend
.現在,
libxl
即使我擺脫了所有xend
實例並停止了,也不會啟動任何實例xend
:root@xen1 [~]# virsh start xen-pv-yolo error: Failed to start domain xen-pv-yolo error: internal error: libxenlight failed to create new domain 'xen-pv-yolo'
從日誌文件
/var/log/libvirt/libxl/xen-pv-yolo.log
:libxl: debug: libxl_create.c:1342:do_domain_create: ao 0x7fea1c0075c0: create: how=(nil) callback=(nil) poller=0x7fea1c001400 libxl: error: libxl_create.c:600:libxl__domain_make: cannot change hotplug execution option once set, please shutdown all guests before changing it libxl: error: libxl_create.c:743:initiate_domain_create: cannot make domain: -3 libxl: debug: libxl_event.c:1591:libxl__ao_complete: ao 0x7fea1c0075c0: complete, rc=-3 libxl: debug: libxl_create.c:1356:do_domain_create: ao 0x7fea1c0075c0: inprogress: poller=0x7fea1c001400, flags=ic libxl: debug: libxl_event.c:1563:libxl__ao__destroy: ao 0x7fea1c0075c0: destroy
我有一些現有的
libxl
實例正在執行,如果為了重新確立 的主導地位而關閉它們會帶來不便libxl
。啟用和禁用後如何
libxl
重新啟動實例xend
?眾所周知,重新啟動可以解決此問題,但我更願意避免重新啟動。
解決方案
執行此命令:
xenstore-write libxl/disable_udev 1
就是這樣。
解釋
這個問題很難解決,因為沒有關於“熱插拔執行選項”如何在幕後工作的文件。
如果您進入 Xen 原始碼到發生錯誤的行號,您會看到:
if (libxl_defbool_val(info->run_hotplug_scripts) != hotplug_setting && (nb_vm - 1)) { LOG(ERROR, "cannot change hotplug execution option once set, " "please shutdown all guests before changing it"); rc = ERROR_FAIL; goto out; }
(取自
~/xen-4.4.1/tools/libxl/libxl_create.c
)我將省去 C 語言調試,但是一旦您追溯所有變數以查看它們的載入位置,您會發現自己位於可以設置
/etc/xen/xl.conf
選項的位置。run_hotplug_scripts
它預設為1
. 如果將此設置為 0,則虛擬機創建將在xl
命令上重新開始工作(而不是通過libvirt
)。不幸的是,
libvirt
載入libxl
使用不同的run_hotplug_scripts
設置源。為了確定這一點,我附加了一個strace
tolibvirtd
並嘗試啟動一個虛擬機。答案都在這裡:
[pid 1194] 06:53:39 write(47, "libxl/disable_udev\0", 19) = 19 [pid 1194] 06:53:39 read(47, "\20\0\0\0\0\0\0\0\2\0\0\0\7\0\0\0", 16) = 16 [pid 1194] 06:53:39 read(47, "ENOENT\0", 7) = 7 [pid 1194] 06:53:39 rt_sigaction(SIGPIPE, {SIG_IGN, [], SA_RESTORER, 0x7f80c9a89710}, NULL, 8) = 0 [pid 1194] 06:53:39 write(43, "libxl: error: libxl_create.c:600:libxl__domain_make: cannot change hotplug execution option once set, please shutdown all guests before changing it\n", 148) = 148
最後一行顯示有關“熱插拔執行選項”的錯誤。
文件描述符
47
用於與xenstored
數據庫互動。
libxl/disable_udev
第一行是對數據庫中數據對象的請求。
libxl/disable_udev
forlibvirt
相當於run_hotplug_scripts
in的反義詞libxl
。第二行是顯示該對像不存在的讀取。
預設情況下,
libvirt
將假定不存在或未設置為1
(true) 表示“是的,請執行熱插拔腳本”。這就是問題。要解決此問題,只需創建對象並將其值設置為
1
. 此命令執行此操作:xenstore-write libxl/disable_udev 1
讀取對像以確認它已儲存在數據庫中:
root@xen1 [~]# xenstore-read libxl/disable_udev 1
前
root@xen1 [~]# virsh start xen-pv-yolo error: Failed to start domain xen-pv-yolo error: internal error: libxenlight failed to create new domain 'xen-pv-yolo'
後
root@xen1 [~]# virsh start xen-pv-yolo Domain xen-pv-yolo started
此修復程序的好處是您不必擔心重新啟動後它會消失。只要重啟後
xend
不與衝突發生衝突libxl
,就不需要再次執行此修復程序。