Skip to content

Conversation

@slawomir-andreasik
Copy link

@slawomir-andreasik slawomir-andreasik commented Nov 19, 2025

GPU passthrough and Windows VM with Looking Glass

TL;DR: Run Windows 11 with dedicated GPU passthrough, Looking Glass for low-latency gaming and hardware spoofing for anti-cheat compatibility. Tested with Fortnite and Counter-Strike 2.

Demo: Omarchy: GPU passthrough + Windows 11 VM installation - Complete setup, gaming with Fortnite and Counter-Strike 2, benchmarks and switching GPU back to host for LM Studio.

See discussion thread for community testing and feedback: #3455


What's New

This PR adds GPU passthrough automation, Looking Glass integration and Windows VM enhancements:

GPU Passthrough Tools (omarchy-gpu-passthrough)

Automated GPU passthrough with mode switching between VM and host usage.

Commands:

omarchy-gpu-passthrough setup              # One-time setup wizard
omarchy-gpu-passthrough setup --uninstall  # Remove configuration

omarchy-gpu-passthrough mode vm            # Bind GPU for VM passthrough
omarchy-gpu-passthrough mode host          # Return GPU to host
omarchy-gpu-passthrough mode none          # Unbind GPU (power saving)

omarchy-gpu-passthrough info status        # Current system status
omarchy-gpu-passthrough info detect        # Hardware compatibility check
omarchy-gpu-passthrough info verify        # Verify configuration
omarchy-gpu-passthrough info report        # Hardware config
omarchy-gpu-passthrough info diagnose      # Full diagnostic report

What it does:

  • Interactive setup wizard with GPU detection
  • Automatic driver binding (vfio-pci <-> nvidia/amdgpu)
  • IOMMU and kernel parameter configuration
  • Hyprland iGPU setup (keeps desktop on integrated GPU)
  • Diagnostics and safety checks
  • Desktop icons for easy access

Files added:

  • omarchy-gpu-passthrough - Main dispatcher
  • omarchy-gpu-passthrough-bind - Mode control
  • omarchy-gpu-passthrough-info - Diagnostics
  • omarchy-gpu-passthrough-setup - Setup wizard
  • omarchy-gpu-passthrough-utils - Shared library

Looking Glass Integration (omarchy-looking-glass-install, omarchy-looking-glass-launch)

Low-latency VM display using shared memory (IVSHMEM). Near-native gaming performance.

Commands:

omarchy-looking-glass-install    # Installation
omarchy-looking-glass-launch     # Launch client

What it does:

  • Installation with dependency management
  • IVSHMEM device setup
  • Permission management (kvm group)
  • Integration with Windows VM

Note: Default escape key is Scroll Lock. If your keyboard lacks this key, configure a different key in ~/.config/looking-glass/client.ini before launching (see Looking Glass documentation for key names).

Files added:

  • omarchy-looking-glass-install - Installation script
  • omarchy-looking-glass-launch - Client launcher

Windows VM Management (omarchy-windows-vm)

Enhanced with GPU passthrough, Looking Glass support and hardware spoofing.

New commands:

omarchy-windows-vm install          # Enhanced: GPU passthrough detection, Looking Glass integration
omarchy-windows-vm launch --lg      # New: Connect via Looking Glass

Existing commands:

omarchy-windows-vm launch           # Interactive connection menu (RDP, LG, VNC)
omarchy-windows-vm launch -k        # Keep VM running after disconnect (existing)
omarchy-windows-vm stop             # Shutdown VM
omarchy-windows-vm status           # Check VM status
omarchy-windows-vm show-compose     # Display docker-compose.yml config (testing/debugging)
omarchy-windows-vm remove           # Remove VM

What's new:

  • GPU passthrough detection and automatic configuration
  • Looking Glass integration with automatic installation prompt
  • SMBIOS spoofing (auto-detected from host hardware)
  • Hardware spoofing for anti-cheat compatibility
  • Installation wizard with progress tracking
  • Quick reinstall vs Fresh reinstall options
  • Desktop icons: "Windows" (RDP) and "Windows [Looking Glass]" (LG)
  • Interactive connection menu with multiple options
  • Progress display and ETA
  • show-compose command for testing docker-compose generation

Installation options:

  • Fresh install: Complete Windows reinstall (removes VM disk)
  • Quick reinstall: Reconfigure docker-compose and GPU settings (keeps VM disk)
  • Shared folder: ~/Windows is never removed (preserved across reinstalls)

