Unable to view windows host from linux client

I am having a lot of trouble setting up the looking-glass client to be able to view my host session running windows 11. I have it to where it shows it as connected, but the output is just the purple screen and the logo and never changes. There is no errors in the logs on the client side, but on the host side I am getting an issue with the IVSHMEM failing to connect to a device. My host log looks like this:

[I]      6860930              time.c:85   | windowsSetTimerResolution      | System timer resolution: 976.5 μs
[I]      6861491               app.c:768  | app_main                       | Looking Glass Host (B6-rc1)
[I]      6861858           cpuinfo.c:37   | lgDebugCPU                     | CPU Model: AMD Ryzen 5 5600X 6-Core Processor
[I]      6862239           cpuinfo.c:38   | lgDebugCPU                     | CPU: 2 sockets, 2 cores, 2 threads
[I]      6863326           ivshmem.c:132  | ivshmemInit                    | IVSHMEM 0* on bus 0xa, device 0x1, function 0x0
[I]      6866017               app.c:785  | app_main                       | IVSHMEM Size     : 32 MiB
[I]      6866381               app.c:786  | app_main                       | IVSHMEM Address  : 0x2A20000
[I]      6866761               app.c:787  | app_main                       | Max Pointer Size : 1024 KiB
[I]      6867074               app.c:788  | app_main                       | KVMFR Version    : 19
[I]      6867373               app.c:806  | app_main                       | Trying           : DXGI
[I]      6870088              dxgi.c:390  | dxgi_init                      | Device Name       : \\.\DISPLAY1
[I]      6870443              dxgi.c:391  | dxgi_init                      | Device Description: NVIDIA GeForce GTX 1080 Ti
[I]      6870905              dxgi.c:392  | dxgi_init                      | Device Vendor ID  : 0x10de
[I]      6871225              dxgi.c:393  | dxgi_init                      | Device Device ID  : 0x1b06
[I]      6871545              dxgi.c:394  | dxgi_init                      | Device Video Mem  : 11121 MiB
[I]      6871886              dxgi.c:395  | dxgi_init                      | Device Sys Mem    : 0 MiB
[I]      6872205              dxgi.c:396  | dxgi_init                      | Shared Sys Mem    : 4086 MiB
[I]      6948709              dxgi.c:503  | dxgi_init                      | Feature Level     : 0xc100
[I]      6949102              dxgi.c:504  | dxgi_init                      | Capture Size      : 1024 x 768
[I]      6949510              dxgi.c:505  | dxgi_init                      | AcquireLock       : enabled
[I]      6949888              dxgi.c:506  | dxgi_init                      | Debug mode        : disabled
[I]      6951074              dxgi.c:598  | dxgi_init                      | Source Format     : DXGI_FORMAT_B8G8R8A8_UNORM
[I]      6951523              dxgi.c:640  | dxgi_init                      | Request Size      : 1024 x 768
[I]      6952405              dxgi.c:658  | dxgi_init                      | Output Size       : 1024 x 768
[I]      6952743              dxgi.c:666  | dxgi_init                      | Copy backend      : Direct3D 11
[I]      6953125              dxgi.c:667  | dxgi_init                      | Damage-aware copy : enabled
[I]      6953500               app.c:831  | app_main                       | Using            : DXGI Direct3D 11
[I]      6953843               app.c:832  | app_main                       | Capture Method   : Asynchronous
[I]      6955421               app.c:687  | lgmpSetup                      | Max Frame Size   : 14 MiB
[I]      6955810               app.c:385  | captureStop                    | ==== [ Capture Stop ] ====
[I]     25679867              time.c:85   | windowsSetTimerResolution      | System timer resolution: 500.0 μs
[I]     25680277               app.c:768  | app_main                       | Looking Glass Host (B6-rc1)
[I]     25680794           cpuinfo.c:37   | lgDebugCPU                     | CPU Model: AMD Ryzen 5 5600X 6-Core Processor
[I]     25681267           cpuinfo.c:38   | lgDebugCPU                     | CPU: 2 sockets, 2 cores, 2 threads
[I]     25682593           ivshmem.c:132  | ivshmemInit                    | IVSHMEM 0* on bus 0xa, device 0x1, function 0x0
    25683842 [E]            ivshmem.c:214  | ivshmemOpen                    | DeviceIoControl Failed: 0x00000224 (An attempt was made to attach to a device that was already attached to another device.)
