Linux

從 xend 切換回 libxl 而不重新啟動

  • June 4, 2015

我做了一些愚蠢的事情:我啟用xendlibxl使用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設置源。為了確定這一點,我附加了一個stracetolibvirtd並嘗試啟動一個虛擬機。

答案都在這裡:

[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_udevforlibvirt相當於run_hotplug_scriptsin的反義詞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,就不需要再次執行此修復程序。

引用自:https://serverfault.com/questions/696419