Вопрос или проблема
У меня есть хост на основе Debian с несколькими виртуальными машинами, которые были настроены в пользовательской сессии virt-manager для лучшей безопасности: в случае, если кто-то выберется из виртуальной машины, у него не будет немедленного доступа к root.
Сеть настроена так, чтобы виртуальные машины были доступны извне хоста.
Теперь я заметил, что ни одна из виртуальных машин не доступна, пока я не войду локально на хосте. Похоже, что вся пользовательская сессия не запускается до этого первого входа на хост. Это не обязательно должно быть входом в рабочий стол, консоль вполне достаточна. И мне не нужно ничего запускать вручную. Сразу после входа всё просто запускается. По крайней мере, сессия и виртуальные машины продолжают работать, когда я выхожу.
Существует ли способ запустить пользовательскую сессию libvirt при загрузке хоста (или, что еще лучше, через несколько минут после загрузки)?
Вторичный вопрос: как это вообще работает? Как libvirt знает, когда пользователь входит в систему?
Я подозреваю, что это не на самом деле пользовательская сессия libvirt – вместо этого демоны libvirt работают как часть systemd менеджера сервисов на уровне пользователя, который запускается вместе с
Существует ли способ запустить пользовательскую сессию libvirt при загрузке хоста (или, что еще лучше, через несколько минут после загрузки)?
Запустите loginctl enable-linger <имя_пользователя>
, чтобы менеджер сервисов systemd –user запускался при загрузке для этого пользователя.
Используйте systemctl --user -t service
, чтобы найти сервисы, которые заставляют виртуальные машины запускаться; отключите их (переместите в другую .target) и создайте .timer systemd, который запускает их немного позже.
Вторичный вопрос: как это вообще работает? Как libvirt знает, когда пользователь входит в систему?
Если libvirt запущен как пользовательский сервис, то ему все равно – он запускается, когда ему нужно запуститься.
Процедура входа вызывает различные модули PAM через /etc/pam.d, некоторые из которых отвечают за различные аспекты “настройки сессии” (например, установка переменных окружения или отображение /etc/motd). Один из них – pam_systemd, который информирует службу systemd-logind о новой пользовательской сессии, и logind соответственно запускает или останавливает user@<uid>.service (ваш менеджер сервисов на уровне пользователя).
Ответ или решение
Решение проблемы с virt-manager и libvirt: запуск сессии пользователя при первой авторизации на хосте вместо загрузки
Введение
Виртуализация на основе libvirt и virt-manager позволяет создавать и управлять виртуальными машинами (ВМ) с акцентом на безопасность и изоляцию. Однако, как вы отметили, для доступа к вашим ВМ необходимо сначала войти в систему на хосте, что может быть не самым удобным решением. В этом руководстве мы рассмотрим, как настроить запуск сессии пользователя и виртуальных машин сразу при загрузке системы, а также разберемся в механизмах, обеспечивающих эту функциональность.
Проблема
Недостаток в текущей конфигурации заключается в том, что сессия пользователя, необходимая для работы libvirt и запуска связанных с ним ВМ, инициализируется только при первой авторизации пользователя на хосте. Это может привести к недоступности ВМ до тех пор, пока пользователь не войдет в систему.
Решение проблемы
Чтобы разрешить данную ситуацию, можно воспользоваться механикой управления службами в системе на базе systemd. Вот шаги, которые вам необходимо выполнить:
-
Включение поддержки "linger" для пользователя:
Для того чтобы systemd-менеджер уровня пользователя (systemd –user) запускался на этапе загрузки системы, выполните следующую команду:loginctl enable-linger <имя_пользователя>
Эта команда позволяет пользователю продолжать работать с его пользовательскими службами даже при отсутствии активного сеанса.
-
Поиск служб, запускающих ВМ:
Выполните следующую команду для определения служб, которые ответственны за старт ваших ВМ:systemctl --user -t service
Обратите внимание на списки сервисов и найдите те, которые используются для запуска ВМ.
-
Деактивация служб и создание таймера:
Чтобы запустить ВМ позже после загрузки, деактивируйте соответствующие службы, переместив их в другую цель, и создайте таймер systemd, который будет их запускать немного позже:systemctl --user stop <имя_сервиса> systemctl --user disable <имя_сервиса>
Создайте файл таймера, например
/etc/systemd/user/myscript.timer
:[Unit] Description=Запуск ВМ через 2 минуты после загрузки [Timer] OnBootSec=2min Unit=<имя_сервиса>.service [Install] WantedBy=default.target
Активируйте таймер:
systemctl --user enable myscript.timer
Второстепенный вопрос: Как libvirt определяет момент входа пользователя?
Система управления сессиями в Linux использует PAM (Pluggable Authentication Modules) для управления различными аспектами аутентификации и сессионной работы пользователей. Модуль pam_systemd
отвечает за уведомление службы systemd-logind о новой пользовательской сессии. Когда пользователь входит в систему, PAM вызывает модули, устанавливающие среду пользователя, и в том числе создает сессию для systemd в виде user@<uid>.service
.
Таким образом, libvirt не требует ручного вмешательства для отслеживания входов пользователей, поскольку уже имеет систему уведомлений от PAM, что позволяет службам автоматически запускаться по мере необходимости.
Заключение
Процесс настройки автозапуска сессии пользователя и ВМ в вашем окружении с использованием virt-manager и libvirt можно легко автоматизировать с помощью возможностей systemd. С помощью предложенных шагов вы можете улучшить доступность ваших ВМ, что обеспечит большую гибкость и интуитивно понятный процесс управления виртуальными машинами. Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обратиться за поддержкой.