Looking glass для linux

Запуск Windows VM под Linux в окне с нативной производительностью


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 см. здесь.

Читайте также:  Терминология операционной системы windows

Программа выпущена под лицензией 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 и др.

Источник

KVM, PCI passthrough, Looking Glass и все-все-все

Искать выход долго не пришлось, но идея бить в бубен прожектором оказалась весьма странной. На тему проброса видеокарт в виртуальную машину интернет изобилует инструкциями различных времён и под различное железо. Чего стоит огромная статья на сайте Arch Linux’а [ 0 ]. Приведу сокращенную версию инструкции по пробросу видеокарты.

0. Проверяем, что железо поддерживает IOMMU

1. Включаем поддержку IOMMU в ядре.

GRUB_CMDLINE_LINUX_DEFAULT=«quiet splash amd_iommu=on»
или
GRUB_CMDLINE_LINUX_DEFAULT=«quiet splash intel_iommu=on»

Не забываем sudo update-grub .

2. Отбираем видеокарту у драйвера

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

04:00.0 VGA compatible controller [0300]: NVIDIA Corporation GT218 [GeForce 210] [10de:0a65] (rev a2)
Kernel driver in use: nouveau
Kernel modules: nvidiafb, nouveau
04:00.1 Audio device [0403]: NVIDIA Corporation High Definition Audio Controller [10de:0be3] (rev a1)
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel

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

Настраиваем модуль VFIO, чтобы он перехватывал устройства, не давая загрузиться основным драйверам. При необходимости добавляем в черный список, основной драйвер.

options vfio-pci ids=10de:0a65,10de:0be3
blacklist nouveau

3. Перезагружаемся и проверяем, что всё получилось

DMAR: Intel® Virtualization Technology for Directed I/O
или
AMD-Vi: Found IOMMU at 0000:00:00.2 cap 0x40
AMD-Vi: Interrupt remapping enabled
AMD-Vi: Lazy IO/TLB flushing enabled

Составные устройства попали в одну группу.

/sys/kernel/iommu_groups/15/devices/0000:01:00.0
/sys/kernel/iommu_groups/15/devices/0000:01:00.1

/sys/kernel/iommu_groups/16/devices/0000:02:00.0
/sys/kernel/iommu_groups/17/devices/0000:03:00.0
/sys/kernel/iommu_groups/18/devices/0000:04:00.0
/sys/kernel/iommu_groups/18/devices/0000:04:00.1

Драйвера KVM и VFIO загружены.

Видеокарта для гостевой ОС захвачена VFIO.

04:00.0 VGA compatible controller [0300]: NVIDIA Corporation GT218 [GeForce 210] [10de:0a65] (rev a2)
Kernel driver in use: vfio-pci
Kernel modules: nvidiafb, nouveau
04:00.1 Audio device [0403]: NVIDIA Corporation High Definition Audio Controller [10de:0be3] (rev a1)
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel

4. Настраиваем QEMU и запускаем гостевую ОС

sudo apt install qemu-kvm qemu-utils seabios ovmf virt-viewer

qemu-img create -f raw -o preallocation=full guest.img 50G
или
fallocate -l 50G guest.img

Запускаем виртуальную машину без проброса видеокарты для установки гостевой ОС. Так как стоит прицел на Looking Glass, то для гостевой стоит выбирать Windows 10. Windows 8/8.1 по последнем данным тоже поддерживаются.

#!/bin/bash
remote-viewer spice://127.0.0.1:5900&
sudo qemu-system-x86_64 \
-machine q35,accel=kvm \
-enable-kvm \
-cpu host,kvm=off,check \
-smp cpus=2,sockets=1,cores=2,threads=1 \
-m 6G \
-rtc base=localtime,clock=host \
-device piix3-usb-uhci \
-device usb-tablet \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive file=’w10.iso’,if=ide,format=raw,index=2,media=cdrom,cache=none \
-drive file=’virtio-win-0.1.141_st.iso’,if=ide,format=raw,index=3,media=cdrom,cache=none \
-drive file=’guest.img’,if=ide,format=raw,index=4,media=disk,cache=writeback \
-vga qxl \
-spice port=5900,addr=127.0.0.1,disable-ticketing \
-monitor stdio \
-netdev user,id=n1,ipv6=off,smb=»/media/user/data» \
-device e1000,netdev=n1,mac=67:77:78:88:89:99 \
«$@»

