Назад | Перейти на главную страницу

Возврат к libxl с xend без перезагрузки

Я сделал что-то тупое: включил 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?

Уже известно, что перезагрузка решит эту проблему, но я бы предпочел избежать перезагрузки.

Решение

Выполните эту команду:

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 для libvirt эквивалентно противоположности 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 после перезагрузки вам не нужно запускать это исправление снова.