Inspect and configure the IOMMU isolation level in Linux
Project description
iommu
Inspect and configure the IOMMU isolation level in Linux.
iommu is a small CLI for inspecting the current IOMMU mode and
switching between them. It rewrites the bootloader's kernel command
line; the change applies on the next boot.
Install
pipx install iommu
Or standalone (single-file, stdlib only, no pip needed):
curl -fsSL https://raw.githubusercontent.com/safl/iommu/main/src/iommu/iommu.py \
-o ~/.local/bin/iommu && chmod +x ~/.local/bin/iommu
Shell completion
iommu --print-completion bash > ~/.local/share/bash-completion/completions/iommu
Open a new shell (or source the file) and tab-completion is live: sudo iommu <TAB> lists show off-for-uio off-for-vfio strict pt.
Usage
iommu # = iommu show (no-arg default)
iommu show # cmdline, mode, iommufd + vfio-cdev availability
iommu --dry-run pt # preview without writing GRUB
sudo iommu pt && sudo reboot # most common: IOMMU on, host passthrough
sudo iommu strict # IOMMU on, translating for all devices
sudo iommu off-for-uio # IOMMU disabled, uio_pci_generic ready
sudo iommu off-for-vfio # IOMMU disabled + noiommu knob, vfio-pci ready
iommu show sample output (here from a WSL host with the IOMMU disabled by the WSL kernel; on a typical bare-metal host the cmdline contains the intel_iommu / amd_iommu / iommu=pt tokens and mode reads one of off-for-uio, off-for-vfio, strict, or pt):
cmdline: initrd=\initrd.img WSL_ROOT_INIT=1 panic=-1 nr_cpus=16 hv_utils.timesync_implicit=1 console=hvc0 debug pty.legacy_count=0 WSL_ENABLE_CRASH_DUMP=1
mode: unset
iommufd: absent (/dev/iommu)
vfio-cdev: 0 device(s) at /dev/vfio/devices
Related
devbind: inspect and control PCI device-driver binding in Linux.hugepages: inspect and manage Linux hugepages.
Background
The Linux IOMMU (Intel VT-d, AMD-Vi) sits between the CPU and PCI
devices, translating and isolating DMA. User space tools that talk to
PCI devices directly (vfio-pci for VM passthrough, vfio-pci or
uio_pci_generic for DPDK/SPDK and xNVMe/uPCIe) interact with the
IOMMU substrate differently depending on which mode the kernel was
booted with.
Modes
Four substrate modes, mutually exclusive.
off-for-uio
Tokens: intel_iommu=off amd_iommu=off
The IOMMU drivers don't load. No DMA isolation anywhere. uio_pci_generic
binds and works. vfio-pci does not work here; there are no IOMMU
groups for it to bind against. Zero overhead, zero protection;
appropriate on trusted hardware or for development where the IOMMU is
undesirable.
off-for-vfio
Tokens: intel_iommu=off amd_iommu=off vfio.enable_unsafe_noiommu_mode=1
Same as off-for-uio (IOMMU off, no DMA isolation), but also tells the
vfio module to expose "noiommu" groups so vfio-pci binds without an
IOMMU backing it. As unsafe as off-for-uio (same lack of isolation),
just a different user space driver framework. Use this when your user
space driver stack (DPDK/SPDK and xNVMe/uPCIe) requires vfio-pci but
you can't or don't want to turn the IOMMU on.
strict
Tokens: intel_iommu=on amd_iommu=on
The IOMMU drivers load and every DMA from every device is translated, including host-owned devices. Maximum isolation; defends the host kernel from malicious or buggy DMA. Highest per-DMA overhead. This is what "IOMMU on" traditionally meant.
pt (passthrough)
Tokens: intel_iommu=on amd_iommu=on iommu=pt
The IOMMU drivers load but host-owned devices skip translation (the
passthrough domain). Devices bound to vfio-pci get switched to an
isolated translating domain. Best of both worlds: native host
performance plus full vfio isolation for VM-passthrough / user space
drivers. The most common production configuration.
Modifiers
Independent of the substrate mode, one further knob sometimes applies:
Unsafe interrupts (cmdline)
On platforms without Interrupt Remapping, vfio-pci passthrough refuses
to bind by default. Two tokens lift that restriction:
vfio_iommu_type1.allow_unsafe_interrupts=1
iommufd.allow_unsafe_interrupts=1
Only meaningful when combined with strict or pt. This tool does not
write them automatically today; they are listed here for awareness.
What this tool does not control
- iommufd vs legacy vfio groups. Both APIs ride on top of the
substrate modes above. On kernel 6.5+,
vfio-pciexposes the legacy/dev/vfio/<group>container API and the iommufd cdev API at/dev/vfio/devices/vfioN(backed by/dev/iommu) simultaneously; whichever the user space consumer asks for is what it gets.iommudoesn't pick. iommu.strict={0,1}. IOTLB-flush policy (lazy vs strict). An orthogonal perf-vs-isolation knob; modern x86 defaults to lazy.- Architecture-specific IOMMU drivers beyond Intel VT-d / AMD-Vi
(e.g.
arm-smmu). Out of scope.
Bootloader handling
iommu <mode> auto-detects the bootloader manager and writes the
new cmdline:
grubby(Fedora / RHEL): one--update-kernel=ALLinvocation to add the target tokens, one to remove the others./etc/default/grub+update-grub(Debian / Ubuntu): rewritesGRUB_CMDLINE_LINUXin place, then runsupdate-grub.
--dry-run shows the intended write without applying it; runs as any
user, no root needed for the preview. The real write requires root
(reading /proc/cmdline for show does not).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file iommu-0.2.8.tar.gz.
File metadata
- Download URL: iommu-0.2.8.tar.gz
- Upload date:
- Size: 8.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b1e884289eada4b0ca2452ef09c32364fe272466263942c5c65e759ab6a414c7
|
|
| MD5 |
2401b828cec34c5b64b6115ef2c51e1f
|
|
| BLAKE2b-256 |
9c56cd4405a66205a48fb71c3dedeaf22706a4e725543a182b1d2198c5837b4a
|
Provenance
The following attestation bundles were made for iommu-0.2.8.tar.gz:
Publisher:
publish.yml on safl/iommu
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
iommu-0.2.8.tar.gz -
Subject digest:
b1e884289eada4b0ca2452ef09c32364fe272466263942c5c65e759ab6a414c7 - Sigstore transparency entry: 1535208994
- Sigstore integration time:
-
Permalink:
safl/iommu@d44652b6308e32c66089749174fdd7510d9d1497 -
Branch / Tag:
refs/tags/v0.2.8 - Owner: https://github.com/safl
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d44652b6308e32c66089749174fdd7510d9d1497 -
Trigger Event:
push
-
Statement type:
File details
Details for the file iommu-0.2.8-py3-none-any.whl.
File metadata
- Download URL: iommu-0.2.8-py3-none-any.whl
- Upload date:
- Size: 8.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
acdd2af9dd5c635f97e8dd5cd9ded42ac78039e039141dd61c1bb891591dee19
|
|
| MD5 |
8a46dea9bd1f8ef5ae1a22d722d6cd15
|
|
| BLAKE2b-256 |
ec983473b2cadfadeb0b0fe63d92fefe623d3865b92d46b443377f454f04019b
|
Provenance
The following attestation bundles were made for iommu-0.2.8-py3-none-any.whl:
Publisher:
publish.yml on safl/iommu
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
iommu-0.2.8-py3-none-any.whl -
Subject digest:
acdd2af9dd5c635f97e8dd5cd9ded42ac78039e039141dd61c1bb891591dee19 - Sigstore transparency entry: 1535209311
- Sigstore integration time:
-
Permalink:
safl/iommu@d44652b6308e32c66089749174fdd7510d9d1497 -
Branch / Tag:
refs/tags/v0.2.8 - Owner: https://github.com/safl
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d44652b6308e32c66089749174fdd7510d9d1497 -
Trigger Event:
push
-
Statement type: