Я уже долго занимаюсь виртуализацией на десктопном железе, связанной с IOMMU напрямую. Конкретнее — «пробросом» видеокарты в виртуальную машину.
Позвольте мне привести некую выжимку из ситуации.
Лагерь зелёных производителей видеокарт:
«Энтузиасты занимаются этим, не купив наши профессиональные, ухудшенные и переоценённые видеокарты! Плохо, мы будем обнаруживать сигнатуру гипервизора в CPUID и выключать карту, если она проброшена в виртуальную машину».
«О ужас, они обошли это! Выпускаем новые драйверы, которые обнаруживают расширения Hyper-V и отключают карту. Пусть оно и будет работать без этих расширений, зато медленнее из-за процессора и памяти».
Конечно, в битве брони и снаряда победил энтузиазм: вместо покупки профессиональной карты народ подсовывает прошивку от неё подходящей десктопной карте и меняет её идентификаторы, иногда перепаивая резисторы, иногда программно, на стороне гипервизора. Вы думали, что времена переделки шестой серии зелёных видеокарт в их профессиональные аналоги ушли? Они вернулись.
А у кого-то видеокарта достаточно старая, чтобы использовать старые драйверы без этой замечательной функциональности.
Лагерь синих производителей процессоров и чипсетов:
«Ой, ваш процессор поддерживает данную технологию, а чипсет — нет. Ну и что, что контроллер PCI-E в процессоре и поддержка зависит от прошивки материнской платы, покупайте более дорогую материнскую плату с другим чипсетом». Самое забавное — некоторые производители материнских плат говорят, что всё будет работать: процессор же поддерживает!
«Ой, извините, так получилось: прошивка материнской платы (и производитель тут почти не важен) утверждает, что наши процессоры не изолируют PCI-E-устройства друг от друга, их не получится разделить на группы». Хотя на самом деле изолируют, и приходится прикручивать костыли на уровне ядра.
«Ой, вы купили наисовременнейшую материнскую плату на нашем новейшем чипсете с новейшей технологией памяти DDR4? Вы, несомненно, молодец, только вот наши процессоры разучились изолировать устройства, и костыли не помогут. Печалька».
«Вау, вы купили серверную материнскую плату и наш серверный процессор на базе десктопного! Мы можем порадовать вас улучшенной производительностью, надёжностью, поддержкой различных технологий, очень важных в энтерпрайзе. IOMMU? Ой, мы забыли. Ну, там так же, как на десктопах, разберётесь».
«Вы можете использовать встроенное в процессор видеоядро в качестве видеокарты для хост-системы, но, к сожалению, 2D-ускорение будет недоступно из-за того, что наши драйверы плохо работают с VGA».
И моё любимое: «Мы дружим с опенсорсом! Поэтому мы разработали супертехнологию, которая позволяет разделить наше видеоядро (производительность которого не уступает картам уровня затычки) на несколько виртуальных машин сразу! И планируем включить это в ядро Linux! Правда, у нас есть только прототип, который пока работает со скоростью бесколёсного велосипеда, но за этим будущее!» Действительно, это очень интересная технология, если бы не производительность, из-за которой эта технология никому не сдалась. Будто видеоядро само по себе не тормозит достаточно. Действительно, программной оптимизацией можно выжать из него поразительную мощность, но железо — это не панацея.
Лагерь красных производителей процессоров и видеоядер:
«Наши процессоры поддерживают IOMMU с давних времён, и на нашей производительной линейке десктопных процессоров всё работает как часы. Но наш отдел маркетинга решил прекратить разработку этой линейки процессоров, и основные силы сконцентрировать на…»
«Мы выпустили на их основе гибридные (или — модное маркетинговое слово — гетерогенные) процессоры со встроенным видеоядром! И это видеоядро даже сравнимо по производительности с нашими видеокартами среднего уровня! IOMMU? Ну… Так получилось, вы знаете, первый блин комом… Ну, в общем, вот вам список багов с пометкой „No Fix Planned“ на две страницы. Да, это баги в процессоре. Почему вы удивляетесь багу „Счётчик тактов может испытывать дрейф“? Зато у нас самые удобные видеокарты!»
«Кстати, о видеокартах… Мы рассказали производителям железок, как написать прошивку с поддержкой UEFI, но некоторые провалились. Энтузиасты склеят из двух одну, благо мы два года назад сказали, что блок поддержки UEFI универсальный, а всем остальным это не нужно». Зачем UEFI? Да потому, что если использовать традиционные технологии (VGA и BIOS), то начинаются такие пляски с памятью и прерываниями, что хост-система в панике выключается. И это её поведение прописано в документации. Пляски в том числе. Но если подобрать правильное железо, то всё работает.
«О, а ещё мы заботимся о энергопотреблении наших видеокарт, и их надо выключать особенным образом. Ну да, гипервизор об этом, как обычно, не знает, поэтому для повторного запуска карты надо перезапускать всю систему целиком».
«Хотите подробную документацию или хотя бы базовые спецификации вашего железа? Извините, вы должны подписать NDA. Да, температура перегрева процессора указана в документе под NDA. А зачем вам эти данные?» Но надо отдать должное, та документация, что есть — действительно крутая. Хотя и запутанная местами.
Особенно удивителен тот факт, что особенный способ трансляции памяти, разработанный и синими, и красными, в случае с пробросом видеокарт может ухудшать производительность, хотя вся теория его работы говорит об обратном.
Ещё можно понять и простить мелкомягких, которые ошиблись с реализацией видеодрайвера для UEFI в своей старой, но популярной ОС за седьмым номером. Тогда ещё были старые спецификации, и мир был немного другим. Благо, этот баг разработчики гипервизора научились обходить.
А так — да, всё работает, если грамотно подобрать железо. Можно запустить виртуальную машину с видеокартой и использовать там свои чудесные пакеты обработки изображений, 3D-редакторы и играть в игры сложнее «косынки».
И всё бы ничего, но ведь на основе этих же технологий работает энтерпрайз-ПО!
О да, можно работать в 3D-редакторе по сети с планшета, не беспокоясь о тормозах и безопасности. Только вот «под капотом» там тот же ужас, что и в пользовательском поле.
Пока я копался с этим, видеокарта, которую я хотел пробросить, успела устареть. Ну и ладно. Зато работает. А сколько всего нового успел узнать в процессе…