Project

General

Profile

KVM PCI Passthrough and Omni-Path » History » Version 4

Brian Smith, 04/07/2018 02:00 AM

1 1 Brian Smith
# KVM PCI Passthrough and OPA
2
3
A KVM guest can use OPA hardware when configured for PCI passthrough.
4
5
## BIOS Settings
6
7
1. Intel VT must be enabled.
8 4 Brian Smith
2. Integrated IO / IntelVT must be enabled.
9 1 Brian Smith
10
## Kernel Command Line
11
12
```intel_iommu=on iommu=pt```
13
14
## Install KVM
15
16
```
17
$ sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system virtinst libosinfo-bin virt-viewer virsh 
18
$ sudo adduser YOU libvirt
19
$ sudo adduser YOU libvirt-qemu
20
$ sudo adduser YOU kvm
21
```
22
23
## Disable hfi1 on host
24
25
The hfi1 driver must not be loaded on the host machine, in order to use PCI passthrough. In /etc/modprobe.d/hfi1.conf:
26
27
```
28
blacklist hfi1
29
```
30
31
Also, there is no reason to have IFS installed on the host. The host machine should have no OPA functionality enabled.
32
33
## Configure PCI Passthrough
34
35
The hfi1 device must be setup for PCI passthrough.  Find the device's port in the output of lspci:
36
37
```
38
$ lspci | grep Omni | cut -f1 '-d '
39
```
40
41
For the scripts below, prepend the port with 0000:, like "0000:80:02.0".
42
43
44
Use the following script, replace PCI_PORT with the port of the hfi1:
45
46
```
47
#!/bin/bash
48
49
PCI_PORT=0000:80:02.0
50
DEV_VENDOR=8086
51
DEV_MODEL=24f0
52
53
rmmod vfio
54
rmmod vfio_pci
55
echo "$PCI_PORT" > /sys/bus/pci/devices/$PCI_PORT/driver/unbind
56
modprobe vfio
57
modprobe vfio_pci
58
echo $DEV_VENDOR $DEV_MODEL > /sys/bus/pci/drivers/vfio-pci/new_id
59
```
60
61 2 Brian Smith
## Configure Default Network for DNS Forwarding
62
63
```
64
$ sudo virsh net-edit default
65
```
66
67
Add this tag:
68
69
```
70
  <domain name='sfw.int' localOnly='no'/>
71
```
72
73 1 Brian Smith
## Create Guest
74
75 3 Brian Smith
While it is possible to manage guests for an unprivileged user, they get a non-functional network setup in the default config. TBD to figure this out. 
76
77
**Use virsh as root.**
78 1 Brian Smith
79
```
80
$ systemctl start libvirtd
81
$ virt-install --virt-type kvm --name gozer-deb8 \
82
    --vcpus=4 --virt-type kvm --cdrom $HOME/kvm-guest/debian-8.7.0-amd64-DVD-1.iso \
83
    -v --os-variant debian8 \
84
    --disk path=$HOME/kvm-guest/gozer-deb8-d1.disk,size=16 --memory 4096 --graphics vnc
85
```
86
87
Connect a VNC client to a tunneled connection to the host.
88
89
From the workstation:
90
91
```
92
$ ssh -L5910:host:5900 YOU@host
93
```
94
95
Now connect a VNC client to localhost:5910 and complete the install.
96
97
## Import Existing Disk to New Guest
98
99
To import an existing guest disk image, use the following command:
100
101
```
102 2 Brian Smith
$ sudo virt-install --virt-type kvm --name gozer-deb8 \
103 1 Brian Smith
    --vcpus=4 --virt-type kvm --import \
104
    -v --os-variant debian8 \
105
    --disk PATH_TO_DISK_IMAGE,device=disk,bus=virtio --memory 4096 --graphics vnc
106
```
107 2 Brian Smith
108
## Connect to Guest, Configure DNS
109
110
TBD: figure out bridged network
111
112
The default network for KVM is 192.168.122.0/24 and the guest should be assigned a DHCP address when it boots. Use the VNC connection to execute ```$ ip addr``. ssh should be able to connect to the guest from the host.
113
114
Unfortunately, dnsmasq doesn't appear to set the search domain properly. For Debian, configure a search domain in the guest's ```/etc/network/interfaces```.
115
116
```
117
allow-hotplug eth0
118
iface eth0 inet dhcp
119
    dns-search sfw.int
120
```
121
122 1 Brian Smith
123
## Configure Guest for PCI Passthrough
124
125
Shutdown the guest if it is running.
126
127
```
128
$ virsh shutdown GUEST
129
```
130
131
Look for the PCI device in virsh. Look for a pci device that matches the port found via lspci.
132
133
```
134
$ virsh nodedev-list --tree 
135
```
136
137
Detach the device. Use the child device of the one that matches the device you found via lspci.
138
139
```
140
$ virsh nodedev-detach pci_0000_81_00_0
141
```
142
143
Dump the device info.
144
145
```
146
$ virsh nodedev-dumpxml pci_0000_81_00_0
147
```
148
149
Convert bus, slot and function to hex. ```$ printf %x VALUE``` can be used for the hex-challenged.
150
151
Edit the guest and add a hostdev section:
152
153
```
154
<hostdev mode='subsystem' type='pci' managed='yes'>
155
  <source>
156
      <address domain='0x0000' bus='0x81' slot='0x0' function='0x0'/>
157
  </source>
158
</hostdev>
159
```
160
161
Upon booting the guest, the passthrough device should be present in the guest's lspci output.
162
163
164
## References
165
166
1. https://wiki.debian.org/KVM
167
2. https://jamielinux.com/docs/libvirt-networking-handbook/nat-based-network.html
168
3. https://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM
169
4. https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF
170
5. https://wiki.debian.org/VGAPassthrough
171
172
----
173
174
{{lastupdated_by}} {{lastupdated_at}}
175
176
{{comment_form}}
177
{{comments}}