Ошибка GnuTLS сигнал 4 на QEMU/KVM с CPU, установленным в “host-model”

Вопрос или проблема

Для автоматизации создания виртуальных машин на наших 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).

  1. Видимо, существует различие в значениях по умолчанию, которые используют virt-manager и virt-install – правда ли это?

  2. Я предполагаю, что 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", это может быть связано с особенностями работы библиотек с поддержкой инструкций процессора. Разберём наиболее вероятные причины и способы их устранения.

Причины проблемы

  1. Различия в настройках virt-manager и virt-install:
    Действительно, virt-manager и virt-install могут применить разные настройки по умолчанию. В частности, virt-manager использует режим "host-passthrough", который позволяет виртуальной машине получить доступ ко всем инструкциям процессора, доступным на хосте. В то же время, virt-install может использовать "host-model", представляющий наиболее подходящую модель CPU, но не обязательно идентичную фактическому хосту.

  2. Ошибки в обнаружении инструкций CPU:
    GnuTLS выполняет обнаружение инструкций во время выполнения для повышения производительности, используя набор инструкций процессора, таких как AES-NI, AVX и другие. Если определённая инструкция недоступна по причине неправильно настроенной модели CPU, это может привести к ошибке "illegal instruction" или подобной.

Решения

  1. Использование режима host-passthrough:
    Если миграция виртуальных машин между хостами для вас не является критичной, используйте команду virt-install --cpu host-passthrough для настройки виртуальных машин, что обеспечит полное соответствие инструкций CPU.

  2. Использование GNUTLS_CPUID_OVERRIDE:
    Если вы хотите исключить конкретные инструкции без использования полного режима "host-passthrough", можно задействовать переменную окружения GNUTLS_CPUID_OVERRIDE=0x1 для отключения всех оптимизаций во время выполнения. Это временное решение может указать на отсутствие специфичных инструкций.

  3. Диагностика с использованием отладчика:
    Чтобы детально изучить, какая именно инструкция вызывает сбой, вы можете использовать GDB. Запустите простую тестовую программу с GnuTLS, которая падает, и проанализируйте, на какой инструкции происходит ошибка. Это позволит вам настроить параметры модели CPU в libvirt или сообщить об ошибке в GnuTLS для улучшения механизма обнаружения.

Вывод

Виртуализация может представлять сложные задачи, особенно в отношении совместимости CPU и поддерживаемых инструкций. Чтобы избежать подобных ошибок в будущем, рекомендуется документировать все изменения в конфигурациях и тестировать их в контролируемой среде. Настройка параметров CPU может значительно повлиять на производительность и стабильность ваших виртуальных машин.

Этот ответ был составлен с использованием информации о проблеме, предоставленной пользователем, для предложения решений, которые могут уменьшить время простоя и улучшить производительность. Если вы продолжаете сталкиваться с проблемами, стоит рассмотреть возможность обращения к специалистам или поддержке GnuTLS для более детального анализа.


SEO-оптимизация: Ошибка GnuTLS, QEMU/KVM, CPU-модель, host-passthrough, host-model, Debian 11, Ubuntu 22.04, миграция виртуальных машин, CPU инструкции, отладка.

Оцените материал
Добавить комментарий

Капча загружается...