Solução
Execute este comando:
xenstore-write libxl/disable_udev 1
É isso aí.
Explicação
Este foi difícil de solucionar porque não há documentação sobre como a "opção de execução do hotplug" funciona nos bastidores.
Se você entrar no código-fonte do Xen para o número da linha em que o erro ocorreu, você verá isto:
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;
}
(extraído de ~/xen-4.4.1/tools/libxl/libxl_create.c
)
Eu pouparei a depuração da linguagem C, mas depois de rastrear todas as variáveis para ver onde elas são carregadas, você se encontrará em /etc/xen/xl.conf
, onde uma opção run_hotplug_scripts
pode ser definida. O padrão é 1
. Se você definir isso como 0, a criação da máquina virtual começará a funcionar novamente no comando xl
(não através de libvirt
).
Infelizmente, libvirt
carrega libxl
usando uma fonte diferente para a configuração run_hotplug_scripts
. Para determinar isso, anexei um strace
a libvirtd
e tentei iniciar uma máquina virtual.
A resposta estava toda aqui:
[pid 1194] 06:53:39 write(47, "libxl/disable_udevxenstore-write libxl/disable_udev 1
", 19) = 19
[pid 1194] 06:53:39 read(47, "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
xenstore-write libxl/disable_udev 1
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;
}
[pid 1194] 06:53:39 write(47, "libxl/disable_udevxenstore-write libxl/disable_udev 1
", 19) = 19
[pid 1194] 06:53:39 read(47, "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
%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 16) = 16
[pid 1194] 06:53:39 read(47, "ENOENT%pre%", 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
%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 16) = 16
[pid 1194] 06:53:39 read(47, "ENOENT%pre%", 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
A última linha mostra o erro sobre a "opção de execução do hotplug".
O descritor de arquivo 47
era para interações com o banco de dados xenstored
.
A primeira linha é uma solicitação para o objeto libxl/disable_udev
data no banco de dados.
libxl/disable_udev
para libvirt
é o equivalente ao oposto de run_hotplug_scripts
em libxl
.
A segunda linha é uma leitura que mostra que o objeto não existe.
Por padrão, libvirt
assumirá que o não existente ou não definido como 1
(true) significa "Sim, execute scripts hotplug". Esse é o problema.
Para corrigir o problema, basta criar o objeto e definir seu valor como 1
. Este comando faz isso:
Lendo o objeto para confirmar que ele foi armazenado no banco de dados:
%pre%Antes
%pre%Depois de
%pre% O que é legal nessa correção é que você não terá que se preocupar com isso depois de uma reinicialização. Contanto que xend
não entre em conflito com libxl
após a reinicialização, não será necessário executar essa correção novamente.