Пчёлки в деле, или Запускаем Windows на BSD Hypervisor

Автор: | 08.10.2016

Я джва года этого ждал! В январе 2014 года прочитал в FreeBSD 10.0-RELEASE Release Notes следующее:

[amd64] The BSD Hypervisor, bhyve(8) is included with FreeBSD. bhyve(8) requires Intel CPUs with VT-x and Extended Page Table (EPT) support. These features are on all Nehalem models and beyond (e.g. Nehalem and newer), but not on the lower-end Atom CPUs.

И сразу подумал, что bhyve — это отличная штука, особенно при использовании в паре с ZFS. Это позволит расширить область задач, которые можно решать с помощью FreeBSD, и увеличит популярность данной системы у IT-специалистов. На тот момент поддержка гостевых ОС была ограничена BSD-семейством и Linux, но время шло и вот, с выходом FreeBSD 11.0-RELEASE, уже официально стало возможно запустить гостя с Windows, да ещё с установкой в графическом режиме.

Устанавливать буду Windows 10 — её можно ставить как есть, а для установки более старых версий потребуется интегрировать драйвера virtio в ISO-образ (инструкция). Утилиту для создания ISO-образа с последней актуальной версией можно загрузить с сайта Microsoft.
002003004

  1. Создадим том ZFS для хранения данных ВМ (при необходимости замените pool/usr/bhyve):
    # zfs create pool/usr/bhyve
  2. Чтобы было проще управлять ВМ, установим sysutils/vm-bhyve:
    # portmaster sysutils/vm-bhyve
    # sysrc vm_enable="YES" vm_dir="zfs:pool/usr/bhyve"
    vm_enable:  -> YES
    vm_dir:  -> zfs:pool/usr/bhyve
    # vm init
  3. Дополнительно можно скопировать типовые шаблоны для ВМ:
    # cp /usr/local/share/examples/vm-bhyve/* /usr/bhyve/.templates/

    А при использовании csh есть смысл прописать в файле ~/.cshrc правила автодополнения:

    complete vm \
     'p@1@(list create install start stop console configure reset poweroff destroy clone snapshot rollback add switch iso)@' \
     'n@create@n@' \
     'n@list@n@' \
     'n@iso@n@' \
     'n@switch@(list create add remove destroy vlan nat)@' \
     'N@switch@`sysrc -inqf /usr/bhyve/.config/switch switch_list`@' \
     'N@install@`ls -1 /usr/bhyve/.iso`@' \
     'N@nat@(off on)@' \
     'p@2@`ls -1 /usr/bhyve | grep -v "^\." | grep -v "^images"`@'

    И активировать их:

    # source ~/.cshrc
  4. Настроем сеть. Для этого создадим виртуальный коммутатор и свяжем его с физическим интерфейсом (при необходимости замените em0):
    # vm switch create public
    # vm switch add public em0

    Если требуется, то можно аналогичным образом настроить NAT и VLAN.

  5. Для запуска Windows потребуется эмулятор UEFI. Установим его:
    # portmaster sysutils/bhyve-firmware
    
    ===>>> The following actions will be taken if you choose to proceed:
            Install sysutils/bhyve-firmware
            Install sysutils/uefi-edk2-bhyve
    
    ===>>> Proceed? y/n [y]

    Обновление от 27.02.2018. Перед выполнением следующего шага рекомендую ознакомиться с комментарием Александра. Лично я тормозов не наблюдаю, но решение за вами.

    # ln -s /usr/local/share/uefi-firmware/BHYVE_UEFI.fd /usr/bhyve/.config/BHYVE_UEFI.fd
  6. Наконец, создадим нашу первую ВМ с шаблоном «windows» и размером диска 30 ГиБ (при необходимости замените wintest):
    # vm create -t windows -s 30G wintest
  7. Откроем настройки ВМ:
    # vm configure wintest

    И добавим следующие строки:

    graphics="yes"
    graphics_res="1600x900"
    graphics_wait="yes"
    xhci_mouse="yes"

    Обязательный параметр только graphics, остальные добавляем по вкусу. Параметр graphics_res позволяет задать более удобное разрешение экрана (значение по умолчанию 800×600). С помощью graphics_wait можно приостановить загрузку ВМ до тех пор, пока не будет установлено подключение по VNC, чтобы не пропустить самое интересное. А xhci_mouse позволит использовать USB-эмуляцию мыши вместо PS/2 (работает только в новых версиях Windows, но работает лучше).

  8. Теперь всё готово к началу установки. Предполагается, что в директории /usr/bhyve/.iso вы уже разместили подходящий ISO-образ:
    # vm install wintest Windows_10_1607.iso

    Проверим результат:

    # vm list
    NAME            DATASTORE       LOADER      CPU    MEMORY    VNC                  AUTOSTART    STATE
    wintest         default         uefi        1      2G        *:5900               No           Locked
  9. Теперь можно подключаться по VNC и проводить установку в привычном для многих графическом режиме.
    006008
  10. Осталось дело за малым — установить драйвера для сетевого адаптера. Скачать их можно отсюда: archive-virtio, но есть нюанс — они не все корректно работают. В частности, у меня не заработала версия 0.1.126, поэтому используем версию 0.1.118. Обновление от 16.04.2017. Версия 135 прекрасно работает.
    # vm stop wintest
    # vm iso https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.135-1/virtio-win-0.1.135.iso
    # vm install wintest virtio-win-0.1.135.iso

    Снова подключаемся по VNC и устанавливаем драйвера из директории D:\NetKVM\w10\amd64.

На этом, пожалуй, всё. Если необходимо, то можно включить автоматический запуск ВМ при старте системы, только не забудьте удалить параметр graphics_wait:

# sysrc vm_list="wintest"
vm_list:  -> wintest

Пчёлки в деле, или Запускаем Windows на BSD Hypervisor: 16 комментариев

  1. Savaoff

    Спасибо за статью.
    Не сравнивали ли скорость работы win 2008r2 под bhyve и qemu-kvm в линуксе?
    Ну, скажем, та же 1c под виндой в обоих гипервизорах…

    1. LB Автор записи

      Не приходилось, пока только тестировал Windows 10. Субъективно работает не хуже, чем под ESXi, синтетику не запускал, прямых сравнений не производил.

  2. Dmitry

    Запускаем не Windows, а Windows 10. Ошибка в заголовке статьи.

    1. LB Автор записи

      Windows 10 тоже Windows. Вся разница с предыдущими версиями лишь в том, что для них требуется специальная подготовка ISO-образа. Информация об этом есть в тексте, там же приведена ссылка на инструкцию.

      1. Dmitry

        Тоже то же)) Но почему не написать — «запуск windows 10»?

        С предыдущими версиями? ))
        https://lists.freebsd.org/pipermail/freebsd-virtualization/2013-November/001741.html
        «bhyve only supports amd64 VM kernels at this time and I have clarified
        this point on bhyve.org

        i386 support is indeed theoretically possible if your proprietary OS can
        provide VirtIO devices as needed for your application.

        Michael»
        теоретически, ибо вирт железка потребует 64битный uefi загрузчик. Держала бы эта железка загрузки legacy (в графике, ибо винда есть графика и без этого хер ее установишь), то да.

        В остальном пофиг. есть эмулятор и есть. Но имхо проще поставить vbox.

  3. Ё

    Есть для удобства такая штука cbsd — рулит и клетками и ульем

  4. Александр

    Не пойму, как устанавливать этот netkvm. Документации нету, никаких setup/install файлов. Не могли бы рассказать?

    1. LB Автор записи

      Примерно так, за точность шагов не ручаюсь, но направление верное. Открываете «Диспетчер устройств», находите там «Ethernet-контроллер» и дважды щёлкаете по нему. Далее вкладка «Драйвер» → «Обновить драйвер» → «Выполнить поиск драйверов на этом компьютере» → «Искать драйвера в следующем месте» → D:\NetKVM\w10\amd64 (при необходимости изменить на свой) → Далее → …

  5. Александр

    Я бы рекомендовал бы исключить вот эту строчку:
    # ln -s /usr/local/share/uefi-firmware/BHYVE_UEFI.fd /usr/bhyve/.config/BHYVE_UEFI.fd
    Так как начинаются жуткие тормоза по VNC, при использовании символической ссылки, и в файле ~/.cshrc поправить 8 строчку на:
    ‘N@switch@`sysrc -inqf /usr/local/share/uefi-firmware/switch switch_list`@’ \

  6. Андрей

    Народ помогите пожалуйста.
    Всё сделал по инструкции win 10 поставил, драйвера virtio-win-0.1.135.iso поставил, ethernet адаптер появился, но не видит сеть и интернет …

    Показывает
    Autoconfiguration IPv4 Address 169.254.183.243
    IPv4 Subnet Mask 255.255.0.0
    Default gateway пустой
    DNS Server пустой

    Сервак стоит в колокейшене, имеет реальный IP
    Ping мой реальный IP не проходит.
    Как я понимаю нужно прописать шлюз и днс … что прописать? спасибо

    1. LB Автор записи

      Судя по всему ваша ВМ не может получить сетевые настройки по DHCP. Вариантов решения множество: поднять сервер DHCP, прописать сетевые настройки вручную, настроить NAT (см. man vm)…

      switch nat name on|off

      Enable or disable NAT functionality on the specified switch.
      Please note that pf is required for this functionality and must
      be enabled in /etc/rc.conf. If DHCP is desired, please install
      the dnsmasq package. vm-bhyve will generate a sample dnsmasq
      configuration in /usr/local/etc/dnsmasq.conf.bhyve, but it is up
      to the user to either use this configuration directly, or merge
      with any existing dnsmasq settings you have configured.

      The switch should have no host ports assigned, as these will end
      up on the private side of the NAT network. vm automatically
      detects the hosts default gateway, which is used as the
      forwarding interface for NAT connections.

      Once enabled, a 172.16.X.0/24 network is assigned to the switch
      (bridge) interface. X is chosen based on the ID of the bridge
      interface. For example, if the switch is using bridge10, the
      network will be 172.16.10.0/24. dnsmasq can be used to provide
      DHCP to the guests, and pf rules are inserted to provide the NAT
      translation.

      /etc/pf.conf is created if it doesn’t exist, and a single include
      statement is added. This include statement can be moved within
      the file if required.

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

      1. Андрей

        Можно у вас попросить платную консультацию по этому вопросу? Оплачу по wmz
        Очень нужно поднять интернет. Не знаю куда дальше копать. Спасибо.
        Можете написать на мой емайл который я указал при публикации поста или на for_something@i.ua
        спасибо.

      2. Андрей

        Пытаюсь настроить в домашней сети.

        Включил
        pf_enable="YES"
        pf_rules="/etc/pf.conf"

        в rc.conf на freebsd.

        Сделал
        vm switch nat public on

        Прописал IP в windows IP вручную 172.16.0.11
        Всё так же — ничего не происходит …

      3. Андрей

        В windows прописал
        IP: 172.16.0.11
        MASK: 255.255.255.0
        GATE: 172.16.0.1
        DNS: 192.168.0.1
        и сеть и интернет заработал…

        а теперь подскажите пожалуйста
        как на этом виртуальном Ip открыть порт 3389 чтобы можно было подключиться по IP сервака на этот порт через RDP
        Спасибо.

      4. LB Автор записи

        Платную консультацию нельзя. Бесплатную можно. Если очень припрёт (заранее спасибо за понимание), то пишите на pavel@onlyfriends.info.

        По поводу RDP, добавьте в /etc/pf.conf:
        rdr pass proto tcp from any to em0 port 3389 -> 172.16.0.11 port 3389
        Где em0 — ваш внешний сетевой интерфейс.

        Подробное описание синтаксиса смотрите в man 5 pf.conf

      5. Андрей

        Спасибо большое за статью и за помощь!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *