解决方案

解决方案

我做了一件愚蠢的事:我启用了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

众所周知,重新启动可以解决此问题,但我希望避免重新启动。

答案1

解决方案

运行此命令:

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_scripts1如果将其设置为 0,则虚拟机创建将根据命令再次开始工作xl(而不是通过libvirt)。

不幸的是,libvirt使用libxl不同的源进行run_hotplug_scripts设置。为了确定这一点,我附加了一个stracelibvirtd尝试启动虚拟机。

答案就在这里:

[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_udevfor相当于inlibvirt的反义词。run_hotplug_scriptslibxl

第二行是显示该对象不存在的内容。

默认情况下,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,您就不需要再次运行此修复程序。

相关内容