5. Пробрасываем видеокарту в гостевую ОС

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

#!/bin/bash
remote-viewer spice://127.0.0.1:5900&
sudo qemu-system-x86_64 \
-machine q35,accel=kvm \
-enable-kvm \
-cpu host,kvm=off,check \
-smp cpus=2,sockets=1,cores=2,threads=1 \
-m 6G \
-rtc base=localtime,clock=host \
-device piix3-usb-uhci \
-device usb-tablet \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive file=’virtio-win-0.1.141_st.iso’,if=ide,format=raw,index=3,media=cdrom,cache=none \
-drive file=’guest.img’,if=ide,format=raw,index=4,media=disk,cache=writeback \
-vga qxl \
-spice port=5900,addr=127.0.0.1,disable-ticketing \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root \
-device vfio-pci,host=04:00.0,bus=root,addr=00.0,multifunction=on \
-device vfio-pci,host=04:00.1,bus=root,addr=00.1 \

-monitor stdio \
-netdev user,id=n1,ipv6=off,smb=»/media/user/data» \
-device e1000,netdev=n1,mac=67:77:78:88:89:99 \
«$@»

После как проброшенная видеокарта заработала, и в диспетчере устройств пишет «Устройство работает нормально», запускаем виртуальную машину только с проброшенной видеокартой.

#!/bin/bash
sudo qemu-system-x86_64 \
-machine q35,accel=kvm \
-enable-kvm \
-cpu host,kvm=off,check \
-smp cpus=2,sockets=1,cores=2,threads=1 \
-m 6G \
-rtc base=localtime,clock=host \
-device piix3-usb-uhci \
-device usb-tablet \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive file=’virtio-win-0.1.141_st.iso’,if=ide,format=raw,index=3,media=cdrom,cache=none \
-drive file=’guest.img’,if=ide,format=raw,index=4,media=disk,cache=writeback \
-vga none \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root \
-device vfio-pci,host=04:00.0,bus=root,addr=00.0,multifunction=on \
-device vfio-pci,host=04:00.1,bus=root,addr=00.1 \
-monitor stdio \
-netdev user,id=n1,ipv6=off,smb=»/media/user/data» \
-device e1000,netdev=n1,mac=67:77:78:88:89:99 \
«$@»

Подключаем к ней монитор и любуемся изображением рабочего стола гостевой ОС.

Читайте также:  Включение режима ahci без переустановки windows

То место, где заканчиваются простые решения

И тут начинается, самое интересное. У кого-то, всё хорошо, картинка пошла и дальше всё просто. Мой опыт два раза споткнулся на стадии отсутствия изображения. Первый раз был проброс встроенной видеокарты процессора Intel 6700T HD 530, видеовыходы были пустые и неудача была списана на то, что встройки плохо прокидываются. Второй раз же пробрасывалась внешняя Nvidia GF210, которая уже была специально куплена для экспериментов. Результат был ещё более интересен. В non EFI режиме видеокарта успешно пробрасывалась и даже показывала картинку, но выключение гостевой ОС давало осечку .

Последующий проброс мог просто повесить хост. Пара часов лёгкого гугления приводит к тому, что проблема зависания видеокарты довольно распространённая. К этому ведёт как некорректное завершение работы виртуальной машины, так и с некоторым шансом даже корректное выключение. Как выход рекомендуют пробрасывать в EFI режиме. Но VBIOS Nvidia GF210 не поддерживает EFI…

