QEMU/KVM и установка Windows

  • Tutorial

Хотим мы того или нет, но программы, для которых необходима Windows, никуда из офисов не исчезли. В ситуации, когда их использование безальтернативно, лучше иметь виртуальную ОС, например для того, чтобы подключиться к аудио-конференции через Skype for Business.




В этой статье я расскажу, как можно с минимальными издержками установить гостевую ОС Windows на гипервизоре QEMU с помощью графического интерфейса virt-manager. Мы нанесем на карту все подводные камни и рифы, а жучков аккуратно посадим в банку.


Подготовка


Самый первый шаг — настройка параметров ядра. Обязательна поддержка KVM и vhost-net, желательна поддержка туннельных интерфейсов[1] и сетевого моста[2]. Полный список на Gentoo вики-странице QEMU.


Подготовьте дисковое пространство. Я выделил 70 GiB, и Windows 8.1 за пару месяцев использовала почти 50 GiB так, что для обновления до 10-й версии места на диске не хватило.


Далее, нам понадобится набор редхатовских драйверов virtio-win. Если у вас установлен RedHat, достаточно запустить


[root@server ~]# yum install virtio-win

и образ iso будет записан в каталог /usr/share/virtio-win/. Также можно его скачать с репозитариев Fedora.
Убедитесь, что поддержка аппаратной виртуализация включена в BIOS/UEFI. Без этого KVM не будет активирован, а virt-manager выдаст вот такую ошибку.




В качестве проверки можно прочитать файл устройства.


(2:506)$ ll /dev/kvm
crw-rw----+ 1 root kvm 10, 232 ноя 9 02:29 /dev/kvm

Если файл не обнаружен, а опции ядра выставлены верно, значит дело в настройках BIOS/UEFI.
Устанавливаем нужные пакеты.


(5:519)$ sudo emerge -av qemu virt-manager

Для RedHat 7 достаточно установить только virt-manager, так как QEMU устанавливается по умолчанию.


[root@server ~]# yum install virt-manager

Дебианщикам надо установить пакет qemu.


root# aptitute install qemu

Можно теперь переходить к установке.


Запуск и инсталляция


Запускаем virt-manager и создаем новую виртуальную машину из локального хранилища.




Указываем путь к установочному iso образу Windows.




Далее, на 3-м и 4-м шаге будет выбор количества CPU, объем RAM и размер дискового пространства, после чего на 5-м шаге следует выбрать дополнительные конфигурации перед настройкой.




Окно дополнительных настроек нужно для того, чтобы выполнить финт ушами. Его смысл в том, чтобы добавить виртуальный флопарь с драйверами из набора virtio-win. Это даст возможность изменить тип жесткого диска: удалить диск с шиной IDE и добавить его же, но с шиной VirtIO. Подробно, в доках RedHat.




Прописываем драйвер /usr/share/virtio-win/virtio-win.vfd и добавляем виртуальный флоппи-диск. Затем переходим на вкладку [Шина] Диск № и проделываем финт с заменой шины диска: удаляем с IDE и добавляем с VirtIO.




Чуть не забыл сказать, для чего нужен этот фокус. Специалисты утверждают, что с шиной VirtIO, производительность диска ощутимо выше.


В принципе, уже можно начинать инсталляцию, но мы забыли добавить CD-ROM с драйверами virtio-win, а они нам пригодятся, когда диспетчер устройств засверкает желтыми иконками вопросительного знака.




Ну вот теперь можно начать установку.




Ну хорошо, начали мы установку. А что, если установщик Windows попросит сменить диск? Мне из-за этого пришлось пару раз прервать и начать всю карусель заново, но с вами такого уже не случится.


(qemu) change ide1-cd0 /tmp/windows_8.1_x64_disk2.iso

Драйвера и доводка


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


Ethernet Controller
PCI Simple Communication Controller
SCSI Controller

Нужно скормить им драйвера из набора virtio-win, что подключены через IDE CD-ROM в предыдущем разделе.




Делается это стандартно: правой кнопкой на желтый знак вопроса, обновить драйвера, путь к файлам.




Вот весь список, а это соседняя страница RedHat доков, где установка драйверов показана подробнее.


  • Balloon, the balloon driver, affects the PCI standard RAM Controller in the System devices group.
  • vioserial, the serial driver, affects the PCI Simple Communication Controller in the System devices group.
  • NetKVM, the network driver, affects the Network adapters group. This driver is only available if a virtio NIC is configured. Configurable parameters for this driver are documented in Appendix E, NetKVM Driver Parameters.
  • viostor, the block driver, affects the Disk drives group. This driver is only available if a virtio disk is configured.

Оборудование


