Looking Glass на домашнем компьютере разработчика
У многих пользователей под Linux иногда возникает необходимость запустить ОС Windows. Например, для некоторых нативных приложений или игр. Windows можно запустить обычной в виртуальной машине, но за это приходится платить производительностью.
Разработчик по имени Джеффри МакРэй (gnif) не готов с этим мириться — и поэтому вместе с несколькими единомышленниками несколько лет назад создал приложение Looking Glass для запуска Windows VM под Linux в окне с нативной производительностью. 17 июля 2021 года вышла четвёртая стабильная версия хоста (B4). Если вкратце, Looking Glass позволяет использовать KVM (Kernel-based Virtual Machine), настроенный на сквозной проход сигнала VGA PCI (GPU passthrough) без подключённого физического монитора, клавиатуры или мыши.
Программа Looking Glass предназначена для использование на локальном компьютере с минимальной задержкой, программа не предназначена для потоковой передачи по сети, а скорее через блок общей памяти. В текущих тестах на частоте монитора 60 Гц можно получить в гостевой системе задержку 16 или менее миллисекунд. Если пользователь не заботится о VSYNC, её можно уменьшить до нескольких (!) миллисекунд.
В данном случае в роли “Windows host application” выступает дисплейный сервер, который работает в гостевой виртуальной машине. Единственное, что должно быть запущено в ОС Linux — это приложение
looking-glass-client
, вот инструкция по установке клиента. Здесь инструкции по сборке хоста. Как вариант, можно скачать собранный бинарник.
Хост захватывает кадры с гостевой ОС через API, и отправляет их клиенту. Хост может быть на гипервизоре или другой виртуальной машине. Кадры отправляются по протоколу с низкой задержкой через общую память.
Через виртуальное устройство IVSHMEM захватывает кадры, а также форму курсора и события движения мыши, передавая их обратно клиенту для рендеринга. Фактически курсор заново рендерится на стороне клиента, независимо от захвата кадров.
В отличие от сетевых потоковых приложений, Looking Glass не использует никаких форм сжатия или преобразования цветового пространства, все кадры передаются клиентскому приложению в 32-битном RGBA без каких-либо преобразований или модификаций. Это возможно благодаря использованию разделяемого сегмента памяти, который обеспечивает высокую пропускную способность при низкой задержке обмена данными между гостем и хостом.
На данный момент система загружает Windows 10 с любой видеокартой, поддерживающей DXGI Desktop Duplication или NVIDIA Capture API (только профессиональные карты, такие как Quadro).
На самом деле почти все современные видеокарты поддерживают DXGI. Это можно проверить через DxDiag, проверив наличие поддержки WDDM 1.2 или выше.
Видеопоток Looking Glass можно добавить как видеоисточник OBS через плагин OBS, который действует как другой клиент Looking Glass. Инструкции по установке см. здесь.
Looking Glass не поддерживает маршрутизацию аудио. Предпочтительным решением является передача звука через QEMU в аудиосистему хоста. Другим популярным решением является использование Scream, виртуальной звуковой карты, которая передаёт звук по сети. Руководство по настройке scream см. здесь.
Программа выпущена под лицензией GPL 2.0, исходный код открыт.
Поговорить с разработчиком можно в канале Discord.
P. S. По отзывам пользователей, первоначально настроить виртуальную машину сложновато, но потом всё действительно работает с нативной производительностью (разница не более 5%) без сбоев, включая Windows Update, обновления драйверов, почти все онлайновые игры и т. д. В виртуальной машине нормально работают античиты PUBG, Battlefield 1/3/4/5, Titanfall 1&2, Arma 3, 7 Days to Die, Ark, Fortnite, Apex, Halo: The Master Chief Collection, Star Wars Squadrons и др.
Комментарии (26)
Yoskaldyr
21.07.2021 23:10+3Только вот ни слова что работать будет только если несколько видеокарт в системе.
Scinolim
22.07.2021 00:27С HD2900XTX в качестве подключалки монитора в паре с боевой RXT3070 работать будет?
Yoskaldyr
22.07.2021 00:56+1лукинглас по идее будет работать в любой связке, в которой можно запустить GPU passthrough.
И чаще проще играть/работать на реальной видюхе с подключенным к ней монитором, чем юзать лукинглас, т.к. через него все равно есть микрофризы в шутеры не сильно поиграть.
Лукинглас очень полезная вещь когда используются серверные видяхи без видеовыходов. Тогда и одну видеокарту можно нарезать сразу на несколько виртуалок (если позволяет) и лукинглас значительно приятнее, чем все остальные способы.Yoskaldyr
22.07.2021 01:03+2Вот для ноутов с дискретной видео, лукинглас может быть хорошим вариантом, если надо запускать виртуалки с поддержкой 3d. Встройка для линукса, дискретка для виртуалки.
alpik
22.07.2021 02:28Не очень понятно.
У меня Vega 11 в проце, и rx570 дискретная на десктопе.
Я смогу пробросить 570 в WM windows и полноценно играть в шутер? Будет ли просадка FPS ?
Сейчас держу Винду на отдельном ссд чисто с целью поиграться, но хотелось бы перенести в виртуалку, и убрать дуалбут.
Yoskaldyr
22.07.2021 02:52+1если это десктоп, то по идее никаких проблем не должно быть.
Есть 2 варианта, в обоих случаях используется проброс дискретной rx570 в виртуалку, а в линуксе использовать только встройку. Отличия только как подключать монитор.
Самый производительный вариант без лагов подключить монитор 2 кабелями — один от материнки (встройка), второй от дискретки и переключать входы на самом мониторе. Или вообще лучше использовать 2 отдельных монитора — один для дискретки (для игр в виртуалке), один для самого линукса.
Если одним кабелем, то монитор подключать к встройке и использовать looking glass для проброса изображения из виртуалки, которая использует дискретку в линукс.DistortNeo
22.07.2021 13:32Самый производительный вариант без лагов подключить монитор 2 кабелями — один от материнки (встройка), второй от дискретки и переключать входы на самом мониторе.
И тут сразу вылезает вопрос с пробросом мыши и клавиатуры и их переключением между хостом и виртуалкой.
Yoskaldyr
22.07.2021 14:53А тут или 2 клавы 2 мыши или не юзать клаву/мышь в момент игры :)
Или как вариант извращения, запускать вин в виртуалке, а из вин управлять линуксом через любой протокол удаленного управления :)P.S. Ну нет пока "нормального" варианта получить хардварное ускорение видео без лагов и фризов в виртуалке под линуксом с удобной одновременной работой линукс хост + вин виртуалка
DistortNeo
22.07.2021 20:00а из вин управлять линуксом через любой протокол удаленного управления :)
Не, ну можно юзать программный Virtual KVM switch. Вот только с переключением видео будут проблемы: программно сменить источник можно только по активному подключению.
а из вин управлять линуксом через любой протокол удаленного управления :)
А не проще тогда винду сделать хостом, а линукс запихнуть в виртуалку?
Yoskaldyr
22.07.2021 23:29А не проще тогда винду сделать хостом, а линукс запихнуть в виртуалку?
Так с этим как раз и нет проблем, особенно с последними изменениями у MS
Да и полноценное 3д редко нужно в линуксе.
Yoskaldyr
22.07.2021 14:56лугингласс хорошо может работать для офисных задач (хотя лично я лаг управления по мыше замечаю), но вот играть во что-то где важна реакция точно не айс. Пошаговые стратегии, или ККИ конечно норм
Darlock_Ahe
23.07.2021 09:49A KVM switch тут не поможет?
DistortNeo
23.07.2021 10:48Хардварный или виртуальный?
Darlock_Ahe
23.07.2021 11:12Хардварный
DistortNeo
23.07.2021 11:55А теперь смотрите: хардварный свитч просто перетыкает мышь и клавиатуру из одного порта компа в другой. Но при этом пробросить конкретный USB-порт как отдельное устройство в виртуалку, используя PCI Passthrough, нельзя, разве что купить отдельную PCI-карточку с USB-портами. То есть в любом случае это будет переподключение к хосту, а уже оттуда будет проброс в виртуальную машину. А менеджер виртуальных машин должен содержать правила привязки устройств не только по коду, но и по порту. А ещё и банально KVM switch с поддержкой 4K стоит довольно дорого.
Yoskaldyr
23.07.2021 17:40Поможет :)
Сам так какое-то время работал.
Но все равно это из разряда извращений и неудобно все-такиСейчас остановился на том что, хедлесс линукс в качестве запускалки основной виртуалки на винде, а также в качестве стенки, различных сетевых извращений (включая пробросы портов и впны), а также для запуска вспомогательных виртуалок, доступ к которым из основной виндовой виртуалки. Все это работает даже с одной видяхой (встройка) с максимально возможной для виртуалки производительностью.
С точки зрения удобства работы с сетью все значительно приятнее чем запускать виртуалки линукса под виндой (вланы, впн-ы, маршрутизация и т.п. под виндой — это боль)
alpik
23.07.2021 00:53Тут как раз проблем нет, у меня рабочий ноут + монитор
Десктоп собирал для виртуалок, подключаю к монитору только поиграться, а так там proxmox живёт.
Yoskaldyr
22.07.2021 15:08Если честно — все эти лукингласс довольно большие костыли.
Всего-то надо чтобы написали нормальные драйвера для виртуального 3д адаптера для винды, это бы покрывало более 50% юзкейсов использования вин на линукс.
Или хотя бы сделали нормальную поддержку SR-IOV для графики для большинства 3д адаптеров.
А сейчас, получается если работаешь на десктопе и хочешь поддержку 3д в виртуалке или покупай серверную видяху или ставь по отдельной видео на виртуалку. А если надо играть, то вообще боль и печаль, одновременно держать включенной виртуалку и взаимодействовать с рабочим столом линукса по нормлаьному — никак :(P.S. Самый адекватный вариант работы с виртуалками винды это под макосью виртуалки от параллелса.
DistortNeo
22.07.2021 20:01+1Всего-то надо чтобы написали нормальные драйвера для виртуального 3д адаптера для винды, это бы покрывало более 50% юзкейсов использования вин на линукс.
А это вообще реально?
Yoskaldyr
22.07.2021 23:36Абсолютно. API, а именно Virgil 3D давно уже есть, и даже есть альфа версия написанная то ли студентом то ли аспирантом для win guest (все на коленке за период хакатона). Только вот за все это время с мертвой точки ничего не сдвинулось.
Единственная надежда что Интелы все-таки допилят поддержку SR-IOV в своих новых видюхах (XE которые). А по то заявлениям мы типа сделали, а по факту в железе нигде нет поддержки.
Maxim_Q
А можно ли использования на VPS'e удаленно? Может кто-то пробовали, поделитесь опытом.
Roman_Cherkasov
Но ведь прямо в статье написано, что программа не предназначена для работы по сети. А такой уровень производительности достигается за счёт хитрой работы с памятью, что позволяет ещё и картинку не сжатую слать.
Teplo_Kota
Это программа для, грубо говоря, показа картинки из одной видеокарты в окно на другой.
symbix
Там для обмена данными используется shared memory, потому, конечно же, нет. Формулировка в статье про "отправку" данных немного вводит в заблуждение. На самом деле никакой отправки нет. С одной стороны пишется в shared memory, с другой из нее же читается. За счёт отсутствования копирования данных и достигается производительность. Кстати, этот же подход используется в nginx unit для максимально быстрого обмена данными между веб-сервером и приложением.
DistortNeo
А почему копирование отсутствует?
Мы же сначала копируем из Guest GPU в RAM, а затем из RAM в Host GPU.