mirror of https://gitlab.com/YuriAlek/vfio
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.
136 lines
3.2 KiB
Bash
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
|