RemoteFX. Часть 5 — перенаправление USB, теория

Мы уже говорили о том, как RemoteFX обеспечивает возможности работы с трёхмерной графикой, приложениями DirectX и мультимедиа через протокол «Удалённого рабочего стола» (RDP). Однако кроме этого, RemoteFX имеет ещё одну восхитительную возможность — низкоуровневую поддержку перенаправления любых устройств USB с клиентских рабочих мест в виртуальные машины Hyper-V.

Ещё со времён RDP 5.1 в Windows XP появилась возможность высокоуровнего перенаправления некоторых классов устройств (таких, например, как принтеры). Со временем набор этих классов расширялся — например, добавились смарт-карты. Но всё равно — это единичные случаи самых распространённых и востребованных классов. А ведь всего одних только классов (не устройств!) сейчас в мире насчитывается более 9000 (в данном случае — это число, близкое к действительности, а не фигура речи). Что же значит «высокоуровневное перенаправление» (High-Level Device Redirection)? Для каждого из поддерживаемых устройств на сервере создаётся соответствующее «виртуальное устройство» (Virtual Device) — например «обычная клавиатура» или «обычный монитор». Приложение, запущенное на сервере, обращается к этому виртуальному устройству с командой, например: «прочитать данные» или «распечатать изображение». Однако поскольку устройство «виртуальное» и «обычное» — оно ничего не знает про специфику работы вашего конкретного физического устройства, которое подключено к клиентскому рабочему месту. Поэтому роль виртуального устройства сводится к тому, чтобы передать эти команды по сети через RDP на клиентское рабочее место. А затем эти команды обрабатываются драйвером вашего специфического устройства, который запущен в ОС на клиентском рабочем месте. Этот драйвер превращает команды в сигналы, специфические уже для данного конкретного устройства. И эти сигналы передаются в стек USB, полностью принадлежащий ОС на клиентском рабочем месте.

Сейчас, в RDP 7.1 с RemoteFX для сценариев VDI появляется возможность работы с любыми устройствами на низком уровне (Low-Level Device Redirection) . Что это значит? Приложение, запущенное в удалённой виртуальной машине, по-прежнему отправляет команды драйверу. Однако этот драйвер запущен в той же виртуальной машине. И по сети через RDP на клиентское рабочее место передаётся (конечно, сжатым — как и всё в мире RDP) уже результат работы этого драйвера — так называемые сигналы USB Request Block (URB). Это — «наибольший общий знаменатель», т.е. самый высокий уровень, который общий для всех устройств USB. А значит — на стороне клиента не нужны специфические драйверы. Их подменяет собой единый «Remote FX Generic USB Driver», который позволяет для любых устройств выполнить одно простое действие — а именно: передать URB, полученный из удалённого сеанса, и отправить обратно ответ устройства. По замыслу разработчиков, весь процесс установки сессии (равно как и отключения) не должен занимать больше 25 секунд.

Если просуммировать вышесказанное — а также некоторые другие факторы, — получим следующую таблицу.

 

Низкоуровневое перенаправление устройств USB с использованием RemoteFX

Высокоуровневое перенаправление устройств USB с использованием виртуальных устройств

Необходимость в драйверах для устройства в ОС на клиентском рабочем месте

Нет

Да

Необходимость в драйверах для устройства в ОС на стороне сервера (виртуальной машины VDI)

Да

Нет

Поддержка любых устройств USB

Да

Нет

Возможность использовать одно устройство с несколькими сеансами (удалёнными и локальным)

Нет

Да

Возможность подключать и отключать устройства без необходимости переподкючения «Удалённого рабочего стола»

Нет

Да

Работает в сценариях RDSH (Remote Desktop Session Host, ранее известные как Terminal Services), а также с физическми компьютерами на стороне сервера

Нет

Да

Требования к каналам связи

Высокие, рекомендуется использование через LAN (как и для графики через RemoteFX)

Низкие, работает как по каналам LAN, так и WAN

Из этой таблицы становится очевидно, что низкоуровневое перенаправление RemoteFX подходит далеко на для всех устройств. Например, клавиатура должна одновременно работать как в локальном сеансе, так и в удалённом (даже в сценарии с тонким клиентом!). Поэтому клавиатура всегда будет перенаправляться через «виртуальное устройство». Другой, не столь очевидный пример — смарт-карты. Дело в том, что по соображениям безопасности, перенаправление устройств не начнёт работать до тех пор, пока не завершатся все процессы аутентификации. Смарт-карты — единственное исключение из этого правила, и они тоже должны быть доступны в нескольких сеансах одновременно.

Поэтому важно понимать, что оба типа перенаправления устройств — RemoteFX и «виртуальные устройства» — могут (и должны!) работать параллельно. Часть устройств будет использовать один метод, а часть другой. Более того, сложные, «составные» устройства (например: принтер-сканер-факс-кард-ридер или клавиатура-тачпад-считыватель отпечатков пальцев) будут логически представлены как отдельные устройства, которые могут одновременно использовать разные методы перенаправления.

Рассмотрим вкратце основные преимущества, приносимые RemoteFX в мир сценариев VDI.

  • Надежность:
    • установка и настройка драйверов, потенциальные проблемы с совместимостью касаются лишь виртуальных машин, а не серверов и клиентских ПК;
    • приложения не отличают локальных устройств от перенаправленных;
    • используется инфраструкрутра PnP, проверенная годами в Windows.
  • Безопасность:
    • драйверы устройств изолированы от серверов виртуализации;
    • все сигналы URB, передающиеся по сети, проверяются на соответствие заявленным ID и спецификации USB 2.0. При обнаружении любой аномалии (что может быть как попыткой скомпрометировать систему, так и проблемой совместимости) устройство отключается от удалённой виртуальной машины и поступает в распоряжение ОС на клиентском рабочем месте;
    • групповые политики позволяют гибко контроллировать список перенаправляемых устройств.
  • Совместимость:
    • поддерживаются драйверы как KMDF (режима ядра), так UMDF (пользовательского режима);
    • поддерживаются как синхронные (например, веб-камеры), так и асинхронные устройства (например, сканеры). В частности — те, которые требуют создания отдельных служб ОС.

Для того, чтобы объяснить принцип работы перенаправления USB, для начала рассмотрим — как вообще работает подключение устройств USB в пределах локальной ОС (без использования перенаправления в удалённую систему).

 

Очевидно, что в сценарии «Удалённого рабочего стола» — когда устройство физически подключено к одному компьютеру, а использоваться должно в другой ОС — всё будет сложнее. Рассмотрим аналогичную схему для соединения RDP с использованием RemoteFX. Вот что происходит со стороны клиентского устройства.

 

А вот, что в это время происходит внутри виртуальной машины, к которой мы подключаемся.

 

Надеемся, что мы довольно подробно раскрыли архитектуру перенаправления устройств USB с помощью RemoteFX. Завтра мы расскажем о том, как это применить на практике и попробовать самостоятельно.