Вопрос или проблема
Для автоматизации создания виртуальных машин на наших QEMU/KVM-хостах с Debian 11, я написал небольшой скрипт на Python, который использует virt-install для настройки новых виртуальных машин (с ОС Ubuntu 22.04). Однако в этих программно созданных ВМ я не мог использовать Git
в HTTPS-репозиториях без явного указания GNUTLS_CPUID_OVERRIDE=0x1
; я всегда получал error: git-remote-https died of signal 4
(также и другие команды, связанные с GNUTLS).
В вручную созданных ВМ я мог успешно клонировать, поэтому начал сравнивать соответствующие настройки и, наконец, смог найти проблему: это конкретный режим процессора. Рабочие ВМ (вручную созданные через virt-manager) используют host-passthrough
, тогда как ВМ, созданные с помощью моего скрипта (а значит через virt-install), используют host-model
(который при выполнении выдает EPYC ROME
).
-
Видимо, существует различие в значениях по умолчанию, которые используют virt-manager и virt-install – правда ли это?
-
Я предполагаю, что GNUTLS ошибочно предполагает наличие определенной функции процессора и пытается ее использовать, что приводит к сегфолту или подобному. Ошибочна ли детекция функций процессора в QEMU для моего процессора “EPYC ROME”?
Заранее спасибо!
KVM-QEMU может имитировать немного другую модель процессора, и libvirt это понимает. Основным случаем использования этого для оператора хоста ВМ является совместимость живых миграций.
man 7 signal
показывает, что 4 это SIGILL, Незаконная инструкция. Хотя вы можете убедиться, что бинарник совместим с вашей архитектурой, скорее всего, он использует какие-то относительно новые сложные инструкции, которые процессор может иметь или не иметь.
GnuTLS имеет обнаружение оптимизированных инструкций на этапе выполнения для повышения производительности, вы обнаружили переменную окружения GNUTLS_CPUID_OVERRIDE, которая это переопределяет. Список в документации предлагает некоторые инструкции, которые могут отсутствовать:
Эту переменную окружения можно использовать для явного включения/отключения
использования определенных возможностей процессора. Обратите внимание, что обнаружение процессора не может быть
переопределено, т.е. опции VIA не могут быть включены на процессоре Intel. В настоящее время доступные опции:0x1: Отключить все оптимизации, обнаруженные на этапе выполнения 0x2: Включить AES-NI 0x4: Включить SSSE3 0x8: Включить PCLMUL 0x10: Включить AVX 0x20: Включить SHA_NI 0x100000: Включить VIA padlock 0x200000: Включить VIA PHE 0x400000: Включить VIA PHE SHA512
libvirt с CPU хост-модели будет запускать самую способную модель, которую знает libvirt, но это не будет в точности соответствовать процессору. Да, возможно, что тот процессор, который представляет libvirt, не соответствует предположениям GnuTLS. Особенно, когда это проблема, которая может возникнуть только в момент выполнения, на конкретных конфигурациях гостевой системы.
host-passthrough позволяет использовать процессор хоста как есть. Если вам не важны живые миграции, этот реальный процессор, вероятно, будет чем-то, что было проверено.
Независимо от того, что по умолчанию используют различные программные средства libvirt, если вас волнует процессор, переопределите умолчание. virt-install --cpu host-passthrough
или отредактируйте домен после его создания.
Таинственная загадка все еще остается: какая инструкция? Используйте отладчик.
Найдите простую тестовую программу, где GnuTLS падает. (Или найдите файл дампа ядра, когда она упала раньше.)
gdb --args git # замените "git" на простую тестовую программу
(gdb) run
(gdb) layout asm
И пролистайте до конца, чтобы увидеть незаконную инструкцию. С ней вы можете:
- Настроить домен libvirt, чтобы добавить ее, но не требовать passthrough
- Использовать более целенаправленный GNUTLS_CPUID_OVERRIDE, исключая только проблемную инструкцию
- Подать баг-репорт в GnuTLS с просьбой улучшить обнаружение CPU
Ответ или решение
Если вы столкнулись с ошибкой GnuTLS signal 4 на QEMU/KVM при использовании CPU-модели "host-model", это может быть связано с особенностями работы библиотек с поддержкой инструкций процессора. Разберём наиболее вероятные причины и способы их устранения.
Причины проблемы
-
Различия в настройках virt-manager и virt-install:
Действительно, virt-manager и virt-install могут применить разные настройки по умолчанию. В частности, virt-manager использует режим "host-passthrough", который позволяет виртуальной машине получить доступ ко всем инструкциям процессора, доступным на хосте. В то же время, virt-install может использовать "host-model", представляющий наиболее подходящую модель CPU, но не обязательно идентичную фактическому хосту. -
Ошибки в обнаружении инструкций CPU:
GnuTLS выполняет обнаружение инструкций во время выполнения для повышения производительности, используя набор инструкций процессора, таких как AES-NI, AVX и другие. Если определённая инструкция недоступна по причине неправильно настроенной модели CPU, это может привести к ошибке "illegal instruction" или подобной.
Решения
-
Использование режима host-passthrough:
Если миграция виртуальных машин между хостами для вас не является критичной, используйте командуvirt-install --cpu host-passthrough
для настройки виртуальных машин, что обеспечит полное соответствие инструкций CPU. -
Использование GNUTLS_CPUID_OVERRIDE:
Если вы хотите исключить конкретные инструкции без использования полного режима "host-passthrough", можно задействовать переменную окруженияGNUTLS_CPUID_OVERRIDE=0x1
для отключения всех оптимизаций во время выполнения. Это временное решение может указать на отсутствие специфичных инструкций. -
Диагностика с использованием отладчика:
Чтобы детально изучить, какая именно инструкция вызывает сбой, вы можете использовать GDB. Запустите простую тестовую программу с GnuTLS, которая падает, и проанализируйте, на какой инструкции происходит ошибка. Это позволит вам настроить параметры модели CPU в libvirt или сообщить об ошибке в GnuTLS для улучшения механизма обнаружения.
Вывод
Виртуализация может представлять сложные задачи, особенно в отношении совместимости CPU и поддерживаемых инструкций. Чтобы избежать подобных ошибок в будущем, рекомендуется документировать все изменения в конфигурациях и тестировать их в контролируемой среде. Настройка параметров CPU может значительно повлиять на производительность и стабильность ваших виртуальных машин.
Этот ответ был составлен с использованием информации о проблеме, предоставленной пользователем, для предложения решений, которые могут уменьшить время простоя и улучшить производительность. Если вы продолжаете сталкиваться с проблемами, стоит рассмотреть возможность обращения к специалистам или поддержке GnuTLS для более детального анализа.
SEO-оптимизация: Ошибка GnuTLS, QEMU/KVM, CPU-модель, host-passthrough, host-model, Debian 11, Ubuntu 22.04, миграция виртуальных машин, CPU инструкции, отладка.