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.

2.4 KiB

PLAIN QEMU WITHOUT LIBVIRT

Passthrough can be done with plain qemu without using libvirt.
The general idea of using plain qemu is to avoid managing libvirt configurations and rather use a single script..
You'd still need libvirt daemon running because we're using virsh command. \

Create disk image with QEMU.

qemu-img create -f raw Disk.img 256G

The script should be run as superuser.
It's possible to get it working as user but it's tricky to setup.
Also, it should be run from TTY..

#!/bin/sh

# Should be run before VM starts
function init_vm() {
	# Stop display manager (if any exists)
	# rc-service xdm stop
	# systemctl stop display-manager 
	
	# Unbind EFI-framebuffer
	echo efi-framebuffer.0 > /sys/bus/platform/drivers/efi-framebuffer/unbind
	
	# Unload GPU modules
	modprobe -r nvidia_drm nvidia_modeset nvidia_uvm nvidia 
	# modprobe -r amdgpu 
	
	# Detach GPU from host
	virsh nodedev-detach pci_0000_01_00_0
	virsh nodedev-detach pci_0000_01_00_1
	
	# Load vfio modules
	modprobe vfio-pci
}

# Start VM
function start_vm() {
	qemu-system-x86_64 \
		-nodefaults \
		-enable-kvm \
		-machine kernel_irqchip=on \
		-cpu host,kvm=off,hv_vendor_id=nil \
		-m 4G \
		-name "Guix" \
		-smp cores=2 \
		-drive file=/home/qaidvoid/VM/Disk.img,if=virtio,format=raw \
		-drive file=/home/qaidvoid/Downloads/guix-system-install-1.2.0.x86_64-linux.iso,media=cdrom \
		-serial none \
		-net nic \
		-net user \
		-vga none \
		-device vfio-pci,host=01:00.0,x-vga=on,multifunction=on \
		-device vfio-pci,host=01:00.1 \
		-object input-linux,id=mouse1,evdev=/dev/input/by-id/usb-PixArt_HP_USB_Optical_Mouse-event-mouse \
		-object input-linux,id=kbd1,evdev=/dev/input/by-id/usb-Chicony_USB_Keyboard-event-kbd,grab_all=on,repeat=on \
		-device virtio-keyboard \
		-device virtio-mouse
}

# Should be run on VM shutdown
function stop_vm() {
	# Unload VFIO modules
	modprobe -r vfio-pci
	
	# Attach GPU to host
	virsh nodedev-reattach pci_0000_01_00_0
	virsh nodedev-reattach pci_0000_01_00_1
	
	# Bind EFI framebuffer to host
	echo "efi-framebuffer.0" > /sys/bus/platform/drivers/efi-framebuffer/bind
	
	# Load GPU modules
	modprobe nvidia_drm
	modprobe nvidia_modeset
	modprobe nvidia_uvm
	modprobe nvidia
	# modprobe amdgpu
	
	# Restart Display Manager? Doesn't seem to work quite well
	# rc-service xdm start
	# systemctl start display-manager
  reboot
}

init_vm
start_vm
stop_vm