virt-manager на удалённом хосте: подключение по SSH и проблема со шрифтами

Раньше 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, sshdqemu-system-x86, libvirt-daemon-systemqemu-kvm, libvirt
Рабочая станция Linuxvirt-manager, ssh-клиентvirt-managervirt-manager (в 10-й версии из CRB, см. ниже)
Браузер (любая ОС)Cockpit на сервереcockpit, cockpit-machinescockpit, 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 directorylibvirt не установлен или не запущен; в 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 forwardingssh -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), шрифты на гипервизоре здесь ни при чём.