Table of Contents

ZFS and VFIO PCI Passthrough on Debian 8

Config Files

Add intel_iommu=on to the boot loader

/etc/defaults/grub
..
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
..

Load vfio on bootup

/etc/modules
...
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
...

Blacklist Video Drivers

Setup Bridged Networking

/etc/network/interfaces
...
auto eth0
iface eth0 inet manual
 
auto br0
iface br0 inet dhcp
        bridge_ports eth0
...

Install Kernel and updates from Backports

Build and Install ZFS on Linux (deb method)

Bind PCI device to VFIO

  1. To grab the hexadecimal PCI id. run
    lspci -nv
  2. 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

  3. 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
  4. 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

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