From 9553f174f0f739da887bbe2aedcd3332be02fcb7 Mon Sep 17 00:00:00 2001 From: QaidVoid <12017109+QaidVoid@users.noreply.github.com> Date: Wed, 2 Dec 2020 00:09:52 +0545 Subject: [PATCH] Cleaning up... --- README.md | 279 ++++++++++++++---------------------------------------- 1 file changed, 71 insertions(+), 208 deletions(-) diff --git a/README.md b/README.md index db11200..a2807e1 100644 --- a/README.md +++ b/README.md @@ -1,247 +1,110 @@ -## Automated Setup -#### WORKING ON IT!!! - -## Manual Setup -Note: Replace win10 with your virtual machine's name on libvirt hooks and virsh commands. - -
- 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 +### **Enable 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*** +```sh +grub-mkconfig -o /boot/grub/grub.cfg +``` +#### Reboot your system for the changes to take effect. - After setting kernel parameter on grub config, reboot your system and verify IOMMU is enabled. +
- ```sh - dmesg | grep 'IOMMU enabled' - ``` -
-
+### **Verify IOMMU** +#### ***If you don't see any output when running following command, IOMMU is not functioning.*** +```sh +dmesg | grep 'IOMMU enabled' +``` +### **Install required tools**
- Install required tools + Gentoo Linux ```sh - sudo pacman -S qemu libvirt edk2-ovmf virt-manager dnsmasq ebtables + emerge -av qemu virt-manager libvirt ebtables dnsmasq ```
- Enable services - Enable libvirtd service and start default network. + Arch Linux ```sh - sudo systemctl enable --now libvirtd - sudo virsh net-start default - sudo virsh net-autostart default + pacman -S qemu libvirt edk2-ovmf virt-manager dnsmasq ebtables ```
- 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 + Fedora ```sh - sudo virsh edit win10 - ``` - Search for hostdev. Add - ```xml - + dnf install @virtualization ``` - 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/) +
+### **Enable required services**
- 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 - ``` + SystemD - Restart libvirtd ```sh - sudo systemctl restart libvirtd + systemctl enable --now libvirtd ```
- Start Script + OpenRC ```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 + rc-update add libvirtd default + rc-service libvirtd start ```
-
- -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 +### Sometimes, you might need to start default network manually. +```sh +virsh net-start default +virsh net-autostart default ``` -/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) +### **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. + +
+ +### **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 + ... + + + ... + + + ... + + ... +``` See Also > [Single GPU Passthrough by joeknock90](https://github.com/joeknock90/Single-GPU-Passthrough)