diff --git a/README.md b/README.md new file mode 100644 index 0000000..9339f5d --- /dev/null +++ b/README.md @@ -0,0 +1,248 @@ +## Automated Setup +#### ** TODO : NOT SURE ** + +## Manual Setup +
+ Enable IOMMU + + ```sh + sudo nano /etc/default/grub + ``` + + Append iommu=pt, and intel_iommu=on or amd_iommu=on kernel options to GRUB_CMDLINE_LINUX_DEFAULT for your CPU. + Then, update grub configuration. + + ```sh + sudo grub-mkconfig -o /boot/grub/grub.cfg + ``` +
+ Verify IOMMU + + After setting kernel parameter on grub config, reboot your system and verify IOMMU is enabled. + + ```sh + dmesg | grep 'IOMMU enabled' + ``` +
+
+ +
+ Install required tools + + ```sh + sudo pacman -S qemu libvirt edk2-ovmf virt-manager dnsmasq ebtables iptables + ``` +
+ +
+ Enable services + Enable libvirtd service and start default network. + + ```sh + sudo systemctl enable --now libvirtd + sudo virsh net-start default + sudo virsh net-autostart default + ``` +
+ +
+ Setup Guest OS + + Download [virtio](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso) driver. + + Launch virt-manager and create new virtual machine. Check Customize before install on final step. + + Overview > Chipset: Q35, Firmware: UEFI + CPUs > CPU model: host-passthrough, CPU topology: Best for your machine :) + SATA Disk > Disk bus: virtio + NIC > Device model: virtio + Add Hardware > CDROM: virtio-win.iso + + Begin Installation and install Windows.. Windows can't detect virtio devices, so you need to Load Driver from virtio-disk/amd64/win10 when prompted. + + After successful installation, install virtio-drivers from virtio CDROM. +
+ +
+ Attach PCI Devices + Remove Tablet, Spice Channel, Video XQL and other applicable devices. + + Add Hardware > PCI Devices: GPU and HDMI audio +
+ +
+ NVIDIA GPU + Nvidia GPU vBIOS requires patching to work. Though, some NVIDIA GPU works without patching. + +
+ Dump GPU vBIOS + + Windows > Use [GPU-Z](https://www.techpowerup.com/gpuz/) + Linux > Try following but doesn't seem to work: + + ```sh + su + echo 1 > /sys/bus/pci/devices/0000:01:00.0/rom + cat /sys/bus/pci/devices/0000:01:00.0/rom > vbios.rom + echo 0 > /sys/bus/pci/devices/0000:01:00.0/rom + ``` + + Or, you can download vBIOS from [TechPowerUp](https://www.techpowerup.com/vgabios/), which might (not) be already patched. +
+ +
+ Patching vBIOS + Use Hex Editor and search for string VIDEO, and remove everything before char U, i.e. HEX value 55. +
+ +
+ Using Patched vBIOS + + ```sh + sudo virsh edit win10 + ``` + Search for hostdev. Add + ```xml + + ``` + before + ```xml +
+ ``` +
+
+ +
+ Libvirt Hooks + Libvirt hooks automate the process of running specific tasks during VM state change. + + More info at: [PassthroughPost](https://passthroughpo.st/simple-per-vm-libvirt-hooks-with-the-vfio-tools-hook-helper/) + +
+ Create Libvirt hook + + ```sh + sudo mkdir /etc/libvirt/hooks + sudo touch /etc/libvirt/hooks/qemu + sudo chmod +x /etc/libvirt/hooks/qemu + ``` + + /etc/libvirt/hooks/qemu | +---------- | + ```sh + #!/bin/bash + + GUEST_NAME="$1" + HOOK_NAME="$2" + STATE_NAME="$3" + MISC="${@:4}" + + BASEDIR="$(dirname $0)" + + HOOKPATH="$BASEDIR/qemu.d/$GUEST_NAME/$HOOK_NAME/$STATE_NAME" + set -e # If a script exits with an error, we should as well. + + if [ -f "$HOOKPATH" ]; then + eval \""$HOOKPATH"\" "$@" + elif [ -d "$HOOKPATH" ]; then + while read file; do + eval \""$file"\" "$@" + done <<< "$(find -L "$HOOKPATH" -maxdepth 1 -type f -executable -print;)" + fi + ``` + + Restart libvirtd + ```sh + sudo systemctl restart libvirtd + ``` +
+ +
+ Start Script + + ```sh + sudo mkdir -p /etc/libvirt/hooks/qemu.d/win10/prepare/begin + sudo touch /etc/libvirt/hooks/qemu.d/win10/prepare/begin/start.sh + sudo chmod +x /etc/libvirt/hooks/qemu.d/win10/prepare/begin/start.sh + ``` + + /etc/libvirt/hooks/qemu.d/win10/prepare/begin/start.sh | + -------------- | + ```sh + #!/bin/bash + set -x + + # Stop display manager + systemctl stop display-manager + + # Unbind EFI Framebuffer + echo efi-framebuffer.0 > /sys/bus/platform/drivers/efi-framebuffer/unbind + + # Unload NVIDIA kernel modules + modprobe -r nvidia_drm nvidia_modeset nvidia_uvm nvidia + + # Unload AMD kernel module + # modprobe -r amdgpu + + # Detach GPU devices from host + # Use your GPU and HDMI Audio PCI host device + virsh nodedev-detach pci_0000_01_00_0 + virsh nodedev-detach pci_0000_01_00_1 + + # Load vfio module + modprobe vfio-pci + ``` +
+ +
+ +Stop Script + + ```sh + sudo mkdir -p /etc/libvirt/hooks/qemu.d/win10/release/end + sudo touch /etc/libvirt/hooks/qemu.d/win10/release/end/stop.sh + sudo chmod +x /etc/libvirt/hooks/qemu.d/win10/release/end/stop.sh +``` + +/etc/libvirt/hooks/qemu.d/win10/release/end/stop.sh | +---------- | + ```sh + #!/bin/bash + set -x + + # Unload vfio module + modprobe -r vfio-pci + + # Attach GPU devices to host + # Use your GPU and HDMI Audio PCI host device + virsh nodedev-reattach pci_0000_01_00_0 + virsh nodedev-reattach pci_0000_01_00_1 + + # Rebind framebuffer to host + echo "efi-framebuffer.0" > /sys/bus/platform/drivers/efi-framebuffer/bind + + # Load NVIDIA kernel modules + modprobe nvidia_drm + modprobe nvidia_modeset + modprobe nvidia_uvm + modprobe nvidia + + # Load AMD kernel module + # modprobe amdgpu + + # Restart Display Manager + systemctl start display-manager + ``` +
+
+ +[Video card driver virtualisation detection](https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF#Video_card_driver_virtualisation_detection) +[Keyboard/Mouse Passthrough](https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF#Passing_keyboard/mouse_via_Evdev) +[Audio Passthrough](https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF#Passing_VM_audio_to_host_via_PulseAudio) +[Troubleshooting](https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF#Troubleshooting) + +See Also +> [Single GPU Passthrough by joeknock90](https://github.com/joeknock90/Single-GPU-Passthrough) +> [Single GPU Passthrough by YuriAlek](https://gitlab.com/YuriAlek/vfio) +> [ArchLinux PCI Passthrough](https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF) +> [Gentoo GPU Passthrough](https://wiki.gentoo.org/wiki/GPU_passthrough_with_libvirt_qemu_kvm) \ No newline at end of file