在Linux系统中,IOMMU(Input/Output Memory Management Unit)是一种硬件设备,用于管理输入输出设备的内存映射以及访问权限。IOMMU可以提高系统的安全性和性能,通过对DMA(直接内存访问,即设备与内存直接通信,而无需经过CPU)请求进行隔离和管理,防止恶意设备访问系统内存并提高内存使用效率。
在IOMMU的实现中,一个IOMMU设备通常会管理多个I/O设备,而这些IO设备可能需要共享同一块物理内存。为了有效管理这些IO设备,Linux内核使用IOMMU Group进行设备的分组和隔离。
IOMMU Group是一组物理设备和其对应的DMA地址空间,一般来说,IOMMU Group中的所有设备共享相同的DMA地址空间,并受到相同的IOMMU保护,如果一个设备与多个IOMMU GROUP关联,或者一个IOMMU Group中包含多个设备,可能需要重新配置系统以确保正确的IOMMU保护,在IOMMU GROUP中,IO设备可以访问统一块物理内存。但不能访问其它IOMMU GROUP的内存,这样可以保护系统的安全性。
1. 虚拟化工具的版本需求
libvirtd 和 qemu 需要新的版本,太旧不支持iommu的设置。
查看 virsh 版本:
virsh version
需求如下:
- libvirt: >= 4.5.0
- QEMU: >= 4.5.0
- hypervision: >= QEMU 2.12.0
2. 物理机配置开启嵌套虚拟化
查看是否开启嵌套虚拟化
cat /sys/module/kvm_intel/parameters/nested
指令输出:
N # 没有开启嵌套虚拟化
添加 kvm-nested.conf
vi /etc/modprobe.d/kvm-nested.conf
文件内容如下:
options kvm-intel nested=1
options kvm-intel enable_shadow_vmcs=1
options kvm-intel enable_apicv=1
options kvm-intel ept=1
重新插入 kvm 驱动
# remove rather than insert a module.
modprobe -r kvm_intel
# Insert all module names on the command line.
modprobe -a kvm_intel
查看是否开启嵌套虚拟化
cat /sys/module/kvm_intel/parameters/nested
指令输出:
Y # 有开启嵌套虚拟化