libvirtd: служба выключена, но виртуальные машины управляются
Современные сборки службы управления виртуализацией работают через активацию по сокету: сама служба выключена, а запускается по обращению. Попытка включить её обычным способом даёт неверную картину, а отключение сокетов ломает управление машинами.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Включать нужно сокеты, а не службу
Обращение приходит на сокет, systemd запускает службу. Служба в выключенном состоянии — это норма такой схемы.
-
Машины с автозапуском не поднимаются после перезагрузки
При активации по сокету служба не запускается сама, а значит и машины с автозапуском не поднимаются, пока никто не обратится.
-
Старые и новые сокеты включены одновременно
В новых сборках службу разделили на отдельные драйверы со своими сокетами. Смешение старой и новой схемы даёт отказы подключения.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Состояние службы и её сокета.
systemctl is-active libvirtd libvirtd.socket 2>/dev/nullКакие unit этого семейства есть и что включено.
systemctl list-unit-files "libvirt*" --no-legendОтвечает ли управление виртуализацией на запросы.
sudo virsh list --all 2>/dev/nullРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Обращение приходит на сокет, systemd запускает службу. Служба в выключенном состоянии — это норма такой схемы.
- Как проверить
-
Посмотрите состояние службы и её сокетов.
systemctl is-active libvirtd libvirtd.socket libvirtd-ro.socket 2>/dev/null systemctl list-unit-files "libvirt*" --no-legend | head
- Как исправить
-
Включайте сокеты, а не службу. Автозапуск самой службы при этой схеме не нужен и мешает.
sudo systemctl enable --now libvirtd.socket libvirtd-ro.socket
- Почему происходит
- При активации по сокету служба не запускается сама, а значит и машины с автозапуском не поднимаются, пока никто не обратится.
- Как проверить
-
Посмотрите, какие машины помечены автозапуском.
sudo virsh list --all --autostart 2>/dev/null; systemctl is-enabled libvirtd 2>/dev/null
- Как исправить
- Включите автозапуск самой службы в дополнение к сокетам, если машины должны подниматься без обращения извне.
- Почему происходит
- В новых сборках службу разделили на отдельные драйверы со своими сокетами. Смешение старой и новой схемы даёт отказы подключения.
- Как проверить
-
Посмотрите все включённые сокеты этого семейства.
systemctl list-unit-files "virt*.socket" "libvirt*.socket" --no-legend 2>/dev/null | head -20
- Как исправить
- Выберите одну схему: монолитную службу или раздельные драйверы. Держать включённым и то и другое нельзя.
Пример вывода
Служба выключена, но управление работает через сокет. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ systemctl is-active libvirtd
inactive
$ systemctl is-active libvirtd.socket
active
$ sudo virsh list --all
Id Name State
1 web running
Связанные ошибки
- Сокет и служба включены одновременно: конфликт при загрузке При сокет-активации в автозапуск включена и служба, и сокет. Порт занимает то, что стартовало первым.
- Служба не получает сокет при сокет-активации Сокет активен, служба запускается, но не находит переданный дескриптор. Разбор: Accept, FileDescriptorName, соответствие имён.
- Служба active, но не работает: обёртки и oneshot Почему состояние active не означает работающую программу: oneshot с RemainAfterExit, обёртки, потерянный главный процесс.
- Bad file descriptor в журнале службы Ошибка 9 при операции с файлом: дескриптор закрыт или не тот. Разбор для служб и сокет-активации.
- File exists при создании файла или сокета Ошибка 17: объект уже существует. Разбор для сокетов, файлов блокировки и каталогов службы.
- MySQL: Can't connect to local server through socket Клиент не находит unix-сокет MySQL: сервер не запущен, путь к сокету другой, каталог в /run не создан.
- Puma слушает сокет, а веб-сервер получает отказ доступа Разъём между приложением и веб-сервером: сокет создаётся с правами приложения, читает его другой пользователь.
- sshd: смена порта не действует из-за ssh.socket Порт в sshd_config игнорируется, потому что адрес слушает systemd через сокет-активацию. Где менять порт.
Источники
-
systemd.socket(5)
Активация служб по обращению на сокет. - Документация libvirt: режимы запуска службы
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на systemd 255: служба неактивна, сокет активен, управление отвечает.