В последнее время среди коллег по ИТ, проснулся интерес к запуску Unix подобных систем под Hyper-V. За последнюю неделю несколько человек спросили как обстоят дела с запуском FreeBSD и Linux внутри нашей системы виртуализации. Большинство интересовал вопрос возможно ли Hyper-V использовать в производственных средах для запуска унаследованных Uniх систем. И если да, то много ли там подводных камней на пути к всеобщему счастью. Поэтому я решил тряхнуть стариной вспомнить былые развлечения и взялся за *nix системы снова. Примерно год назад я уже пробовал запускать несколько вариантов BSD систем под Hyper-V. В тот момент Hyper-V еще даже официально не вышел на рынок. Результаты были не очень обнадеживающие. На тот момент была актуальна FreeBSD 6.3 и FreeBSD 7.0. Все попытки запустить обе системы окончились неудачей. Что бы я ни делал, загрузчик ОС зависал с ошибкой “Can’t load kernel”. Мне даже не удавалось запустить установку системы. Эти версии ОС так и не заработали под Hyper-V.
С тех пор прошло некоторое количество времени, RTM версия Hyper-V вышла на рынок и не давно была выпущена FreeBSD 6.4. Поэтому я решил проверить ее, а заодно и версии FreeBSD 7.1 RC1 и самую свежую FreeBSD 8.0. snapshoot 200812. В процессе исследования работы этих систем под Hyper-V я увидел что Василий Гусев тоже "борется" с FreeBSD и решил посильно помочь. В отличие от Василия, я решил использовать Windows Server 2008 Enterprise Edition, а не Windows Server 2008 R2. Такое решение было продиктовано в первую очередь тем, что нужно было проверить как, подопытные ОС заработают под общедоступным Windows Server 2008. Не у всех ведь есть доступ к бета-версиям. К тому же использовать бета-версию в производственной среде под нагрузкой большинство моих коллег врядли бы стало.
Вот что выяснилось в процессе исследования. Все перечисленные ОС нормально загружаются под Hyper-V и выполняют свою инсталляцию так же как и на реальном оборудовании. Никаких ошибок в процессе установки не появляется. Есть маленькие проблемы, но они решаемы.
Как же установить эти ОС? Все очень просто. В связи с тем что драйверов синтетических устройств и компонентов интеграции для FreeBSD не выпускается нам придется удалить сетевую карту создаваемую по умолчанию и вместо нее добавить Legacy Network Adapter.
Эта карта обычно хорошо работает в системах, которые официально не поддерживаются Microsoft. У нее есть только один минус - ограничение скорости в 100 мегабит. Впрочем большинству клиентов этого вполне хватает. Теперь систему можно устанавливать. В этом процессе нет ничего необычного поэтому мы его пропускаем.
Ближе к концу установки система предлагает настроить сетевую карту. Делать это можно двумя путями: DHCP или статической адресацией. Многие из пытавшихся настроить сеть во FreeBSD под Hyper-V говорят, что сеть работает плохо, DHCP нестабилен и использовать его нельзя . Дескать, мы обречены на жизнь со статической адресацией. Это не правда. :) Давайте попробуем воспользоваться DHCP.
Как видите, система правильно нашла мой домашний маршрутизатор ASUS WL-500w являющийся по совместительству еще и DHCP сервером. В журнале работы самого DHCP сервера можно увидеть следующее
Dec 15 20:09:30 dnsmasq[52]: DHCPREQUEST(br0) 192.168.1.235 00:15:5d:01:fa:78 Dec 15 20:09:30 dnsmasq[52]: DHCPACK(br0) 192.168.1.235 00:15:5d:01:fa:78 freebsd7
Значит DHCP все таки отрабатывает нормально. :)
В конце установки в момент когда система спрашивает у нас разрешения на перезагрузку соглашаемся с ней. И в момент завершения работы она зависает в состоянии Stoping. Казалось бы ничего страшного, но гостевая ОС перестает вообще реагировать на какие либо команды основной системы.
Самое неприятное, что из меню исчезает команда "Turn Off" ведь по мнению Hyper-V гостевая ОС уже почти завершилась. И завершать ее еще раз было бы некорректно. В таком состоянии гостевая ОС может висеть довольно долго, но мы ждать этого не будем.
Запускаем Powershell с правами Administrator даже если вы в данный момент являетесь Local Administrator, иначе скрипт Powershell не покажет вам нужную виртуальную машину. Завершаем работу этой виртуальной машины с помощью скрипта Powershell и WMI.
> Get-WmiObject -Namespace root\virtualization msvm_computersystem | Format-Table ElementName, ProcessId
> kill номер процесса
И пока виртуальная машина не успела перезапуститься выключаем ее кнопкой "Turn Off". Извлекаем из виртуального CD-ROM установочный диск иначе инсталляция начнется снова. После этого спокойно загружаем только что установленную систему. Все идет хорошо до тех пор пока FreeBSD не попытается получить адрес по DHCP. Как видите это ей не удается как на этапе загрузки так и после загрузки.
Итак давайте чинить FreeBSD.
Если после загрузки виртуальной машины выполнить следующие команды:
# ifconfig de0 down
# ifconfig de0 up
# dhclient de0
Или включить/выключить все сетевые интерфейсы с помощью скрипта
# /etc/rc.d/netif restart
то после этого сетевой интерфейс de0 начинает функционировать нормально и получает IP адрес через DHCP и сеть работает так так и должна.
Но подобное счастье длится только до следующей перезагрузки системы. К сожалению данная настройка не переживет перезагрузку системы поэтому нам необходимо внести изменения в /etc/rc.conf вписав в него следующую строку.
ifconfig_de0=”DHCP media 100baseTX mediaopt full-duplex”
Того же самого эффекта можно добиться с помощью программы sysinstall. Нужно только добавить опции ”DHCP media 100baseTX mediaopt full-duplex” в параметры команды ifconfig.
Насколько я понимаю система зависает потому что не может правильно управлять питанием через ACPI. Для того чтобы это исправить один из Японских коллег написал патч для ядра FreeBSD.
Сеть у вас уже работает так что скачать патч и все нужные утилиты не составит труда. Давайте установим патч и посмотрим что получится. В гостевой ОС должен быть установлен компилятор, исходные тексты ядра и моя любимая утилита wget. Если у вас нет wget можете использовать fetch. Чтобы скомпилировать и установить новое ядро нужно выполнить вот такие команды.
# cd /tmp
# wget http://shell.peach.ne.jp/~aoyama/wordpress/download/fbs71-200809-hvpatch.bz2
# cd /usr/src/
# bzcat < /path/to/fbs71-200809-hv.patch.bz2 | patch -p1
# make buildkernel
# make installkernel
# shutdown -r now
Затем "убиваем" гостевую ОС с помощью скрипта на Powershell о котором я уже писал. И после перезагрузки у вас должны пропасть проблемы с сетью и подвисанием самой ОС.
Теперь можно полноценно использовать FreeBSD под Hyper-V. Понятно что процедура лечения ОС не простая, но ведь никто вас не заставляет ее проходить повторно. В случае необходимости просто клонируйте виртуальную машину и создайте еще один экземпляр FreeBSD. Дабы не быть голословным привожу снимок экрана на котором видны три виртуальных машины FreeBSD 6.4 i386, FreeBSD 7.1 RC1 i386 и FreeBSD 8.0. CURRENT 200812 amd64 нормально работающих в моей системе.
Есть правда маленькая загвоздка FreeBSD 6.4 i386 упрямо не хочет завершать процесс заморозки по нажатию кнопки "Save", видимо патч на нее подействовал не совсем правильно. Надо будет на досуге продолжить разбирательство с ней.
В следующих записях в блоге думаю сделать тестирование скорости работы FreeBSD под Hyper-V. Надеюсь вам это будет интересно. После этого можно будет обосновано говорить о том, стоит ли использовать FreeBSD в системе виртуализации Hyper-V для каких либо промышленных задач.
Так же есть планы написать о всех тонкостях запуска Linux под Hyper-V. Пишите в комментариях про какие Unix\Linux ОС под Hyper-V вам будет наиболее интересно почитать.
Обновление.
За время прошедшее с момента написания этой заметки ситуация с FreeBSD заметно улучшилась. Установка и настройка упростилась. Подробности читайте здесь
http://blogs.technet.com/b/abeshkov/archive/2011/02/07/3385455.aspx
Отличный пост :) Буду фиксить свою тестовую бздяху :)
Save state кстати нормально и у меня не выполнялся, так что дело не в патче.
>Так же есть планы написать о всех тонкостях запуска Linux под Hyper-V. Пишите в комментариях про какие Unix\Linux ОС под Hyper-V вам будет наиболее интересно почитать.
Интересно почитать про официально поддерживаемые Linux'ы: Suse или RH. Где брать правильные версии, как ставить Integration Components...
> Save state кстати нормально и у меня не выполнялся, так что дело не в патче.
У меня Save state работает с FreeBSD 7.1 RC1 и FreeBSD 8.0
Интересно было бы почитать про установку Debian но не думаю, что там слишком большие отличия.
> Интересно почитать про официально поддерживаемые Linux'ы: Suse или RH. Где брать правильные версии, как ставить Integration Components...
Обязательно напишу про это. Как оказалось процесс установки не тривиальный.
> Интересно было бы почитать про установку Debian но не думаю, что там слишком большие отличия.
С Debian могут быть проблемы в том что он официально не поддерживается и компонентов интеграции под него нет. Скорее всего придется компилировать их вручную.
Можете ли вы сделать Английская версия этого? Это было полезно для меня (я знаю русский - едва ли), но она будет полезной для широкой аудитории :)
I would also like to see this is an English version. I was cunning and Googled "Beshkov Andrey freebsd hyper-v" or the like and found a direct link from Google then used their 'Translate this page' link ;)
Helped me out! Thanks for the article. :)
hmm... i can't seem to find a patch in there anywhere пишет после запуска команды
bzcat < /path/to/fbs71-200809-hv.patch.bz2 | patch -p1 хотя wget нормально скачал файл, затем внимательно присмотревшись увидел что в имени файла стоит лишняя точка hv.patch.bz2 изменил имя файла в команде bzcat < /path/to/fbs71-200809-hvpatch.bz2 | patch -p1 но толку ноль
что делать помогите кто нить советом.
Вопрос решился очень просто ))), надо было включить немножко мозга и внимательней смотреть на путь откуда брать патч )))
У меня после сборки ядра отвалилась сетевуха (негрузится зараза)
Аналогичная проблема, ниже лог загрузки ОС:
de0: <Digital 21140A Fast Ethernet> irq 11 at device 10.0 on pci0
de0: can't read ENET ROM (why=-3) (ffffffffffffffffffffffffffffffffffffffffffff
de0: 21140A [10-100Mb/s] pass 2.0
de0: address unknown
Всё это происходит именно после наложения патча. Вот еще человек о том же пишет http://www.opennet.ru/openforum/vsluhforumID1/88373.html
Судя по всему у Андрея был другой релиз FreeBSD
starzzki и alk
Какая у вас версия Hyper-V и FreeBSD у вас не работает?
hyper-v 6.0.6001.18016
freebsd ftp://ftp.ru.freebsd.org/pub/FreeBSD/ISO-IMAGES-i386/8.0/8.0-RELEASE-i386-dvd1.iso.gz
alk
Скорее всего, какой-то необходимый параметр закоментировали в конфиге, дело тут не в Hyper-V, меня 8.0 BSD вполне адекватно работает и без выше описанных рецетов