[E]     25684494               app.c:780  | app_main                       | Failed to open the IVSHMEM device

where it looks like it tries to connect to the same device twice? But even when I run it from the client side, everything looks like it connected fine, its just that Im getting no output. Here is the logs on the host for when the client connects to it:

[I]    279555923              dxgi.c:390  | dxgi_init                      | Device Name       : \\.\DISPLAY1
[I]    279556431              dxgi.c:391  | dxgi_init                      | Device Description: NVIDIA GeForce GTX 1080 Ti
[I]    279556897              dxgi.c:392  | dxgi_init                      | Device Vendor ID  : 0x10de
[I]    279557255              dxgi.c:393  | dxgi_init                      | Device Device ID  : 0x1b06
[I]    279557594              dxgi.c:394  | dxgi_init                      | Device Video Mem  : 11121 MiB
[I]    279558070              dxgi.c:395  | dxgi_init                      | Device Sys Mem    : 0 MiB
[I]    279558401              dxgi.c:396  | dxgi_init                      | Shared Sys Mem    : 4086 MiB
[I]    279676851              dxgi.c:503  | dxgi_init                      | Feature Level     : 0xc100
[I]    279677260              dxgi.c:504  | dxgi_init                      | Capture Size      : 1024 x 768
[I]    279677675              dxgi.c:505  | dxgi_init                      | AcquireLock       : enabled
[I]    279678067              dxgi.c:506  | dxgi_init                      | Debug mode        : disabled
[I]    279679099              dxgi.c:598  | dxgi_init                      | Source Format     : DXGI_FORMAT_B8G8R8A8_UNORM
[I]    279679507              dxgi.c:640  | dxgi_init                      | Request Size      : 1024 x 768
[I]    279680281              dxgi.c:658  | dxgi_init                      | Output Size       : 1024 x 768
[I]    279680742              dxgi.c:666  | dxgi_init                      | Copy backend      : Direct3D 11
[I]    279681276              dxgi.c:667  | dxgi_init                      | Damage-aware copy : enabled
[I]    279681817               app.c:379  | captureStart                   | ==== [ Capture Start ] ====
[I]    279682325               app.c:312  | frameThread                    | Frame thread started

I was able to get it to load into the login screen only one time in looking-glass from the client and I haven’t been able to recreate it even though I didn’t change anything. This is my first time trying to set this up so maybe I am missing something simple? Also the only time I was able to get it past the purple screen into the login was with the “-s” flag to disable spice, in which I had no mouse or keyboard to actually log in, but the display was there.

here is the client log for reference:

