Первый тестовый проброс устройств на ASUS M5A97PRO

В данной статье рассказывается о проведенном эксперименте цель которого была проброс устройства в виртуальную машину из хоста под управлением Ubuntu 11.04. В качечтве системной платы использовалась ASUS M5A97PRO.

Материнская плата ASUS M5A97PRO собрана на чипсете AMD 970 и обладает поддержкой технологии AMD IOMMU, обеспечивающей проброс реальных устройств в виртуальные машины.

Настройка

1. Обновите BIOS материнской карты. Версия биос которая поставляется изначально некорректно работает с пробросом устройств. Для обновления биос скопирируйте ROM c официального сайта ASUS на флешку и запустите утилиту EZ Flash. Для чистоты эксперимента можете воспользоваться использованной версией BIOS ROM.
2. Скомпилируйте и установите ядро Linux 3.2.0 включив поддержку IOMMU либо используйте пакеты подготовленные в рамках экспиримента.
3. В файле настроек GRUB (/etc/default/grub) установите значение строке:
GRUB_CMDLINE_LINUX_DEFAULT="iommu=pt iommu=1 amd_iommu=fullflush" 
Эти опции активируют AMD IOMMU
4. В каталоге /etc/modprobe.d создайте файл kvm_iommu_map_guest.conf со следущим содержанием:
options kvm allow_unsafe_assigned_interrupts=1
5. Обновите GRUB с помощью команды update-grub. Если используете iSCSI цели остановите сервис open-iscsi комадой:
service open-iscsi stop
для того чтобы предотвратить поиск загрузочных записей на всех дисках виртуальных машин хранящихся в хранилище.
6. Перезагрузитесь
6.a Если загрузка не осуществляется, либо не включаются некоторые устройства  - значит BIOS не обновлен.
6.b Если загрузка завершилась успешно проверте включение IOMMU коммандой:
dmesg | grep AMD-Vi
на выходе должны получить сообщения подобные следующим:
[    1.655121] AMD-Vi: Enabling IOMMU at 0000:00:00.2 cap 0x40
[    1.708344] AMD-Vi: Initialized for Passthrough Mode

Это говорит о том что запуск IOMMU завершен успешно.
7. Подготовьте KVM 1.0. В ходе теста использовалась перекомпилированная версия KVM версии из LaunchPad. Проброс PCI-устройств с помощью специальной версии QEMU, оптимизированной для работы со SPICE, используемого в UmVirt VP, в настоящее время не возможен по причине отсутствия поддержки устройства "pci-assign", вызванного задержкой синхронизации веток разработки KVM.

Проброс встроенного USB 3.0 контролера

1. Включите модуль PCI STUB если он не часть ядра командой
modprobe pci_stub
результат проверте командой
lsmod | grep pci
2. Выберите устройство для проброса выполнив команду
ls pci
Вы должны получить список устройств вида

