# SR-IOV

### Ensure IOMMU Is Activated

> First step of this process is to make sure that your hardware is even capable of this type of virtualization. You need to have a motherboard, CPU, and BIOS that has an IOMMU controller and supports Intel-VT-x and Intel-VT-d or AMD-v and AMD-vi. Some motherboards use different terminology for these, for example they may list AMD-v as SVM and AMD-vi as IOMMU controller.

### Update Bootloader

#### Update Kernel Parameters

**\*\*NOTE\*\*** Be sure to replace `intel_iommu=on` with `amd_iommu=on` if you're running on AMD instead of Intel.

##### Grub2
```diff
# /etc/default/grub
- GRUB_CMDLINE_LINUX_DEFAULT="quiet"
+ GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt
```

##### Systemd
```diff
# /etc/kernel/cmdline
- root=ZFS=rpool/ROOT/pve-1 boot=zfs
+ root=ZFS=rpool/ROOT/pve-1 boot=zfs intel_iommu=on iommu=pt
```

#### Rebuild Bootloader Options

##### Grub
```
update-grub
```

##### systemd-boot
```
bootctl update
```

##### Proxmox
```
pve-efiboot-tool refresh
```

### Enable Virtual Functions

Find the link name you want to add virtual function to using `ip link`. In this scenario we're going to say we want to add 4 virtual functions to link `eth2`. You can find the maximum number of virtual function possible by reading the `sriov_totalvfs` from sysfs...

```bash
cat /sys/class/net/enp10s0f0/device/sriov_totalvfs
7
```

To enable virtual functions you just `echo` the number you want to `sriov_numvfs` in sysfs...

```bash
echo 4 > /sys/class/net/enp10s0f0/device/sriov_numvfs
```


### Make Persistent
Sysfs is a virtual file system in Linux kernel 2.5+ that provides a tree of system devices. This package provides the program 'systool' to query it: it can list devices by bus, class, and topology.
 
In addition this package ships a configuration file /etc/sysfs.conf which allows one to conveniently set sysfs attributes at system bootup (in the init script etc/init.d/sysfsutils).

```bash
apt install sysfsutils
```

### Configure sysfsutils

To make these changes persistent, you need to update `/etc/sysfs.conf` so that it gets set on startup.

```bash
echo "class/net/eth2/device/sriov_numvfs = 4" >> /etc/sysfs.conf
```