[d | an-b-bro-fr-gf-hr-l-m-maid-med-mi-mu-ne-o-old_o-p-ph-r-s-sci-sp-t-tran-tv-w-x | bg-vg | au-mo-tr | a-aa-abe-azu-c-dn-fi-hau-jp-ls-ma-me-rm-sos-tan-to-vn | misc-tenma-vndev | dev-stat]
[Burichan] [Futaba] [Gurochan] [Tomorrow] [Архив-Каталог-RSS] [Главная]

Файл: 2014-10-13-065704_1366x768_scrot.png -(148 KB, 1366x768, 2014-10-13-065704_1366x768_scrot.png)
148 No.162014  

Привет, Лейн и Клумба-тян. Юккуря на связи. Думаю вам это будет интересно. Ну и Чии пускай почитает, может ей тоже занятно будет.

(не без помощи треда на арчевем форуме: https://bbs.archlinux.org/viewtopic.php?id=162768 , гугла и ответов людей из ирца).

Хочу поделиться историей успекса проброса Nvidia 780GTX (а ранее - Radeon HD7870 и Nvidia 9800GT) в виртуалку с виндой. Это оказалось совсем несложно и достаточно стабильно для ежедневного домашнего использования на протяжении порядка полугода. Не факт что именно вам это окажется полезным, но имейте в виду такую возможность.

В общех чертах технология выглядит следющим образом: в свежем, слегка пропатченном ядре линукса часть PCI-девайсов системы отдаётся из владения непосредственно хоста некому модулю ядра, который в последствии может представить KVM или XEN-виртуалке (хотя продолжительное время я пользовался только KVM, так что за стабильность XEN-решения не ручаюсь) эксклюзивный доступ к этому девайсу. Доступ действительно эксклюзивный, другие виртуалки или сам хост этим девайсом одновременно с гостем-виртуалкой пользоваться не могут. Но это мелочи, в конце концов всегда можно взять двухголовую материнку и отдать во владение виртуалки только одну из видеокарт или пользоваться на хосте встроенной графикой типа IGD. Используемые технологии называются VT-d (бренд intel) и IOMMU (термин AMD и общий термин виртуализации девайсового I/O).

Пробрасываются практически любые дискретные видеокарты, как ATI (истории успеха на линейках 5xxx, 6xxx, 7xxx и 2xx) так и Nvidia (истории успеха на линейках 7xxx, 8xxx, 9xxx, 4xx, 5xx, 6xx и 7xx). Встроенная графика типа IGD не пробрасывается, увы. Но и смысла в этом по сравнению с обычной эмуляцией VGA не так много. Однако есть ещё нюансы:

  • прежде всего нужен процессор с поддержкой IOMMU/VT-d. Только некоторые модели i5 и не все модели i7 подходят. За AMD не скажу, но возможно тоже далеко не каждый экземпляр процессора подойдёт. Уточнить можно скорее всего на сайтах производителей камней, есть ли у конкретной модели нужная технология. Я использовал только Core i7-3770 (без всяких буквенных суффиксов, да).
  • так же нужна поддержка такой же тенхологии от матери. Я экспериментировал с двумя интеловыми, на чипстах Z77, одна была с двумя PCI-Ex16, другая с одним. Список чипсетов опять же гуглится на сайте интела и, думаю, амд.
  • пробрасываемая видеокарта может (в зависимости от чипсета, фирмвари матери и чёрт знает чего ещё) потребовать размещения в primary-слоте (обычно, верхнем, если мать о двух видеокартах, но всё зависит от конкретной схемы конечно, предлагаю обратиться к мануалу матери для уточнения), а так же может потребовать выставления как Primary Video Adapter в BIOS'е (соответсвенно, сам интерфейс биоса начнёт отображаться на ней же).

В остальном требований к железу нет, всё что потребуется (более старая технология VT-x у интела, например) скорее всего и так будет включена в соотвтествующий сетап.

Теперь требования к софту.

  • потребуется относительно свежее (лучше всего - ванильное или близкое к таковому, я использовал как чисто ванильку, так gentoo-sources с гентушными патчами) ядро >= 3.9 версии, я сейчас использую 3.17.0-rc7.
  • так же потребуются как минимум один (а возможно два или три) патча, которых нет (не было) в апстриме: acs override и i915 (эти два есть по ссылке в ОП-посте на форуме арча, в тарболле linux-mainline.tar.gz и второй нужен только если используется интеловый IGD). Третий, уже похоже включённый в апстрим 3.17 патч: i915 vga arbiter fixes ( https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/patch/?id=4e4e7dc55af5aa62497ac060e3cfd143bd4b4db3 , тоже нужен только пользователям интелового IGD ).
  • так же может потребоваться гитовая qemu, хотя может быть версия 2.1.1 уже содержит все необходимые патчи; в любом случае всё уже есть в апстриме. Патчить seabios уже не надо, по крайней мере с его версией 1.7.5 .

Собственно, всё, остальное - дело конфигурации ядра, модулей и собственно qemu.

>> No.162015  

Прежде всего надо собрать kvm, kvm_intel (или kvm_amd) как модули. Вкомпиленные в ядро могут работать немного не так, как хочется, хотя может у меня просто были руки кривые. vfio, vfio-pci и pci-stub так же стоит собрать модулями. Включить BRIDGE и TUN/TAP может быть полезным для одного из самых простых и удобных сетапов сети, но не обязательно. Можно их и вкомпилить, если хочется. Остальное - по вкусу для конкретной системы.

В опциях ядра, помимо специфичного для конкретной системы (привет, systemd и всякоразные initrd) надо указать что-то вроде intel_iommu=on noirqdebug.
Для стабильной работы VGA-адаптера мне так же потребовалось создать файл с контентом:

# cat /etc/modprobe.d/vfio_iommu_type1.conf
options vfio_iommu_type1 allow_unsafe_interrupts=1
options kvm allow_unsafe_assigned_interrupts=1 ignore_msrs=1

(имеено как для модулей, из опция ядра типа vfio_iommu_type1.allow_unsafe_interrupts=1 это давало всякие непонятные фризы всей системы без каких-либо пояснений в dmesg'е почему-то)

собственно, кернел-левел конфигурация на этом заканчивается, начинается qemu. Там идёт длинный конфиг типа того что на ОП-пике и его я запощу отдельным постом, чтобы всё влезло, вместе с пояснениями.

Прежде всего потребуется хелпер-функция, которая будет кидать pci-девайс в pci-stub, отбирая при этом у нормального драйвера хост-системы:

move_device () {

BDF=$1; shift
DRV=$1; shift
BND=$1; shift

# Unbind a PCI function from its driver as necessary
[ -e /sys/bus/pci/devices/$BDF/driver/unbind ] && \
echo -n $BDF > /sys/bus/pci/devices/$BDF/driver/unbind

# Add a new slot to the PCI Backend's list
vendor=$(sed 's/^0x//' /sys/bus/pci/devices/$BDF/vendor)
device=$(sed 's/^0x//' /sys/bus/pci/devices/$BDF/device);
echo -n $vendor $device > /sys/bus/pci/drivers/$DRV/new_id 2>/dev/null

# Now that the backend is watching for the slot, bind to it
[ "x$BND" = "xtrue" ] && \
echo -n $BDF > /sys/bus/pci/drivers/$DRV/bind

}

Использовать можно следующим образом:

move_device "0000:01:00.0" "vfio-pci" # переместит праймари видеокарту на vfio-pci
move_device "0000:01:00.1" "vfio-pci" # переместит девайс на видеокарте (в моём случае - hdmi аудиокарта) туда же. На vfio-pci надо забиндить все поддевайсы на шине основного девайса.
move_device "0000:00:1a.0" "pci-stub" # перместит обычный PCI USB-контроллер (целиком, со всеми висящими на нём девайсами) во власть pci-stub и впоследствии - виртуалки.

Использовать vfio-pci для обычных PCI устройств обычно оверкилл, pci-stub'а достаточно.

Смотреть конретные идентификаторы на шине можно на том же lspci и добавляя к началу идентификатор глобальной PCI-шины (обычно это почти всегда 0000).

Далее идёт крокодил собственно запуска виртуалки в моём случае:

>> No.162016  

PULSE_SERVER=127.0.0.1 \
QEMU_AUDIO_DAC_FIXED_FREQ=44100 \
QEMU_AUDIO_ADC_FIXED_FREQ=44100 \
QEMU_AUDIO_DRV=pa \
qemu-system-x86_64 \

-enable-kvm -m 16384 -M q35 \
-cpu Haswell,hv-time,hv_relaxed,hv_vapic,hv_spinlocks=0x1fff -smp 6 \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \
-device vfio-pci,host=01:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on \
-device piix4-ide,bus=pcie.0,id=ahci \
-device ide-hd,bus=ahci.0,drive=disk \
-device ich9-intel-hda,bus=pcie.0,addr=1b.0,id=sound0 \
-device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 \
-bios /usr/share/qemu/bios.bin \
-vnc none \
-drive file=/dev/virt/win7,id=disk,format=raw \
-net nic,model=rtl8139,macaddr=52:54:00:08:d9:75 \
-net tap,script=/home/user/bin/asset/qemu-ifup \
-device pci-assign,host=00:1a.0,bus=pcie.0,addr=1a.0 \
-usb \
-usbdevice host:044f:0404 $(: joystick) \
-usbdevice host:044f:0402 $(: joystick) \
-usbdevice host:06a3:0764 $(: pedals) \
-usbdevice host:131d:0158 $(: TrackIR) \
-boot menu=on -vga none -no-hpet

разберём по частям:

PULSE_SERVER=127.0.0.1 # поскольку запуск скорее всего будет (как в моём случае) вне контекста сессии дбаса и pulseaudio, то чтобы был звук - указываем сервер пульсы как локальный. В моём случае это ещё необходимость гнать звук на эту машину по сети и в /etc/pulse/default.pa надо что-то типа

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/24 auth-anonymous=1

QEMU_AUDIO_DAC_FIXED_FREQ=44100 \ # говорим qemu использовать частоты
QEMU_AUDIO_ADC_FIXED_FREQ=44100 \ # 44100 для звука
QEMU_AUDIO_DRV=pa \ # и драйвер pulseaudio в общем.

-enable-kvm -m 16384 -M q35 \ # включаем kvm в qemu и выделяю 16 гигов памяти (из 32-ух) на чипсете seabios q35.

-cpu Haswell,hv-time,hv_relaxed,hv_vapic,hv_spinlocks=0x1fff -smp 6 \ # даём виртуалке что-то типа CPU на базе haswell с некими Hyper-V (вендоприколы, ага), как их называют, enlightenment'ами. По-большому счёту для увеличения производительности нужен только hv-time (дефис или подчёркивание вроде как равнозначны), остальные hv_* не то чтобы нужны, но могут быть полезными. -smp 6 говорит что выделям 6 ядер (из восьми в моём случае).

-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \ # выделяет PCI-E шину с айди root.1

-device vfio-pci,host=01:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on \ # устанавливает пробрасываемый VGA-адаптер (важны параметры multifunction=on и x-vga=on) на хостовой шине 01:00.0. Поддевайсы типа аудиокарты на видеокарте можно не пробрасывать, достаточно иметь их на vfio-pci.

-device piix4-ide,bus=pcie.0,id=ahci \ # добавляем ide-шину для виртуального жёсткого диска

-device ide-hd,bus=ahci.0,drive=disk \ # и вешаем на неё диск с id=disk (укажем впоследствии)

-device ich9-intel-hda,bus=pcie.0,addr=1b.0,id=sound0 \ # создаёт и размещает на pcie-шине
-device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 \ # стаднартную intel-hda-duplex аудиокарту, которую будет видеть виртуалка

-bios /usr/share/qemu/bios.bin \ # указываем путь до seabios'а

-vnc none \ # отключаем vnc-сервер, встроенный в qemu

-drive file=/dev/virt/win7,id=disk,format=raw \ # указываем некий девайс (в моём случае - партитиция lvm целиком) в качестве диска, под id=disk для ide-шины, что указывал и ранее

-net nic,model=rtl8139,macaddr=52:54:00:08:d9:75 \ # создаём некую генериковую сетевуху с определённым мак-адересом

-net tap,script=/home/user/bin/asset/qemu-ifup \ # и указываем ifup-скрипт для этой сетевухи. Выглядит он примерно так: ip link set $1 up promisc on; brctl addif br0 $1; sleep 2. br0 бридж разумеется должен быть сконфигурирован до запуска скрипта.

-device pci-assign,host=00:1a.0,bus=pcie.0,addr=1a.0 \ # вешаем один из USB-контроллереров на pcie.0 шину виртуалки.

-usb \ # включаем давно всем известный usb-passthrough

-usbdevice host:044f:0404 $(: joystick) \ # и кидаем в виртуалку
-usbdevice host:044f:0402 $(: joystick) \ # пачку USB-устройств.
-usbdevice host:06a3:0764 $(: pedals) \ # смотреть их айдишники можно в
-usbdevice host:131d:0158 $(: TrackIR) \ # lsusb. штуки в $(: строках) -- просто хитрый способ сделать инлайн-коментарий на баше.

-boot menu=on -vga none -no-hpet # включем загрузочное меню seabios'а, отключаем эмуляцию vga-дисплея (у нас и так есть видеокарта) и выключаем глючный HPET qemu (его роль играть будет hv-time в опциях CPU).

Вот собственно и всё. Так, при помощи изоленты, молотка и зубила можно из буханки хлеба... ой. Ну вы поняли.

В моём случае, чего я не мог достигнуть просто поставив винду: это стеап дал возможность гнать в вендовую машину звук по сети через протоклы pulseaudio с минимальной латенси (виндовая версия пока ещё очень сыра и тормозит на 200 мс минимум) и использовать шаредную LVM-партитицию для нужд венды вместо живого разрозненого железа. Ну а так же такой сетап не лишил меня второго потенциального монитора на IGD с линуксом на том же хосте.

P.S. Пишу с ноутбука.
P.P.S. Вот честно, отправлю и пойду спать. Честно-честно.

>> No.162017  

>>162014
Сложности.
Вроде Citrix XenServer давно заявляли официальную поддержку "проброса" видеоекарт в гостевую систему. Почему всё ещё нужно что-то патчить и конпелировать?

>> No.162018  

Кстати, virt-manager не используешь?

>> No.162019  

Проснуто.

>>162017
Не разбираюсь, но подозреваю что citrix предоставляет свою сборку ядра с необходимыми патчами. с XEN'ом есть ещё сложность, если две видеокарты и хосту отсавлена какая-нибудь нвидия, то могут быть затыки с поприетарными драйверами.

>>162018
Нет, не умею в гуепряталки и кнопочкоискалки :/ а через virsh если делать - зачем если можно сразу указать чего ты хочешь от кемы?

>> No.162020  
Файл: sample_42f7d2f8b26bd6efda870805d4473848.jpg -(239 KB, 850x1133, sample_42f7d2f8b26bd6efda870805d4473848.jpg)
239

Схоронил. Как будет потребное железо - обязательно попробую. и угораздило же меня купить именно тот i5 где нету vt-d Т_Т

>> No.162021  

А этот ваш Xen можно присобачить к мак мини? Чтобы и OS X, и венда, и BSD'а работали в полную силу?
И как оно будет работать с маковскими фичами типа раздела EFI/RecoveryHD и родным загрузчиком OS X?

>> No.162022  

>>162021
Вот тут не знаю. OSX запускать ещё доводилось, когда-нибудь обязательно попробую. С BSD проблем быть не должно, по-идее. Разве что ненужными станут всякие hv-* флаги, наверное.

>> No.165902  

Вверх для популярности.

>> No.165903  
Файл: 05d7862c24b065fe7d3aa4be607d71ddb53e00e8.png -(69 KB, 480x640, 05d7862c24b065fe7d3aa4be607d71ddb53e00e8.png)
69
>Юккуря

Ты хоть представляешь, через что тебе придётся пройти, чтобы снова стать человеком?!

//(не открывать, там спойлер полный)

>> No.165907  
Файл: welcome.jpg -(89 KB, 525x413, welcome.jpg)
89

>>162014

>Юккуря

С юккуричана, чито ли?

>> No.165977  
Файл: Kaguya.png -(42 KB, 273x221, Kaguya.png)
42

>>165903
Лучше умереть, чем есть капусту!

>>165907
Нет, вобще со скайпового пучата.11




[d | an-b-bro-fr-gf-hr-l-m-maid-med-mi-mu-ne-o-old_o-p-ph-r-s-sci-sp-t-tran-tv-w-x | bg-vg | au-mo-tr | a-aa-abe-azu-c-dn-fi-hau-jp-ls-ma-me-rm-sos-tan-to-vn | misc-tenma-vndev | dev-stat]
[Burichan] [Futaba] [Gurochan] [Tomorrow] [Архив-Каталог-RSS] [Главная]