・BIOSでIOMMU拡張を有効化
「Intel VT-d」「I/O Virtualization Technology」などの名前の設定項目を有効にする。
# 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
・IOMMUグループの確認
# vi iommu.sh #!/bin/bash shopt -s nullglob for d in /sys/kernel/iommu_groups/*/devices/*; do n=${d#*/iommu_groups/*}; n=${n%%/*} printf 'IOMMU Group %s ' "$n" lspci -nns "${d##*/}" done; # sh iommu.sh IOMMU Group 1 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device IOMMU Group 1 01:00.1 Audio device [0403]: NVIDIA Corporation Device IOMMU Group 1 02:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller ... PCIパススルーはIOMMUグループ単位でしかできない。 上記例ではグループ1にGPUとNICが属しているため、パススルーする場合はGPUとNICを両方同時にパススルーする必要がある。
# 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
NVIDIAのGPUをWindowsにパススルーする場合は下記の対応が必要。
http://d.hatena.ne.jp/kt_hiro/20170716/1500199181
# virsh edit vm1 <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0' bus='1' slot='0' function='0'/> </source> </hostdev> ※lspci で追加したいデバイスが 01:00.0 の場合、bus='1' slot='0' function='0' を指定する。
# 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='0' bus='0' slot='1d' function='0'/> </source> </hostdev> ※フロントUSB(00:1d.0)をパススルーする場合
単一仮想マシンでGPUパススルーして画面出力し、USBパススルーしてマウス・キーボードを接続すれば、仮想マシンをローカルPCのように使用することができる。