Раньше virt-manager запускали прямо на сервере и выводили окно на свой компьютер через ssh -X. Отсюда две типичные беды: ошибка could not open display и квадраты вместо русских букв. Обе связаны с X11 forwarding, а не с самим virt-manager.
Сейчас так делать не нужно. virt-manager ставится на рабочую станцию и подключается к libvirt на сервере по SSH, через URI вида qemu+ssh://user@host/system. На сервере не нужны ни графика, ни шрифты, ни X-сервер. Консоли виртуальных машин (SPICE или VNC) virt-manager сам пробрасывает через тот же SSH.
Короткий рецепт: на сервере добавьте пользователя в группу libvirt, на рабочей станции настройте вход по SSH-ключу и добавьте подключение в virt-manager. Если на рабочей станции Windows или нужен доступ из браузера, используйте Cockpit с модулем cockpit-machines. X11 forwarding оставьте на крайний случай: как его настроить и как убрать квадраты вместо букв, разобрано ниже.
Схема работы и что где ставится
| Где | Что нужно | Пакеты Debian 12/13, Ubuntu 24.04 | Пакеты AlmaLinux/Rocky 9 и 10 |
|---|---|---|---|
| Сервер (гипервизор) | QEMU/KVM, libvirt, sshd | qemu-system-x86, libvirt-daemon-system | qemu-kvm, libvirt |
| Рабочая станция Linux | virt-manager, ssh-клиент | virt-manager | virt-manager (в 10-й версии из CRB, см. ниже) |
| Браузер (любая ОС) | Cockpit на сервере | cockpit, cockpit-machines | cockpit, cockpit-machines |
virt-manager на рабочей станции общается с удалённым libvirt по SSH. На стороне сервера запускается вспомогательная программа virt-ssh-helper (в старых версиях libvirt вместо неё использовался nc), которая соединяет SSH-сессию с сокетом libvirt. Вам об этом думать не нужно, пока не появится ошибка про nc.
Шаг 1. Подготовка сервера
Проверьте, что процессор поддерживает аппаратную виртуализацию и модуль KVM загружен:
grep -cE 'vmx|svm' /proc/cpuinfo
lsmod | grep kvm
Первая команда должна вывести число больше нуля, вторая показать kvm_intel или kvm_amd.
Debian 12/13 и Ubuntu 24.04
apt update
apt install qemu-system-x86 libvirt-daemon-system
systemctl status libvirtd
AlmaLinux и Rocky Linux 9/10
dnf install qemu-kvm libvirt
systemctl enable --now virtqemud.socket virtnetworkd.socket virtstoraged.socket
virt-host-validate qemu
В RHEL-ветке начиная с 9-й версии libvirt работает в виде отдельных (модульных) демонов: virtqemud, virtnetworkd, virtstoraged и т. д. Монолитный libvirtd там считается устаревшим. В Debian и Ubuntu по умолчанию по-прежнему работает libvirtd. Для подключения по SSH разницы нет: virt-ssh-helper сам найдёт нужный сокет.
Шаг 2. Пользователь и группа libvirt
Подключаться под root не нужно. Заведите обычного пользователя (или используйте существующего) и добавьте его в группу libvirt:
usermod -aG libvirt admin
Группа libvirt есть и в Debian/Ubuntu, и в AlmaLinux. Её членам libvirt разрешает полный доступ к qemu:///system: в Debian и Ubuntu через права на сокет, в AlmaLinux через правило polkit /usr/share/polkit-1/rules.d/50-libvirt.rules. Не путайте её с группой libvirt-qemu в Debian: под ней работают сами процессы QEMU, пользователю она не нужна.
Членство в группе применяется при новом входе. Выйдите из SSH-сессии, зайдите снова и проверьте:
id
virsh -c qemu:///system list --all
Если команда показала список машин (пусть пустой) без запроса пароля и без ошибки polkit, сервер готов.
Членство в libvirt по сути равно правам root на этом хосте: через libvirt можно подключить к ВМ любой файл хоста. Добавляйте в группу только администраторов.
Шаг 3. SSH-ключ на рабочей станции
virt-manager открывает несколько SSH-сессий подряд: для управления, для консоли, для каждого окна. Если входить по паролю, он будет спрашивать его снова и снова, а без графической программы ssh-askpass вообще не сможет спросить. Поэтому нужен ключ:
ssh-keygen -t ed25519
ssh-copy-id admin@kvm1.example.com
ssh admin@kvm1.example.com 'virsh -c qemu:///system list --all'
Последняя команда нужна не только для проверки. При первом подключении SSH спросит, доверять ли ключу хоста. В терминале на этот вопрос легко ответить, а virt-manager в этом месте часто падает с Host key verification failed.
Если ключ защищён паролем (так и стоит делать), загрузите его в ssh-agent, тогда пароль спросят один раз за сеанс:
ssh-add ~/.ssh/id_ed25519
Нестандартный порт и имя пользователя удобно держать в ~/.ssh/config, virt-manager его учитывает:
Host kvm1
HostName kvm1.example.com
User admin
Port 2222
IdentityFile ~/.ssh/id_ed25519
Подробнее про ключи и копирование файлов по SSH — в статье scp, sftp и rsync: копирование файлов между Linux-серверами.
Шаг 4. Подключение в virt-manager
Установите virt-manager на рабочую станцию:
# Debian, Ubuntu
apt install virt-manager
# AlmaLinux/Rocky 9
dnf install virt-manager
# AlmaLinux/Rocky 10: пакет лежит в репозитории CRB
dnf config-manager --set-enabled crb
dnf install virt-manager
В графическом интерфейсе: «Файл» → «Добавить соединение». Гипервизор QEMU/KVM, отметьте «Подключиться к удалённому узлу через SSH», укажите имя пользователя и хост (порт можно через двоеточие: kvm1.example.com:2222). Поставьте галочку «Автоподключение», если хост нужен постоянно.
То же самое из командной строки:
virt-manager -c 'qemu+ssh://admin@kvm1.example.com/system'
# с портом и явным ключом
virt-manager -c 'qemu+ssh://admin@kvm1.example.com:2222/system?keyfile=/home/user/.ssh/id_ed25519'
# если описан Host kvm1 в ~/.ssh/config
virt-manager -c 'qemu+ssh://kvm1/system'
Проверить соединение без графики можно через virsh с того же компьютера:
virsh -c 'qemu+ssh://admin@kvm1.example.com/system' list --all
virsh -c 'qemu+ssh://admin@kvm1.example.com/system' nodeinfo
Чтобы не писать -c каждый раз, задайте адрес по умолчанию: export LIBVIRT_DEFAULT_URI='qemu+ssh://kvm1/system'.
/system и /session
Окончание URI важно. /system — системный экземпляр libvirt, где живут все серверные ВМ, сети и пулы хранения. /session — личный экземпляр пользователя, в нём свои машины, обычно пустые. Частая жалоба «подключился, а машин нет» почти всегда означает, что в URI стоит /session.
Консоли ВМ
Графика гостя (SPICE или VNC) на сервере должна слушать только 127.0.0.1, так и сделано по умолчанию. virt-manager сам пробросит её через SSH. Открывать порты 5900 и выше в интернет не нужно и опасно: на VNC часто нет пароля.
Если рабочая станция на Windows
Нативной сборки virt-manager для Windows нет. Варианты:
- WSL2 на Windows 11. Поставьте Ubuntu или Debian в WSL, внутри
apt install virt-manager. Графические программы из WSL работают через встроенный WSLg без отдельного X-сервера. Дальше всё как в Linux: ключ,qemu+ssh://. - Cockpit. Веб-интерфейс на сервере, нужен только браузер. Разобран ниже.
- X-сервер на Windows и
ssh -X. Тот самый старый способ с PuTTY и Xming (сейчас чаще VcXsrv или MobaXterm). Работает, но медленно и требует ставить графику на сервер.
Если всё же нужен X11 forwarding
Иногда до сервера можно добраться только через промежуточный хост, а ставить что-то на рабочую станцию нельзя. Тогда virt-manager запускается на сервере, а окно рисуется у вас.
Что нужно на сервере
# Debian, Ubuntu
apt install virt-manager xauth
# AlmaLinux/Rocky 9
dnf install virt-manager xorg-x11-xauth
Полноценный X-сервер (xorg-x11-server-Xorg, xserver-xorg) на сервере не нужен. Окно отображает X-сервер на вашей стороне, на сервере достаточно xauth. Старые инструкции, где ставят Xorg на гипервизор, тянут сотни лишних пакетов.
Настройка sshd
Проверьте фактическое значение параметров:
sshd -T | grep -i x11
Нужно x11forwarding yes. В Debian, Ubuntu и AlmaLinux это значение по умолчанию в /etc/ssh/sshd_config. Если оно выключено, включите его в файле или в отдельном файле в /etc/ssh/sshd_config.d/ и перечитайте конфигурацию:
# Debian, Ubuntu
systemctl reload ssh
# AlmaLinux
systemctl reload sshd
Перезагружать сервер не нужно. Параметр X11UseLocalhost оставьте как есть (yes). Совет переключить его в no встречается в старых статьях, но тогда проброшенный дисплей слушает на всех интерфейсах сервера, и к нему может подключиться кто угодно из сети. Для virt-manager это не требуется.
Запуск
ssh -X admin@kvm1.example.com
echo $DISPLAY # примерно так: localhost:10.0
virt-manager --no-fork
Если $DISPLAY пустой, проброс не заработал: нет xauth, выключен X11Forwarding или вы забыли -X. Тогда virt-manager и выдаёт cannot open display. Если окно открывается, но часть функций падает с ошибками доступа к X, попробуйте ssh -Y (доверенный проброс). Используйте его только для своих серверов.
В PuTTY проброс включается в Connection → SSH → X11 → Enable X11 forwarding, на Windows при этом должен быть запущен X-сервер.
Квадраты вместо букв
При X11 forwarding программа рисует текст шрифтами сервера, а не вашего компьютера. На минимальной установке сервера шрифтов с кириллицей часто нет вообще, и русские названия ВМ, пункты меню или текст в диалогах превращаются в квадраты.
Лечится установкой шрифтов на сервер:
# Debian, Ubuntu
apt install fonts-dejavu-core fontconfig
# AlmaLinux/Rocky 9 и 10
dnf install dejavu-sans-fonts fontconfig
Подойдёт и семейство Noto: fonts-noto-core в Debian/Ubuntu, google-noto-sans-fonts в AlmaLinux. После установки обновите кэш и проверьте, что шрифты с русским языком видны:
fc-cache -f
fc-list :lang=ru | head
Перезапустите virt-manager. Если интерфейс должен быть на русском, на сервере нужна ещё и русская локаль: в Debian/Ubuntu dpkg-reconfigure locales (выбрать ru_RU.UTF-8), в AlmaLinux пакет glibc-langpack-ru. Без неё будут предупреждения cannot change locale, но квадраты от этого не появляются, их причина всегда в шрифтах.
При подключении через qemu+ssh:// с рабочей станции этой проблемы нет: окно рисуется локально вашими шрифтами.
Cockpit как альтернатива
Cockpit — веб-консоль для Linux-серверов, модуль cockpit-machines добавляет в неё управление ВМ libvirt: создание, консоль в браузере, диски, сети, снимки. Red Hat продвигает именно его как замену virt-manager в RHEL 9 и 10.
# Debian 12/13, Ubuntu 24.04
apt install cockpit cockpit-machines
# AlmaLinux/Rocky 9 и 10
dnf install cockpit cockpit-machines
systemctl enable --now cockpit.socket
Cockpit слушает порт 9090 и пускает по системным учётным записям. Не открывайте этот порт в интернет. Самый простой безопасный вариант — SSH-туннель:
ssh -L 9090:localhost:9090 admin@kvm1.example.com
После этого откройте в браузере https://localhost:9090. Если доступ нужен из офисной сети, разрешите порт в firewall только для её адресов. Пароль пользователя должен быть стойким, а вход под root в Cockpit лучше запретить (по умолчанию он запрещён через /etc/cockpit/disallowed-users).
Если машин много и нужен кластер, бэкапы и полноценный веб-интерфейс, посмотрите на Proxmox VE: установка Proxmox VE на свой сервер. Про настройку гостевых Windows под KVM есть отдельная статья: драйверы VirtIO для Windows.
Типичные ошибки
| Симптом | Причина | Решение |
|---|---|---|
authentication unavailable: no polkit agent available to authenticate action 'org.libvirt.unix.manage' | Пользователь не в группе libvirt или ещё не перелогинился | usermod -aG libvirt user, новый вход по SSH, проверка id |
Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory | libvirt не установлен или не запущен; в AlmaLinux не включены модульные демоны | Debian/Ubuntu: systemctl enable --now libvirtd; AlmaLinux: systemctl enable --now virtqemud.socket |
Host key verification failed | Ключ хоста ещё не принят или изменился | Один раз зайти ssh user@host из терминала; при смене ключа ssh-keygen -R host |
Бесконечные запросы пароля или ошибка про ssh-askpass | Вход по паролю без графической программы запроса | Ключ + ssh-agent; как временная мера пакет ssh-askpass |
nc: command not found | Старый libvirt без virt-ssh-helper на одной из сторон | Обновить libvirt или поставить на сервер netcat-openbsd / nmap-ncat |
| Подключение есть, машин нет | URI с /session вместо /system | Использовать qemu+ssh://user@host/system |
cannot open display | Не работает X11 forwarding | ssh -X, пакет xauth на сервере, X11Forwarding yes |
| Квадраты вместо русских букв | На сервере нет шрифтов с кириллицей | fonts-dejavu-core или dejavu-sans-fonts, fc-cache -f |
Частые вопросы
Нужно ли ставить графическую оболочку на сервер с KVM?
Нет. При подключении через qemu+ssh:// на сервере нужны только QEMU, libvirt и sshd. Графика, шрифты и сам virt-manager стоят на рабочей станции. Даже для X11 forwarding на сервер ставится не X-сервер, а только xauth и virt-manager с зависимостями.
Можно ли подключаться под root?
Технически можно, но вход root по SSH лучше держать выключенным. Обычный пользователь в группе libvirt получает тот же доступ к ВМ, а в журналах видно, кто именно работал. Помните, что права этой группы фактически равны root-доступу к хосту.
Как подключиться, если SSH на нестандартном порту?
Укажите порт в URI: qemu+ssh://admin@host:2222/system. Удобнее описать хост в ~/.ssh/config с полями HostName, Port, User и IdentityFile, а в URI писать только псевдоним.
Почему консоль ВМ открывается медленно или с задержкой?
Консоль идёт через SSH-туннель, на медленном канале это заметно. Помогает SPICE вместо VNC, меньшее разрешение экрана гостя и для Linux-гостей работа по SSH напрямую вместо графической консоли. С X11 forwarding будет ещё медленнее, потому что по сети передаётся весь интерфейс virt-manager.
Что выбрать: virt-manager или Cockpit?
virt-manager удобнее для детальной настройки ВМ: XML, устройства, проброс PCI. Cockpit проще для повседневной работы и не требует ничего ставить на клиент, кроме браузера. Их можно использовать одновременно: оба работают поверх одного libvirt и видят одни и те же машины.
Квадраты появились в консоли гостя, а не в меню virt-manager. Это то же самое?
Нет. Если квадраты внутри окна гостевой системы, проблема в шрифтах или локали самого гостя, например в текстовой консоли Linux без кириллического шрифта. Её решают внутри ВМ (в Debian и Ubuntu пакет console-setup), шрифты на гипервизоре здесь ни при чём.