- KVM的IOMMU的使用方法
- dmesg|grep DMAR
- lspci-n-s 0000:08:00. 0
- echo"8086 10a7">/sys/bus/pci/drivers/pci-stub/new_id
- echo 0000:08:00.0>/sys/bus/pci/devices/0000:08:00.0/driver/unbind
- echo 0000:08:00.0>/sys/bus/pci/drivers/pci-stub/bind
- echo"8086 10a7">/sys/bus/pci/drivers/pci-stub/new_id
- echo 0000:08:00.1>/sys/bus/pci/devices/0000:08:00.1/driver/unbind
- echo 0000:08:00.1>/sys/bus/pci/drivers/pci-stub/bind
- qemu-kvm-smp 2-m2048-drive file=/var/lib/libvirt/images/f13-kvm.img, if=virtio, boot=on-pcidevice host=08:00.0
- lspci
KVM的IOMMU的使用方法
下面介绍KVM的IOMMU方法。本节以Intel VT-d的使用方法为中心进行说明。PCI传递通过下列流程来设置(如图5-23所示)。
图 5-23 在IOMMU中设置的页表
1.在BIOS中启用VT-d。
2.在内核启动选项中启用VT-d。
3.决定PCI传递的设备。
4.从主机操作系统拆除设备。
5.向客户端操作系统分配设备。
首先,为了检查系统是否可以使用IOMMU,需要检查ACPI的表。在Intel VT-d中,使用dmesg按照下列方式来检查ACPI表中是否存在签名为DMAR的表。如果没有DMAR,请回到BIOS,启用VT-d。
dmesg|grep DMAR
ACPI:DMAR 00000000bf7cadb4 000E8(v01 Intel OEMDMAR 00060000 LOHR 00000001)★DMAR:Host address width 39
DMAR:DRHD base:0x000000fed14000 flags:0x1
DMAR:RMRR base:0x000000bf7df000 end:0x000000bf7eefff
DMAR:ATSR flags:0x0
使用VT-d时,需要将intel_iommu内核启动选项设置如下。也像Fedora 13等这样默认为on的发布版。
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux(2.6.32-71.el6.x86_64)
root(hd0,0)
kernel/vmlinuz-2.6.32-71.el6.x86_64 ro root=UUID=234a4e64-a785-48b7-
a8a9-
fd88428d62fe
rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=ja_JP.UTF-8 KEYBOARDTYPE=pc KEYTABLE=jp106 rhgb quiet intel_iommu=on
initrd/initramfs-2.6.32-71.el6.x86_64.img
然后决定将哪个设备PCI传递到哪个客户端操作系统。决定PCI传递的设备后,使用lscpi命令检查PCI的BDP编号(Bus:Device.Function编号)。
00:00.0 Host bridge:Intel Corporation 5520 I/O Hub to ESI Port(rev 13)
00:01.0 PCI bridge:Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 1(rev 13)
00:03.0 PCI bridge:Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 3(rev 13)
……snip……
00:1e.0 PCI bridge:Intel Corporation 82801 PCI Bridge(rev 90)
00:1f.0 ISA bridge:Intel Corporation 82801JIB(ICH10)LPC Interface Controller
00:1f.2 IDE interface:Intel Corporation 82801JI(ICH10 Family)4 port SATA IDE Controller#1
00:1f.3 SMBus:Intel Corporation 82801JI(ICH10 Family)SMBus Controller
00:1f.5 IDE interface:Intel Corporation 82801JI(ICH10 Family)2 port SATA IDE Controller#2
01:00.0 RAID bus controller:LSI Logic/Symbios Logic MegaRAID SAS 1078(rev 04)
05:00.0 Fibre Channel:Emulex Corporation Zephyr LightPulse Fibre Channel Host Adapter(rev 02)
06:00.0 SCSI storage controller:LSI Logic/Symbios Logic SAS1068E PCI-Express Fusion-MPT SAS(rev 08)
07:00.0 Fibre Channel:Emulex Corporation Zephyr LightPulse Fibre Channel Host Adapter(rev 02)
08:00.0 Ethernet controller:Intel Corporation 82575EB Gigabit Network Connection(rev 02)
08:00.1 Ethernet controller:Intel Corporation 82575EB Gigabit Network Connection(rev 02)
09:00.0 VGA compatible controller:Matrox Graphics, Inc.MGA G200e[Pilot]ServerEngines(SEP1)(rev 02)
……snip……
例如,假设将08:00.0的以太网控制器进行PCI传递。
08:00.0 Ethernet controller:Intel Corporation 82575EB Gigabit Network Connection(rev 02)
还需要得知这个设备的PCI设备的厂商ID、设备ID。
lspci-n-s 0000:08:00. 0
08:00. 0 0200:8086:10a7(rev 02)
在找出BDF编号和厂商ID、设备ID后,将这个设备从主机操作系统上拆除。拆除的方法如下所示。不具有FLR(Function-Level Reset)[1]功能的多功能设备在向客户端操作系统分配时,会重启所有的功能设备,因此需要将这些功能设备全部拆除。
echo"8086 10a7">/sys/bus/pci/drivers/pci-stub/new_id
echo 0000:08:00.0>/sys/bus/pci/devices/0000:08:00.0/driver/unbind
echo 0000:08:00.0>/sys/bus/pci/drivers/pci-stub/bind
echo"8086 10a7">/sys/bus/pci/drivers/pci-stub/new_id
echo 0000:08:00.1>/sys/bus/pci/devices/0000:08:00.1/driver/unbind
echo 0000:08:00.1>/sys/bus/pci/drivers/pci-stub/bind
最后指定PCI传递的PCI设备,使用KVM启动客户端操作系统。
qemu-kvm-smp 2-m2048-drive file=/var/lib/libvirt/images/f13-kvm.img, if=virtio, boot=on-pcidevice host=08:00.0
从客户端操作系统可以看到传递到00:05.0的PCI设备。
lspci
00:00.0 Host bridge:Intel Corporation 440FX-82441FX PMC[Natoma](rev 02)
00:01.0 ISA bridge:Intel Corporation 82371SB PIIX3 ISA[Natoma/Triton II]
00:01.1 IDE interface:Intel Corporation 82371SB PIIX3 IDE[Natoma/Triton II]00:01.3 Bridge:Intel Corporation 82371AB/EB/MB PIIX4 ACPI(rev 03)
00:02.0 VGA compatible controller:Cirrus Logic GD 5446
00:03.0 Ethernet controller:Realtek Semiconductor Co.,Ltd.RTL-8139/8139C/8139C+(rev 20)
00:04.0 SCSI storage controller:Qumranet, Inc.Virtio block device
00:05.0 Ethernet controller:Intel Corporation 82575EB Gigabit Network Connection(rev 02)
可以使用qemu的控制台时,在打开客户端操作系统的VGA控制台界面后,使用Ctrl+Alt+2快捷键切换到qemu控制台。在qemu控制台上,还可以使用下列命令将PCI设备动态添加到客户端操作系统中。
(qemu)pci_add pci_addr=auto host host=08:00.0
将PCI设备动态删除需进行如下操作。向pci_addr指定的编号为在客户端操作系统上看到的PCI设备的Bus编号。
(qemu)pci_del pci_addr=5
在RHEL6或Fedora13等发布版中,可以使用virt-manager通过PCI传递(pass-through)将设备添加到客户端操作系统或者从客户端操作系统中删除(见图5-24)。
图 5-24 通过RHEL6的PCI传递添加设备
[1]以PCI设备的Function为单位重启的功能。