kvm

qemu installation script
git clone https://git.awy.one/kvm
Log | Files | Refs | README | LICENSE

gpu_pass.sh (4012B) - View raw


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/bin/sh
set -e
WRKDIR=$PWD

if [ "$(id -u)" -ne 0 ]
  then printf "The script has to be run as root.\n"
  exit
fi

if [ -x "$(command -v doas)" ]; then
  PERMUSER=$DOAS_USER
  evalcommand="doas -u $PERMUSER"
else
  PERMUSER=$SUDO_USER
  evalcommand="sudo -u $PERMUSER"
fi

run_as_user() {
  $evalcommand "$@"
}

run_as_user mkdir -p /home/"$PERMUSER"/.local/share/vgabios
run_as_user cp "$WRKDIR"/Hooks/patch.rom /home/"$PERMUSER"/.local/share/vgabios

pacman -S qemu-desktop libvirt edk2-ovmf virt-manager dnsmasq wget --noconfirm


mkdir /etc/libvirt/hooks

# Online version
#wget 'https://raw.githubusercontent.com/PassthroughPOST/VFIO-Tools/master/libvirt_hooks/qemu' \
#     -O /etc/libvirt/hooks/qemu

cp "$WRKDIR"/Hooks/qemu /etc/libvirt/hooks/

chmod +x /etc/libvirt/hooks/qemu

mkdir -p /etc/libvirt/hooks/qemu.d/win10-hidden-pt/prepare/begin
mkdir -p /etc/libvirt/hooks/qemu.d/win10-hidden-pt/release/end

cat <<EOL >> /etc/libvirt/hooks/qemu.d/win10-hidden-pt/prepare/begin/start.sh
#!/bin/bash
set -x

source "/etc/libvirt/hooks/kvm.conf"

#systemctl stop sddm.service
killall Hyprland

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
sleep 10
modprobe -r nvidia_drm
modprobe -r nvidia_modeset
modprobe -r nvidia_uvm
modprobe -r drm_kms_helper
modprobe -r nvidia
#modprobe -r drm

virsh nodedev-detach $VIRSH_GPU_VIDEO
virsh nodedev-detach $VIRSH_GPU_AUDIO

modprobe vfio
modprobe vfio_pci
modprobe vfio_iommu_type1

#./usr/share/UnbindUSB/vfio-usb.sh 0000:00:14.0
EOL

cat <<EOL >> /etc/libvirt/hooks/qemu.d/win10-hidden-pt/release/end/revert.sh
#!/bin/bash
set -x
source "/etc/libvirt/hooks/kvm.conf"

modprobe -r vfio_pci
modprobe -r vfio_iommu_type1
modprobe -r vfio

virsh nodedev-reattach $VIRSH_GPU_VIDEO
virsh nodedev-reattach $VIRSH_GPU_AUDIO

echo 1 > /sys/class/vtconsole/vtcon0/bind
echo 0 > /sys/class/vtconsole/vtcon1/bind

nvidia-xconfig --query-gpu-info > /dev/null 2>&1

echo "efi-framebuffer.0" > /sys/bus/platform/drivers/efi-framebuffer/bind

modprobe nvidia_drm
modprobe nvidia_modeset
modprobe drm_kms_helper
modprobe nvidia
modprobe drm
modprobe nvidia_uvm

#systemctl start sddm.service

#echo 0000:00:14.0 > /sys/bus/pci/drivers/vfio-pci/unbind
#echo 0000:00:14.0 > /sys/bus/pci/drivers/xhci_hcd/bind
EOL

chmod +x /etc/libvirt/hooks/qemu.d/win10-hidden-pt/prepare/begin/start.sh
chmod +x /etc/libvirt/hooks/qemu.d/win10-hidden-pt/release/end/revert.sh

case "$(readlink -f /sbin/init)" in
  *systemd*)
cat <<EOL >> /etc/libvirt/hooks/qemu.d/win10-hidden-pt/prepare/begin/cpuisolation.sh
#!/bin/sh
systemctl set-property --runtime -- user.slice AllowedCPUs=0,6
systemctl set-property --runtime -- system.slice AllowedCPUs=0,6
systemctl set-property --runtime -- init.scope AllowedCPUs=0,6
EOL
cat <<EOL >> /etc/libvirt/hooks/qemu.d/win10-hidden-pt/release/end/cpurevert.sh
#!/bin/sh
systemctl set-property --runtime -- user.slice AllowedCPUs=0-11
systemctl set-property --runtime -- system.slice AllowedCPUs=0-11
systemctl set-property --runtime -- init.scope AllowedCPUs=0-11
EOL
    ;;
  *dinit*)
    pacman --noconfirm -S libvirt-dinit
cat <<EOL >> /etc/libvirt/hooks/qemu.d/win10-hidden-pt/prepare/begin/cpuisolation.sh
#!/bin/sh
echo "+cpuset" > /sys/fs/cgroup/cgroup.subtree_control
echo "0,16" > /sys/fs/cgroup/1/cpuset.cpus
EOL
cat <<EOL >> /etc/libvirt/hooks/qemu.d/win10-hidden-pt/release/end/cpurevert.sh
#!/bin/sh
echo "0-31" > /sys/fs/cgroup/1/cpuset.cpus
echo "+cpuset" > /sys/fs/cgroup/cgroup.subtree_control
EOL
    dinitctl start libvirtd
    ;;
esac

chmod +x /etc/libvirt/hooks/qemu.d/win10-hidden-pt/prepare/begin/cpuisolation.sh
chmod +x /etc/libvirt/hooks/qemu.d/win10-hidden-pt/release/end/cpurevert.sh


cat <<EOL >> /etc/libvirt/hooks/kvm.conf
VIRSH_GPU_VIDEO=pci_0000_01_00_0
VIRSH_GPU_AUDIO=pci_0000_01_00_1
EOL

# usermod -aG libvirt,kvm,input,audio,video "$PERMUSER"
usermod -aG libvirt,input "$PERMUSER"

virsh net-autostart default