SPICE
Краткий обзор технологий
Протокол SPICE
SPICE — простой протокол для независимой вычислительной среды. Позволяет работать с «виртуальным рабочим столом», в том числе, через Интернет, причём и на стороне «клиента», и на стороне «сервера» могут выступать различные операционные системы и аппаратные платформы (подробнее). Хотя изначально SPICE проектировался исключительно для виртуальных сред, его можно поставить в один ряд с новейшими (объектными) версиями таких «чисто терминальных» протоколов, как RDP и NX.
Proxmox VE
PVE — готовое решение для управления средой виртуализации, позволяющее обеспечить, в числе прочего, безопасный удалённый доступ по протоколу SPICE к большому количеству терминальных серверов, работающих внутри виртуальных машин KVM. При этом можно задействовать максимум возможностей, предоставляемых протоколом SPICE и гипервизором QEMU/KVM, в том числе, проброс USB-флэшек, смарт-карт, принтеров, звука, получить более тесную интеграцию с окном гостевой системы (бесшовную работу мыши, клавиатуры, динамическое переключение разрешения экрана, общий с гостевой системой буфер обмена для операций копирования/вставки).
OpenStack
OpenStack — ещё одно готовое решение для построения более масштабной инфраструктуры облачных сервисов и облачных хранилищ. Как и PVE, OpenStack позволяет обеспечить, в числе прочего, безопасный удалённый доступ по протоколу SPICE к большому количеству терминальных серверов, работающих внутри виртуальных машин, использующих гипервизор QEMU/KVM.
SPICE-сервер
SPICE-сервер реализован библиотекой libspice. Пока что основным пользователем этой библиотеки является среда виртуализации QEMU, использующая SPICE-сервер для предоставления удалённого доступа к виртуальным машинам через протокол SPICE. Таким образом, все возможности протокола SPICE на данный момент могут быть обеспечены только в виртуальной среде на основе QEMU. Поскольку код SPICE-сервера вынесен в отдельную библиотеку, есть надежда на скорое появление реализаций, выходящих за рамки этой виртуальной среды.
SPICE-клиенты
SPICE-клиенты — это программы, которые используются для удалённого доступа по протоколу SPICE. Рекомендуемым SPICE-клиентом является remote-viewer из пакета virt-viewer. Программа spicy из пакета libspice-gtk-tools может использоваться в тестовых целях, всей функциональности она не предоставляет. Установив пакет spice-html5, можно получить удалённый доступ к «виртуальному рабочему столу» прямо из веб-браузера.
Драйвер QXL VGA
SPICE-сервер поддерживает интерфейс VDI QXL. Когда libspice используется с QEMU, для улучшения производительности «удалённого» дисплея и улучшения графических возможностей «гостевой» графической системы можно задействовать определенное видео-устройство PCI. Это видео-устройство называется устройством QXL. Оно требует наличия «гостевых» драйверов QXL для полной функциональности.
Агент «виртуального рабочего стола»
SPICE VDAgent — необязательный компонент, улучшающий интеграцию окна гостевой системы с графическим интерфейсом удалённого пользователя. SPICE-протокол поддерживает канал связи между клиентом и агентом на стороне сервера. Агент работает внутри гостевой системы. Для связи с агентом в гостевой системе также используется специальное устройство, так называемый VDI-порт.
Перенаправление папок
Для возможности получения доступа к локальной папке, внутри ВМ должен быть установлен пакет spice-webdavd. В этом случае общая папка будет доступна через локальный сервер WebDAV по адресу http://localhost:9843.
Доступ к общей папке из файлового менеджера:
- Dolphin — «Сеть»→«Сетевые службы»→«Сетевой каталог WebDav»→«Spice client folder»;
- Thunar — в адресной строке ввести адрес с указанием протокола dav или davs (dav://localhost:9843/).
Терминальный сервер на физическом узле
Терминальный сервер может быть развёрнут не только в виртуальной среде. Он может работать и на физическом железе, даже без видеокарты. Headless/bare-metal конфигурация теперь легко настраивается благодаря наличию в репозитории Xorg-модуля spiceqxl.
Общий доступ к рабочему столу
x11spice позволяет предоставлять удалённый общий доступ к своему рабочему столу (сеансу, уже запущенному на реальной видеокарте). Это аналог общего рабочего стола X2Go (похожая функция в Windows называется "Удалённый помощник", для тех же целей служит TeamViewer).
Аргументы командной строки переопределяют настройки файла конфигурации.
Файл конфигурации /etc/xdg/x11spice/x11spice.conf. Рекомендуется скопировать этот файл под обычным пользователем в ~/.config/x11spice/x11spice.conf и изменять настройки в нём.
Правим конфигурацию под обычным пользователем:
$ mkdir ~/.config/x11spice
$ cp -L /etc/xdg/x11spice/x11spice.conf ~/.config/x11spice/
$ mcedit ~/.config/x11spice/x11spice.conf
- указать пароль явно (параметр password)
- сгенерировать пароль и показать его в терминале (параметр generate-password)
- брать пароль из файла (параметр password-file).
В файлах конфигурации и в командной строке должен быть указан один из этих параметров. Иначе, например, если в файле указан параметр password, а в командной строке задавать generate-password, сервер не будет запущен с ошибкой:
$ x11spice --generate-password=6
Error: you can specify only one of password, password-file, and generate-password
Чтобы подключаемый мог не только видеть рабочий стол, но и менять на нём что-либо, требуется включить опцию allow-control=true.
Теперь на клиенте запускаем x11spice из «Меню запуска приложений» («Стандартные/Инструменты» → «x11spice (Удалённый помощник)») или из командной строки.
Пример запуска SPICE-сервера из командной строки:
$ x11spice --allow-control --generate-password=5
PASSWORD=uDJHY
При нажатии на кнопку «Отключиться», соединение будет разорвано, при нажатии на кнопку «Выйти» — будет остановлен сервер Spice.
Прямое использование qemu/kvm
...
Настройка терминального сервера
# apt-get install xorg-drv-spiceqxl
# cp -af /etc/X11/xorg.conf.d /root/
# rm -f /etc/X11/xorg.conf.d/*
# cat >/etc/X11/xorg.conf <<EOF
# https://cgit.freedesktop.org/xorg/driver/xf86-video-qxl/plain/examples/spiceqxl.xorg.conf.example
Section "Device"
Identifier "XSPICE QXL"
Driver "spiceqxl"
# ---- Network and security options
#Option "SpiceDisableTicketing" "False"
Option "SpicePassword" "123"
#Option "SpicePort" "5900"
#Option "SpiceTlsPort" "5900"
#Option "SpiceSasl" "False"
#Option "SpiceX509Dir" ""
#Option "SpiceCacertFile" ""
#Option "SpiceX509KeyFile" ""
#Option "SpiceX509KeyPassword" ""
#Option "SpiceX509CertFile" ""
#Option "SpiceDhFile" ""
#Option "SpiceTlsCiphers" ""
#Option "SpiceAddr" ""
#Option "SpiceIPV4Only" "True"
#Option "SpiceIPV6Only" "False"
#Option "SpiceExitOnDisconnect" "False"
# ---- Monitor configuration options
Option "NumHeads" "1"
# ---- Compression options
#Option "SpiceZlibGlzWanCompression" "auto"
#Option "SpiceJpegWanCompression" "auto"
#Option "SpiceImageCompression" "auto_glz"
#Option "SpiceDeferredFPS" "10"
#Option "SpiceStreamingVideo" "filter"
#Option "SpiceVideoCodecs" ""
#Option "EnableImageCache" "True"
#Option "EnableFallbackCache" "True"
#Option "EnableSurfaces" "True"
# ---- Xspice-specific buffer options
#Option "SurfaceBufferSize" "128"
#Option "CommandBufferSize" "128"
#Option "FrameBufferSize" "16"
# ---- VDAgent options
#Option "SpiceVdagentEnabled" "False"
#Option "SpiceVdagentVirtioPath" "/tmp/xspice-virtio"
#Option "SpiceVdagentUinputPath" "/tmp/xspice-uinput"
#Option "SpiceVdagentUid" "0"
#Option "SpiceVdagentGid" "0"
#Option "SpiceAgentMouse" "True"
#Option "SpicePlaybackCompression" "True"
#Option "SpiceDisableCopyPaste" "False"
#Option "SpicePlaybackFIFODir" ""
#Option "SpiceSmartCardFile" "/tmp/spice.pcsc.comm"
EndSection
Section "InputDevice"
Identifier "XSPICE Pointer"
Driver "xspice pointer"
EndSection
Section "InputDevice"
Identifier "XSPICE Keyboard"
Driver "xspice keyboard"
EndSection
Section "Monitor"
Identifier "XSPICE Monitor"
EndSection
Section "Screen"
Identifier "XSPICE Screen"
Monitor "XSPICE Monitor"
Device "XSPICE QXL"
DefaultDepth 24
EndSection
Section "ServerLayout"
Identifier "XSPICE Layout"
Screen "XSPICE Screen"
InputDevice "XSPICE Keyboard"
InputDevice "XSPICE Pointer"
EndSection
Section "ServerFlags"
Option "AutoAddDevices" "False"
EndSection
EOF
Удалённое подключение к терминальному серверу
# apt-get install libspice-gtk-tools virt-viewer spice-html5
$ remote-viewer "spice://10.X.Y.Z?port=5900&password=123"
$ spicy -p 5900 -h 10.X.Y.Z -w 123
HTML5 Client
HTML5 Client позволяет подключиться к удалённому компьютеру без установки какого-либо клиента — используется лишь браузер.
Настройка удалённого доступа:
- Установить пакеты spice-html5 и python-module-websockify:
# apt-get install spice-html5 python-module-websockify
- Запустить SPICE сервер.
- Запустить websockify:
$ websockify.py2 5959 127.0.0.1:5900 --web /usr/share/spice-html5
- Первый параметр в данной команде — порт на котором spice-html5 будет слушать. Второй параметр — IP и порт, где стоит SPICE сервер: 127.0.0.1:5900. Третий параметр --web — запустить веб-сервер на том же порту, отдавать содержимое директории /usr/share/spice-html5.
Для подключения к удаленному рабочему столу:
- Запустить браузер.
- В адресной строке ввести адрес удалённого компьютера и порт, на котором слушает сервер:
- Нажать кнопку «Spice». Указать хост, на котором работает websockify; порт, который был указан при запуске websockify; пароль и нажать кнопку «Start Connection»:
Продолжение следует...