Тут постепенно начинается область безграничных возможностей и 101 способов сделать по-своему, поэтому я покажу, как это работает у меня, а вы можете настроить более точно под свои нужды.




У меня выбран дисплей Сервер Spice и звуковое устройство ich6. Нет, конечно, если у вас уйма времени и желание во всем разобраться до самых тонкостей — дерзайте и пробуйте альтернативные подходы, но у меня звук взлетел, вернее завибрировал, только с такими настройками. Во второй части, посвященной прогулке по граблям и отлову багов, я расскажу об этом подробнее. В закладке видео я выставил QXL, ибо с этой опцией, благодаря волшебному драйверу, мне удалось добиться нормального разрешения экрана.


Подключаться к ВМ можно разнообразно.


  1. Через графический интерфейс virt-manager
  2. Выбрать дисплей VNC-сервер и подключаться через vnc-клиента
  3. Установить Spice-клиента и подключаться через него
  4. К Windows можно подключиться через rdp, если включен терминальный сервер

У меня вариант 3, для Gentoo это программа spice-gtk


$ eix spice-gtk
[I] net-misc/spice-gtk
     Доступные версии:      0.31 ~0.32-r1 ~0.32-r2 **9999 {dbus gstaudio gstreamer gstvideo gtk3 +introspection libressl lz4 mjpeg policykit pulseaudio python sasl smartcard static-libs usbredir vala webdav PYTHON_SINGLE_TARGET="python2_7 python3_4" PYTHON_TARGETS="python2_7 python3_4"}
     Установленные версии:  0.31(16:05:41 18.06.2016)(gtk3 introspection pulseaudio python usbredir -dbus -gstreamer -libressl -lz4 -policykit -sasl -smartcard -static-libs -vala -webdav PYTHON_SINGLE_TARGET="python2_7 -python3_4" PYTHON_TARGETS="python2_7 python3_4")
     Домашняя страница:     http://spice-space.org https://cgit.freedesktop.org/spice/spice-gtk/
     Описание:              Set of GObject and Gtk objects for connecting to Spice servers and a client GUI

Сеть


Сеть для ВМ можно настроить по-разному, на Хабре умельцы уже об этом писали. Я перепробовал несколько способов, и в конце простота опять взяла вверх. Сама ВМ запускается из под рута[3], но графический интерфейс spice-gtk — из под обычного непривилегированного пользователя. Это позволяет решить дилемму: для сетевых опций нужны права рута, а для звукового демона pulseaudio, рут запрещен. Я пробовал навешать все права на обычного пользователя, но ничего не получалось, то pulse не пульсирует, то сеть не создается, там много а тут мало. В итоге решил так и доволен. Буду рад, если в комментариях будет найден лучший способ.




Такой простой выбор сетевых опций дает результат превосходящий ожидания. Создаются 3 дополнительных сетевых интерфейса: virbr0, virbr0-nic, vnet0.


$ ip addr
...
4: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:54:00:cc:2a:1e brd ff:ff:ff:ff:ff:ff
    inet 192.168.102.1/24 brd 192.168.102.255 scope global virbr0
       valid_lft forever preferred_lft forever
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:cc:2a:1e brd ff:ff:ff:ff:ff:ff
11: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN group default qlen 1000
    link/ether fe:54:00:fb:50:45 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fefb:5045/64 scope link 
       valid_lft forever preferred_lft forever

В iptables создается свод правил, вот основные:


$ sudo iptables -L
...
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             192.168.102.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.102.0/24     anywhere 

Windows ВМ:


C:\Users\user>ipconfig

Windows IP Configuration
Ethernet adapter Ethernet 2:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::90c3:a458:6645:7b9a%7
   IPv4 Address. . . . . . . . . . . : 192.168.102.203
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 192.168.102.1

Tunnel adapter isatap.{BD8F0DA4-92A8-42BD-A557-23AC89AED941}:

   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . :

Tunnel adapter IPHTTPSInterface:

   Connection-specific DNS Suffix  . :
   IPv6 Address. . . . . . . . . . . : 2620:0:a13:8a7:51af:79ae:92b8:828a
   Temporary IPv6 Address. . . . . . : 2620:0:a13:8a7:b49d:81fe:e509:16e7
   Link-local IPv6 Address . . . . . : fe80::51af:79ae:92b8:828a%15
   Default Gateway . . . . . . . . . :

Повторяю, все это libvirtd создает сам, ничего для этого делать не надо. В результате имеем нормальный роутинг между хостом и ВМ, можно обмениваться файлами по ssh / scp. Можно пойти дальше и создать шару на Windows, а на Linux хосте настроить samba, но мне это показалось избыточным.


В завершение


Трудно рассказать в одной статье обо всех аспектах Windows + QEMU/KVM, поэтому завершим в следующей. А там будет самый смак, командный интерфейс, разрешение экрана максимум 1024x768, Сцилла pulseaudio и Харибда сети, команда virsh и настройка ВМ из конфиг файла, фейл с tpm, двоичный синтаксис устройств и прочие тихие радости.




  1. TUN/TAP interfaces
  2. Ethernet bridging
  3. От английского root
Поделиться публикацией

Комментарии 34

    +11
    Ну… Прямо скажем — установка винды под виртуалкой — это тривиальная вещь, с которой справится практически кто угодно.
    Ожидал, что в статье будет затронут и подробно рассмотрен вопрос проброма PCI устройств(видеокарты, например). Т.к. это действительно важная часть удобного использования винды под виртуалкой. И в то же время не самая простая часть настройки виртуалки. Особенно благодаря вендорам типа NVidia, которые намеренно блокируют возможность проброса в драйверах.
    Это была бы интересная и познавательная статья… А how-to установки видны, как я уже выше писал — это просто и врядли вызывает у кого-то вопросы.
      –5
      Не могу с Вами согласиться. Мне пришлось помучиться с видео, звуком, сетью. Tpm не получается задействовать. Возможно, сама установка и легко происходит, но вот получить на выходе рабочую как надо систему, сложнее.
      Во второй части я затрону эти вопросы, документация там запутана и есть над чем поколдовать.
      0
      Интересный аспект с виртуальными машинами — это возможный проброс второй видеокарты в гостевую ОС.
      Платой вроде бы должно поддерживаться IOMMU
        0
        И процессор должен поддерживать VT-d
          +1
          Кроме этого в случае с Nvidia нужно еще шаманить с правильной настройкой параметров запуска (прячем KVM и отключаем фичи Hyper-V) иначе будет Ошибка 43 от драйвера.
            –2
            Это уже детали настройки. Ветка все таки про железные требования
        0
        Посоветуйте толковую веб-морду для управления виртуалками KVM. Что-то типа phpVirtualBox…
          +6
          Как вариант взять сразу дистрибутив ProxMox?

          image
          image
          image
            +1
            У них недавно новый релиз был — 4.3. Пофиксили много багов, обновленная веб-морда, состояние дисков теперь через нее можно посмотреть и настройки ceph. Недавно обновил один из тестовых серверов.
              0
              Давно на них целился, но у меня сервер одновременно медиацентр с Kodi. Неудобно. Поэтому просто KVM под Debian и виртуалки с управлением через RedHat'овский virtual machine manager. Хватает.
                0
                У меня тоже сервер одновременно Коди-центр, именно под Proxmox — очень даже удобно. Медиацентр — это тоже ВМ, точнее контейнер с пробросом видеокарты и юсб-портов (без IOMMU, это же контейнер) и pulseaudio по tcp. Если бы было IOMMU — можно было бы вообще видеокарту пробросить и было бы идеально вообще — никакого геморроя с настройкой контейнера и пробросом.
                  0
                  Я не решился пробрасывать видео)
                    0
                    Собственно, сейчас видеокарту можно пробросить почти везде. Даже nvidia, которые блокируют такую возможность в своих драйверах. Работает в kvm/xen/esxi. Личный опыт — esxi и GTX750ti.
                      0
                      Надо попробовать. Kodi — это последний сервис, который у меня привязан к ОС. И по-хорошему надо мигрировать на Ubuntu. Свежее и проще с плагинами. У меня Intel Core i5-3470. VT-d поддерживает. MSI B75IA-E33 — материнская. Видеокарта только интегрированная. Собственно, я уже задумался о переносе. Посоветуете что-то почитать? Заодно тот же вопрос к DaylightIsBurning.
                        0
                        Хотя мне еще Asus Xonar — звуковую карту пробрасывать придется…
                          0
                          Если видеокарты ещё нет — то radeon пробрасывается проще, приятнее и быстрее. И мигрировать, вероятно, лучше на http://openelec.tv/, если у вас нет потребности в дополнительных сервисах внутри данной виртуальной машины.
                          Ну и линк на официальную документацию: https://pve.proxmox.com/wiki/Pci_passthrough (в ней всё просто и понятно).
                          Впрочем, в первую очередь вам необходимо проверить наличие настройки vt-d в uefi вашей платы. Идеальный вариант — найти у друзей подходящую видеокарту и проверить работоспособность всей системы. После этого можно уже покупать.
                          (Спасибо за ваши статьи :) )
                            0
                            Всегда пожалуйста) насчет дискретной видеокарты — беда. Это mini-itx. Единственный PCI-E занят звуковой картой.
                              0
                              Увы, виртуализация встроенной видеокарты (KVMGT) не возможна для поколений ниже четвёртого. Так что придется или жертвовать звуком (у вас же всё равно hdmi устройство на втором конце кабеля выводит звук), или менять железо целиком.
                                0
                                Ну или уйти на связку «файловый сервер» + «коробочка для kodi». Здесь помогут всевозможные устройства с Android TV, например. Либо любое иное устройство с поддержкой нормальных дистрибутивов линукс и аппаратным ускорением.
                                  0
                                  У меня на втором телевизоре RaspberryPie так работает. С HDMI звуком тоже не пойдет. Ниже по течению акустика домашнего кинотеатра. Это позволяет в том числе включать музыку через Kodi без телевизора.
                            0
                            Если есть IOMMU (поддержка нужна не только от ЦПУ, но и материнки), то проброс в KVM делается легко. Проброс звуковухи можно не делать, а просто по TCP/IP Pulseaudio соеденить. Не знаю, можно ли пробросить встроенное видео (даже если есть Vt-d). Если IOMMU не работает — можно пробросить видео в контейнер (не ВМ). Я так сделал на проксмосе. У меня встроенное видео от AMD, пробросил его в контейнер (KUbuntu) — всё работает, даже проприетарные дрова. На этом контейнере у меня Kodi. Можно даже пару таких контейнеров сделать, один «десктоп» и один медиацентр и запускать по очереди.
                              0
                              По поводу того, как настроить lxc контейнер в роли десктопа/медиацентра я в свое время исчерпывающего мануала не нашел, но по кускам инфу в гугле собирал. Ключевые слова lxc, desktop, gui, container, passthrough, gpu, video, pulseaudio и т.п. На гитхабе есть соотв. проект, но у меня не вышло его запустить, да и версия контейнера тогда вроде была 12.04, а я предпочитаю свежие версии для десктопной ОС. На тот момент мне удалось запустить контейнер с ubuntu 15.10, я установил Kodi и больше не трогал. Как будет время, попытаюсь воспроизвести процедуру и поставить 16.10… Я сначала просто добавил контейнер стандартным путём в проксмоксе, потом его менял.
                              Тут могут быть полезные куски конфигов:
                              https://www.stgraber.org/2014/02/09/lxc-1-0-gui-in-containers/
                              https://www.flockport.com/run-gui-apps-in-lxc-containers/
                              http://unix.stackexchange.com/questions/191289/docker-how-to-run-x-desktop-in-a-container
              0
              Busyness?))
                0
                Я на этом слове всегда ошибаюсь.
                +1
                «Как поставить Windows в KVM» — это точно статья для хабра, а не Компьютерры какой-нибудь?
                  0
                  Какой-нибудь?
                    +4
                    В принципе эта статья — руководство.
                    Подумайте сами: если исключить из хабра руководства, статьи на исторические темы по IT, то остаётся только два крупных направления —
                    1) реклама компаний
                    2) рассказы о том, как я написал игру/взломал чего-нибудь/нашёл уязвимость/восхваления и поругания отдельных языков программирования.

                    Ну и алгоритмы с математикой, в которые очень не часто что-то пишут.

                    Т.е. в принципе хабр остается рекламной площадкой для компаний и отдельных индивидуумов.
                    Это ж вроде бы не учебник и не Википедия
                      –2
                      Вы могли бы в дисклеймер просто добавить, что статья не решает никаких нетривиальных проблем и тем кто знаком с QEMU скорее всего будет неинтересна.
                        +2
                        Это подразумевается тэгом tutorial. Автор обозначил категорию материала и материал ей соответствует.
                          0
                          тоже верно, но мне кажется, добавить подобный дисклеймер не повредит, а негатива от аудитории, ожидающей большего и разочарованной поубавится.
                    0
                    Даже стабильные драйверы для гостевой системы иногда вызывают проблемы, так что стоит рассмотреть использование образа с последними драйверами.
                      0
                      Хотелось уточнить версии по номерам. Какие посоветуете версии без глюков для установки Virtio драйверов, которые проверены и стабильны для windows 8.1, linux, unix, windows server 2012R2. На какую лучше систему поставить linux/unix(debian, freebsd10, ubuntu)?
                        +1
                        Последняя версия драйверов virtio для windows 0.1.126 — их я и советовал бы использовать. Со старыми версиями драйверов были проблемы, драйверы на некоторый устройства даже не устанавливались.

                        На FreeBSD нет KVM. Debian/Ubuntu/CentOS — вопрос вкуса, как вам больше нравится. Главное чтобы ПО было достаточно актуальное.
                    • НЛО прилетело и опубликовало эту надпись здесь

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое