Project

General

Profile

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

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