среда, 15 августа 2012 г.

Виртуализация с технологией VT-d в “домашних” условиях

Заняться виртуализацией двигало появившееся у меня желание сократить количество компьютеров в доме. У меня уже давно находится компьютер который является Wi-Fi точкой доступа, FTP сервером, является качалкой torrent и прочее. Вся работа на нём ведётся под управлением OC Linux. После покупки программно-аппаратного комплекса PC-3000 UDMA пришлось собрать ещё один компьютер под управлением Windows. PC-3000 оборудование хорошее, но к сожалению в сторону Linux разработчики даже не смотрят. Я решил объединить две системы в один компьютер используя виртуализацию, при этом Linux будет использоваться как основная система, а работа с PC-3000 будет вестись из гостевой виртуальной машины с Windows. Ситуация осложнялась тем что для такого объединения простая аппаратная виртуализация VT-x (Intel VT или AMD-v) имеющаяся на множестве процессоров мне не подходила. Для подобной системы требовалась более продвинутая аппаратная виртуализация, виртуализация ввода-вывода, называемая VT-d. Именно этот тип виртуализации позволяет пробросить любое устройство воткнутое в PCI или PCI-e шину в гостевую виртуальную систему.



Какие преимущества получаются при использовании такой системы? 

  • Пониженное потребление электроэнергии. Очевидно что одна система потребляем меньше электроэнергии чем две.
  • Снижение стоимости. Это преимущество актуально для тех кто только собирается собирать систему для ремонта или задумывается об обновлении платформы собранной для ремонта
  • Повышенная надёжность. Сервер как правило комплектуется источником бесперебойного питания, что позволит продолжать работу во время кратковременного пропадания электроэнергии.
  • Возможность удобно масштабировать дисковое пространство. При сохранении информации из виртуальной машины с использованием Samba или FTP сервиса, увеличение дискового пространства для виртуальной машины будет абсолютно прозрачным.
  • Удобство работы. Отсутствует привязка к рабочему месту. Подключив накопитель с которым требуется поработать можно подсоединившись удалённо к виртуальной машине продолжить работу с накопителем. При этом виртуальную машину можно перезагружать, выключать, снова включать зная что даже если возникнут серьёзные проблемы на этапе загрузки виртуальной машины их можно устранить удалённо.
  • Для меня так же очевидным преимуществом является опыт в работе с технологиями виртуализации получаемый при построении подобной системы.
Выбор оборудования
Создание платформы начнём с подбора оборудования. Для работы технологии виртуализации ввода-вывода VT-d необходима соответствующая поддержка со стороны материнской платы, BIOS (или EFI) материнской платы и реализация технологии VT-d в процессоре.

Начнём с выбора материнской платы. Технология VT-d гарантированно обслуживается линейкой чипсетов серии “Q”, начиная с самой ранней модели чипсета Q35 и заканчивая современной на данный момент моделью чипсета Q77. Это сужает круг поисков требуемой материнской платы, всё что нам нужно это посмотреть предложения материнских плат на рынке с данными типами чипсета. Мой выбор пал на модель от ASUS P8Q77-M, mATX формата. Хоть и дороговатая, но качественная, современная материнская плата. Ваш выбор возможно будет отличаться от моего, тут уж кому какой производитель но душе.

Проверяем поддержку VT-d на уровне BIOS или EFI. Тут достаточно просто, с материнскими платами идут инструкции по эксплуатации которые можно скачать с сайта производителя. Скачиваем инструкцию и начинаем искать в районе раздела “Advanced menu” строчку “Intel Virtualization Technology”. Эта строчка означает что есть поддержка технологии VT-x и помимо этого, при поддержке технологии VT-d к этой строчке обязательно должна идти строка “Intel TXT(LT) Support” заявляющая о гарантированной поддержке необходимой нам технологии Intel VT-d (Virtualization Technology for Directed I/O, технология виртуализации ввода/вывода).
Подбор процессора с поддержкой VT-d. 

