You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
vfio-guide-2/libvirt/qemu

136 lines
3.2 KiB
Bash

#!/bin/bash
## QEMU hooks
#sudo ln -sf "$(pwd)"/qemu /etc/libvirt/hooks/qemu
## 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/qemu_log.txt
## Virtual interface name
VIRTNAME=virt1
## Config files
SAMBA_CFG="/home/yu/vfio/libvirt/smb.conf"
## Samba server
samba_server(){
samba_start(){
[[ -f /var/run/smbd.pid ]] || sudo smbd --configfile="$SAMBA_CFG"
}
samba_stop(){
[[ -f /var/run/smbd.pid ]] && sudo kill -15 "$(cat /var/run/smbd.pid)"
}
if [ "$1" == "start" ]; then
samba_start
elif [ "$1" == "stop" ]; then
samba_stop
fi
}
if [[ "$1" == "GPU"* ]]; then
if [ "$2" == "prepare" ]; then
## Memory lock limit
#[ "$ULIMIT" != "$ULIMIT_TARGET" ] && ulimit -l "$ULIMIT_TARGET"
## Firewall nftables
nft add rule inet filter INPUT iifname "virbr1" tcp dport { 53, 67, 68, 139, 445 \} counter accept
nft add rule inet filter INPUT iifname "virbr1" udp dport { 53, 67, 68 \} counter accept
nft add rule arp filter INPUT iifname "virbr1" accept
## Volume
amixer -q sset Master 100%
## Kill the Window Manager
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
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
## Start samba server
samba_server start
## iptables
#iptables -A LIBVIRT_INP -i virbr1 -p tcp -m tcp --dport 445 -j ACCEPT
fi
if [ "$2" == "release" ]; then
## iptables
#iptables -D LIBVIRT_INP -i virbr1 -p tcp -m tcp --dport 445 -j ACCEPT
## Stop the samba server
#samba_server stop
## Stop the network
if [ "$(virsh net-list --all | grep "$VIRTNAME" | awk '{print $2}')" == "active" ]; then
virsh net-destroy "$VIRTNAME"
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_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