31892118ed | 3 years ago | |
---|---|---|
README.md | 3 years ago | |
TROUBLESHOOTING.md | 3 years ago |
README.md
Table Of Contents
- IOMMU Setup
- Installing Packages
- Enabling Services
- Guest Setup
- Attching PCI Devices
- Libvirt Hooks
- Keyboard/Mouse Passthrough
- Video Card Virtualisation Detection
- Audio Passthrough
- GPU vBIOS Patching
- TROUBLESHOOTING
Enable & Verify IOMMU
Set the kernel paramater depending on your CPU.
For GRUB user, edit grub configuration.
/etc/default/grub |
---|
GRUB_CMDLINE_LINUX_DEFAULT="... intel_iommu=on iommu=pt ..." |
OR |
GRUB_CMDLINE_LINUX_DEFAULT="... amd_iommu=on iommu=pt ..." |
Generate grub.cfg
grub-mkconfig -o /boot/grub/grub.cfg
Reboot your system for the changes to take effect.
To verify IOMMU, run the following command, which should return result.
dmesg | grep 'IOMMU enabled'
Install required tools
Gentoo Linux
emerge -av qemu virt-manager libvirt ebtables dnsmasq
Arch Linux
pacman -S qemu libvirt edk2-ovmf virt-manager dnsmasq ebtables
Fedora
dnf install @virtualization
Ubuntu
apt install libvirt-bin bridge-utils virt-manager qemu-kvm ovmf
Enable required services
SystemD
systemctl enable --now libvirtd
OpenRC
rc-update add libvirtd default
rc-service libvirtd start
Sometimes, you might need to start default network manually.
virsh net-start default
virsh net-autostart default
Setup Guest OS
NOTE: You should replace win10 with your VM's name where applicable
You should add your user to libvirt group to be able to run VM without root. And, input and kvm group for passing input devices.
usermod -aG kvm,input,libvirt username
Download virtio driver.
Launch virt-manager and create a new virtual machine. Select Customize before install on Final Step.
In Overview section, set Chipset to Q35, and Firmware to UEFI
In CPUs section, set CPU model to host-passthrough, and CPU Topology to whatever fits your system.
For SATA disk of VM, set Disk Bus to virtio.
In NIC section, set Device Model to virtio
Add Hardware > CDROM: virtio-win.iso
Now, Begin Installation. Windows can't detect the virtio disk, so you need to Load Driver and select virtio-iso/amd64/win10 when prompted.
After successful installation of Windows, install virtio drivers from virtio CDROM.
Attaching PCI devices
Remove Channel Spice, Display Spice, Video QXL, Sound ich* and other unnecessary devices.
Now, click on Add Hardware, select PCI Devices and add the PCI Host devices for your GPU's VGA and HDMI Audio.
Libvirt Hooks
Libvirt hooks automate the process of running specific tasks during VM state change.
More info at: PassthroughPost
Create Libvirt Hook
mkdir /etc/libvirt/hooks
touch /etc/libvirt/hooks/qemu
chmod +x /etc/libvirt/hooks/qemu
/etc/libvirt/hooks/qemu |
---|
|
Create Start Script
mkdir -p /etc/libvirt/hooks/qemu.d/win10/prepare/begin
touch /etc/libvirt/hooks/qemu.d/win10/prepare/begin/start.sh
chmod +x /etc/libvirt/hooks/qemu.d/win10/prepare/begin/start.sh
/etc/libvirt/hooks/qemu.d/win10/prepare/begin/start.sh |
---|
|
Create Stop Script
mkdir -p /etc/libvirt/hooks/qemu.d/win10/release/end
touch /etc/libvirt/hooks/qemu.d/win10/release/end/stop.sh
chmod +x /etc/libvirt/hooks/qemu.d/win10/release/end/stop.sh
/etc/libvirt/hooks/qemu.d/win10/release/end/stop.sh |
---|
|
Keyboard/Mouse Passthrough
Modify libvirt configuration of your VM. Change first line to:
virsh edit win10 |
---|
|
Find your keyboard and mouse devices in /dev/input/by-id. You'd generally use the devices ending with event-kbd and event-mouse. And the devices in your configuration right before closing </domain>
tag.
Replace MOUSE_NAME and KEYBOARD_NAME with your device id.
virsh edit win10 |
---|
|
You need to include these devices in your qemu config.
/etc/libvirt/qemu.conf |
---|
|
Also, switch from PS/2 devices to virtio devices. Add the devices inside <devices>
block
virsh edit win10 |
---|
|
Audio Passthrough
VM's audio can be routed to the host. You need Pulseaudio. It's hit or miss.
You can also use Scream instead of Pulseaudio.
Modify the libvirt configuration of your VM.
virsh edit win10 |
---|
|
Video card driver virtualisation detection
Video Card drivers refuse to run in Virtual Machine, so you need to spoof Hyper-V Vendor ID.
virsh edit win10 |
---|
|
NVIDIA guest drivers also require hiding the KVM CPU leaf:
virsh edit win10 |
---|
|
vBIOS Patching
NOTE: vBIOS patching is not patching directly into the hardware. You only patch the dumped ROM file.
While most of the GPU can be passed with stock vBIOS, some GPU requires vBIOS patching depending on your host distro.
In order to patch vBIOS, you need to first dump the GPU vBIOS from your system.
If you have Windows installed, you can use GPU-Z to dump vBIOS.
To dump vBIOS on Linux, you can use following command (replace PCI id with yours):
If it doesn't work on your distro, you can try using live cd.
echo 1 > /sys/bus/pci/devices/0000:01:00.0/rom
cat /sys/bus/pci/devices/0000:01:00.0/rom > path/to/dump/vbios.rom
echo 0 > /sys/bus/pci/devices/0000:01:00.0/rom
To patch vBIOS, you need to use Hex Editor (eg., Okteta) and trim unnecessary header.
For NVIDIA GPU, using hex editor, search string “VIDEO”, and remove everything before HEX value 55.
For other GPU, I have no idea.
To use patched vBIOS, edit VM's configuration to include patched vBIOS inside hostdev block of VGA
virsh edit win10 |
---|
|
See Also
Single GPU Passthrough by joeknock90
Single GPU Passthrough by YuriAlek
ArchLinux PCI Passthrough
Gentoo GPU Passthrough