====== ZFS and VFIO PCI Passthrough on Debian 8 ====== ===== Config Files ===== ==== Add intel_iommu=on to the boot loader ==== .. GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on" .. ==== Load vfio on bootup ==== ... vfio vfio_iommu_type1 vfio_pci vfio_virqfd ... ==== Blacklist Video Drivers==== * If a driver is using a pci device that you want to passthough you might want to blacklist the driver, although you can try unbinding the driver before you tell vfio to claim the device * driver name is found be running: lspci -vn | less -p VGA Look for "**Kernel driver in use:**" ... blacklist mgag200 blacklist nouveau ... ==== Setup Bridged Networking ==== ... auto eth0 iface eth0 inet manual auto br0 iface br0 inet dhcp bridge_ports eth0 ... ===== Install Kernel and updates from Backports ===== * add the following line to /etc/apt/sources.listdeb http://ftp.debian.org/debian jessie-backports main * Update package list and update packagesapt-get update apt-get -t jessie-backports upgrade ===== Build and Install ZFS on Linux (deb method) ===== * Download current release from [[https://github.com/zfsonlinux/zfs/releases]]. You will need **spl-x.x.x.x.tar.gz** and **zfs-x.x.x.x.tar.gz** * Install dependency packagesapt-get install build-essential gawk alien fakeroot linux-headers-$(uname -r) zlib1g-dev uuid-dev libblkid-dev libselinux-dev parted lsscsi * Build and install spl tar xvzf spl-x.x.x.x.tar.gz cd spl-x.x.x.x ./configure make deb-utils deb-kmod dpkg -i *.deb * Build and install zfs tar xvzf zfs-x.x.x.x.tar.gz cd zfs-x.x.x.x ./configure make deb-utils deb-kmod dpkg -i *.deb ===== Bind PCI device to VFIO ===== - To grab the hexadecimal PCI id. runlspci -nv - e.g. for 07:00.0 0300: 10de:0322 (rev a1) (prog-if 00 [VGA controller]) the PCI ID would be **10de:0322**. The slot ID/address is **07:00.0** - Then take the slot address in the previous example ***07:00.0** and prepend "0000:" so that you have something like **0000:07:00.0**. Then execute the following command to unbind the current driver echo 0000:07:00.0 > /sys/bus/pci/devices/0000:07:00.0/driver/unbind - Then take the PCI ID in the previous example **10de:0322** and replace the ":" with a space then run the following command echo 102b 0522 > /sys/bus/pci/drivers/vfio-pci/new_id ===== USB Passthough ===== * If you are passing a physical video card to a VM, you will need to also pass usb input devices to the VM since the VM will not have a SDL or Spice virtual display. * This is done through USB passthrough. * To find the USB id's to pass through run lsusb | grep -v "root hub" * This will give you something like thisBus 005 Device 002: ID 046b:ff10 American Megatrends, Inc. Virtual Keyboard and Mouse Bus 003 Device 003: ID 0557:2205 ATEN International Co., Ltd Bus 003 Device 002: ID 0451:2046 Texas Instruments, Inc. TUSB2046 Hub * What we want is the hexadecimal ID **ffff:ffff** * then this to pass the usb device to the vm-usbdevice host:ffff:ffff ===== Example kvm script ===== #!/bin/sh echo 0000:07:00.0 > /sys/bus/pci/devices/0000:07:00.0/driver/unbind echo 102b 0522 > /sys/bus/pci/drivers/vfio-pci/new_id qemu-system-x86_64 -enable-kvm -M q35 -m 2048 \ -cpu host -smp 4,sockets=1,cores=4,threads=1 \ -net nic,model=virtio,vlan=0 -net tap,vlan=0,ifname=tap0,script=/etc/qemu-ifup \ -device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \ -device vfio-pci,host=07:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on \ -drive file=/vol1/iso/bie2k8r2411.iso,index=2,media=cdrom \ -drive file=/vol1/iso/virtio-win.iso,index=3,media=cdrom \ -drive file=/vol1/hd-img/win2kr3.qed,format=qed,if=virtio,cache=writeback,index=1 \ -usb -usbdevice host:0557:2205 \ -boot menu=on \ -vga none ==== Important Bits ==== * The following is used to tell kvm to use the pci video card for display not a SDL or Spice canvas-vga none * The following is used to tell kvm to setup bridged networking-net nic,model=virtio,vlan=0 -net tap,vlan=0,ifname=tap0,script=/etc/qemu-ifup * The following is used to add a pcie bridge to the vm (needed for pci passthrough)-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 * The following adds ICH9 emulation that enables smoother pci passthrough-M q35 * The following unbinds the current driver and tells vfio to claim the pci deviceecho 0000:07:00.0 > /sys/bus/pci/devices/0000:07:00.0/driver/unbind echo 102b 0522 > /sys/bus/pci/drivers/vfio-pci/new_id * The following passes a video card to the vm and binds it to the pcie bridge-device vfio-pci,host=07:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on \ * The following passes a usb hub to the vm so that keyboard and mouse input can be used with the physical display-usbdevice host:0557:2205 * Add Spice Display-vga qxl -spice port=5900,addr=127.0.0.1,disable-ticketing