Both installation and uninstall are idempotent (safe to run multiple times).

Files modified:

  • omarchy-windows-vm

Automatic SPICE Support

Looking Glass requires SPICE for keyboard/mouse input. Upstream dockurr/windows rejected SPICE support (PR #1567) due to image size concerns.

Solution: omarchy-windows-vm automatically builds a custom image with SPICE when needed:

  • Detects if local image has SPICE support (via docker history)
  • Auto-builds if missing (~5-10 min, first install only)
  • Zero user intervention required

Note: See Known Limitations section for previous manual workaround (now obsolete).


Hardware Requirements

BIOS Settings (one-time):

  • Enable CPU Virtualization (AMD-V/SVM or Intel VT-x)
  • Enable IOMMU (AMD-Vi or Intel VT-d)
  • Set Primary Display to IGD (integrated graphics)
  • Connect monitor to motherboard ports (not GPU)

Hardware:

  • 2 GPUs required: 1 dedicated + 1 integrated
  • Dedicated GPU for VM passthrough
  • Integrated GPU for host desktop (Hyprland)

Looking Glass Display Requirement:

Looking Glass needs a display connected to your dedicated GPU. Options:

  1. Second monitor on GPU
  2. Same monitor with 2 cables (MOBO + GPU) - no input switching needed
  3. HDMI/DP dummy plug (~$5) - emulates display without real cable

Without display on GPU, only slow RDP will work.

Tested Hardware:

# omarchy-gpu-passthrough info report

=== Hardware Configuration Report ===

SYSTEM
  CPU: AMD Ryzen 7 8700G w/ Radeon 780M Graphics (16 cores)
  Kernel: 6.17.8-arch1-1
  OS: Arch Linux
  RAM: 58 GB

  Omarchy:
    Version: 3.1.7
    Branch: feat/omarchy-gpu-passthrough
    Bootloader: Limine

MOTHERBOARD
  Vendor: Micro-Star International Co., Ltd.
  Model: MAG B650M MORTAR WIFI (MS-7D76)
  BIOS: A.H0

BIOS SETTINGS
  IOMMU: Enabled ✓
  AMD-Vi: Active
  IOMMU Mode: Passthrough

GPUs
  [1] NVIDIA Corporation GB205 [GeForce RTX 5070] (01:00.0)
      Type: Dedicated | Driver: vfio-pci | Mode: vm ✓ | vRAM: 16 GB

  [2] Advanced Micro Devices, Inc. [AMD/ATI] Phoenix1 (41:00.0)
      Type: Integrated | Driver: amdgpu | vRAM: 4 GB (allocated)

DISPLAY CONFIGURATION
  Primary GPU: AMD Radeon 780M Graphics (radeonsi, phoenix, LLVM 21.1.5, DRM 3.64, 6.17.8-arch1-1)
  Session: Wayland
  Compositor: Hyprland

  Monitors per GPU:
    [1] NVIDIA Corporation GB205 [GeForce RTX 5070]: N/A (bound to vfio-pci for VM)
    [2] Advanced Micro Devices, Inc. [AMD/ATI] Phoenix1: 2 monitor(s) via DP,HDMI-A

DRIVER VERSIONS
  AMD/Mesa: 4.6
  VFIO: Built-in (kernel 6.17.8-arch1-1)

GPU PASSTHROUGH STATUS
  Configured: Yes ✓
  Dynamic Binding: Enabled
  Current Mode: vm
  Ready for VM: Yes ✓

Generated: 2025-11-19 00:54:00

Tested on Omarchy versions: 3.1.7, 3.2.0, 3.2.1, 3.2.2

Known working hardware:

  • NVIDIA RTX 5070 + AMD Ryzen 8700G (iGPU) - @slawomir-andreasik
  • NVIDIA RTX 4090 + Intel i9-13900K (iGPU) - @steventsvetkov
  • NVIDIA GTX 1660 SUPER + AMD Ryzen 5 5600G (iGPU) - @Colchito12
  • NVIDIA RTX 2060 12GB + AMD Sapphire 4GB (iGPU) - @cosier (zen kernel + ACS patch for AMD 500 series)

Not tested: AMD dedicated GPUs, Intel Arc GPUs


Quick Start

Prerequisites:

  • 2 GPUs: 1 dedicated + 1 integrated
  • BIOS configured: VT-x/AMD-V enabled, IOMMU enabled, Primary Display = IGD

1. Install GPU Passthrough

# Configure BIOS (see requirements above)
omarchy-gpu-passthrough info detect    # Verify hardware compatibility
omarchy-gpu-passthrough setup          # Run setup wizard
sudo reboot                            # Apply kernel parameters

2. Verify Configuration (after reboot)

omarchy-gpu-passthrough info verify    # Check everything is configured correctly

# Optional: generate reports (helpful for troubleshooting)
omarchy-gpu-passthrough info report    # Hardware configuration summary
omarchy-gpu-passthrough info diagnose  # Full diagnostic report

If you encounter issues, please share the output of these commands in the discussion thread.

3. Install Windows VM

omarchy-windows-vm install             # Interactive wizard (~20 min)

During installation you'll be prompted to install Looking Glass. Installation is automated if you choose yes. You can also install manually with omarchy-looking-glass-install.

4. Launch Windows VM

omarchy-windows-vm launch --lg         # Looking Glass (low-latency)
# OR
omarchy-windows-vm launch              # Interactive menu (RDP, LG, VNC)

5. Switch GPU back to host (optional)

omarchy-windows-vm stop
omarchy-gpu-passthrough mode host      # Use GPU on host (CUDA, LM Studio, etc.)

Known Limitations

Experimental Status

Tested on author and community hardware configurations (see Known working hardware). Backup your system before installation.

Black Screen Risk

Can occur after first GPU passthrough setup (first boot with blacklisted GPU). System blacklists dedicated GPU for VM passthrough. If Hyprland configuration fails, desktop won't start.

Recovery:

  1. Press Ctrl+Alt+F2 to switch to TTY2
  2. Login with credentials
  3. Run: omarchy-gpu-passthrough setup (re-configure)
    OR: omarchy-gpu-passthrough setup --uninstall (remove)
  4. Reboot

Prevention: Set "Primary Display = IGD" in BIOS before setup.

Anti-Cheat Compatibility

Hardware spoofing included (SMBIOS, CPU flags).

Tested: Fortnite/EasyAntiCheat, Counter-Strike 2
Not tested: Valorant/Vanguard, BattlEye, other anti-cheat systems

Upstream Dependency SOLVED: Automatic SPICE Build

Upstream Dependency (Temporary)

Waiting for new dockurr/windows release. SPICE support fix merged to qemus/qemu (PR #978) but dockurr/windows hasn't released new version yet.

Workaround (for testing now):
bash~~ ~~git clone https://github.com/dockur/windows.git~~ ~~cd windows~~ ~~git fetch origin pull/1567/head:spice-support~~ ~~git checkout spice-support~~ ~~docker build -t dockurr/windows:latest .~~ ~~

This creates local dockurr/windows:latest image. Scripts will use this local image. Workaround won't be needed after new release.

Update: Manual workaround no longer needed. omarchy-windows-vm now automatically builds custom image with SPICE support when Looking Glass is enabled. Build happens transparently during installation. See "Automatic SPICE Support" in What's New section.

Other Limitations

  • GPU compatibility: Tested with NVIDIA (RTX 5070, RTX 4090, RTX 2060, GTX 1660 SUPER) + AMD/Intel iGPU
  • AMD 500 series motherboards may require zen kernel + ACS patch for proper IOMMU groups
  • Uninstall: omarchy-gpu-passthrough setup --uninstall

Testing This PR

Want to test GPU passthrough before it's merged? Follow these steps:

# 1. Fetch PR branch
git -C "$OMARCHY_PATH" fetch origin pull/3454/head
git -C "$OMARCHY_PATH" checkout -B feat/omarchy-gpu-passthrough FETCH_HEAD

# 2. Switch to test branch
omarchy-update-branch feat/omarchy-gpu-passthrough

# 3. Test features
omarchy-gpu-passthrough info detect    # Check hardware compatibility
omarchy-gpu-passthrough setup          # Run setup (backs up config files)
sudo reboot                            # Apply kernel parameters

# 4. Verify configuration (after reboot)
omarchy-gpu-passthrough info verify    # Check everything is configured correctly

# Optional: generate reports (helpful for troubleshooting)
omarchy-gpu-passthrough info report    # Hardware configuration summary
omarchy-gpu-passthrough info diagnose  # Full diagnostic report

# 5. Install Windows VM
omarchy-windows-vm install             # Install Windows VM with Looking Glass

# 6. Return to master
omarchy-update-branch master
git -C "$OMARCHY_PATH" branch -D feat/omarchy-gpu-passthrough

Notes:

  • omarchy-update-branch automatically creates snapshot and updates system
  • Setup creates backups in /var/backups/omarchy-gpu-passthrough/
  • System modifications can be reverted with omarchy-gpu-passthrough setup --uninstall
  • Menu update (SUPER+SPACE) won't work on PR branch - this is normal, just fetch once and test

Related Discussion

This addresses the feature request from #3307

Community testing and feedback welcome in the discussion thread.


Credits

Thanks to @sspaeti for the original omarchy-windows-vm implementation and @dhh for Omarchy and inspiration.

@sspaeti
Copy link
Contributor

sspaeti commented Nov 19, 2025

Wow, this seems amazing! Thanks for making this! 🙌 The black-screen risk is real. I had to turn off GPU acceleration in Brave/Chromium because I got black screens during Google Meet meetings regularly. I assume this could be related (don't have to be). Do you think this is a one-off, or that could happen again? Or is that a misconfiguration or a bug in the latest packages? (I didn't have that before, so when I troubleshooted, I thought it could be because of a Mesa or similar update, but I'm not sure.

@slawomir-andreasik
Copy link
Author

The black screen risk I mentioned is specifically about the first boot after GPU passthrough setup - it happened to me during testing when something didn't configure correctly (kernel params or Hyprland trying to start on the wrong GPU).
I've fixed those installer bugs, but since I only tested on my hardware, there's still a chance someone with different hardware might hit it. That's why I documented the recovery steps.

Your Brave/Chromium issue sounds different.

@landsman
Copy link
Contributor

This is truly amazing. I would never have believed I would see GPU-heavy tasks like playing Counter-Strike 2 in a Windows VM running via Docker on Linux, in a home setting. Good job!

@Tenosiey
Copy link

This is just awesome, hope this gets implemented into the main branch!

@slawomir-andreasik slawomir-andreasik force-pushed the feat/omarchy-gpu-passthrough branch 5 times, most recently from 5502de0 to 9138bf1 Compare November 24, 2025 22:28
@landsman
Copy link
Contributor

If you want to merge this it would make sense to point this to dev branch.

@hngrdev
Copy link

hngrdev commented Nov 25, 2025

Hi!
Pretty awesome stuff
Tried it on my laptop, but the vm fails because the IOMMU group isn't correct: I have 5 devices on my setup (2018 MSI GS65 stealth), which runs on intel and nvidia, and the script seems to assume 2 of them
Will try fixing it and suggesting a few changes

@slawomir-andreasik slawomir-andreasik force-pushed the feat/omarchy-gpu-passthrough branch from 9138bf1 to d8680b5 Compare November 25, 2025 19:42
@slawomir-andreasik slawomir-andreasik changed the base branch from master to dev November 25, 2025 19:43
@slawomir-andreasik
Copy link
Author

If you want to merge this it would make sense to point this to dev branch.

Done

Hi! Pretty awesome stuff Tried it on my laptop, but the vm fails because the IOMMU group isn't correct: I have 5 devices on my setup (2018 MSI GS65 stealth), which runs on intel and nvidia, and the script seems to assume 2 of them Will try fixing it and suggesting a few changes

Hey @hngrdev, give it another shot - should handle more IOMMU configurations now. If it still doesn't work, drop a diagnostic report here.


Recent changes:

  • Rebased to v3.2.0
  • Automatic SPICE build - Looking Glass needs it for keyboard/mouse, but qemus/qemu reverted it due to image size, so omarchy-windows-vm builds a custom image when needed
  • Fixed SPICE socket permissions and group membership
  • UX improvements - cleaner log output, better installation flow

Want to help test GPU passthrough?

# Fetch PR branch
git -C "$OMARCHY_PATH" fetch origin pull/3454/head:feat/omarchy-gpu-passthrough

# Switch to test branch
omarchy-update-branch feat/omarchy-gpu-passthrough

# Test it out
omarchy-gpu-passthrough info detect    # Check hardware compatibility
omarchy-gpu-passthrough setup          # Run setup
omarchy-windows-vm install             # Install Windows VM with Looking Glass

Any feedback welcome.

@slawomir-andreasik slawomir-andreasik force-pushed the feat/omarchy-gpu-passthrough branch from d8680b5 to 66983ab Compare November 25, 2025 22:13
@catapultam-habeo
Copy link

It would be useful to be able to point this at a raw block device instead of a virtual volume. Use case would be having a dual boot that could be bootable or could be loaded as VM.

@slawomir-andreasik slawomir-andreasik force-pushed the feat/omarchy-gpu-passthrough branch from 1566bff to 350d8d8 Compare November 26, 2025 16:27
@slawomir-andreasik
Copy link
Author

minor fixes and rebase from v3.2.1

@slawomir-andreasik slawomir-andreasik force-pushed the feat/omarchy-gpu-passthrough branch from 350d8d8 to 614564b Compare November 26, 2025 17:57
@slawomir-andreasik
Copy link
Author

It would be useful to be able to point this at a raw block device instead of a virtual volume. Use case would be having a dual boot that could be bootable or could be loaded as VM.

Interesting idea. Should be possible since QEMU supports raw block devices. Main challenge would be configuring docker-compose correctly to prevent accidental overwrites - you'd want the disk passed through as read-write but with installation disabled. Would need to detect existing OS and skip the Windows installation flow entirely.

@hngrdev
Copy link

hngrdev commented Nov 29, 2025

Gave it another try on my laptop, didn't work, here are the results:
docker logs give me:
ERROR: qemu-system-x86_64: -device vfio-pci,host=0000:00:01.0: vfio 0000:00:01.0 group 2 is not viable
Please ensure all devices within the iommu_group are bound to their vfio bus driver

0000:00:01.0 is the PCI bridge, and it seems like it can't be bound to vfio-pci, but can be bound to pci-stub
0000:01:00.2 is the USB controller and keeps getting bound to xhci_hcd for some reason
Once I bind my stuff manually, it seems to work
Oh, in my case, the bridge shouldn't be passed to the vm it seems, so I don't even know if it should be bound to vfio-pci or pci-stub

if [ ! -d "/sys/kernel/iommu_groups/2/devices/" ]; then
echo "IOMMU Group 2 does not exist."
exit 1
fi

for device in /sys/kernel/iommu_groups/2/devices/*; do
pci_addr=$(basename "$device")

driver=$(lspci -k -s "$pci_addr" | grep -i "Kernel driver in use" | awk -F': ' '{print $2}')

echo "Device: $pci_addr"
if [ -n "$driver" ]; then
echo " Driver: $driver"
else
echo " No driver assigned."
fi
echo ""
done
Device: 0000:00:01.0
Driver: pcieport

Device: 0000:01:00.0
Driver: vfio-pci

Device: 0000:01:00.1
Driver: vfio-pci

Device: 0000:01:00.2
Driver: xhci_hcd

Device: 0000:01:00.3
Driver: vfio-pci

GPU Passthrough Diagnostics

ℹ️ Collecting system information...
[GPU PASSTHROUGH DIAGNOSTICS REPORT]
Generated: Sat Nov 29 04:01:37 PM CET 2025
Hostname: laptop

[SYSTEM INFORMATION]

[CPU]
Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
CPU Vendor: intel

[Operating System]
Kernel: 6.17.9-arch1-1

[Bootloader]
Limine

[Motherboard]
Vendor: Micro-Star International Co., Ltd.
Model: MS-16Q4
BIOS: E16Q4IMS.107

[Display Session]
Session Type: wayland
Wayland Display: wayland-1
Desktop: Hyprland

[GPU INFORMATION]

[GPU 1: Intel Corporation CoffeeLake-H GT2 [UHD Graphics 630]]
PCI Address: 00:02.0
Vendor:Device ID: 8086:3e9b
Type: integrated
Current Driver: i915

DRM Card: card1
Display Connectors:
card1-DP-1: disconnected
card1-eDP-1: connected
card1-HDMI-A-1: disconnected

[GPU 2: NVIDIA Corporation TU106M [GeForce RTX 2060 Mobile]]
PCI Address: 01:00.0
Vendor:Device ID: 10de:1f11
Type: dedicated
Current Driver: vfio-pci
Audio Device: 01:00.1

[IOMMU INFORMATION]

IOMMU Status: Enabled
IOMMU Devices: 2

Active VFIO IOMMU Groups: 1

[GPU 1: Intel Corporation CoffeeLake-H GT2 [UHD Graphics 630]]
PCI Address: 00:02.0
IOMMU Group: 0
Devices in group (1):
00:02.0 VGA compatible controller [0300]: Intel Corporation CoffeeLake-H GT2 [UHD Graphics 630] [8086:3e9b]

[GPU 2: NVIDIA Corporation TU106M [GeForce RTX 2060 Mobile]]
PCI Address: 01:00.0
IOMMU Group: 2
Devices in group (5):
00:01.0 PCI bridge [0604]: Intel Corporation 6th-10th Gen Core Processor PCIe Controller (x16) [8086:1901] (rev 07)
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU106M [GeForce RTX 2060 Mobile] [10de:1f11] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation TU106 High Definition Audio Controller [10de:10f9] (rev a1)
01:00.2 USB controller [0c03]: NVIDIA Corporation TU106 USB 3.1 Host Controller [10de:1ada] (rev a1)
01:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU106 USB Type-C UCSI Controller [10de:1adb] (rev a1)

[KERNEL CONFIGURATION]

[Kernel Command Line]
intel_iommu=on iommu=pt quiet splash cryptdevice=PARTUUID=07ed398a-2891-49ca-9f07-fb5277651248:root root=/dev/mapper/root zswap.enabled=0 rootflags=subvol=@ rw rootfstype=btrfs

[IOMMU Parameters]
intel_iommu=on
Status: ✓ Enabled

iommu=pt: ✓ Enabled

[LOADED KERNEL MODULES]

[VFIO Modules]
vfio_pci 20480 0
vfio_pci_core 98304 1 vfio_pci
vfio_iommu_type1 45056 0
vfio 77824 4 vfio_pci_core,vfio_iommu_type1,vfio_pci

[NVIDIA Modules]
None loaded

[AMD GPU Modules]
None loaded

[DRIVER VERSIONS]

[NVIDIA Driver]
Not loaded

[AMD GPU Driver]
Not loaded

[VFIO Driver]
Version: Built-in (kernel 6.17.9-arch1-1)

[GPU PASSTHROUGH CONFIGURATION]

[GPU Configuration: /etc/omarchy-gpu-passthrough.conf]

GPU Passthrough Config - Generated 2025-11-29

GPU_PCI_ADDR="01:00.0"
GPU_VENDOR_ID="10de"
GPU_DEVICE_ID="1f11"
GPU_NAME="NVIDIA Corporation TU106M [GeForce RTX 2060 Mobile]"
GPU_DRIVER_ORIGINAL="nvidia"
GPU_AUDIO_PCI="01:00.1"
GPU_AUDIO_IDS="10de:10f9"
GPU_IOMMU_GROUP="unknown"
GPU_IOMMU_DEVICES=""

[Limine Configuration: /etc/default/limine]
(Showing KERNEL_CMDLINE entries only)
KERNEL_CMDLINE[default]="cryptdevice=PARTUUID=07ed398a-2891-49ca-9f07-fb5277651248:root root=/dev/mapper/root zswap.enabled=0 rootflags=subvol=@ rw rootfstype=btrfs"
KERNEL_CMDLINE[default]+="quiet splash"
KERNEL_CMDLINE[default]+=" intel_iommu=on iommu=pt"

[VFIO Configuration: /etc/modprobe.d/vfio.conf]

VFIO GPU Passthrough - Generated 2025-11-29

options vfio-pci disable_vga=1
options vfio-pci disable_idle_d3=1

[Driver Blacklist: /etc/modprobe.d/blacklist-gpu-passthrough.conf]

GPU Passthrough - Prevent NVIDIA auto-load at boot

install nvidia /bin/false

[System Environment (/etc/environment)]
(GPU-related variables only)
No GPU-related variables found

[PROCESSES USING GPU]

[NVIDIA GPU Processes]
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

[DRI Device Handles]
/dev/dri/card1: user 1407 F.... Hyprland
user 1495 F.... Xwayland
/dev/dri/renderD128: user 1407 F.... Hyprland
user 1495 F.... Xwayland
user 1539 F.... walker
user 1630 F.... xdg-desktop-por
user 1828 F.... chromium
user 1913 F.... chromium
user 2150 F.... alacritty
user 34020 F.... alacritty
user 34373 F.... alacritty

[NVIDIA Device Handles]
Specified filename /dev/nvidia* does not exist.
No NVIDIA devices or no processes

[RECENT GPU PASSTHROUGH LOGS]

[Last 50 lines of /var/log/omarchy-gpu-passthrough/gpu-passthrough.log]
[2025-11-29 15:51:00] [INFO] === SETUP WIZARD START ===
[2025-11-29 15:51:00] [INFO] User: user
[2025-11-29 15:51:00] [INFO] System: 6.17.9-arch1-1
[2025-11-29 15:51:04] [INFO] User user added to kvm group
[2025-11-29 15:51:04] [INFO] User user added to video group
[2025-11-29 15:51:21] [INFO] Monitor setup: 1 iGPU, 0 dGPU
[2025-11-29 15:51:24] [INFO] User confirmed monitor setup
[2025-11-29 15:51:24] [INFO] User selected GPU for passthrough: NVIDIA Corporation TU106M [GeForce RTX 2060 Mobile] (01:00.0)
[2025-11-29 15:51:25] [INFO] GPU for passthrough: NVIDIA Corporation TU106M [GeForce RTX 2060 Mobile] (01:00.0) - 10de:1f11
[2025-11-29 15:51:25] [INFO] Host GPU (iGPU): Intel Corporation CoffeeLake-H GT2 [UHD Graphics 630] (00:02.0)
[2025-11-29 15:51:26] [INFO] Snapshot: GPU Passthrough: NVIDIA Corporation TU106M [GeForce RTX 2060 Mobile]
[2025-11-29 15:51:26] [INFO] Backup snapshot created: /var/backups/omarchy-gpu-passthrough/setup-20251129-155126 (4 files)
[2025-11-29 15:51:27] [INFO] Configuring system environment for iGPU: 00:02.0
[2025-11-29 15:51:27] [INFO] Configuring Hyprland for iGPU: 00:02.0
[2025-11-29 15:51:27] [INFO] Rebuilding initramfs and UKI...
[2025-11-29 15:51:45] [INFO] limine-mkinitcpio completed successfully
[2025-11-29 15:51:45] [INFO] === SETUP WIZARD COMPLETED SUCCESSFULLY ===
[2025-11-29 15:51:45] [INFO] GPU configured: NVIDIA Corporation TU106M [GeForce RTX 2060 Mobile] (01:00.0) - 10de:1f11
[2025-11-29 15:56:45] [INFO] === BIND OPERATION START ===
[2025-11-29 15:56:45] [INFO] GPU: NVIDIA Corporation TU106M [GeForce RTX 2060 Mobile] (01:00.0)
[2025-11-29 15:56:45] [INFO] Current driver: none
[2025-11-29 15:56:45] [INFO] GPU: NVIDIA Corporation TU106M [GeForce RTX 2060 Mobile] (01:00.0), Current: none
[2025-11-29 15:56:45] [INFO] IOMMU group contains 5 device(s): 00:01.0 01:00.0 01:00.1 01:00.2 01:00.3
[2025-11-29 15:56:45] [INFO] Bound 00:01.0 to vfio-pci
[2025-11-29 15:56:45] [INFO] Bound 01:00.0 to vfio-pci
[2025-11-29 15:56:46] [INFO] Bound 01:00.1 to vfio-pci
[2025-11-29 15:56:46] [INFO] Bound 01:00.2 to vfio-pci
[2025-11-29 15:56:46] [INFO] Bound 01:00.3 to vfio-pci
[2025-11-29 15:56:46] [SUCCESS] All IOMMU group devices bound to vfio-pci
[2025-11-29 15:56:47] [SUCCESS] === BIND SUCCESS: GPU ready for VM passthrough ===

RELEVANT BOOT MESSAGES (dmesg)

[IOMMU Messages]
[ 0.000000] Command line: intel_iommu=on iommu=pt quiet splash cryptdevice=PARTUUID=07ed398a-2891-49ca-9f07-fb5277651248:root root=/dev/mapper/root zswap.enabled=0 rootflags=subvol=@ rw rootfstype=btrfs
[ 0.060592] Kernel command line: intel_iommu=on iommu=pt quiet splash cryptdevice=PARTUUID=07ed398a-2891-49ca-9f07-fb5277651248:root root=/dev/mapper/root zswap.enabled=0 rootflags=subvol=@ rw rootfstype=btrfs
[ 0.060622] DMAR: IOMMU enabled
[ 0.141964] DMAR-IR: IOAPIC id 2 under DRHD base 0xfed91000 IOMMU 1
[ 0.496588] iommu: Default domain type: Passthrough (set via kernel command line)
[ 0.613394] pci 0000:00:02.0: Adding to iommu group 0
[ 0.613446] pci 0000:00:00.0: Adding to iommu group 1
[ 0.613470] pci 0000:00:01.0: Adding to iommu group 2
[ 0.613492] pci 0000:00:12.0: Adding to iommu group 3
[ 0.613516] pci 0000:00:14.0: Adding to iommu group 4
[ 0.613528] pci 0000:00:14.2: Adding to iommu group 4
[ 0.613542] pci 0000:00:14.3: Adding to iommu group 5
[ 0.613571] pci 0000:00:15.0: Adding to iommu group 6
[ 0.613584] pci 0000:00:15.2: Adding to iommu group 6
[ 0.613602] pci 0000:00:16.0: Adding to iommu group 7
[ 0.613627] pci 0000:00:1b.0: Adding to iommu group 8
[ 0.613654] pci 0000:00:1d.0: Adding to iommu group 9
[ 0.613678] pci 0000:00:1d.4: Adding to iommu group 10
[ 0.613711] pci 0000:00:1f.0: Adding to iommu group 11
[ 0.613726] pci 0000:00:1f.3: Adding to iommu group 11

[VFIO Messages]
[ 0.979080] VFIO - User Level meta-driver version: 0.3
[ 267.593067] vfio-pci 0000:01:00.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=none:owns=none
[ 267.626638] vfio-pci 0000:01:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=io+mem:owns=none
[ 267.641199] vfio-pci 0000:01:00.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=none:owns=none

[Boot VGA Device]
[ 0.569602] pci 0000:00:02.0: vgaarb: setting as boot VGA device

[PCI Passthrough Messages]
[ 267.593067] vfio-pci 0000:01:00.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=none:owns=none
[ 267.626638] vfio-pci 0000:01:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=io+mem:owns=none
[ 267.641199] vfio-pci 0000:01:00.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=none:owns=none

[END OF DIAGNOSTICS REPORT]

Report saved to: /tmp/omarchy-gpu-passthrough-diagnostics-20251129_160137.txt
Generated: Sat Nov 29 04:01:37 PM CET 2025

✓ Report saved: /tmp/omarchy-gpu-passthrough-diagnostics-20251129_160137.txt

Installation and launch of Looking Glass for low-latency VM display with IVSHMEM setup and permission management.
Dedicated GPU passthrough with automatic driver binding, IOMMU setup and state management. Mode switching, setup wizard and diagnostics.
GPU passthrough, Looking Glass support and hardware spoofing. Installation wizard and lifecycle management.
SPICE socket 666 → 660+kvm. Use sg kvm for group refresh.
Detects if dockurr/windows image has SPICE support and auto-builds if missing.
No manual workaround needed - transparent during installation.
Replace echo with emoji (❌, ⚠️, ✓) with msg_* functions.
Added msg_* to omarchy-looking-glass-install.
Reduces user friction during installation: consolidates sudo prompts, eliminates YAY/pacman interactive prompts, hides Docker build logs. Fixes desktop launcher bug. Adds snapshot integration for GPU passthrough.
Adds tmpfiles.d and sudoers configuration for passwordless desktop launcher operations. Reorganizes Windows VM installation: collect decisions first, show summary, confirm once, then execute. Removes exec sg kvm pattern.
@slawomir-andreasik slawomir-andreasik force-pushed the feat/omarchy-gpu-passthrough branch from 62b66fb to f17b423 Compare November 29, 2025 16:42
@slawomir-andreasik
Copy link
Author

minor doc updates and rebase from v3.2.2

@slawomir-andreasik
Copy link
Author

@hngrdev thanks for the detailed diagnostic report!

0000:00:01.0 is the PCI bridge, and it seems like it can't be bound to vfio-pci

You're right - the script shouldn't try to pass PCI bridges to the VM. They're host-side infrastructure that connects the PCIe slot to the CPU. I've pushed a fix that filters out devices with class 0604 (PCI bridge).

Could you update and try again?

git -C "$OMARCHY_PATH" fetch origin pull/3454/head:feat/omarchy-gpu-passthrough
omarchy-update-branch feat/omarchy-gpu-passthrough

# Re-run setup to regenerate config
omarchy-gpu-passthrough setup

# Remove old VM completely
omarchy-windows-vm remove
rm -rf ~/.config/windows/

# Reinstall VM with new config
omarchy-windows-vm install

If you have time, could you share (paste to https://pastebin.com if too long):

omarchy-gpu-passthrough info detect
omarchy-gpu-passthrough info report
omarchy-gpu-passthrough info diagnose

Let's move this to the discussion thread: #3455

@slawomir-andreasik slawomir-andreasik force-pushed the feat/omarchy-gpu-passthrough branch 4 times, most recently from c0bad19 to 0318217 Compare December 1, 2025 09:03
@slawomir-andreasik slawomir-andreasik force-pushed the feat/omarchy-gpu-passthrough branch from 0318217 to 8025f20 Compare December 1, 2025 09:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants