我做了一件愚蠢的事:我启用了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
?
众所周知,重新启动可以解决此问题,但我希望避免重新启动。
答案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_scripts
1
如果将其设置为 0,则虚拟机创建将根据命令再次开始工作xl
(而不是通过libvirt
)。
不幸的是,libvirt
使用libxl
不同的源进行run_hotplug_scripts
设置。为了确定这一点,我附加了一个strace
并libvirtd
尝试启动虚拟机。
答案就在这里:
[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
for相当于inlibvirt
的反义词。run_hotplug_scripts
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
,您就不需要再次运行此修复程序。