Для подбора требуемого процессора воспользуемся выбором процессора по определённым критериям на сайтом компании Intel. По ссылке представлены Core i5 процессоры с поддержкой технологии VT-d с TDP от 45-и ватт (убраны варианты для мобильных систем). По возможности приобретайте процессор который идёт сразу с вентилятором, в этом случае в прайс листе продавца рядом с наименованием процессора идёт пометка “BOX”. Вентилятор в комплекте идёт достаточно тихий и качественный.

Желательно убедиться что выбранный процессор поддерживается выбранной материнской платой. Как правило таблица поддерживаемых процессоров находится на сайте производителя, посмотрите соответствие по наименованию процессора и версии BIOS материнской платы с которой эта поддержка анонсирована. При необходимости обновите BIOS до актуальной версии.

Программное обеспечение
После сборки оборудования устанавливаем операционную систему. Я уже давно пользуюсь CentOS, поэтому рассказ о конфигурации ПО буду вести на примере CentOS 6.3. По завершению установки системы смотрим установлены ли компоненты виртуализации. В случае отсутствия требуемых компонентов виртуализации они будут установлены в систему командой

[midnighter@localhost ~]$ yum groupinstall "Платформа виртуализации"

Настройка платформы виртуализации
Итак, все требуемые аппаратные и программные компоненты у нас имеются, самое время приступить к настройке.
  1. Активируем подержку VT-d в BIOS
    При старте системы по нажатию клавиши “Del” на клавиатуре попадаем в BIOS. Место расположения нужных опций которые требуется активировать отличается от поставщика BIOS, как правило это раздел “Advanced menu”. В этом разделе ищем строчки “Intel Virtualization Technology” и “Intel TXT(LT) Support” которые требуется переключить в “enabled”. По умолчанию как правило все опции виртуализации заблокированы.
  2. Активируем поддержку VT-d в ядре
    Для этого нам требуется добавить параметр intel_iommu=on к строке конфигурации ядра в файле /boot/grub/menu.lst
    Кроме того возможны случаи когда система может иметь проблемы с таблицами ACPI. Это проявляется в непрерывных сообщениях в логе похожих на подобную запись.
    dmar: DMAR:[DMA Read] Request device [00:02.0] fault addr 7f800000 
    dmar: DRHD: handling fault status reg 3
    
    В случае если такая проблема возникла для её устранения достаточно добавить запись intel_iommu=igfx_off 
    Пример ниже демонстрирует модифицированную запись файла menu.lst
    default=0
    timeout=5
    splashimage=(hd0,0)/grub/splash.xpm.gz
    hiddenmenu
    title Red Hat Enterprise Linux Server (2.6.32-36.x86-645)
            root (hd0,0)
            kernel /vmlinuz-2.6.32-36.x86-64 ro root=/dev/VolGroup00/LogVol00 rhgb quiet intel_iommu=on intel_iommu=igfx_off
            initrd /initrd-2.6.32-36.x86-64.img
    
  3. Перезагрузка системы
    Для применения новой конфигурации требуется перезагрузка. После перезагрузки проверяем активацию технологии виртуализации.
    midnighter@localhost ~]$ dmesg | grep "Virtualization Technology"
    PCI-DMA: Intel(R) Virtualization Technology for Directed I/O
    
Начиная с этого момента начала работать платформа с активированной технологией VT-d.

Настройка сервиса виртуализации
Программная часть виртуализации основана на сервисе libvirtd. Требуется убедиться что сервис стартует вместе с загрузкой основной системы, нам в этом поможет команда
[midnighter@localhost ~]$ chkconfig --list | grep libvirtd
libvirtd            0:выкл  1:выкл  2:выкл  3:вкл   4:вкл   5:вкл   6:выкл
В противном случае устанавливаем загрузку на уровнях 3, 4, 5 во вкл
Далее в файле /etc/sysconfig/libvirtd убираем комментарий со строки
# Listen for TCP/IP connections
# NB. must setup TLS/SSL keys prior to using this
LIBVIRTD_ARGS="--listen"
в файле /etc/libvirtd/libvirtd.conf убираем коментарии со строк
isten_tls = 0
listen_tcp = 1
Подобная конфигурация допустима на время тестирования. Позже если открываете доступ к виртуальной машине из локальной сети или интернета, обязательно настройте безопасный доступ в этом же конфигурационном файле.

Перезагружаем сервис виртуализации для того чтобы новая конфигурация вступила в силу
[midnighter@localhost ~]$ sudo service libvirtd restart
Создаём пользователя в SASL с помощью которого будем подключаться к сервису виртуализации.
[midnighter@localhost ~]$ sudo saslpasswd2 -a libvirt -c midnighter
Образы виртуальных машин хранятся в директории “/var/lib/libvirt/images”, целесообразно будет под образы выделить отдельный LVM том и добавить его автомонтирование в файл “/etc/fstab”. После этой операции определяемся с гостевой ОС. Я рекомендую установить Windows 7 Home Basic 32-х битной архитектуры. Почему именно эта система? Более продвинутые версии имеют в своём составе сервисы которые в холостую будут потреблять процессорное время попусту грея воздух и расходуя электроэнергию, Home Basic вполне достаточно для обычной работы. Оперативной памяти под такую гостевую систему которая будет работать только с ПО PC-3000 выделять более 2гб. излишне, поэтому вполне достаточно будет 32-х битной архитектуры. Теперь мы можем работать с образом виртуальной машины имеющим некоторый набор виртуального оборудования, но запускать такой контейнер и устанавливать на него операционную систему пока ещё рано.

Подключение к виртуальной машине
Для возможности удалённого подключения к сервису виртуализации требуется убрать комментарии со строчек vnc_listen = “0.0.0.0” и spice_listen = “0.0.0.0” в файле /etc/libvirt/qemu.conf и применить данную конфигурацию командой
[midnighter@localhost ~]$ sudo service libvirtd restart
При создании образа виртуальной машины идёт комплектация определённым набором оборудования настроенного по умолчанию. Графический адаптер в списке этого оборудования настроен на соединение с адресом “127.0.0.1”, поэтому требуется создать новый графический адаптер у которого после правки файла “/etc/libvirt/qemu.conf” появилась возможность указать “прослушивать все доступные интерфейсы”. В противном случе при удалённом подключении появится сообщение "ошибка соединения просмотрщика с хостом гипервизора". Позже обязательно настройте безопасный авторизованный доступ в файле “/etc/libvirt/qemu.conf”.

Подключаться к сервису виртуализации можно с помощью менеджера виртуальных машин, с помощью этой программы можно создавать и смотреть вывод дисплея виртуальной машины по протоколу VNC или SPICE. Какой протокол будет использоваться указываем в конфигурации видеоадаптера при создании машины. Также есть возможность отдельно сконфигурировать образ виртуальной машины консольной утилитой virsh, а затем для просмотра вывода дисплея виртуальной машины использовать программу для работы с протоколом VNC.

Пробрасываем устройство
Самый простой способ пробросить устройство при создании образа виртуальной машины это воспользоваться программой “менеджер виртуальных машин”. В этом случае при создании машины в разделе “Параметры виртуального оборудования” нажимаем кнопку “Добавить оборудование”. В появившемся списке выбираем “PCI Host Device” и после выбора этого пункта у нас появляется дополнительный перечень оборудования которое мы можем пробросить. Выбираем оборудование и после перезагрузки виртуальной машины всё что требуется сделать это установить драйвера на это оборудование. У меня это PC-3000 для которого я и установил требуемые драйвера и необходимое для работы программное обеспечение.

Работа с помощью консольной утилиты более сложна и детально описана в разделе 12.1 документации по пробросу PCI устройств с помощью virsh.




Как можно видеть из этой статьи, пробросить можно любое оборудование установленное в PCI или PCI-e шину и при этом полноценно работать и ним из виртуальной гостевой операционной системы.

2 комментария:

  1. Скажите, пожалуйста, можно ли пробросить PCI-e видеокарту?

    ОтветитьУдалить
    Ответы
    1. Надо пробовать. Конкретно с видеокартами могут быть подводные камни.

      Удалить