diff --git a/CHANGELOG.md b/CHANGELOG.md index f886c97..2643b07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 2019/06/13 +Improved libvirt hooks. +### Added +- [libvirt](/libvirt) + - [virt1.xml](/libvirt/virt1.xml) +### Changed +- [qemu](/libvirt/qemu) + ## 2019/03/22 ### Added - [scritps](/scripts) diff --git a/libvirt/qemu b/libvirt/qemu new file mode 100755 index 0000000..b3b4ef3 --- /dev/null +++ b/libvirt/qemu @@ -0,0 +1,62 @@ +#!/usr/bin/env bash + +## QEMU hooks. How to use. +# chmod +x qemu +# sudo ln -sf "$(pwd)/qemu" /etc/libvirt/hooks/qemu + +## Virsh devices. +VIRSH_GPU="pci_0000_06_00_0" +VIRSH_GPU_AUDIO="pci_0000_06_00_1" + +## Log file. Only tells if the GPU was un/binded correctly. +LOG=/tmp/qemu_log.txt + +if [[ "$1" == "GPU"* ]]; then + if [ "$2" == "prepare" ]; then + + ## Kill the Window Manager. Yours may vary. + killall i3 > /dev/null 2>&1 + sleep 5 ## Just in case + + ## Remove the framebuffer and console + echo 0 > /sys/class/vtconsole/vtcon0/bind + echo 0 > /sys/class/vtconsole/vtcon1/bind + echo efi-framebuffer.0 > /sys/bus/platform/drivers/efi-framebuffer/unbind + + ## Detach the GPU and USB + virsh nodedev-detach "$VIRSH_GPU" >> "$LOG" 2>&1 + virsh nodedev-detach "$VIRSH_GPU_AUDIO" >> "$LOG" 2>&1 + + ## Load vfio. + modprobe vfio-pci + + ## Start the network. + if [[ $(virsh net-list --all | grep "virt1" | awk '{print $2}') != "active" ]]; then + virsh net-start virt1 + fi + + fi + if [ "$2" == "release" ]; then + + ## Stop the network. + if [ "$(virsh net-list --all | grep "virt1" | awk '{print $2}')" == "active" ]; then + ## "destroy" actually stops it. + virsh net-destroy virt1 + fi + + ## Unload vfio module. + modprobe -r vfio-pci + modprobe -r vfio_iommu_type1 + modprobe -r vfio + + ## Reattach the GPU and USB. + virsh nodedev-reattach "$VIRSH_GPU_AUDIO" >> "$LOG" 2>&1 + virsh nodedev-reattach "$VIRSH_GPU" >> "$LOG" 2>&1 + + ## Reload the framebuffer and console. + echo 1 > /sys/class/vtconsole/vtcon0/bind + nvidia-xconfig --query-gpu-info > /dev/null 2>&1 + echo "efi-framebuffer.0" > /sys/bus/platform/drivers/efi-framebuffer/bind + + fi +fi diff --git a/libvirt/virt1.xml b/libvirt/virt1.xml new file mode 100644 index 0000000..820a921 --- /dev/null +++ b/libvirt/virt1.xml @@ -0,0 +1,16 @@ + + virt1 + c387430a-d3f9-4859-a9bd-3a25987de672 + + + + + + + + + + + + + diff --git a/scripts/qemu b/scripts/qemu deleted file mode 100755 index ed8e8aa..0000000 --- a/scripts/qemu +++ /dev/null @@ -1,83 +0,0 @@ -#!/bin/bash - -## IOMMU groups -IOMMU_GPU=06:00.0 -IOMMU_GPU_AUDIO=06:00.1 -IOMMU_USB=07:00.3 -IOMMU_AUDIO=08:00.3 - -## Virsh devices -VIRSH_GPU=pci_0000_06_00_0 -VIRSH_GPU_AUDIO=pci_0000_06_00_1 -VIRSH_USB=pci_0000_07_00_3 -VIRSH_AUDIO=pci_0000_08_00_3 - -## PCI BUS ID -videoid="10de 1184" -audioid="10de 0e0a" -videobusid="0000:${IOMMU_GPU}" -audiobusid="0000:${IOMMU_GPU_AUDIO}" - -## QEMU options -RAM=12G - -## Ulimit -ULIMIT=$(ulimit -a | grep "max locked memory" | awk '{print $6}') -ULIMIT_TARGET=$(( $(echo $RAM | tr -d 'G') * 1048576 + 100000 )) - -## Log file -LOG=/tmp/passthrough.log - -## Virtual interface name -VIRTNAME=virt1 - -if [[ $1 == "win10" ]]; then - if [[ $2 == "prepare" ]]; then - ## Memory lock limit - [[ $ULIMIT != $ULIMIT_TARGET ]] && ulimit -l $ULIMIT_TAGET - - ## Kill the Window Manager - killall i3 > /dev/null 2>&1 - sleep 5 - - ## Remove the framebuffer and console - echo 0 > /sys/class/vtconsole/vtcon0/bind - echo 0 > /sys/class/vtconsole/vtcon1/bind - echo efi-framebuffer.0 > /sys/bus/platform/drivers/efi-framebuffer/unbind - - ## Detach the GPU and USB - virsh nodedev-detach $VIRSH_GPU >> $LOG 2>&1 - virsh nodedev-detach $VIRSH_GPU_AUDIO >> $LOG 2>&1 - virsh nodedev-detach $VIRSH_USB >> $LOG 2>&1 - - ## Load vfio - modprobe vfio-pci - - ## Start the network - if [[ $(virsh net-list --all | grep $VIRTNAME | awk '{print $2}') != "active" ]]; then - virsh net-start $VIRTNAME - fi - - fi - if [[ $2 == 'release' ]]; then - - ## Unload vfio module - modprobe -r vfio-pci - modprobe -r vfio_iommu_type1 - modprobe -r vfio - - ## Reattach the GPU and USB - virsh nodedev-reattach $VIRSH_USB >> $LOG 2>&1 - virsh nodedev-reattach $VIRSH_GPU_AUDIO >> $LOG 2>&1 - virsh nodedev-reattach $VIRSH_GPU >> $LOG 2>&1 - - ## Reload the framebuffer and console - echo 1 > /sys/class/vtconsole/vtcon0/bind - nvidia-xconfig --query-gpu-info > /dev/null 2>&1 - echo "efi-framebuffer.0" > /sys/bus/platform/drivers/efi-framebuffer/bind - - ## Restore ulimit - ulimit -l $ULIMIT - - fi -fi diff --git a/scripts/virsh-network.xml b/scripts/virsh-network.xml deleted file mode 100644 index 9f2a29f..0000000 --- a/scripts/virsh-network.xml +++ /dev/null @@ -1,13 +0,0 @@ - - virt1 - 046a1f8f-e46c-4517-8f8e-6c793a8b57a2 - - - - - - - - - - diff --git a/scripts/windows.xml b/scripts/windows.xml deleted file mode 100644 index 409c5b9..0000000 --- a/scripts/windows.xml +++ /dev/null @@ -1,141 +0,0 @@ - - win10 - 49a79759-dfa2-4670-a6f6-eab2d6794abd - 12582910 - 12582910 - 12 - 1 - - - - - - - - - - - - - - - - - - - - - hvm - /usr/share/ovmf/x64/OVMF_CODE.fd - /var/lib/libvirt/qemu/nvram/win10_VARS.fd - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - destroy - restart - destroy - - - - - - /usr/bin/qemu-system-x86_64 - - - - -
- - - - - - -
- - - - - - -
- - -
- - -
- - - -
- - - - - -
- - - -
- - -
- - - -
- -
- - - -
- -
- - -
- - -