Шить или не шить, вот в чем вопрос

Не шить. QEMU поддерживает подмену VBIOS при пробросе видеокарты. Но VBIOS ещё придётся научить поддерживать EFI режим. Обычно это рекомендуют проверять перед тем как начать проброс видеокарты, например здесь [ 2 ]. Но дело приходится иметь с тем, что есть, и искать свежую видеокарту с поддержкой EFI не хотелось. Значит нужно патчить VBIOS. Все операции выполняемые с VBIOS, делаются на свой страх и риск. Мной использовалось комплект ПО и инструкция к нему от сюда [ 3 ]. После считывания VBIOS получаем файл gt210.rom , патчим и на выходе имеем gt210_uefi.rom . Вот его и нужно подсунуть видеокарте при загрузке виртуальной машины.

#!/bin/bash
sudo qemu-system-x86_64 \
-machine q35,accel=kvm \
-enable-kvm \
-cpu host,kvm=off,check \
-smp cpus=2,sockets=1,cores=2,threads=1 \
-m 6G \
-rtc base=localtime,clock=host \
-device piix3-usb-uhci \
-device usb-tablet \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive file=’virtio-win-0.1.141_st.iso’,if=ide,format=raw,index=3,media=cdrom,cache=none \
-drive file=’guest.img’,if=ide,format=raw,index=4,media=disk,cache=writeback \
-vga none \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root \
-device vfio-pci,host=04:00.0,bus=root,addr=00.0,multifunction=on,romfile=gt210_uefi.rom \
-device vfio-pci,host=04:00.1,bus=root,addr=00.1 \
-monitor stdio \
-netdev user,id=n1,ipv6=off,smb=»/media/user/data» \
-device e1000,netdev=n1,mac=67:77:78:88:89:99 \
«$@»

Запускаем виртуальную машину и смотрим.

Темнота

Выходы видеокарты сияли темнотой. В очередной раз мораль проходила испытание неудачей. Первое, что приходит в голову, гостевая ОС падает при старте. Логи, мне нужны её логи. Для этого запускаем vga_qxl.sh . Смотрим предыдущий запуск. А там всё хорошо, кроме того, что питание резко дёрнули. Получается, что оно работает, хотя и не работает. Первая идея была подключиться по RDP и посмотреть, что же там происходит, но всё же лучше для этого использовать VNC, например tightvnc [ 4 ]. Устанавливаем VNC, настраиваем на 5600 порт и прокидываем этот порт для доступа из хоста.

#!/bin/bash
sudo qemu-system-x86_64 \
-machine q35,accel=kvm \
-enable-kvm \
-cpu host,kvm=off,check \
-smp cpus=2,sockets=1,cores=2,threads=1 \
-m 6G \
-rtc base=localtime,clock=host \
-device piix3-usb-uhci \
-device usb-tablet \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive file=’virtio-win-0.1.141_st.iso’,if=ide,format=raw,index=3,media=cdrom,cache=none \
-drive file=’guest.img’,if=ide,format=raw,index=4,media=disk,cache=writeback \
-vga none \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root \
-device vfio-pci,host=04:00.0,bus=root,addr=00.0,multifunction=on,romfile=gt210_uefi.rom \
-device vfio-pci,host=04:00.1,bus=root,addr=00.1 \
-monitor stdio \
-netdev user,id=n1,hostfwd=tcp:127.0.0.1:5600-:5600,ipv6=off,smb=»/media/user/data» \
-device e1000,netdev=n1,mac=67:77:78:88:89:99 \
«$@»

Подключаемся и видим рабочую машину, только монитор у неё странный Generic Non-PnP Monitor (Универсальный монитор не PnP). Картинка есть, значит можно пробовать запускать Looking Glass.

Читайте также:  Проигрыватель windows media не воспроизводит dvd диски

Looking Glass

