Глава 6. Устройства и протоколы Виртуальных устройств отображения

В этой главе мы обсудим те способы, которыми мы получаем доступ к своим виртуальным машинам применяя виртуальные графические карты и протоколы. Существуют доступными почти 10 адаптеров виртуального отображения, которые мы способны применять в своих виртуальных машинах и имеется множество доступных протоколов и приложений, которые мы можем применять для доступа к своим виртуальным машинам. Если мы на секунду забудем про SSH и любой вид в целом доступа на основе консоли, на рынке имеются различные протоколы, которые мы можем применять для доступа к имеющейся консоли своей виртуальной машины, например, VNC, SPICE и noVNC.

В основанных на Microsoft средах мы имеем тенденцию использовать RDP (remote desktop protocol, протокол удалённого рабочего стола). Когда мы обсуждаем VDI (Virtual Desktop Infrastructure, инфраструктуру виртуального рабочего стола), тогда имеются доступными дополнительные протоколы - PCoIP (PC over IP), VMware Blast и тому подобные. Некоторые из этих технологий предлагают дополнительные функциональные возможности, к примеру, большую глубину цветов, шифрование, перенаправление аудио и файловых систем, перенаправление принтера, управление полосой пропускания, а также перенаправление USB и прочих портов. Именно они выступают ключевыми технологиями для вашего удалённого рабочего стола в современном облачном мире.

Всё это означает, что мы обязаны потратить некоторое время и часть усилий на изучение различных устройств отображения и протоколов, а также того как их настраивать и применять. Мы не хотим попадать в такие ситуации когда мы не способны видеть свой дисплей виртуальной машины потому как выбрали неверное устройство виртуального отображения или в обстоятельствах, когда мы пробуем открыть консоль чтобы наблюдать содержимое виртуальной машины, а эта консоль не открывается.

В этой главе мы рассмотрим следующие вопросы:

  • Применение устройств отображения виртуальной машины

  • Обсуждение протоколов удалённого отображения

  • Применение протокола отображения VNC

  • Применение протокола отображения SPICE

  • Получение переносимости отображения при помощи NoVNC

  • Давайте приступим!

Применение устройств отображения виртуальной машины

Чтобы заставить имеющуюся графику работать в виртуальных машинах, QEMU требуется предоствить в виртуальные машины два компонента: виртуальный графический адаптер и метод или протокол для доступа к этой графике со стороны соответствующего клиента. Давайте обсудим два этих понятия, причём начнём с виртуального графического адаптера. Самая последняя версия QEMU обладает восемью различными типами виртуальных/ эмулируемых грфических адаптеров. Все они обладают некоторыми сходствами и различиями, причём все они могут быть выражены в терминах функциональных возможностей и/ или поддерживаемыми разрешающими способностями или иными более техническими подробностями. Итак, давайте опишем их и посмотрим для каких вариантов применения мы предпочтём ту или иную виртуальную графическую карту.

  • tcx: Виртуальная графическая карта SUN TCX, которая может применяться в старых ОС SUN.

  • cirrus: Виртуальная графическая карта, которая основана на старой микросхеме VGA Cirrus Logic GD5446. Она может применяться всеми гостевыми ОС после Windows 95.

  • std: Некая стандртная катра VGA, которя может применяться с режимами высокой разрешающей способности начиная с Windows XP.

  • vmware: Графический адаптер SVGA VMware, которая требует дополнительных драйверов в гостевых ОС Linux и установки интсрументов VMware для OC Windows.

  • QXL: Де факто стандартная паравиртуальная графическая карта, которую нам необходимо применять при использовании протокола удалённого отображения SPICE, который будет обсуждён подробнее слегка позже в этой главе. Существует и более старая версия этой виртуальной графической карты с названием QXL VGA, которая утрачивает более современные функциональные возможности, при том что предлагает меньшие накладные расходы (она использует меньше памяти).

  • Virtio: Паравиртуальная 3D виртуальная графическая карта, основыввющася на проекте virgl, который предоставляет 3D ускорение для гостевых ОС QEMU. Она обладает двумя различными типами (VGS и gpu). virtio-vga обычно применяется в тех ситуациях, когда нам требуется поддержка множества мониторов и аппаратное ускорение OpenGL. Версия virtio-gpu не обладает встроенным режимом совместимости со стандартным VGA.

  • cg3: Виртуальная графическая карта, которую мы можем применять со старыми гостевыми ОС но основе более старых SPARC.

  • none: Отключает графическую карту в соответствующей гостевой ОС.

При настройке вашей виртуальной машины вы имеете возможность выбирать из этих вариантов при запуске или создании виртуальной машины. В CentOS 8 устанавливаемой по умолчанию графической картой, которая назначается во вновь создаваемой виртуальной машине выступает QXL, как это показано на следующем снимке экрана устанавливаемой для новой виртуальной машины конфигурации:

 

Рисунок 6-1


Устанавливаемая по умолчанию виртуальная графическая карта для гостевой ОС - QXL

Кроме того, по умолчанию, мы способны выбирать три таких типа виртуальных графических карт для любой определённой виртуальной машины, поскальку они обычно предварительно установлены для нас в любом сервере Linux, который сконфигурирован для виртуализации:

  • QXL

  • VGA

  • Virtio

Некоторым новым ОС, запускаемым в виртуализации KVM не следует применять более старые адаптеры графических карт по целому ряду причин. Например, начиная с Red Hat Enterprise Linux/ CentOS 7, рекомендуется не применять для Windows 10 b Windows Server 2016 виртуальную видеокарту cirrus. Основная причина для этого связана с имеющейся нестабильностью получаемой виртуальной машины, а также с тем фактом, что - скажем - вы не сможете применять разрешающую способность отображения Full HD с виртуальной видеокартой cirrus. На всякий случай, если вы приступаете к установке этих гостевых ОС убедитесь то вы пользуетесь ведеокартой QXL, ибо она обеспечивает наилучшую производительность и совместимость с протоколом удалённого отображения SPICE.

Теоретически, вы всё ещё можете применять виртуальные графические карты cirrus для некоторых действительно старых гостевых ОС (старее Windows NT такой как 4.0 и старых клиентов гостевых ОС, таких как Windows XP), но это всё. Для всего прочего намного лучше применять либо драйвер std, либо драйвер QXL, поскольку они предлагают наилучшие поддерживаемые производительность и ускорение. Более того, эти виртуальные графические карты также предлагают более высокие разрешающие способности отображения.

Существуют и некоторые прочие доступные виртуальные видеокарты для QEMU, такие как встроенные драйверы для различных устройств SoC (System on a Chip), ati vga, bochs и ому подобных. Некоторые из них применяются часто, например, SoC - просто вспомните все эти имеющиеся в мире Raspberry Pi и BBC Micro:bit. Эти новые варианты виртуальной графики дополнительно расширяются IoT (Internet of Tings). Итак, имеется множество веских причин, по которым нам необходимо уделять пристальное внимание тому, что происходит на данном рынке.

Давайте покажем это на неком примере. Скажем, мы желаем создать некую новую виртуальную машину, которая намерена обладать установленным в ней неким набором индивидуальных параметров в терминах того как мы будем осуществлять доступ к ей виртуальному дисплею. Если вы помните, в Главе 3, Установка гипервизора KVM, libvirt и oVirt мы обсуждали различные команды управления libvirt (virsh? virt-install) и мы также создавали некоторые виртуальные машины при помощи virt-install и некие персональные параметры. Давайте присоединимся к этому и воспользуемся аналогичным примером:


virt-install --virt-type=kvm --name MasteringKVM01 --vcpus 2 --ram 4096 --os-variant=rhel8.0 --/iso/CentOS-8-x86_64-1905-dvd1.iso --network=default --video=vga --graphics vnc,password=Packt123 --disk size=16
 	   

Вот что должно произойти:

 

Рисунок 6-2


Создаётся виртуальная машина KVM с виртуальной видеокартой VGA. Здесь VNC запрашивает задание пароля.

После того как мы наберём значение пароля (Packt123, как это предписано в параметре настроек virt-install) нам предстанет такой экран:

 

Рисунок 6-3


Видеоадаптер VGA с его низшей по умолчанию (640x480) изначальной разрешающей способностью - знакомое нам всем разрешение, кто застал 80е

Как уже говорилось, мы просто воспользовались этим как примером того, как добавлять расширенный вариант в команду virt-install, в частности, как установить виртуальную машину с определ1нной видеокартой.

Существуют и иные, более современные концепции применения реальных видеокарт, которые мы установили в свои компьютеры или серверы для передачи их возможностей напрямую в виртуальные машины. Как мы уже упоминали ранее, это очень важно для таких вариантов как VDI. Давайте на секунду обсудим эти концепции и воспользуемся реальными примерами и сопоставлениями чтобы осознать сложность VDI в более широком масштабе.

Физические и виртуальные графические карты в сценариях VDI

Как мы уже обсуждали в Главе 1, Основы виртуализации KVM, VDI это понятие, которое использует парадигму виртуализации для ОС клиентов. Это означает, что конечные пользователи подключаются напрямую к своим виртуальным машинам запуская некую ОС клиента (скажем, Windows 8.1, Windows 10 или Linux Mint), которая либо зарезервирована для них, либо объединена в пул, что означает, что множество пользователей могут выполнять доступ к одним и тем же виртуальным машинам и получать доступ к своим данным через дополнительные возможности VDI.

Теперь, если мы говорим о большинстве бизнес- пользователей, им требуется нечто, что мы в шутку называем пишущей машинкой. Эта модель применения относится к сценарию, при котором пользователь пользуется клиентской ОС для чтения документов и их написания, электронной почты и просмотра Интернета. И для таких вариантов применения когда мы применяем какое- то решение на основе производителя (решения Horizon VMware, Xen Desktop Citrix или основанные на Remote Desktop службы VDI Microsof), мы были бы способны делать это с любым из них.

Однако тут имеется одно большое но. Что произойдёт когда такой сценарий содержит сотни пользователей, которым требуется доступ к 2D и/ или 3D видео ускорению? Что происходит когда мы разрабатываем некое VDI решение создающих проекты компаний - архитектурных, трубопроводных, нефтегазовых или производящих видео? Запуск решений VDI на основе ЦПУ и программно- определяемых виртуальных видеокарт не даст нам ничего, особенно при масштабировании. Именно здесь более функционально насыщенными будут Xen Desktop и Horizon, если мы говорим об уровне технологий. И, честно говоря, методы на основе KVM не так уж сильно отстают с точки зрения параметров отображения, просто они несколько отстают от некоторых прочих функциональных возможностей корпоративного уровня, которые мы обсудим в последующих главах, например, в Главе 12, Горизонтальное масштабирование KVM посредством OpenStack.

В целом имеются три концепции, которые мы можем применять для получения производительности видеокарт для некой виртуальной машины:

  • Мы можем применять программное построение изображений основанных на ЦПУ.

  • Мы имеем возможность зарезервировать некое GPU для конкретной виртуальной машины (проброс PCI).

  • Мы можем делить на части какое- то GPU с тем чтобы мы были способны применять его во множестве виртуальных машин.

Если воспользоваться в качестве некой метафоры Horizon VMware, эти решения будут именоваться построением изображений (рендерингом) в ЦПУ, vDGA (Virtual Direct Graphics Acceleration ) и vSGA (Virtual Shared Graphics Acceleration). Или, в Citrix, мы бы говорили об HDX 3D Pro. В CentOS мы говорим об устройствах посредниках (mediated devices) в сценарии совместно используемых видеокарт.

