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.

3.1 KiB

PLAIN QEMU WITHOUT LIBVIRT

WORK IN PROGRESS

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.. \

Stuffs directly taken from YuriAlek's script.

Create disk image with QEMU.

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

The script should be run as superuser.

#!/bin/sh

ULIMIT=$(ulimit -a | grep "max locked memory" | awk '{print $6}')

# Replace 4 with the amount of RAM you supply to the VM (in GB)
ULIMIT_TARGET=$((4 * 1048576 + 100000))

ulimit -l $ULIMIT_TARGET

# Should be run before VM starts
function init_vm() {
	# Stop display manager (if any exists)
	# rc-service xdm stop
	# systemctl stop display-manager 
	pkill -9 dwm

	sleep 1
	# 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 snd_hda_intel
	# modprobe -r amdgpu 
	
	# Load vfio modules
	modprobe vfio-pci

	# Bind drivers to vfio
	echo "10de 1c03" > /sys/bus/pci/drivers/vfio-pci/new_id
	echo "0000:01:00.0" > /sys/bus/pci/devices/0000:01:00.0/driver/unbind
	echo "0000:01:00.0" > /sys/bus/pci/drivers/vfio-pci/bind
	echo "10de 1c03" > /sys/bus/pci/drivers/vfio-pci/remove_id

	echo "10de 10f1" > /sys/bus/pci/drivers/vfio-pci/new_id
	echo "0000:01:00.1" > /sys/bus/pci/devices/0000:01:00.1/driver/unbind
	echo "0000:01:00.1" > /sys/bus/pci/drivers/vfio-pci/bind
	echo "10de 10f1" > /sys/bus/pci/drivers/vfio-pci/remove_id
}

# Start VM
function start_vm() {
	qemu-system-x86_64 \
		-runas qaidvoid \
		-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
	
	ulimit -l $ULIMIT

	# Reboot system, because I have no idea how to rebind drivers
	reboot

	# Load GPU modules
	modprobe nvidia_drm
	modprobe nvidia_modeset
	modprobe nvidia_uvm
	modprobe nvidia
	# modprobe amdgpu

	# Attach GPU to host ? driver doesn't exist ? 
	echo "0000:01:00.0" > /sys/bus/pci/devices/0000:01:00.0/driver/bind
	echo "0000:01:00.1" > /sys/bus/pci/devices/0000:01:00.1/driver/bind

	# Bind EFI framebuffer to host
	echo "efi-framebuffer.0" > /sys/bus/platform/drivers/efi-framebuffer/bind
	
	# Restart Display Manager
	# rc-service xdm start
	# systemctl start display-manager
	# su - qaidvoid -c startx
}

init_vm
start_vm
stop_vm