00:00.0 Host bridge: ATI Technologies Inc RD890 PCI to PCI bridge (external gfx0 port B) (rev 02)
00:00.2 Generic system peripheral [0806]: ATI Technologies Inc Device 5a23
00:02.0 PCI bridge: ATI Technologies Inc RD890 PCI to PCI bridge (PCI express gpp port B)
00:04.0 PCI bridge: ATI Technologies Inc RD890 PCI to PCI bridge (PCI express gpp port D)
00:06.0 PCI bridge: ATI Technologies Inc RD890 PCI to PCI bridge (PCI express gpp port F)
00:07.0 PCI bridge: ATI Technologies Inc RD890 PCI to PCI bridge (PCI express gpp port G)
00:11.0 SATA controller: ATI Technologies Inc SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode] (rev 40)
00:12.0 USB Controller: ATI Technologies Inc SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
00:12.2 USB Controller: ATI Technologies Inc SB7x0/SB8x0/SB9x0 USB EHCI Controller
00:13.0 USB Controller: ATI Technologies Inc SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
00:13.2 USB Controller: ATI Technologies Inc SB7x0/SB8x0/SB9x0 USB EHCI Controller
00:14.0 SMBus: ATI Technologies Inc SBx00 SMBus Controller (rev 42)
00:14.2 Audio device: ATI Technologies Inc SBx00 Azalia (Intel HDA) (rev 40)
00:14.3 ISA bridge: ATI Technologies Inc SB7x0/SB8x0/SB9x0 LPC host controller (rev 40)
00:14.4 PCI bridge: ATI Technologies Inc SBx00 PCI to PCI Bridge (rev 40)
00:14.5 USB Controller: ATI Technologies Inc SB7x0/SB8x0/SB9x0 USB OHCI2 Controller
00:16.0 USB Controller: ATI Technologies Inc SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
00:16.2 USB Controller: ATI Technologies Inc SB7x0/SB8x0/SB9x0 USB EHCI Controller
00:18.0 Host bridge: Advanced Micro Devices [AMD] Family 10h Processor HyperTransport Configuration
00:18.1 Host bridge: Advanced Micro Devices [AMD] Family 10h Processor Address Map
00:18.2 Host bridge: Advanced Micro Devices [AMD] Family 10h Processor DRAM Controller
00:18.3 Host bridge: Advanced Micro Devices [AMD] Family 10h Processor Miscellaneous Control
00:18.4 Host bridge: Advanced Micro Devices [AMD] Family 10h Processor Link Control
01:00.0 VGA compatible controller: nVidia Corporation GT218 [GeForce 210] (rev a2)
01:00.1 Audio device: nVidia Corporation High Definition Audio Controller (rev a1)
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 06)
03:00.0 SATA controller: JMicron Technology Corp. JMB362 AHCI Controller (rev 10)
04:00.0 USB Controller: Device 1b21:1042
05:05.0 Multimedia video controller: Brooktree Corporation Bt878 Video Capture (rev 11)
05:05.1 Multimedia controller: Brooktree Corporation Bt878 Audio Capture (rev 11)
05:06.0 Ethernet controller: D-Link System Inc DGE-528T Gigabit Ethernet Adapter (rev 10)

где первый столбец адрес устройства. Выберем устройство 04:00.0

3. Запустите KVM c просом устройства указав его адрес например
kvm -m 512 -boot c -net none -hda /dev/zero -device pci-assign,host=04:00.0,id=hostpci0 -vga cirrus

На что получи вывод где приведены инструкции по пробросу устройства:
Failed to assign device "hostpci0" : Device or resource busy
*** The driver 'xhci_hcd' is occupying your device 0000:04:00.0.
***
*** You can try the following commands to free it:
***
*** $ echo "1b21 1042" > /sys/bus/pci/drivers/pci-stub/new_id
*** $ echo "0000:04:00.0" > /sys/bus/pci/drivers/xhci_hcd/unbind
*** $ echo "0000:04:00.0" > /sys/bus/pci/drivers/pci-stub/bind
*** $ echo "1b21 1042" > /sys/bus/pci/drivers/pci-stub/remove_id
***
kvm: -device pci-assign,host=04:00.0,id=hostpci0: Device 'pci-assign' could not be initialized


4. Выполним указанные инструкции
echo "1b21 1042" > /sys/bus/pci/drivers/pci-stub/new_id
echo "0000:04:00.0" > /sys/bus/pci/drivers/xhci_hcd/unbind
echo "0000:04:00.0" > /sys/bus/pci/drivers/pci-stub/bind
echo "1b21 1042" > /sys/bus/pci/drivers/pci-stub/remove_id


5. Осуществим повторный запуск
kvm -m 512 -boot c -net none -hda /dev/zero -device pci-assign,host=04:00.0,id=hostpci0 -vga cirrus
в результате должна запустится виртуальная машина с проброшенным устройством

В случае если в гостевой системе установлена лицензионная версия Windows вас попросят пройти процедуру авторизации по причине изменеия конфигурации оборудования.

В диспетчере устройств вы можете увидеть проброшенное устройство

В Linux устройство сразу обнаруживается однако подключение новых USB устройств не осуществляется

Не смотря на то что USB устройства не пробрасываются, сам USB котролер успешно пробрасывается. Конечно такой проброс не может быть использован на практике, однако даёт возможность понять что проброс устройств возможен при достаточном уровне знаний и возможностей системы.

PCI устройства в настоящее время не пробрасываются по причине возникновения ошибок, возможно что-то делалось не так как следует. Реализация технологии IOMMU в Linux и KVM можно считать сырой. Если вы желаете занятся пробросом устройств уже сегодня рекомендуем воспользоваться XEN так как в рамках проекта XEN уже реализованы средства проброса различных устройств. Имеются примеры проброса даже видео карт.