Когда мы говорим о пробросе (passthrough) PCI, он несомненно доставит наилучшую производительность, поскольку вы сможете применять видеокарту PCI- Express, причём напрямую в виртуальную машину, установить внутри своей гостевой ОС естественный драйвер и получить графическую карту целиком для своих нужд. Однако это создаёт четыре проблемы:

  • Вы сможете обладать этой видеокартой PCI- Express переданной в одну виртуальную машину.

  • Поскольку серверы могут быть ограничены в плане обновляемости, например, вы не сможете запускать 50 подобных виртуальных машин на одном физическом сервере, поскольку вы не способны установить в одном физическом сервере 50 видеокарт - физически или с точки зрения слотов PCI- Express, когда у вас в обычном сервере 2U имеется до шести слотов.

  • Когда вы используете Блейд- серверы (например, HP c7000), это будет ещё хуже, так как если вы намерены воспользоваться дополнительными видеокартами, вы воспользуетесь половиной плотности серверов из блейд шасси, ибо эти карты могут подходить лишь для лезвий двойной высоты.

  • Вы намерены потратить очень большие средства на масштабирование всякого подобного решения до сотен виртуальных рабочих столов или, что ещё пуще, для тысяч виртуальных рабочих столов.

Когда мы обсуждаем подход совместного использования при котором вы делите на части физическую видеокарту с тем чтобы применять её во множестве виртуальных машин, это приводит к созданию другого набора проблем:

  • Вы гораздо более ограничены в плане того какие именно видеокарты применять, так как возможно имеется пара десятков карт, которые поддерживают такую модель применения (некоторые из них включают карты nVidia GRID, Quadro, Tesla и пару карт AMD и Intel).

  • Когда вы совместно используете одну и ту же видеокарту с четырьмя, восемью, 16 или 32 виртуальными машинами, вам придётся биметь в виду тот факт, что вы получите меньшую производительность, поскольку вы разделяете одно и то же GPU во множестве виртуальных машин.

  • Совместимость с DirectX, OpenGL, CUDA и разгрузкой кодирования видео будет не настолько хороша как вы могли бы ожидать и вам может потребоваться применение более ранних версий этих стандартов.

  • Может быть вовлечено дополнительное лицензирование в зависимости от самого производителя и решения.

Следующая тема в нашем списке - как именно применять GPU более современным способом - применяя концепцию разбиения GPU для предоставления частей GPU множеству виртуальных машин. Давайте поясним как это работает и как настраивается на примере GPU nVidia.

 

Разбиение GPU на части на примере vGPU nVidia

Давайте воспользуемся примером чтобы посмотреть как мы можем применять тот сценарий, при котором мы разбиваем своё GPU на части (vGPU nVidia) для своих виртуальных машин на основе KVM. Эта процедура очень похожа на процедуру SR-IOV, которую мы обсуждали в Главе 4, Сетевая среда libvirt, в которой мы применяли в поддерживаемой Intel сетевой карте для представления виртуальных функций в нашем хосте CentOS, которые мы далее предоставляли в свои виртуальные машины предоставляя им восходящие соединения к установленному мосту KVM.

Прежде всего, нам требуется проверить какой вид видеокарты у нас имеется и она должна относиться к к поддерживаемым (в нашем случае мы пользуемся Tesla P4). Давайте воспользуемся командой lshw для проверки своих устройств отображения, что должно выглядеть аналогично следующему:


# yum -y install lshw
# lshw -C display
*-display
       description: 3D controller
       product: GP104GL [Tesla P4]
       vendor: NVIDIA Corporation
       physical id: 0
       bus info: pci@0000:01:00.0
       version: a0
       width: 64 bits
       clock: 33MHz
       capabilities: pm msi pciexpress cap_list
       configuration: driver=vfio-pci latency=0
       resources: irq:15 memory:f6000000-f6ffffff memory:e0000000-efffffff memory:f0000000-f1ffffff
		

Получаемый вывод этой команды сообщает нам что у нас имеется 3D- совместимое GPU - а именно, основанный на nVidia GP104GL продукт. Она сообщает нам что это устройство уже применяет драйвер vfio-pci. Этот драйвер является естественным драйвером SR-IOV для VF (Virtualized Functions, Виртуальных функций). Эти функции составляют ядро функциональности SR-IOV. Мы объясняем это использованием такой способности SR-IOV GPU.

Первое что нам надлежит предпринять - всё что все мы пользователи nVidia GPU применяли все эти годы - это установка в чёрный список установленного драйвера nouveau, который мешает нам. И, когда мы намерены применять разбиение на части GPU на постоянной основе, нам требуется превратить это в постоянное с тем, чтобы он не загружался при запуске нашего сервера. Однако будьте осторожны - порой это может приводить к неожиданному поведению, например, к запуску сервера без какой бы то ни было видимой причины. Итак, нам требуется создать файл настроек для modprobe, который будет заносит в чёрный список соответствующий драйвер nouveau. давайте создадим файл с названием nouveauoff.conf в каталоге /etc/modprobe.d со следующим содержимым:


blacklist nouveau
options nouveau modeset 0
 	   

Затем нам необходимо принудить наш сервер повторно создать необходимый нам образ initrd, который загружается при запуске нашего сервера и перезапускает этот сервер чтобы ввести в действие эти изменения. Мы намерены сделать это при помощи команды dracut, за которой следует обычная команда reboot:


# dracut –-regenerate-all –force
# systemctl reboot
		

После этого перезапуска давайте проверим что наш драйвер vfio для видеокарты nVidia загружен и, если это так, проверить службу диспетчера vGPU:


