diff --git a/README.md b/README.md index 34ec771..fa93ef1 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,19 @@ ### **Enable IOMMU** -#### ***Set the kernel paramater depending on your CPU.*** -#### For GRUB user, edit grub configuration. +***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 ..."` | +| `GRUB_CMDLINE_LINUX_DEFAULT="... intel_iommu=on iommu=pt ..."` | | OR | -| `GRUB_CMDLINE_LINUX_DEFAULT="amd_iommu=on iommu=pt ..."` | -#### ***Generate grub.cfg*** +| `GRUB_CMDLINE_LINUX_DEFAULT="... amd_iommu=on iommu=pt ..."` | +***Generate grub.cfg*** ```sh grub-mkconfig -o /boot/grub/grub.cfg ``` -#### Reboot your system for the changes to take effect. +Reboot your system for the changes to take effect. ### **Verify IOMMU** -#### ***If you don't see any output when running following command, IOMMU is not functioning.*** +***If you don't see any output when running following command, IOMMU is not functioning.*** ```sh dmesg | grep 'IOMMU enabled' ``` @@ -61,34 +61,47 @@ dmesg | grep 'IOMMU enabled' ``` -#### Sometimes, you might need to start default network manually. +Sometimes, you might need to start default network manually. ```sh virsh net-start default virsh net-autostart default ``` ### **Setup Guest OS** -### ***NOTE: You should replace win10 with your VM's name where applicable*** -#### ***Download [virtio](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso) 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. +***NOTE: You should replace win10 with your VM's name where applicable*** \ +Download [virtio](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso) 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 XQL, 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 -#### Some GPU vBIOS needs to be patched for UEFI Support. ------ TODO: vBIOS patching ------ -#### To use patched vBIOS, edit VM's configuration -```sh -virsh edit win10 -``` -```xml +Remove Channel Spice, Display Spice, Video XQL, 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 \ +Some GPU vBIOS needs to be patched for UEFI Support. \ +----- TODO: vBIOS patching ------ \ +To use patched vBIOS, edit VM's configuration to include patched vBIOS inside ***hostdev*** block of VGA + + ```sh + mkdir /etc/libvirt/hooks + touch /etc/libvirt/hooks/qemu + chmod +x /etc/libvirt/hooks/qemu + ``` + + + + + + + + +
+ virsh edit win10 +
+ + ```xml ... @@ -98,12 +111,162 @@ virsh edit win10 ... ... -``` + ``` + +
### Libvirt Hooks -#### TODO +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 + mkdir /etc/libvirt/hooks + touch /etc/libvirt/hooks/qemu + 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 + ``` + +
+
+ +
+ Create Start Script + + ```sh + 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 +
+ + ```sh +#!/bin/bash +set -x + +# Stop display manager +systemctl stop display-manager +# rc-service display-manager stop + +# 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 + ``` + +
+
+ +
+ Create Stop Script + + ```sh + 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 +
+ + ```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 +# rc-service display-manager start + ``` + +
+
-See Also +### **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)