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)


  1. Maxim_Q
    21.07.2021 22:12
    -2

    Программа Looking Glass предназначена для использование на локальном компьютере с минимальной задержкой

    А можно ли использования на VPS'e удаленно? Может кто-то пробовали, поделитесь опытом.


    1. Roman_Cherkasov
      21.07.2021 22:28
      +4

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


    1. Teplo_Kota
      21.07.2021 22:29
      +1

      Это программа для, грубо говоря, показа картинки из одной видеокарты в окно на другой.


    1. symbix
      21.07.2021 22:33
      +1

      Там для обмена данными используется shared memory, потому, конечно же, нет. Формулировка в статье про "отправку" данных немного вводит в заблуждение. На самом деле никакой отправки нет. С одной стороны пишется в shared memory, с другой из нее же читается. За счёт отсутствования копирования данных и достигается производительность. Кстати, этот же подход используется в nginx unit для максимально быстрого обмена данными между веб-сервером и приложением.


      1. DistortNeo
        22.07.2021 13:25

        А почему копирование отсутствует?
        Мы же сначала копируем из Guest GPU в RAM, а затем из RAM в Host GPU.


  1. Yoskaldyr
    21.07.2021 23:10
    +3

    Только вот ни слова что работать будет только если несколько видеокарт в системе.


    1. Scinolim
      22.07.2021 00:27

      С HD2900XTX в качестве подключалки монитора в паре с боевой RXT3070 работать будет?


      1. Yoskaldyr
        22.07.2021 00:56
        +1

        лукинглас по идее будет работать в любой связке, в которой можно запустить GPU passthrough.
        И чаще проще играть/работать на реальной видюхе с подключенным к ней монитором, чем юзать лукинглас, т.к. через него все равно есть микрофризы в шутеры не сильно поиграть.
        Лукинглас очень полезная вещь когда используются серверные видяхи без видеовыходов. Тогда и одну видеокарту можно нарезать сразу на несколько виртуалок (если позволяет) и лукинглас значительно приятнее, чем все остальные способы.


        1. Yoskaldyr
          22.07.2021 01:03
          +2

          Вот для ноутов с дискретной видео, лукинглас может быть хорошим вариантом, если надо запускать виртуалки с поддержкой 3d. Встройка для линукса, дискретка для виртуалки.


  1. alpik
    22.07.2021 02:28

    Не очень понятно.

    У меня Vega 11 в проце, и rx570 дискретная на десктопе.

    Я смогу пробросить 570 в WM windows и полноценно играть в шутер? Будет ли просадка FPS ?

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


    1. Yoskaldyr
      22.07.2021 02:52
      +1

      если это десктоп, то по идее никаких проблем не должно быть.
      Есть 2 варианта, в обоих случаях используется проброс дискретной rx570 в виртуалку, а в линуксе использовать только встройку. Отличия только как подключать монитор.
      Самый производительный вариант без лагов подключить монитор 2 кабелями — один от материнки (встройка), второй от дискретки и переключать входы на самом мониторе. Или вообще лучше использовать 2 отдельных монитора — один для дискретки (для игр в виртуалке), один для самого линукса.
      Если одним кабелем, то монитор подключать к встройке и использовать looking glass для проброса изображения из виртуалки, которая использует дискретку в линукс.


      1. DistortNeo
        22.07.2021 13:32

        Самый производительный вариант без лагов подключить монитор 2 кабелями — один от материнки (встройка), второй от дискретки и переключать входы на самом мониторе.

        И тут сразу вылезает вопрос с пробросом мыши и клавиатуры и их переключением между хостом и виртуалкой.


        1. Yoskaldyr
          22.07.2021 14:53

          А тут или 2 клавы 2 мыши или не юзать клаву/мышь в момент игры :)
          Или как вариант извращения, запускать вин в виртуалке, а из вин управлять линуксом через любой протокол удаленного управления :)


          P.S. Ну нет пока "нормального" варианта получить хардварное ускорение видео без лагов и фризов в виртуалке под линуксом с удобной одновременной работой линукс хост + вин виртуалка


          1. DistortNeo
            22.07.2021 20:00

            а из вин управлять линуксом через любой протокол удаленного управления :)

            Не, ну можно юзать программный Virtual KVM switch. Вот только с переключением видео будут проблемы: программно сменить источник можно только по активному подключению.


            а из вин управлять линуксом через любой протокол удаленного управления :)

            А не проще тогда винду сделать хостом, а линукс запихнуть в виртуалку?


            1. Yoskaldyr
              22.07.2021 23:29

              А не проще тогда винду сделать хостом, а линукс запихнуть в виртуалку?

              Так с этим как раз и нет проблем, особенно с последними изменениями у MS
              Да и полноценное 3д редко нужно в линуксе.


        1. Yoskaldyr
          22.07.2021 14:56

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


        1. Darlock_Ahe
          23.07.2021 09:49

          A KVM switch тут не поможет?


          1. DistortNeo
            23.07.2021 10:48

            Хардварный или виртуальный?


            1. Darlock_Ahe
              23.07.2021 11:12

              Хардварный 


              1. DistortNeo
                23.07.2021 11:55

                А теперь смотрите: хардварный свитч просто перетыкает мышь и клавиатуру из одного порта компа в другой. Но при этом пробросить конкретный USB-порт как отдельное устройство в виртуалку, используя PCI Passthrough, нельзя, разве что купить отдельную PCI-карточку с USB-портами. То есть в любом случае это будет переподключение к хосту, а уже оттуда будет проброс в виртуальную машину. А менеджер виртуальных машин должен содержать правила привязки устройств не только по коду, но и по порту. А ещё и банально KVM switch с поддержкой 4K стоит довольно дорого.


                1. Darlock_Ahe
                  23.07.2021 12:03

                  Ok, makes sense.

                  Видимо я плохо понимаю принцип действия свитча.


          1. Yoskaldyr
            23.07.2021 17:40

            Поможет :)
            Сам так какое-то время работал.
            Но все равно это из разряда извращений и неудобно все-таки


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


      1. alpik
        23.07.2021 00:53

        Тут как раз проблем нет, у меня рабочий ноут + монитор

        Десктоп собирал для виртуалок, подключаю к монитору только поиграться, а так там proxmox живёт.


  1. Yoskaldyr
    22.07.2021 15:08

    Если честно — все эти лукингласс довольно большие костыли.
    Всего-то надо чтобы написали нормальные драйвера для виртуального 3д адаптера для винды, это бы покрывало более 50% юзкейсов использования вин на линукс.
    Или хотя бы сделали нормальную поддержку SR-IOV для графики для большинства 3д адаптеров.
    А сейчас, получается если работаешь на десктопе и хочешь поддержку 3д в виртуалке или покупай серверную видяху или ставь по отдельной видео на виртуалку. А если надо играть, то вообще боль и печаль, одновременно держать включенной виртуалку и взаимодействовать с рабочим столом линукса по нормлаьному — никак :(


    P.S. Самый адекватный вариант работы с виртуалками винды это под макосью виртуалки от параллелса.


    1. DistortNeo
      22.07.2021 20:01
      +1

      Всего-то надо чтобы написали нормальные драйвера для виртуального 3д адаптера для винды, это бы покрывало более 50% юзкейсов использования вин на линукс.

      А это вообще реально?


      1. Yoskaldyr
        22.07.2021 23:36

        Абсолютно. API, а именно Virgil 3D давно уже есть, и даже есть альфа версия написанная то ли студентом то ли аспирантом для win guest (все на коленке за период хакатона). Только вот за все это время с мертвой точки ничего не сдвинулось.


        Единственная надежда что Интелы все-таки допилят поддержку SR-IOV в своих новых видюхах (XE которые). А по то заявлениям мы типа сделали, а по факту в железе нигде нет поддержки.