我做了一些愚蠢的事情:我启用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
?
众所周知,重新启动可以解决此问题,但我更愿意避免重新启动。
解决方案
运行此命令:
而已。
解释
这个问题很难解决,因为没有关于“热插拔执行选项”如何在幕后工作的文档。
如果您进入 Xen 源代码到发生错误的行号,您会看到:
(取自
~/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
并尝试启动一个虚拟机。答案都在这里:
最后一行显示有关“热插拔执行选项”的错误。
文件描述符
47
用于与xenstored
数据库交互。libxl/disable_udev
第一行是对数据库中数据对象的请求。libxl/disable_udev
forlibvirt
相当于run_hotplug_scripts
in的反义词libxl
。第二行是显示该对象不存在的读取。
默认情况下,
libvirt
将假定不存在或未设置为1
(true) 表示“是的,请运行热插拔脚本”。这就是问题。要解决此问题,只需创建对象并将其值设置为
1
. 此命令执行此操作:读取对象以确认它已存储在数据库中:
前
后
此修复程序的好处是您不必担心重新启动后它会消失。只要重启后
xend
不与冲突发生冲突libxl
,就不需要再次运行此修复程序。