Диагностика проблем с виртуальными машинами#

При работе с ВМ можно столкнуться с разными проблемами. Некоторые проблемы могут быть быстро и легко устранены, для других, возможно, потребуется сбор данных и анализ журналов, связанных с ВМ.

Ниже приведены инструкции о создании журналов и диагностики некоторых распространенных проблем с ВМ, а также о том, как информировать разработчика об этих проблемах.

Создание журналов отладки libvirt#

Для диагностики проблем с ВМ рекомендуется создавать и просматривать журналы отладки libvirt. Прикрепление журналов отладки к запросу поддержки ускоряет решение возникших проблем, связанных с ВМ.

Ниже приведены сведения, объясняющие, что такое журналы отладки, инструкции о настройке постоянного использования журналов, включении во время работы демона libvirt и прикреплении к ним сообщении о проблемах.

Принцип работы журналов отладки libvirt#

Журналы отладки — это текстовые файлы, которые содержат данные о событиях, происходящих во время работы ВМ. Журналы предоставляют информацию об основных функциях на стороне хоста, таких как библиотеки хоста и демон libvirt. Файлы журналов также содержат стандартный вывод ошибок stderr всех работающих ВМ.

Ведение журналов отладки не включено по умолчанию и должно быть включено при запуске libvirt. Можно включить ведение журнала в рамках одной сессии или постоянно. Можно включить ведение журнала, когда сессия демона libvirt уже запущена, изменив настройки времени выполнения демона.

Включения постоянных настроек для журналов отладки libvirt#

Можно настроить автоматическое включение ведения журнала отладки libvirt при каждом запуске libvirt. По умолчанию virtqemud – основной демон libvirt в ОС SberLinux OS Server. Чтобы внести постоянные изменения в конфигурацию libvirt, необходимо отредактировать файл virtqemud.conf, расположенный в каталоге /etc/libvirt.

Примечание

В некоторых случаях, например, при обновлении с предыдущих версий SberLinux OS Server, libvirtd может оставаться включенным демоном libvirt. В этом случае следует отредактировать файл libvirtd.conf.

Для включения постоянных настроек для журналов отладки libvirt выполните следующий сценарий:

  1. Откройте файл virtqemud.conf в редакторе.

  2. Замените или установите фильтры в соответствии с требованиями. Значения фильтра отладки представлены в таблице ниже:

    Значение

    Описание

    1

    Регистрировать все сообщения, сгенерированные libvirt

    2

    Регистрировать всю неотладочную информацию

    3

    Регистрировать все предупреждения и сообщения об ошибках. Значение по умолчанию

    4

    Регистрировать только сообщения об ошибках

    Ниже приведен пример настройки демона virtqemud с использованием фильтров:

    log_filters="3:remote 4:event 3:util.json 3:rpc"
    log_outputs="1:file:/var/log/libvirt/libvirt.log"
    

    В примере применены следующие настройки:

    • Регистрация всех сообщений об ошибках и предупреждений уровней remote, util.json и rpc.

    • Регистрация сообщений об ошибках только уровня event;

    • Сохранение отфильтрованных журналов в /var/log/libvirt/libvirt.log.

  3. Сохраните файл и выйдите из редактора.

  4. Перезапустите демон libvirt:

    systemctl restart virtqemud.service
    

Включение журналов отладки libvirt во время выполнения#

Можно изменить настройки времени выполнения (runtime-настройки) libvirt, чтобы включить журналы отладки и сохранить их в выходной файл.

Данный сценарий рекомендуется, когда перезапуск демона libvirt невозможен, например, потому что одновременно запускается другой процесс, такой как миграция или резервное копирование. Изменение настроек времени выполнения также полезно, если требуется протестировать выполнение команды без редактирования файлов конфигурации или перезапуска демона.

Для включения журнала отладки libvirt во время выполнения выполните следующий сценарий:

  1. Опционально. Сделайте резервную копию активного набора фильтров журнала:

    virt-admin -c virtqemud:///system daemon-log-filters >> virt-filters-backup
    

    Примечание

    Рекомендуется создать резервную копию активного набора фильтров, чтобы можно было восстановить их после создания журналов. Если не восстановить фильтры, сообщения будут продолжать регистрироваться, что может повлиять на производительность системы.

  2. Включите отладку и настройте фильтры в соответствии с требованиями:

    virt-admin -c virtqemud:///system daemon-log-filters "3:remote 4:event 3:util.json 3:rpc"
    

    Команда выше:

    • Включает регистрацию всех сообщений об ошибках и предупреждения из уровней remote, util.json и rpc.

    • Включает регистрацию только сообщений об ошибках из уровня event.

  3. Сохраните журналы в определенный файл или каталог:

    virt-admin -c virtqemud:///system daemon-log-outputs "1:file:/var/log/libvirt/libvirt.log"
    

    Команда выше сохраняет выходные данные журнала в файл libvirt.log в каталоге /var/log/libvirt/.

  4. Опционально. Создайте пустой набор фильтров:

    virt-admin -c virtqemud:///system daemon-log-filters
    

    Пример вывода команды:

    Logging filters:
    

    Важно

    Можно удалить фильтры для создания файла журнала, который будет содержать всю информацию, связанную с ВМ. Однако это не рекомендуется, так как данный файл может содержать большое количество избыточной информации, генерируемой модулями libvirt.

  5. Опционально. Восстановите фильтры до исходного состояния с помощью файла резервной копии. Для этого выполните шаг 2 с сохраненными значениями, чтобы восстановить фильтры.