Хоть данная технология и использует OpenGL, после gl пробел не нужен. А вот почитать инструкцию [ 5 ] на сайте проекта нужно обязательно. Для гостевой ОС скачать приложение захвата экрана looking-glass-host.exe [ 6 ], скачать и установить Microsoft Visual C++ 2015 Redistributable [ 7 ], скачать драйвер для IVSHMEM устройства [ 8 ]. Для хоста ставим зависимости, скачиваем и собираем клиентское приложение.

#!/bin/bash
sudo apt-get install cmake libsdl2-dev libsdl2-ttf-dev nettle-dev libspice-protocol-dev libfontconfig1-dev libx11-dev fonts-freefont-ttf libconfig-dev
wget github.com/gnif/LookingGlass/archive/a12.tar.gz
tar -xf a12.tar.gz
cd LookingGlass-a12
mkdir client/build
cd client/build
cmake ../
make

Запускаем виртуальную машину с IVSHMEM устройством. Размер памяти в 32Mb выбран для разрешения 1920×1080.

#!/bin/bash
if [! -f /dev/shm/looking-glass ]; then
touch /dev/shm/looking-glass
chown `whoami`:kvm /dev/shm/looking-glass
chmod 660 /dev/shm/looking-glass
fi

sudo qemu-system-x86_64 \
-machine q35,accel=kvm \
-enable-kvm \
-cpu host,kvm=off,check \
-smp cpus=2,sockets=1,cores=2,threads=1 \
-m 6G \
-rtc base=localtime,clock=host \
-device piix3-usb-uhci \
-device usb-tablet \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive file=’virtio-win-0.1.141_st.iso’,if=ide,format=raw,index=3,media=cdrom,cache=none \
-drive file=’guest.img’,if=ide,format=raw,index=4,media=disk,cache=writeback \
-vga none \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root \
-device vfio-pci,host=04:00.0,bus=root,addr=00.0,multifunction=on,romfile=gt210_uefi.rom \
-device vfio-pci,host=04:00.1,bus=root,addr=00.1 \
-device ivshmem-plain,memdev=ivshmem,bus=pcie.0 \
-object memory-backend-file,id=ivshmem,share=on,mem-path=/dev/shm/looking-glass,size=32M \

-monitor stdio \
-netdev user,id=n1,hostfwd=tcp:127.0.0.1:5600-:5600,ipv6=off,smb=»/media/user/data» \
-device e1000,netdev=n1,mac=67:77:78:88:89:99 \
«$@»

Подключаемся через VNC, устанавливаем драйвер на IVSHMEM устройство, возможно на него будет поставлен стандартный драйвер, находится в «Системные устройства». Запускаем looking-glass-host.exe. На хосте запускаем ./LookingGlass-a12/client/build/looking-glass-client .

На этом у меня заработала система с NVidia GF210, а затем по этому же маршруту удалось запустить Intel HD530. С разрешением экрана была маленькая проблемка, для смены на редкое разрешение, например 2048х1152, пришлось использовать Custom Resolution Utility [ 9 ].

Ещё один нюанс, при добавлении приложения looking-glass-host.exe в автозагрузку, нужно настроить автоматический вход пользователя, по соображениям безопасности гостевая ОС не даёт захватывать экран входа в систему.

Послесловие

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

Производительность. Накладные ресурсы на виртуализацию и не самая расторопная гостевая ОС не дадут с комфортом работать на слабом и средне-слабом железе. Потребуется мощный процессор не меньше 6-8 ядер, хорошая видеокарта для гостевой ОС, 16ГБ+ оперативной памяти, минимум по 8ГБ на каждую ОС. И танцы с бубном, чтобы выжать максимум из железа.
Терпение. Если сразу не заработает, то сил и времени придётся потратить прилично. Искать, читать, пробовать. Опять искать, читать и снова пробовать. Оставлю ещё несколько ссылок, которые мне попадались, возможно там будет ещё какая-нибудь полезная информация. [ 10 ] [ 11 ] [ 12 ]

Источник

Оцените статью