# lsmod | grep nvidia | grep vfio
nvidia_vgpu_vfio 45011 0
nvidia 14248203 10 nvidia_vgpu_vfio
mdev 22078 2 vfio_mdev,nvidia_vgpu_vfio
vfio 34373 3 vfio_mdev,nvidia_vgpu_vfio,vfio_iommu_type1
# systemctl status nvidia-vgpu-mgr
vidia-vgpu-mgr.service - NVIDIA vGPU Manager Daemon
   Loaded: loaded (/usr/lib/systemd/system/nvidia-vgpu-mgr.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2019-12-12 20:17:36 CET; 0h 3min ago
Main PID: 1327 (nvidia-vgpu-mgr)
		

Нам требуется создать некий UUID, который мы будем применять для представления своей виртуальной функции в виртуальную машину KVM. Для этого мы воспользуемся командой uuidgen:


# uuidgen
c7802054-3b97-4e18-86a7-3d68dff2594d
		

Теперь давайте воспользуемся этим UUID для той виртуальной машины, которая будет разделять наше GPU. Для этого нам требуется создать некий файл шаблона XML, который мы будем добавлять к уже имеющимся файлам XML для своих виртуальных машин через copy-paste. Давайте создадим этот vsga.xml:


<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci'>
  <source>
    <address uuid='c7802054-3b97-4e18-86a7-3d68dff2594d'/>
  </source>
</hostdev>
 	   

Применяйте эти настройки в качестве шаблона и просто вставляйте копированием (copy-past) для наполнения содержимого файла XML любой виртуальной машины когда вы желаете получить доступ к нашему разделяемому GPU.

{Прим. пер.: материал этого раздела весьма устарел, хотя в целом и отражает направление работ. Сейчас nVidia лицензирует разбиение GPU на VF и для сопровождения этой функциональности требуется приобретать лицензии и устанавливать один или более серверов лицензий, без которых не поддерживается свойства виртуальных функций PCI GPU, в которых такая функциональность возможна. Эта процедура относительно гладко выполняется для VMware и Citrix Xen, однако документация nVidia очень слабо отражает процесс настройки данной функциональности в KVM Linux и RHEL (последний обладает рядом отличий). Если запутались, но всё же желаете выполнить эти настройки, обратитесь к нам. Оказываем консультации по установке в CentOS/ RHEL и Ubuntu. Также не согласимся с авторами, что этот процесс масштабируется для корпоративного уровня хуже VMware и Citrix. Подробнее в нашем переводе Практической автоматизации предприятия в Linux Джеймса Фримана, изданной в январе 2020.}

Следующим понятием, которое нам требуется обсудить полностью противоположно SR-IOV, когда мы делим некое устройство на части для представления этих частей виртуальным машинам. При пробросе GPU мы берём всё наше устройство целиком и представляем его непосредственно одному объекту, а именно одной виртуальной машине. Давайте изучим как это настраивать.

PCI проброс GPU

Как это имеет место и со всеми современными функциональными возможностями, включение проброса PCI GPU требует выполнения множества последовательных шагов. Выполним эти шаги в правильном порядке, мы напрямую представляем это аппаратное устройство некой виртуальной машине. Давайте опишем эти шаги настройки и выполним их:

  1. Для включения проброса PCI GPU нам потребуется настроить и включить IOMMU - прежде всего в BIOS {Firmware} нашего сервера, а затем в дистрибутиве нашего Linux. Мы применяем серверы на базе Intel, а потому нам требуется добавить параметры iommu в наш файл /etc/default/grub как это показано на следующем снимке экрана:

     

    Рисунок 6-4


    Добавление в файл GRUB параметров intel_iommu iommu=pt

    {Прим. пер.: Для систем AMD IOMMU вместо этого применяется параметр amd_iommu=on в сочетании с iommu=pt (pass- through) или amd_iommu=pt. В последнем случае параметр pt включает IOMMU только для применяемых в пробросе устройств, однако он может не поддерживаться всем оборудованием. В этом случае можно обойтись без него.}

  2. Наш следующий шаг состоит в повторной настройке имеющейся конфигурации GRUB и её перезапуске, чего можно достичь набором приводимых ниже команд {Прим. пер.: подробнее в нашем переводе Практика загрузки. Изучение процесса загрузки Linux, Windows и Unix Йогеш Бабар}:

    
    # grub2-mkconfig -o /etc/grub2.cfg
    # systemctl reboot
    		
  3. После перезапуска своего хоста нам потребуется получить некие сведения - в частности, сведения идентификатора относительно того устройства GPU, которое мы бы желали пробросить в свою виртуальную машину. Давайте получим их:

     

    Рисунок 6-5


    Применение lspci для отображения существенных сведений конфигурации

    В нашем случае мы хотим пробросить в свою виртуальную машину карту Quadro 2000, ибо мы пользуемся GT740 для подключения своего монитора, а наша карта Quadro в настоящее время свободна от каких бы то ни было нагрузок или подключений. Итак, нам требуется записать два номера: 0000:05:00.0 и 10de:0dd8.

    Чтобы двигаться далее нам потребуются оба идентификатора, причём каждый из них определяет какое именно устройство мы желаем использовать и где.


  4. Наш следующий шаг состоит в пояснении для своего хоста, что он не будет использовать для себя самого это особенное устройство PCI (карту Qadro). Для этого нам потребуется снова изменить настройки GRUB и добавить другой параметр в тот же самый файл (/etc/defaults/grub)

     

    Рисунок 6-6


    Добавление в GRUB параметра pci-stub.ids с тем чтобы он игнорировал данное устройство при запуске своей ОС

  5. Нам снова требуется повторно настроить GRUB и перезапустить после этого свой сервер, а потому введите такие команды:

    
    # grub2-mkconfig -o /etc/grub2.cfg
    # systemctl reboot
    		

    Этот шаг помечает окончание настройки нашего физического сервера. Теперь мы можем перейти к следующему этапу своего процесса, который заключается в том как теперь применять полностью настроенное проброшенное устройство PCI в своей виртуальной машине.

    Давайте убедимся что все сделано правильно при помощи команды virsh nodedev-dumpxml для соответствующего идентификатора проброшенного устройства PCI:

     

    Рисунок 6-7


    Проверка того что стек KVM способен видеть наше устройство PCI

    Здесь мы можем видеть, что QEMU наблюдает две функции 0x1 и 0x0. Функция 0x1 в реальности это микросхема аудио нашего устройства GPU, которая не применяется для нашей процедуры. Нам всего лишь требуется функция 0x0, которая и является самим GPU. Это означает, что нам требуется маскировать её. Мы можем выполнить это с помощью следующей команды:

     

    Рисунок 6-8


    Отсоединение устройство 0x1 с тем, чтобы его можно было бы использовать для проброса

  6. Теперь давайте добавим это GPU через проброс PCI в свою виртуальную машину. Для этого мы воспользуемся только что установленной виртуальной машиной с названием MasteringKVM03, но вы можете применять любую иную виртуальную машину по своему усмотрению. Нам потребуется создать некий файл XML, которым воспользуется QEMU чтобы иметь сведения какое устройство добавлять в виртуальную машину. После этого нам потребуется остановить эту машину и импортировать этот файл XML в свою виртуальную машину. В нашем случае необходимый файл XML выглядит так:

     

    Рисунок 6-9


    XML файл с нашим определением проброса PCI GPU для KVM

  7. Следующий шаг состоит в подключении этого XML файла к нашей виртуальной машине MasteringKVM03. Мы можем сделать это при помощи команды virsh attach-device:

     

    Рисунок 6-10


    Импорт нашего XML файла в домен/ виртуальную машину

  8. После своего предыдущего шага мы можем запустить нашу виртуальную машину, зарегистрироваться в ней и убедиться что эта виртуальная машина наблюдает наше GPU:

     

    Рисунок 6-11


    Импорт нашего XML файла в домен/ виртуальную машину

Наш следующим логичным шагом была бы установка драйвера nVidia для этой карты под Linux с тем чтобы свободно применять её в качестве своего дискретного GPU.

Теперь давайте перейдём к следующему важному объекту, который относится к протоколам удалённого отображения. Мы как бы уже крутились вокруг этой темы в своей предыдущей части этой главы, но теперь мы намерены заняться этим непосредственно.

Обсуждение протоколов удалённого отображения

Как мы уже упоминали ранее, существуют различные решения виртуализации, а потому совершенно нормально, что имеются различные методы для доступа к виртуальным машинам. Если вы взглянете на имеющуюся историю виртуальных машин, у нас имеется целый ряд различных протоколов отображения, которые заботятся об этой конкретной задаче. Поэтому давайте сначала слегка обсудим их историю.

История протоколов удалённого отображения

Всегда будут иметься люди, оспаривающие данную предпосылку, но удалённые протоколы начинались как исключительно текстовые. Как ни крути, но терминалы последовательного текстового режима существовали здесь задолго до того как у нас появились X Windows или ещё что либо, отдалённо напоминающее графический интерфейс во вселенных на основе Microsoft, Apple и UNIX. Кроме того, также невозможно оспорить тот факт, что для доступа к удалённым дисплеям использовались протоколы telnet и rlogin. Так уж получилось, что удалённый дисплей, к которому мы обращаемся при помощи telnet и rlogin является текстовым дисплеем. В более широком смысле то же самое относится и к SSH. И последовательные терминалы, и текстовые консоли, а также основанные на тексте такие протоколы как telnet и rlogin выступали чем- то наиболее распространённым применяемым в качестве стартового момента, который уходит в далёкие 1970-е.

Окончание 1970х стало важным периодом в истории вычислительной техники, ибо предпринимались многочисленные попытки начать массовое производство персональных компьютеров для большого числа людей (к примеру, Apple II c 1977). В 1980м люди стали больше применять персональные компьютеры, на что укажет вам любой почитатель Amiga, Commodore, Atari, Spectrum или Amstrad. Зарубите себе на носу, что самые первые нстоящие общедоступные ОС на основе графического интерфейса на появлялись вплоть до Xerox Star (1981) и Apple Lisa (1983). Самой первой общедоступной ОС с графическим интерфейсом пользователя на основе Apple стала Mac OS System 1.0 в 1984. Большинство прочих упомянутых ранее компьютеров пользовались текстовыми ОС. Даже игры той эпохи выглядели так, быдто бы они рисовались вручную пока вы играли в них. Amiga's Workbench 1.0 была выпущена в 1985 и со своим графическим интерфейсом и моделью использования цветов она намного опередила своё время. Тем не менее, 1985й, скорее всего, запомнится ещё чем- то - именно в этом году была выпущена операционная система Microsof Windows OS (v1.0). Позднее она превратилась в Windows 2.0 (1987), Windows 3.0 (1990), Windows 3.1 (1992), которыми Microsoft уже штурмом завоевала мир ОС. Да имелись и ОС прочих производителей:

  • Apple: Mac OS System 7 (1991)

  • IBM: OS/2 v1 (1988), v1.2 (1989), v2.0 (1992), Warp 4 (1996)

Всё это оказалось просто крошечной точкой на горизонте по сравнению с гигантским штормом, случившемся в 1995м, когда Microsoft представила Windows 96. Это была первая клиентская ОС Microsoft, которая была способна по умолчанию загружаться с графическим интерфейсом, поскольку предыдущие версии запускались из командной строки. Затем пришли Windows 98 и XP, что подразумевало ещё бо́льшую долю рынка для Microsoft. оставшаяся часть истории вам, скорее всего, хорошо знакома по Vista, Windows 7, Windows 8 и Windows 10.

Смысл этой истории не в том чтобы обучить вас историческим событиям как таковым. Речь идёт о том, чтобы отметить саму тенденцию, что достаточно просто. Мы начинали с текстовых интерфейсов в командной строке (скажем, в IBM и MS DOS, ранних версиях Windows, Linux, UNIX, Amiga, Atari и тому подобного). Затем мы постепенно перешли к большому числу визуальных интерфейсов (GUI). Благодаря достижениям в области новых сетевых технологий, графического процессора, центрального процессора и технологий мониторинга мы достигли некого этапа, на котором мы желаем сиятельного монитора с разрешением 4k при 4- мегапиксельной степени разрешающей способности, низкой латентностью, гигантской мощностью ЦПУ, фантастической цветопередачей и определёнными практиками пользователя. Такие практики пользователя должны быть незамедлительными и в действительности не важно применяем ли мы локальную ОС или же удалённую (VDI, облачное решение, или же иную лежащую в основе технологию).

Это подразумевает, что наряду со всеми только что упомянутыми аппаратными компонентами необходимо было разрабатывать и прочие (программные) составляющие. В частности, необходимо было разрабатывать высококлассные протоколы удалённого отображения, которые в наши дни следует расширять до модели применения в браузере. Люде не желают чтобы их принуждали устанавливать дополнительные приложения (клиентов) для доступа к своим удалённым ресурсам.

Типы протоколов удалённого отображения

Давайте просто упомянем некоторые из протоколов, которые очень активны на имеющемся сейчас рынке:

  • Microsof Remote Desktop Protocol/Remote FX: Применяемый Подключением удалённого рабочего места (RDP), этот многоканальный протокол позволяет нам соединяться с основанными на Microsoft виртуальными машинами ({Прим. пер.: а применяя xRDP это можно делать и с xNix машинами. Remote FX 14 июля 2020 отключён из- за уязвимостей по причинам безопасности, подробнее....})

  • VNC: Сокращение от Virtual Network Computing, это система разделения удалённого рабочего места, которая передаёт события мыши и клавиатуры для доступа к удалённым машинам.

  • SPICE: Сокращение для Simple Protocol for Independent Computing Environments (Простого протокола для независимых вычислительных сред), это другой протокол удалённого отображения, который может применяться для доступа к удалённым машинам. Он был разработан Qumranet, которая была приобретена Red Hat.

Если мы и дальше расширим свой список до применяемых под VDI протоколов, то список окажется ещё длиннее:

  • Teradici PCoIP (PC over IP): Протокол VDI на основе UDP, который мы можем применять в виртуальных машинах на основе VDI решений VMware, Citrix и Microsof.

  • VMware Blast Extreme: Ответ VMware на PcoIP для решения VDI на основе Horizon VMware.

  • Citrix HDX: протокол Citrix для виртуальных рабочих мест.

  • Естественно, имеются доступными и иные, но не применяемые настолько же часто и менее важные, а именно:

    • Colorado CodeCraf

    • OpenText Exceed TurboX

    • NoMachine

    • FreeNX

    • Apache Guacamole

    • Chrome Remote Desktop

    • Miranex

    • Основные различия между обычными удалёнными протоколами и полнофункциональными протоколами VDI связаны с дополнительными функциями. Например, в PCoIP, Blast Extreme и HDX вы способны настраивать параметры пропускной способности, управлять перенаправлениям USB и принтера (вручную или централизованно при помощи политик), использовать перенаправления мультимедиа (для разгузки декодирования мультимедиа), перенаправление Flash- устройств (для выгрузки этих устройств), перенаправления устройств клиента, перенаправление последовательного порта и десятки прочих функций. Например, в VNC или удалённом рабочем столе (RDP) вы не способны выполнять часть этих моментов.

      Перечислив всё это, давайте обсудим два наиболее важных в мире открытого исходного кода: VNC и SPICE.

    Применение протокола отображения VNC

    Когда сервер VNC включён через libvirt, QEMU перенаправит получаемый графический вывод в свою встроенную реализацию сервера VNC. Этот сервер VNC быдет ожидать по сетевому порту к которому способны подключаться клиенты VNC.

    Приводимый ниже моментальный снимок экрана показывает как добавлять графический сервер VNC. Просто проследуйте в Virtual Machine Manager (Диспетчер виртуальной машины), откройте имеющиеся настройки своей виртуальной машины и перейдите к закладке Display Spice (Пикантности отображения)

     

    Рисунок 6-12


    Настройка VNC для виртуальной машины KVM

    После добавления графики VNC вам будут представлены отображённые на предыдущем снимке экрана параметры:

    • Type: Значение типа графического сервера. Здесь это VNC server.

    • Address: Адрес по которому выполняет ожидание сервер VNC. Это может быть all, localhost или IP address. По умолчанию это Localhost only.

    • Port: Порт по которому выполняет ожидание сервер VNC. Вы можете либо выбрать auto, тогда libvirt определит значение базового порта по его доступности или же вы можете опредилить его самостоятельно. Убедитесь что он не вызывает какого- нибудь конфликта.

    • Password: Защищающий доступ VNC пароль.

    • Keymap: Когда вы желаете применять некую особую раскладку клавиатуры вместо некой определяемой автоматически, вы можете сделать то же самое при помощи инструмента командной строки virt-xml.

    Например, давайте добавим графику VNC к виртуальной машине с названием PacktGPUPass и затем измените его VNC на ожидание по IP адресу 192.168.122.1:

    
    # virt-xml MasteringKVM03 --add-device --graphics type=vnc
    # virt-xml MasteringKVM03 --edit --graphics listen=192.168.122.1
    		

    Вот как это выглядит в файле XML настроек PacktVM01:

    
    <graphics type='vnc' port='-1' autoport='yes' listen='192.168.122.1'>
        <listen type='address' address='192.168.122.1'/>
    </graphics>
     	   

    Вы также можете воспользоваться virsh для редактирования PacktGPUPass и изменять необходимые параметры индивидуально.

    Почему VNC?

    Вы можете применять VNC когда вы выполняете доступ к виртуальной машине через локальную сеть или же осуществлять доступ к своей ВМ напрямую из её консоли. Будет не самой лучшей мыслью выставлять виртуальные машины в общедоступной сети при помощи VNC, ибо это подключение не шифруется. VNC это хороший вариант когда ваши виртуальные машины это серверы без установленного графического интерфейса. Ещё один момент в пользу VNC - доступность клиентов. Вы можете получать доступ к виртуальной машине с платформы любой операционной системы, так как для этой платформы будет доступна программа просмотра VNC.

    Применение протокола отображения SPICE

    Как и KVM, SPICE (Simple Protocol for Independent Computing Environments) это одна из наилучших пришедшей в технологии виртуализации с открытым исходным кодом инноваций. Он продвинул виртуализацию с открытым исходным кодом в некую крупную реализацию VDI (Virtual Desktop Infrastructure).

    [Замечание]Замечание

    Первоначально Qumranet разработал в 2007 SPICE в качестве закрытого базового кода. В 2008 Red Hat, Inc. приобрёл Qumranet, а в декабре 2009 они приняли решение открыть этот код под лицензией открытого хода и стали рассматривать этот протокол в качестве некоторого открытого стандарта.

    SPICE это единственное решение в Linux с открытым исходным кодом, который предоставляет двустороннее аудио. Он обладает возможностями высококачественного построения 2D изображений, которое способно пользоваться видеокартой системы клиента. SPICE к тому же поддерживает множество мониторов HD, шифрование, аутентификацию смарткарт, сжатие, а также проброс USB поверх своей сетевой среды. Для ознакомления с полным перечнем функциональных возможностей вы можете посетить http://www.spice-space.org/features.html. Если вы разработчик и желаете знать о внутреннем строении SPICE, посетите http://www.spice-space.org/documentation.html. Если вы планируете VDI или устанавливаете виртуальные машины, которым требуется графический интерфейс, SPICE будет для вас наилучшим вариантом.

    SPICE может оказаться не совместимым с некоторыми более древними виртуальными машинами, поскольку они не обладают поддержкой QXL. В подобных ситуациях вы можете использовать SPICE с прочими общими виртуальными видеокартами.

    Теперь давайте ознакомимся с тем как добавить графический сервер SPICE в вашу виртуальную машину. Он может рассматриваться как самый производительный протокол виртуального отображения в мире открытого исходного кода.

    Добавление графического сервера SPICE

    Libvirt теперь выбирает SPICE в качестве устанавливаемого по умолчанию графического сервера для большинства установок виртуальных машин. Вам надлежит следовать той же самой процедуре, которую мы упоминали ранее для VNC чтобы добавить необходимый графически сервер SPICE. Просто замените VNC на SPICE в своём ниспадающем меню. При этом вы получите некую дополнительную возможность выбора TLS port, так как SPICE поддерживает шифрование:

     

    Рисунок 6-13


    Настройка SPICE для виртуальной машины KVM

    Для получения этого меню конфигурации просто измените для своей виртуальной машины установленные настроки. Пройдите в параметры для Display Spice и во всплывающем меню выберите Spice server. Все прочие параметры не обязательны, а потому у вас нет необходимости обязательного выполнения дополнительных настроек.

    Покончив с предыдущей процедурой, мы рассмотрели все необходимые вопросы, относящиеся к протоколам отображения. Теперь давайте обсудим различные методы, которые мы моем применять для доступа к консоли своей виртуальной машины.

    Методы доступа консоли ВМ

    Существует множество способов подключения к консоли виртуальной машины. Когда ваша среда обладает доступом к полному графическому интерфейсу, самый простой метод состоит в применении консоли virt-manager самой по себе. virt-viewer это другой инструмент, который может предоставить вам доступ к своей консоли виртуальной машины. Этот инструмент очень полезен когда вы пытаетесь выполнить доступ к консоли виртуальной машине из некого удалённого местоположения. В своём следующем примере мы собираемся выполнить подключение к удалённому гипервизору, который имеет IP адрес 192.168.122.1. Это соединение туннелируется через некий сеанс SSH и является безопасным.

    Самый первый шаг состоит в установке системной аутентификации без пароля между вашим клиентом и самим гипервизором.

    1. На своей клиентской машине воспользуйтесь следующим кодом:Code

      
      # ssh-keygen
      # ssh-copy-id root@192.168.122.1
      # virt-viewer -c qemu+ssh://root@192.168.122.1/system
      		

      Вам будет представлен перечень доступных в вашем гипервизоре виртуальных машин:

       

      Рисунок 6-14


      Меню выбора virt-viewer для доступа к виртуальной машине

    2. Для подключения к консоли некой ВМ напрямую воспользуйтесь такой командой:

      
      # virt-viewer -c qemu+ssh://root@192.168.122.1/system MasteringKVM03
      		

      Когда ваша среда ограничена только текстовой консолью, тогда вы можете полагаться на предпочитаемый вами virsh - чтобы быть конкретнее virsh console vm_name, это потребует некоторых дополнительных настроек внутри ОС вашей виртуальной машины, как то поясняется на нашем следующем шаге.

    3. Если ваш дистрибутив Linux применяет GRUB (не GRUB2), добавьте в конец своей имеющейся строки запуска Ядра в /boot/grub/grub.conf приводимую далее строку и остановите эту виртуальную машину:

      
      console=tty0 console=ttyS0,115200
      		

      Если ваш дистрибутив Linux применяет GRUB2, тогда этот шаг становится чуточку сложнее. Имейте в виду, что наша следующая команда была проверена в виртуальной машине Fedora 22. Для прочих дистрибутивов этот шаг настройки GRUB2 может быть иным, хотя сами изменения, которые требуются для настройки вашего файла GRUB должны оставаться теми же самыми:

      
      # cat /etc/default/grub (only relevant variables are shown)
      GRUB_TERMINAL_OUTPUT="console"
      GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora/swap rd.lvm.lv=fedora/root rhgb quiet"
      		

      Изменённая конфигурация такова:

      
      # cat /etc/default/grub (only relevant variables are shown)
      GRUB_TERMINAL_OUTPUT="serial console"
      GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora/swap rd.lvm.lv=fedora/root console=tty0 console=ttyS0"
      # grub2-mkconfig -o /boot/grub2/grub.cfg
      		
    4. Теперь остановите свою виртуальную машину. Затем запустите её снова при помощи virsh:

      
      # virsh shutdown PacktGPUPass
      # virsh start PacktGPUPass --console
      		
    5. Для подключения к консоли только что запущенной виртуальной машины исполните такую команду:

      
      # virsh console PacktGPUPass
      		

      Также вы можете осуществить это с удалённого клиента следующим образом:

      
      # virsh -c qemu+ssh://root@192.168.122.1/system console PacktGPUPass
      Connected to domain PacktGPUPass:
      Escape character is ^]
      		

    В некоторых случаях в ^] мы наблюдаем приклеившуюся к нему стек команд. Для его отработки нажмите множество раз клавишу Enter чтобы увидеть приглашение на регистрацию. Порой настройка текстовой консоли очень важна когда вы желаете перехватывать имеющиеся сообщения запуска для целей устранения неисправностей. Для выхода из этой консоли воспользуйтесь ctrl +].

    Наша тема приводит нас во вселенную noVNC, другой протокол на основе VNC, который обладает парой главных преимуществ над обычным VNC. Давайте теперь обсудим эти преимущества и собственно реализацию noVNC.

    Достижение переносимости дисплея при помощи noVNC

    Все эти протоколы отображения полагаются на обладание неким типом клиентского приложения и/ или дополнительной программной поддержки, которые позволят нам осуществлять доступ к необходимой нам консоли виртуальной машины. Но что произойдёт если у нас просто нет никаких этих дополнительных возможностей? Что случится если к нашей среде мы имеем лишь доступ текстового режима, но мы всё ещё желаем обладать управлением подключением к своим виртуальным машинам на основании графического интерфейса?

    Войдите в noVNC, некий клиент VNC на основе HTML5, который вы можете применять через какой- то HTML5- совместимый браузер, что, мы полагаем, можно сказать практически обо всех представленных на рынке веб браузерах. Он поддерживается всеми имеющимися наиболее популярными браузерами, включая и мобильные и загружает прочие функциональные возможности, включая:

    • Буфер обмена копирования- вставки

    • Поддержка масштабирования разрешающей способности и изменения размера

    • Он применяется бесплатно по лицензии MPL 2.0

    • Его достаточно просто устанавливать и он поддерживает аутентификацию, а также запросто можно реализовать его безопасность поверх HTTPS.

    Если вы хотите заставить noVNC работать, вам требуются два момента:

    • Виртуальная машина (машины), которая настроена на приём подключений VNC, причём предпочтительно с выполнением небольшой настройки - например, какого- то пароля и правильно настроенного сетевого интерфейса для подключения к необходимой виртуальной машине. Вы можете бесплатно воспользоваться tigervnc-server, настроить его на приём подключений - скажем - по порту 5901 для какого- то конкретного пользователя, а для клиентского подключения воспользоваться этим портом и IP адресом сервера.

    • Установку noVNC н неком клиентском компьютере, которого вы можете выгрузить из репозиториев EPEL или непосредственно как пакет zip/tar.gz и запустить непосредственно из своего веб браузера. Для его установки вам потребуется набрать следующую последовательность команд:

      
      # yum -y install novnc
      # cd /etc/pki/tls/certs
      # openssl req -x509 -nodes -newkey rsa:2048 -keyout /etc/pki/tls/certs/nv.pem -out /etc/pki/tls/certs/nv.pem -days 365
      # websockify -D --web=/usr/share/novnc --cert=/etc/pki/tls/certs/nv.pem 6080 localhost:5901
       	   

    Окончательный результат будет выглядеть как- то так:

     

    Рисунок 6-15


    Экран настройки консоли noVNC

    Здесь мы можем применять для этой конкретной консоли пароль своего сервера VNC. После ввода значения пароля мы получим вот это:

     

    Рисунок 6-16


    Консоль noVNC в действии - мы можем наблюдать консоль своей виртуальной машины и применять ей для работы со своей виртуальной машины

    Все эти варианты мы можем получить также и через oVirt. В процессе установки oVirt нам просто потребуется выбрать один дополнительный параметр в процессе настройки его механизма:

    
    --otopi-environment="OVESETUP_CONFIG/websocketProxyConfig=bool:True"
    		

    Этот параметр разрешит oVirt применять noVNC в качестве удалённого клиента отображения, причём поверх уже имеющихся SPICE и VNC.

    Давайте взглянем на некий пример настройки виртуальной машины в oVirt практически со всеми теми параметрами, которые мы обсуждали в этой главе. Обратите особое внимание на параметр настройки Monitors:

     

    Рисунок 6-17


    oVirt к тому же поддерживает все те устройства, которые мы обсуждали в этой главе

    Если мы кликнем по подменю Graphics protocol, мы получим те параметры, которые мы применяли в SPICE, VNC, noVNC и различных сочетаниях из них. Кроме того, в самом низу экрана у нас имеются доступными параметры для некоторого числа мониторов, которые мы бы желали обнаруживать в своём удалённом отображении. Это может оказаться очень полезным если мы хотим обладать высокопроизводительной удалённой консолью со множеством устройств отображения.

    Обнаружив, что noVNC был также интегрирован и в noVNC, мы можем рассматривать это как признак того что он появится. Рассматривайте это с точки зрения такой перспективы - всё относящееся в ИТ к приложениям управления постепенно теперь с годами перемещается в приложения на веб основе. Имеется логика в том, что точно такие же вещи произойдут и с консолями виртуальных машин. Это также было реализовано и в решениях прочих производителей, а потому обнаружение применяемым здесь noVNC также не должно стать большой неожиданностью.

    Выводы

    В этой главе мы рассмотрели виртуальные устройства отображения и протоколы, применяемые для отображения данных виртуальных машин. Мы также слегка углубились в мир совместного применения GPU и их проброса, которые выступают важными понятиями для крупномасштабных сред с запущенными в них VDI. Мы осудили некоторые преимущества и подводные камни таких ситуаций, поскольку они имеют тенденцию быть достаточно сложными для реализации и требуют множества ресурсов - включая и финансовые ресурсы. Допустим, что вам придётся выполнять проброс PCI для 2D/3D ускорения в сотню виртуальных машин. В действительности это потребует закупку сотни графических карт, что является большим, очень большим вопросом для финансов. Помимо прочих рассмотренных вопросов мы прошлись также по различным протоколам отображения и тем вариантам, которые мы можем применять для консольного доступа к своим виртуальным машинам.

    В своей следующей главе мы проведём вас по некоторым обычным операциям с виртуальными машинами - установке, настройке и управлении жизненным циклом, включая обсуждение моментальных снимков виртуальных машин и их миграции.

    Вопросы

    1. Какие типы устройств отображения виртуальных машин мы можем применять?

    2. В чём состоят основные преимущества применения устройства виртуального отображения QXL над VGA?

    3. В чём состоят основные преимущества и недостатки совместного использования GPU?

    4. Каковы основные преимущества проброса PCI GPU?

    5. В чём заключаются основные преимущества SPICE над VNC?

    6. Зачем бы вам мог потребоваться noVNC?

    Дополнительное чтение

    Для получения дополнительных сведений, относящихся к рассмотренным в этой главе вопросам, воспользуйтесь следующими ссылками:

    Настройка виртуализации и управление ею

    Документация QEMU

    Документация по программному обеспечению виртуальных GPU nVidia

    Работа с группами IOMMU