Прикрепление журналов отладки libvirt к запросам поддержки#

Если возникает возможность создать запрос поддержки для диагностики и решения проблем с ВМ, рекомендуется прикрепить к нему журналы отладки. Разработчик в этом случае будет иметь доступ ко всей информации, необходимой для быстрого решения проблемы, связанной с ВМ.

При возникшей проблеме:

  • Подготовьте запрос в службу поддержки.

  • В зависимости от ошибок к запросу с описанием возникших проблем прикрепите следующие журналы:

    • при проблемах со службой libvirt – файл хоста /var/log/libvirt/libvirt.log;

    • при проблемах с конкретной ВМ прикрепите соответствующий файл журнала. Например, для ВМ <example-vm> прикрепите файл <example-vm>.log, который можно найти по пути /var/log/libvirt/qemu/<example-vm>.log.

Создание дампа ядра виртуальной машины#

Для анализа неисправностей и ошибок ВМ можно создать дамп ее ядра и сохранить его в файл на диске для последующей диагностики.

Ниже приведена информация о процессе создания дампа ядра и инструкции процесса записи дампа ядра ВМ в определенный файл.

Принцип создания дампа ядра виртуальной машины#

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

Для сохранения состояния ВМ в таких случаях используется команда virsh dump для создания дампа ядра ВМ в файле перед ее перезагрузкой. Файл дампа ядра содержит необработанный образ физической памяти ВМ, включающий подробную информацию о ВМ. Данная информация может быть использована для диагностики проблем ВМ либо вручную, либо с помощью утилиты crash.

Создание файла дампа ядра виртуальной машины#

Дамп ядра ВМ содержит подробную информацию о состоянии ВМ в любой момент времени. Эта информация похожа на snapshot и может помочь обнаружить проблемы при неисправностях или внезапном выключении ВМ.

Перед созданием файла убедитесь, что на диске достаточно места для сохранения файла. Пространство, занимаемое ВМ, зависит от объема оперативной памяти, выделенной ВМ.

Создайте дамп ядра ВМ с помощью команды virsh dump:

virsh dump <example-vm> /core/file/<filename>.file --memory-only

Команда выше сохраняет состояния ядер ВМ <example-vm>, ее памяти и общего регистра процессоров в файл <filename>.file каталога /core/file.

Пример вывода команды:

Domain 'lander1' dumped to /core/file/gargantua.file

Важно

Утилита crash не поддерживает формат файла по умолчанию команды virsh dump. Чтобы проанализировать файл дампа ядра с помощью crash, требуется создать данный файл с помощью опции --memory-only.

Также нужно использовать опцию --memory-only при создании файла дампа ядра для прикрепления к запросу в поддержку.

Если команда virsh dump завершается ошибкой System is deadlocked on memory, убедитесь, что выделено достаточно пространства для файла дампа ядра. Для этого используйте следующее значение опции crashkernel:

crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M

В качестве альтернативы не используйте crashkernel, который автоматически назначает память дампа ядра.

Обратная трассировка процессов виртуальной машины#

Если в работе процесса, связанного с ВМ, происходит сбой, для создания трассировки стека выполнения неисправного процесса можно использовать команду gstack вместе с идентификатором процесса (PID). Если процесс является частью группы потоков, то все потоки также отслеживаются.

Перед обратной трассировкой процессов убедитесь, что:

  • пакет GDB установлен;

  • известен PID процессов, которые нужно отследить, с помощью, например, команды:

    pgrep libvirt
    

    Данная команды позволяет найти PID процесса. Пример вывода команды:

    22014
    22025
    

Для выполнения трассировки процесса используйте утилиту gstack с PID процесса, который нужно отследить:

gstack <PID>

Где <PID> – это PID процесса, например, 22014.

Пример вывода команды:

Thread 3 (Thread 0x7f33edaf7700 (LWP 22017)):
#0  0x00007f33f81aef21 in poll () from /lib64/libc.so.6
#1  0x00007f33f89059b6 in g_main_context_iterate.isra () from /lib64/libglib-2.0.so.0
#2  0x00007f33f8905d72 in g_main_loop_run () from /lib64/libglib-2.0.so.0
...