从xend切换回libxl而无需重新启动

我做了一些愚蠢的事情:我启用了libxl xend ,并用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的统治地位,将会带来一些不便。

在启用和禁用xend之后,如何让libxl再次启动实例?

已经知道重启会解决这个问题,但我宁愿避免重启。

运行这个命令:

 xenstore-write libxl/disable_udev 1 

而已。

说明

这个很难排除故障,因为没有关于“hotplug执行选项”如何在幕后工作的文档。

如果你进入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语言debugging,但是一旦你追溯了所有的variables,看看它们在哪里加载,你会发现你在/etc/xen/xl.conf ,在那里可以设置一个选项run_hotplug_scripts 。 它默认为1如果将其设置为0,则虚拟机创build将在xl命令(不通过libvirt )上再次开始工作。

不幸的是, libvirt使用run_hotplug_scripts设置的不同来源加载libxl 。 为了确定这一点,我给libvirtd了一个strace ,并试图启动一个虚拟机。

答案全在这里:

 [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 

最后一行显示关于“hotplug执行选项”的错误。

文件描述符47用于与已xenstored数据库进行交互。

第一行是对数据库中的libxl/disable_udev数据对象的请求。

libvirt libxl/disable_udevrun_hotplug_scripts中的libxl相反。

第二行是一个显示对象不存在的读取。

默认情况下, libvirt将假定不存在或不被设置为1 (true)表示“是的,请运行hotplug脚本”。 这就是问题。

要解决这个问题,只需创build对象并将其值设置为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发生冲突,则不需要再次运行此修复程序。