You're running a KVM-based virtualization. You want to do PCI/PCIe passthrough of some device. You don't want it to attach to the host OS at all.
Your device looks like that:
00:1f.2 SATA controller [0106]: Intel Corporation 6 Series/C200 Series Chipset Family SATA AHCI Controller [8086:1c02] (rev 05)
Subsystem: Hewlett-Packard Company 6 Series/C200 Series Chipset Family 6 port Desktop SATA AHCI Controller [103c:330d]
Kernel driver in use: ahci
Kernel modules: ahci
Usually the solutions are simple:
- If you have only one device listing some module in
Kernel modules
(e.g.nvidiafb
) you can add it to/etc/modprobe.d/some-file.conf
asblacklist nvidiafb
- If you have multiple and they're normal devices you just add
options vfio-pci ids=8086:1c02
to some file in/etc/modprobe.d/
(make sure to use the id in[...]
and not pci location00:1f.2
)
However, these will not work if your device is handled by something loaded very very VERY early... like a driver for your second SATA controller.
- You cannot blacklist
ahci
(like in example here) because you will prevent all controllers from working (=no boot volume) - You cannot use
modprobe.d
to set options becausevfio-pci
loads waaaaay too late.
There are two prerequisites:
vfio-pci
must be availbale before rootfs is attachedvfio-pci
must load beforeahci
loads
The first is simple:
- add
vfio-pci
to/etc/initramfs-tools/modules
- update initramfs:
update-initramfs -u -k $(uname -r)
- Proxmox on UEFI: if you're using Proxmox 7 booted using UEFI mode you also need to run
proxmox-boot-tool refresh
- it will place the module in
initramfs
disk (in/etc/conf/modules
)
The second is more complicated:
- entry in
/etc/initramfs-tools/modules
will loadvfio-pci
before the rootfs is mounted - however,
/etc/conf/modules
from ramdisk is loaded after some scripts (see/init
in ramdisk) - these scripts (
scripts/init-top/
) load some drivers... andudev
... andudev
loadsahci
- solution:
- create
/usr/share/initramfs-tools/scripts/init-top/load_vfio-pci
with#!/bin/sh modprobe vfio-pci ids=8086:1c02
chmod +x /usr/share/initramfs-tools/scripts/init-top/load_vfio-pci
- edit
/usr/share/initramfs-tools/scripts/init-top/udev
and changePREREQS=""
toPREREQS="load_vfio-pci"
- create
- update initramfs:
update-initramfs -u -k $(uname -r)
- Proxmox on UEFI: if you're using Proxmox 7 booted using UEFI mode you also need to run
proxmox-boot-tool refresh
- note: this will not work if placed in "standard place" (
/etc/initramfs-tools/scripts...
) as dependencies are not cross-directory and/usr/share
comes first
Without the mod:
# lspci -knn
...
00:1f.2 SATA controller [0106]: Intel Corporation 6 Series/C200 Series Chipset Family SATA AHCI Controller [8086:1c02] (rev 05)
Subsystem: Hewlett-Packard Company 6 Series/C200 Series Chipset Family 6 port Desktop SATA AHCI Controller [103c:330d]
Kernel driver in use: ahci
Kernel modules: ahci
With the mod:
# lspci -knn
...
00:1f.2 SATA controller [0106]: Intel Corporation 6 Series/C200 Series Chipset Family SATA AHCI Controller [8086:1c02] (rev 05)
Subsystem: Hewlett-Packard Company 6 Series/C200 Series Chipset Family 6 port Desktop SATA AHCI Controller [103c:330d]
Kernel driver in use: vfio-pci
Kernel modules: ahci
I upgraded my PVE installation today and had the issue that SATA controller passthrough stopped working and all SATA disks appear in
lsblk
on host machine.Previously I enabled passthrough with kernel parameters:
This method stopped working after the upgrade.
I solved the issue by adjusting the loading order of modules.
Just add a line to
/etc/modprobe.d/
:According to
modprobe.d(5)
, this line makesvfio-pci
loads beforeahci
.Updating initramfs + reboot, and now
lsblk
no longer shows SATA disks.lspci
shows that SATA controller is now handled byvfio-ahci
.Reference: https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF#Loading_vfio-pci_early