[I]  27897067596              main.c:1786 | main                           | Looking Glass (B6-rc1)
[I]  27897067608              main.c:1787 | main                           | Locking Method: Atomic
[I]  27897067787           cpuinfo.c:37   | lgDebugCPU                     | CPU Model: AMD Ryzen 5 5600X 6-Core Processor
[I]  27897067790           cpuinfo.c:38   | lgDebugCPU                     | CPU: 1 sockets, 6 cores, 12 threads
[I]  27897079151              main.c:1162 | lg_run                         | Using font: /usr/share/fonts/TTF/DejaVuSansMono.ttf
[I]  27897079371           ivshmem.c:128  | ivshmemOpenDev                 | KVMFR Device     : /dev/shm/looking-glass
[I]  27897081423             audio.c:159  | audio_init                     | Using AudioDev: PipeWire
[I]  27897081428                ps.c:245  | purespice_connect              | Connecting to socket 127.0.0.1:5900
[I]  27897087422               rsa.c:178  | rsa_encryptPassword            | Using Nettle
[I]  27897087989                ps.c:268  | purespice_connect              | Connected
[I]  27897088068      channel_main.c:167  | onMessage_mainName             | Guest name: win11
[I]  27897088082      channel_main.c:183  | onMessage_mainUUID             | Guest UUID: d212f227-60e1-4c5d-910b-d9dfb20a249f
[I]  27897094689                ps.c:644  | ps_connectChannel              | INPUTS channel connected
[I]  27897094718           channel.c:312  | onMessage_notify               | [notify] keyboard channel is insecure
[I]  27897094781               egl.c:267  | egl_initialize                 | Double buffering is off
[I]  27897094785              main.c:1116 | tryRenderer                    | Using Renderer: EGL
[I]  27897103907                gl.c:58   | waylandGetEGLDisplay           | Using eglGetPlatformDisplay
[I]  27897128603               egl.c:828  | egl_renderStartup              | Single buffer mode
[I]  27897129648               egl.c:855  | egl_renderStartup              | EGL     : 1.5
[I]  27897129652               egl.c:856  | egl_renderStartup              | Vendor  : AMD
[I]  27897129654               egl.c:857  | egl_renderStartup              | Renderer: AMD Radeon RX 6650 XT (radeonsi, navi23, LLVM 16.0.6, DRM 3.54, 6.6.8-arch1-1)
[I]  27897129658               egl.c:858  | egl_renderStartup              | Version : OpenGL ES 3.2 Mesa 23.3.2-arch1.2
[I]  27897129662               egl.c:859  | egl_renderStartup              | EGL APIs: OpenGL OpenGL_ES
[I]  27897129669               egl.c:930  | egl_renderStartup              | Debug messages disabled, enable with egl:debug=true
[I]  27897162266           eglutil.c:35   | swapWithDamageInit             | Using EGL_KHR_swap_buffers_with_damage
[I]  27897166275              main.c:1567 | lg_run                         | Guest Information:
[I]  27897166280              main.c:1568 | lg_run                         | Version  : B6-rc1
[I]  27897166282              main.c:1589 | lg_run                         | UUID     : d212f227-60e1-4c5d-910b-d9dfb20a249f
[I]  27897166288              main.c:1598 | lg_run                         | CPU Model: AMD Ryzen 5 5600X 6-Core Processor
[I]  27897166293              main.c:1599 | lg_run                         | CPU      : 2 sockets, 2 cores, 2 threads
[I]  27897166296              main.c:1601 | lg_run                         | Using    : DXGI Direct3D 11
[I]  27897166298              main.c:1637 | lg_run                         | OS       : Windows
[I]  27897166301              main.c:1639 | lg_run                         | OS Name  : Windows 10 Pro (Build: 22631)
[I]  27897166305              main.c:1661 | lg_run                         | Starting session

Let me know if I would be needed to provide any more information than this, the IVSHMEM driver also shows up correctly in the device manager, and the client and the host are both version B6-rc1. I am also making the connection to the vm through RDP with video set to ‘none’ if that makes any difference as well. Also here is my xml:

<domain type="kvm">
  <name>win11</name>
  <uuid>d212f227-60e1-4c5d-910b-d9dfb20a249f</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://microsoft.com/win/11"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit="KiB">8388608</memory>
  <currentMemory unit="KiB">8388608</currentMemory>
  <memoryBacking>
    <source type="memfd"/>
    <access mode="shared"/>
  </memoryBacking>
  <vcpu placement="static">10</vcpu>
  <os firmware="efi">
    <type arch="x86_64" machine="pc-q35-8.2">hvm</type>
    <firmware>
      <feature enabled="no" name="enrolled-keys"/>
      <feature enabled="yes" name="secure-boot"/>
    </firmware>
    <loader readonly="yes" secure="yes" type="pflash">/usr/share/edk2/x64/OVMF_CODE.secboot.4m.fd</loader>
    <nvram template="/usr/share/edk2/x64/OVMF_VARS.4m.fd">/var/lib/libvirt/qemu/nvram/win11_VARS.fd</nvram>
    <bootmenu enable="yes"/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv mode="custom">
      <relaxed state="on"/>
      <vapic state="on"/>
      <spinlocks state="on" retries="8191"/>
      <vendor_id state="on" value="1234567890ab"/>
    </hyperv>
    <kvm>
      <hidden state="on"/>
    </kvm>
    <smm state="on"/>
  </features>
  <cpu mode="host-passthrough" check="none" migratable="on"/>
  <clock offset="localtime">
    <timer name="rtc" tickpolicy="catchup"/>
    <timer name="pit" tickpolicy="delay"/>
    <timer name="hpet" present="no"/>
    <timer name="hypervclock" present="yes"/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled="no"/>
    <suspend-to-disk enabled="no"/>
  </pm>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type="file" device="disk">
      <driver name="qemu" type="qcow2"/>
      <source file="/home/nick/vm/win11.qcow2"/>
      <target dev="vda" bus="virtio"/>
      <boot order="2"/>
      <address type="pci" domain="0x0000" bus="0x03" slot="0x00" function="0x0"/>
    </disk>
    <disk type="file" device="cdrom">
      <driver name="qemu" type="raw"/>
      <source file="/home/nick/Downloads/Win11_23H2_English_x64v2.iso"/>
      <target dev="sdb" bus="sata"/>
      <readonly/>
      <boot order="1"/>
      <address type="drive" controller="0" bus="0" target="0" unit="1"/>
    </disk>
    <disk type="file" device="cdrom">
      <driver name="qemu" type="raw"/>
      <source file="/home/nick/Downloads/virtio-win-0.1.240.iso"/>
      <target dev="sdc" bus="sata"/>
      <readonly/>
      <boot order="3"/>
      <address type="drive" controller="0" bus="0" target="0" unit="2"/>
    </disk>
    <controller type="usb" index="0" model="qemu-xhci" ports="15">
      <address type="pci" domain="0x0000" bus="0x02" slot="0x00" function="0x0"/>
    </controller>
    <controller type="pci" index="0" model="pcie-root"/>
    <controller type="pci" index="1" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="1" port="0x10"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x0" multifunction="on"/>
    </controller>
    <controller type="pci" index="2" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="2" port="0x11"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x1"/>
    </controller>
    <controller type="pci" index="3" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="3" port="0x12"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x2"/>
    </controller>
    <controller type="pci" index="4" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="4" port="0x13"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x3"/>
    </controller>
    <controller type="pci" index="5" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="5" port="0x14"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x4"/>
    </controller>
    <controller type="pci" index="6" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="6" port="0x15"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x5"/>
    </controller>
    <controller type="pci" index="7" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="7" port="0x16"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x6"/>
    </controller>
    <controller type="pci" index="8" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="8" port="0x17"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x7"/>
    </controller>
    <controller type="pci" index="9" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="9" port="0x18"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x0" multifunction="on"/>
    </controller>
    <controller type="pci" index="10" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="10" port="0x19"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x1"/>
    </controller>
    <controller type="pci" index="11" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="11" port="0x1a"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x2"/>
    </controller>
    <controller type="pci" index="12" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="12" port="0x1b"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x3"/>
    </controller>
    <controller type="pci" index="13" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="13" port="0x1c"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x4"/>
    </controller>
    <controller type="pci" index="14" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="14" port="0x1d"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x5"/>
    </controller>
    <controller type="pci" index="15" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="15" port="0x8"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x0"/>
    </controller>
    <controller type="pci" index="16" model="pcie-to-pci-bridge">
      <model name="pcie-pci-bridge"/>
      <address type="pci" domain="0x0000" bus="0x08" slot="0x00" function="0x0"/>
    </controller>
    <controller type="sata" index="0">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x1f" function="0x2"/>
    </controller>
    <controller type="virtio-serial" index="0">
      <address type="pci" domain="0x0000" bus="0x0b" slot="0x00" function="0x0"/>
    </controller>
    <filesystem type="mount" accessmode="passthrough">
      <driver type="virtiofs"/>
      <source dir="/home/data"/>
      <target dir="/home/data"/>
      <address type="pci" domain="0x0000" bus="0x05" slot="0x00" function="0x0"/>
    </filesystem>
    <interface type="network">
      <mac address="52:54:00:98:29:22"/>
      <source network="default"/>
      <model type="e1000e"/>
      <address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
    </interface>
    <input type="mouse" bus="ps2"/>
    <input type="keyboard" bus="ps2"/>
    <input type="keyboard" bus="virtio">
      <address type="pci" domain="0x0000" bus="0x09" slot="0x00" function="0x0"/>
    </input>
    <tpm model="tpm-crb">
      <backend type="emulator" version="2.0"/>
    </tpm>
    <graphics type="spice" autoport="yes">
      <listen type="address"/>
    </graphics>
    <audio id="1" type="none"/>
    <video>
      <model type="none"/>
    </video>
    <hostdev mode="subsystem" type="pci" managed="yes">
      <source>
        <address domain="0x0000" bus="0x09" slot="0x00" function="0x0"/>
      </source>
      <rom file="/usr/share/vgabios/gtx1080ti.rom"/>
      <address type="pci" domain="0x0000" bus="0x06" slot="0x00" function="0x0"/>
    </hostdev>
    <hostdev mode="subsystem" type="pci" managed="yes">
      <source>
        <address domain="0x0000" bus="0x09" slot="0x00" function="0x1"/>
      </source>
      <rom file="/usr/share/vgabios/gtx1080ti.rom"/>
      <address type="pci" domain="0x0000" bus="0x07" slot="0x00" function="0x0"/>
    </hostdev>
    <watchdog model="itco" action="reset"/>
    <memballoon model="virtio">
      <address type="pci" domain="0x0000" bus="0x04" slot="0x00" function="0x0"/>
    </memballoon>
    <shmem name="looking-glass">
      <model type="ivshmem-plain"/>
      <size unit="M">32</size>
      <address type="pci" domain="0x0000" bus="0x10" slot="0x01" function="0x0"/>
    </shmem>
  </devices>
</domain>
  1. Please upgrade to B6. “rc” versions are release-candidates and are older and unstable than the stable release.
  2. You VM is misconfigured (you don’t have 2 sockets). You don’t have an explicit topology configuration and you are missing many enlightenments. You might want to join the VFIO discord, review their PSA and seek help if needed to set it up properly and tune it.
  3. The host application complains about being unable to “to attach to a device that was already attached to another device”. You are likely using a program such as SCREAM for audio that competes over the IVSHMEM device. Please do not use SCREAM. Even their devs recommend not to use it over IVSHMEM. B6 has native audio support using PipeWire and you should make an effort to use that.

Thank you for the quick response, sorry I forgot to mention that I was previously using the B6 version with similar results. I have switched back to that now and implemented your suggestions. My relevant updated xml is below:

  <features>
    <acpi/>
    <apic/>
    <hyperv mode="custom">
      <relaxed state="on"/>
      <vapic state="on"/>
      <spinlocks state="on" retries="8191"/>
      <vpindex state="on"/>
      <synic state="on"/>
      <stimer state="on"/>
      <reset state="on"/>
      <vendor_id state="on" value="kvm hyperv"/>
      <frequencies state="on"/>
    </hyperv>
    <kvm>
      <hidden state="on"/>
    </kvm>
    <smm state="on"/>
  </features>
  <cpu mode="host-passthrough" check="none" migratable="on">
    <topology sockets="2" dies="1" cores="6" threads="1"/>
  </cpu>

I am still getting the same issue of nothing happening when I try to connect the client to the windows host. Any suggestions?

Oh, also I am using pipewire and don’t have SCREAM installed, so not sure what the error on the host would be about. It shouldn’t be preventing me from viewing the connection though would it?

Edit: the error about the second device trying to connect stopped after a reboot, not sure what tweak exactly fixed that. Still same issue of no display on connection though.

Edit 2: Ok, so it was a really simple issue… I didn’t have the gpu that was passed through connected to my monitor… Even then the screen is still purple until I wait a couple seconds, click on the screen, and type in my password, all while the screen is still purple. Only then it launches into the windows vm, is this expected? Or should I see my sign in screen? Everything else seems to be working as expected though.

Your VM is still misconfigured:
<topology sockets="2" dies="1" cores="6" threads="1"/>
You do not have two sockets, and you should enable the topoext feature that is especially important in AMD CPUs.

Your XML audio section does not indicate that:
<audio id="1" type="none"/>
This will not work with LG native audio support for PipeWire.

You should see your sign-in screen. Make sure to run the host application as a service. Do not start it manually. It requires specific permissions to display prompts and the login screen that can only be used when running as service. When you install the host application package, it sets and starts the service for you, so you need not do anything there.