KVM的IOMMU的使用方法

下面介绍KVM的IOMMU方法。本节以Intel VT-d的使用方法为中心进行说明。PCI传递通过下列流程来设置(如图5-23所示)。

KVM的IOMMU的使用方法 - 图1

图 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)。

KVM的IOMMU的使用方法 - 图2

图 5-24 通过RHEL6的PCI传递添加设备

[1]以PCI设备的Function为单位重启的功能。