Hatena::ブログ(Diary)

わすれないうちにメモしよう

2015-06-16

CentOS7 KVM で PCIパススルー、USBパススルー

BIOSでIOMMU拡張を有効化

「Intel VT-d」「I/O Virtualization Technology」などの名前の設定項目を有効にする。

LinuxカーネルでIOMMU機能を有効化

# vi /etc/default/grub
GRUB_CMDLINE_LINUX の末尾に「intel_iommu=on」もしくは「amd_iommu=on」を追加

# grub2-mkconfig -o /boot/grub2/grub.cfg

# reboot

# dmesg | grep -e DMAR -e IOMMU
[    0.000000] Intel-IOMMU: enabled

PCIパススルーするデバイスを特定

# lspci
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Cedar [Radeon HD 5000/6000/7350/8350 Series]
01:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Cedar HDMI Audio [Radeon HD 5400/6300 Series]

# lspci -n
01:00.0 0300: 1002:68f9
01:00.1 0403: 1002:aa68

GPUの場合はホストにドライバが読み込まれないように無効化
 grub に nomodeset を追加

# vi /etc/default/grub 
GRUB_CMDLINE_LINUX="vconsole.keymap=us crashkernel=auto vconsole.font=latarcyrheb-sun16 intel_iommu=on nomodeset"

# grub2-mkconfig -o /boot/grub2/grub.cfg

ドライバブラックリストに追加

# lspci -v -d 1002:68f9 | grep Kernel
	Kernel driver in use: radeon

# lspci -v -d 1002:aa68 | grep Kernel
	Kernel driver in use: snd_hda_intel

# lsmod | grep radeon
drm                   297829  2 ttm,drm_kms_helper,radeon

# vi /etc/modprobe.d/blacklist.conf
blacklist drm
blacklist radeon
blacklist snd-hda-intel

# reboot

仮想マシンの設定でPCIデバイスを追加

# virsh edit vm1
<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
  </source>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x01' slot='0x00' function='0x1'/>
  </source>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</hostdev>

※lspci で追加したいデバイスが 01:00.0 の場合、
 bus='0x01' slot='0x00' function='0x0'
 を指定する。
 それ以外のパラメータは他設定とバッティングしないように指定する。

NVIDIAGPUWindowsにパススルーする場合は下記の対応が必要。
http://d.hatena.ne.jp/kt_hiro/20170716/1500199181

仮想マシンの設定でUSBデバイスを追加

# lsusb
Bus 002 Device 004: ID 3275:0080 VidzMedia Pte Ltd
※ 3275 が vendor id、0080 が product id

# virsh edit vm1
<hostdev mode=’subsystem’ type=’usb’>
  <source startupPolicy=’optional’>
    <vendor id=’0x3275’/>
    <product id=’0x0080’/>
  </source>
</hostdev>

仮想マシンの設定でUSBホストコントローラを追加
サーバのフロントUSBポート、リアUSBポートをまとめて仮想マシンにパススルーすることができる

# lspci
00:1a.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #2 (rev 04)
00:1d.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #1 (rev 04)
※上記の例では 00:1a.0 がリアUSB、00:1d.0 がフロントUSB

# virsh edit vm1
<hostdev mode='subsystem' type='pci' managed='yes'>
  <driver name='vfio'/>
    <source>
      <address domain='0x0000' bus='0x00' slot='0x1d' function='0x0'/>
    </source>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</hostdev>

※フロントUSB(00:1d.0)をパススルーする場合

かなりニッチな使い方だが、単一仮想マシンGPUパススルーして画面出力し、
USBパススルーしてマウスキーボードを接続すれば、
仮想マシンをローカルPCのように使用することができる。

トラックバック - http://d.hatena.ne.jp/kt_hiro/20150616/1434434879
リンク元