Mudando de volta para o libxl do xend sem reinicializar

1

Eu fiz algo estúpido: habilitei xend over libxl e iniciei uma instância com xend .

Agora, libxl não inicia nenhuma instância, embora eu tenha me livrado de todas as xend instâncias e interrompido 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'

Do arquivo de log /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

Eu tenho algumas instâncias de libxl em execução, e seria um inconveniente desligá-las para reafirmar o domínio de libxl .

Como posso obter libxl para iniciar as instâncias novamente depois de ativar e desativar xend ?

Já se sabe que uma reinicialização resolveria esse problema, mas eu preferiria evitar uma reinicialização.

    
por Deltik 03.06.2015 / 20:34

1 resposta

2

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_udev
xenstore-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_udev
xenstore-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:

%pre%

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.

    
por 04.06.2015 / 14:52