21 мая 2013 г.

Как я сделал PCI passthrough на Intel платформе.

Мне хотелось бы окончательно избавится от Windows раздела на моем жестком диске и работать с некотрыми Windows программами  без костылей (иногда и поиграть) и без необходимости выхода из основной системы. Другими словами иметь виртуалку в которой полноценно работает аппаратное ускорение графики, RAID, USB, а также pci устройства которые не поддерживаются virtualbox.

Исходные данные

  • Материнская плата H55M-E33(MS-7636) 
  • Процессор Intel® Core™ i5 CPU 650
  • ОС Linux 3.2.0-43-generic x86_64 Ubuntu 12.04.2 LTS 
  • VirtualBox 4.2.12r84980 

 Процесс

1 Включаем поддержку IOMMU в ядре. Для этого в файле /etc/default/grub меняю строку
GRUB_CMDLINE_LINUX="" 
на
GRUB_CMDLINE_LINUX="intel_iommu=on" 
2 Обновляем загрузчик grub
$sudo update-grub 
3 После перезагрузки выполням
$dmesg | grep -i -e iommu -e dmar 
в выводе должны быть подобные строки:
Intel-IOMMU: enabled
DMAR: DRHD base: 0x000000fed90000 flags: 0x0
IOMMU 0: reg_base_addr fed90000 ver 1:0 cap c9008020e30272 ecap 1000
vboxpci: IOMMU found 
Если таких или похожих строк нет, то возможно у вас в биосе отключена Vt-d, либо процессор или материнская плата не поддерживает IOMMU.
4 Проверим, есть ли устройства которые можно пробросить. Если нет строк с FLReset+ тогда вряд ли получится. У меня так:
$ sudo lspci -vv | grep -i flreset+
ExtTag- RBE- FLReset+ 
5 Если функция есть, то ищем устройства которые можно пробросить. В моей системе нашлость только одно такое PCI устройство 00:1b.0 (встроенный в материнку звуковой чип Intel). Я делал с помощью команды:
$sudo lspci -vv | less 
6  Смотрим какой модуль ядра оно использует:
$ lspci -k -s 00:1b

00:1b.0 Audio device: Intel Corporation 5 Series/3400 Series Chipset High Definition Audio (rev 06) Subsystem: Micro-Star International Co., Ltd. Device 7636
Kernel driver in use:snd-hda-intel
Kernel modules: snd-hda-intel 
7 Запрещаем его загрузку, добавив в /etc/modprobe.d/blacklist.conf строку
blacklist snd-hda-intel 
и выполним команду
$sudo update-initramfs -u 
8 Перегружаем компьютер и пробрасываем устройство в гостевую:
$vboxmanage modifyvm u1204 --pciattach 00:1b.0@01:05.0 

При успешном пробросе не должно быть сообщений. 01:05.0  это любой адрес pci устройства, который не занят в гостевой. Согласно документации по virtualbox у гостевой системы должны быть  включены в настройках VT-x/AMD-V и nested paging, а на хосте должн быть установлен Oracle VM VirtualBox Extension Pack.
9 Запускаем гостя, смотрим в нем, что устройство появилось:
$lspci -s
01:05 01:05.0 Audio device: Intel Corporation 5 Series/3400 Series Chipset High Definition Audio (rev 06) 

Итог:

Звуковая карта определилась гостевой ОС и что самое главное заработала, т.е. звук гостевой системы выводится на физическое устройство хоста.  В ходе моих экспериментов многие устройства успешно пробрасывались (без FLReset+) и виделись ядром гостя, но работать отказывались. Были случаи, что система хоста зависала, так что будьте осторожны (на этапе 9), если будете повторять. К сожалению GPU и USB пока пробросить не удалось, что является моей конечной целью.

Обновления заметки:

Удалось успешно  прокинуть USB хоста, причем я пропускал шаги 6 и 7 .
$lspci | grep USB
00:1a.0 USB controller: Intel Corporation 5 Series/3400 Series Chipset USB2 Enhanced Host Controller (rev 06)
00:1d.0 USB controller: Intel Corporation 5 Series/3400 Series Chipset USB2 Enhanced Host Controller (rev 06)
Флешка видится и нормально  работает. Видеокамера работает показывает несколько секунд, а потом изображение пропадает (mplayer tv:// выдает v4l2: select timeout).

Ссылки: 

https://www.virtualbox.org/manual/ch09.html#pcipassthrough
https://www.virtualbox.org/ticket/5252
http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM
http://wiki.xensource.com/wiki/VTdHowTo
http://www.intel.com/support/motherboards/desktop/sb/CS-030922.htm?wapkw=%28vt-d%29

Комментариев нет: