Украинское сообщество программистов

Виртуализация при помощи VirtualBox

Макс Ищенко
Опубликовано 15.09.2008 в Статьи

Введение

VirtualBox logoВ последние годы виртуализация стала очень модным словом в ИТ, но до недавнего времени для меня она оставалась некой абстрактной технологией. В этой статье я хочу поделиться своим опытом практического использования технологии виртуализации. Речь пойдет создании полностью самодостаточной среды разработки проекта.

Зачем? Попробую перечислить возможные варианты использования:

  • вам важно иметь возможность запуска сайта по Windows/Mac OS X, даже если проект Linux only
  • вы хотите отладить процесс развертывания, на “чистой” системе (особенно если процесс автоматизирован)
  • вы хотите взять работу в дорогу/в отпуск, работать придется на чужом ПК/ноутбуке
  • вы привлекаете в проект фрилансера и не хотите целый день ей/ему объяснять как поднять локальную копию сайта
  • не-программисты из вашей команды хотят иметь “свою” копию проекта, но не могут самостоятельно ее настроить

Если ни один из вариантов вас не заинтриговал, дальше можно не читать. ;)

Виртуализация дает удобный инструмент для использования в качестве тестового окружения или переносного окружения разработчика. Чем сложнее программный проект, чем больше у него внешних зависимостей, тем больше выгод может дать его виртуализация.

Виртуализация в коробке

Уяснив для себя, что виртуализация мне нужна, первое с чем я столкнулся: многообразие различных решений. Тут и гипервизор Xen и контейнеры OpenVZ, и KVM, которая идет из коробки в последних дистрибутивах Ubuntu/Fedora, и целая линейка продуктов VMWare, которая кажется закрывает все продуктовые ниши.

Цели применения виртуализации могут быть очень разные, также отличаются и соответствующие продукты. Я искал “обычную” виртуализацию, которая выполняет эмуляцию аппаратного обеспечения и позволяет исполнять несколько полноценных виртуальных машин внутри одной ОС (хост-машины).

Перепробовав разные варианты в итоге выбрал Sun VirtualBox. Почему? Кроссплатформенность, бесплатность, управление через ком.строку, отличная документация, хорошая скорость работы, небольшой размер дистрибутива (24Мб против 400+ у VMWare Server).

VirtualBox screenshot

Похожие по функциональности продукты: бесплатный VMWare Server и Linux KVM. Если VirtualBox “не совсем” устраивает имеет смысл взглянуть на эту парочку. Интересно выглядит и ovirt (на базе libvirt/kvm).

Примечание: в процессе моего изучения VirtualBox и написания этой статьи вышла версия VirtualBox 2.0. О ней я еще ничего не знаю, в данной статье описывается версия 1.6.4.

Установка VirtualBox

В качестве host-ОС я использую Ubuntu Linux, ее же использовал и для виртуальной машины.

На сайте VirtualBox к загрузке доступно две ветки, OSE (Open source edition) и “free”. OSE есть в репозиториях Ubuntu, но она не такая свежая (1.5.х против 1.6.х) и не поддерживает PAE. Что оказалось критичным, но об этом позже.

VirtualBox конфликтует с KVM, которая идет по умолчанию в свежих дистрибутивах Ubuntu (а также Fedora). Решение заключается в выгрузке kvm-модуля ядра:

# rmmod kvm-intel

При установке non-OSE ветки необходима компиляция драйвера ядра, для чего потребуются его (ядра) include-файлы. Их обеспечивает виртуальный пакет linux-headers нужной версии:

# apt-get install linux-header

Установка Ubuntu

Процедура простая:

  1. Создается новая виртуальная машина (проще всего — через GUI VirtualBox). Для нее понадобится создать .vdi диск. Я бы рекомендовал либо expandable либо диск меньше 4Гб, для максимальной переносимости (файловая система, используемая на DVD-дисках не позволяет создавать файлы размером в 4Гб или больше; делать gzip/ungzip для записи можно, но очень ресурсоемко).
  2. В настройках машины подключается .iso образ установочного диска ОС.
  3. Выполняется запуск VM и дальше идет обычный процесс установки.

Для виртуальной машины имеет смысл использовать Ubuntu Server Edition, который идет с text-mode installer или даже JeOS, которая еще компактнее и создавалась специально для целей виртуализации.

Установку я выполнял OSE версией VirtualBox и в результате после окончания установки и перезагрузки получил такую ошибку:

This kernel requires the following features not present on the CPU
0:6
Unable to boot - please use a kernel that is appropiate for your CPU

Как выяснилось, это проблема совместимости. Один из способов решения — использовать версию 1.6.х и включить в настройках галочку PAE. Альтернативный вариант — загрузить VM в recovery mode и поставить ядро -generic вместо -i386.

Есть и другой способ — сразу ставить JeOS, у которой эта ошибка не проявляется.

Настройка SSH-доступа

По умолчанию VirtualBox использует NAT, благодаря чему гостевая VM видит интернет без необходимости какой-либо настройки с вашей стороны (при условии, что гостевая ОС обнаружит и настроит виртуальную Ethernet-карту).

Ключевая “особенность” технологии NAT состоит в том, что гостевая и хост-машина никак не “видят” друг друга в IP-сети. Самое простое решение — проброс (форвард) портов средствами VirtualBox. Выглядит это так (пример из документации):

VBoxManage setextradata guest-vm "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol" TCP
VBoxManage setextradata guest-vm "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" 22
VBoxManage setextradata guest-vm "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort" 2222

Важно: для активации этих настроек требуется перезапуск гостевой VM.

Теперь можно подключаться через порт 2222 на хост-машине:

ssh -p2222 localhost # Linux
C:\>putty localhost:2222 ; Windows

Если пишет “connection refused”, значит на виртуалке не установлен sshd (он отсутствует по умолчанию в JeOS). Ставим:

$ sudo aptitude install openssh-server

Сразу имеет смысл настроить беспарольный вход по SSH:

$ ssh-keygen -t rsa
$ ssh guest mkdir -p .ssh
$ cat ~/.ssh/id_rsa.pub | ssh guest 'cat >> .ssh/authorized_keys'
$ ssh guest chmod 600 .ssh/authorized_keys

Клонирование VM

Фактически у нас уже есть полностью работоспособная виртуалка, только пока “голая”, без нашего приложения и сопутствующих библиотек. В этот момент имеет смысл “сохраниться”, чтобы в следующий раз не выполнять рутинную операцию установки/настройки базовой ОС.

Для этого можно сделать “снимок” (snapshot), но лучше — клонировать VM целиком. В результате мы получим отдельную VM, полностью независимую от оригинала.

Клонирование выполняется просто, одной командой clonevdi, которая создает копию нашего .vdi файла. Но эта на первый взгляд простая операция содержит несколько подводных камней.

Копировать VM необходимо только средствами VirtualBox, иначе копию не удастся запустить на той же машине (при клонировании меняется UUID виртуального диска, который хранится в .vdi файле).

Я написал такой примерно скриптик, который автоматизирует операцию клонирования и настройки копии (см. cсылки в конце статьи):

$  VBoxManage -nologo clonevdi $vboxdir/$orig.vdi $vboxdir/$name.vdi
$  VBoxManage -nologo createvm -name $name -register
$  VBoxManage -nologo modifyvm $name -hda $vboxdir/"$name.vdi"
$  VBoxManage -nologo modifyvm $name -macaddress1 $nic
$  VBoxManage -nologo modifyvm $name -nic1 nat 

Современные версии Linux используют UUID в качестве указателей на разделы, поэтому их придется обновлять при каждом клонировании. О чем, кстати, явно предупреждает документация на VirtualBox.

Я решил поступить проще. До клонирования я исправил все ссылки по UUID в /etc/fstab и /boot/grub/menu.lst на обычные ссылки /dev/sda*. (напоминание: после правки menu.lst необходимо перезаписать GRUB командой sudo grub-install /dev/sda).

Если вы делали “снимки” (snapshots), при клонировании они не будут скопированы. Чтобы клонированная копия имела изменения из snapshots их необходимо “объединить” с оригинальным .vdi неочевидным способом: делая Discard каждому из снимков, начиная с самого старого (верхнего в дереве).

Еще после клонирования новая VM будет видеть сетевую карту с новым mac-адресом. Поэтому нужно либо использовать тот же MAC-адрес (его можно изменить через Settings -> Network), либо поправить в гостевом линуксе файл /etc/network/interfaces (заменив eth0 на ethX, см. ifconfig -a). Я использую один MAC для всех виртуалок (устанавливается скриптом выше), работает замечательно.

Настройка VPN-сети

VPN: Виртуальная локальная сеть, доступная из любой точки интернета. Это единственный способ сделать виртуалку видимой извне (документация описывает настройку bridge networking, но он позволяет добиться только того, что виртуалка видна в локальной сети хост-машины; сама же хост-сеть, как правило, невидима извне).

Обычно настроить VPN-сеть еще сложнее, чем bridge networking. Но, к счастью, нашлась такая штука, как Hamachi. Благодаря ей весь процесс занимает буквально минуты.

Выглядит это так:

  1. На гостевую VM устанавливается клиент Hamachi. Т.к. Hamachi-клиент написан на Си, потребуется сначала установить компилятор и вспомогательные утилиты: sudo aptitude install build-essentials.
  2. Командой hamachi create создается наша VPN-сеть и устанавливается пароль на подключение к сети.
  3. Командой hamachi join выполняется вход в VPN-сеть и hamachi go-online, чтобы эта машина стала видима другим машинам VPN-сети.
  4. Для удобства каждой машине ставится уникальное имя (hamachi set-nick).

Пункты 2-4 выполняются один раз, в дальнейшем достаточно выполнять только команду hamachi start. Эта процедура повторяется на каждой машине, которой необходим доступ к приватной сети.

В результате доступ на гостевую VM будет работать с любой другой машины, подключенной к VPN сети. Даже если сама host-машина никак “извне” не видна. Это просто фантастика. Вы можете скопировать виртуалку на свой ноутбук, уехать с ним за тридевять земель и подключившись к интернет, сделать VM доступной коллегам. Или же зайти удаленно на VM, которая осталась на офисном сервере, пока вы в разъездах.

Автозапуск VM на host-машине

Автозапуск гостевой VM может потребоваться если мы хотим работать с ней удаленно, а host-машина извне недоступна (по соображениям безопасности). Если сделать автозапуск, мы сможем войти на гостевую машину без необходимости промежуточного входа на host-машину.

Запуск выполняется через VBoxHeadless, размещение и формат скрипта зависит от дистрибутива. Мой скрипт для upstart (используется в Ubuntu) можно найти в коде vbox-utils, см. ссылки. Фактически это всего одна команда:

$ VBoxHeadless -startvm dou-staging1

Проверить, что машина была успешно запущена можно командой VBoxManage:

$ VBoxManage -nologo list runningvms

При этом можно подключиться удаленно, через протокол RDP:

$ rdesktop host.machine.ip:3389 # IP хост-машины, где выполняется VBoxHeadless

Ну и конечно должен работать SSH-доступ из любой точки VPN-сети.

Для полноты картины привожу команду усыпления VM:

$ VBoxManage controlvm dou-staging1 savestate

Развертывание приложения

Здесь особо писать и нечего, т.к. процесс развертывания полностью определяется приложением. Главное — что у нас есть база — виртуальная ОС, досупная по ssh, с открытым веб-интерфейсом.

Console screenshot

Заключение

На этом считаю свою миссию выполненной. О преимуществах виртуализации я рассказал, использование VirtualBox подробно описал. Если есть вопросы — спрашивайте, буду отвечать.

Ссылки

  • VirtualBox.org — официальный сайт VirtualBox
  • All about VDIs (tutorial) — хороший FAQ на форуме virtualbox
  • vbox-utils — мои скрипты для VirtualBox, о которых шла речь в статье

Теги: , , ,

1 звезда2 звезды3 звезды4 звезды5 звезд (23 голосов, средний: 4.7 из 5)
Загрузка ... Загрузка ...
Распределение голосов

Понравилась статья? Подпишись на обновления по RSS/E-mail

Подписаться, не оставляя комментарий

Все комментарии (35) к “Виртуализация при помощи VirtualBox” RSS

  1. Александр Лозовюк

    Гм.. а почему вы сравниваете с серверной VMware, хотя, насколько я знаю, VirtualBox ybrjulf yt позиционировался как серверный продукт – а как десктопный, потому корректнее сравнивать все же с VMware Workstation

    а вот за JeOS спасибо!!

  2. Denis Osetrov

    А как насчет Virtual PC от MS? Кто что может сказать?

  3. Сергей Савостин

    Спасибо за статью.
    У меня вопрос немного не в тему.
    Подскажите дистрибутив *nix самый минимальный (даже без GUI) для установки в качестве хост-системы.
    Смысл в чем – быстро и малозанимаемо запускается хост-ос, а под ней через VirtualBox парочка виртуальных.
    Спасибо!

  4. Сергей Савостин

    Пардон, это я выше

  5. Александр Лозовюк

    странно, вот JeOS – ставится через раз, а когда поставилась – глюки с отсутствующими модулями и вываливаени в оболочку какую-то служебную судя по всему. и не работает ничего

  6. Всеволод Соловьёв

    А VirtualBox’у можно дать доступ к реальному диску? Или потом развернуть образ на реальный раздел (правда, как это может воспринять сама ОС)?

  7. Сергей Савостин

    А VirtualBox’у можно дать доступ к реальному диску?

    я так понимаю самый безопасный путь – Shared folders – типа сетевые папки…

  8. Макс Ищенко

    2Савостин: например JeOS. Хотя их там до черта, выбирать есть из чего.

  9. Сергей Савостин

    Ага, сообразил уже. Вроде поставилось, занятно…

  10. lasc

    2Всеволод Соловьёв можно дать доступ к реальному диску. можно запустить бокс под виндовс и ставить на тот же самый диск линух, с затиранием mbr и тд перегрузиться и получить установленную линуху

    в чем приемущество относительно OpenVZ котороя в убунте поднимается тоже с полтыка

  11. qwer

    .. бесплатность .. небольшой размер дистрибутива (24Мб против 400+ у VMWare Server).
    у VMWare есть бесплатная версия VMWare Server’а, которая весит 150 мб

  12. Всеволод Соловьёв

    2lasc
    Угу, спасибо, это и требовалось :)

  13. Макс Ищенко

    OpenVZ это совсем из другой оперы, больше похоже на “улучшенный chroot”.

  14. Anonymous

    виртуалка с линуксом это хорошо, а вот как считаються лицензии (по правилам) на винду, БД и т.д. когда оно ставиться на виртуалку?

  15. cencio

    опс, последний месадж не анонимный, а мой :)

  16. Anonymous

    про qemu забыли. оно умеет эмулировать разные процессоры, а не только x86. полезно если надо потестировать и/или отладить приложение например в big-endian среде.

  17. Caxap

    Кто-то может обьяснить как достучаться до гостевой ОС (CentOS 5.2) из хостовой Win XPпо SSH?Я так понимаю.что данные инструкции типа:

    VBoxManage setextradata guest-vm “VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol” TCP
    VBoxManage setextradata guest-vm “VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort” 22
    VBoxManage setextradata guest-vm “VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort” 2222

    рулят для юниксовых хостов с установленной ВМ,а для Окон что делать?Ибо Putty не видит маршрута…

  18. Макс Ищенко

    Под виндой работает точно также. Хост – localhost (127.0.0.1).

  19. Caxap

    Ok.Вопрос в том где команды вбивать?

  20. Макс Ищенко

    Пуск – Выполнить – cmd.exe

  21. Pentarh Udi

    Спасибо за статью.
    У меня вопрос немного не в тему.
    Подскажите дистрибутив *nix самый минимальный (даже без GUI) для установки в качестве хост-системы.
    Смысл в чем – быстро и малозанимаемо запускается хост-ос, а под ней через VirtualBox парочка виртуальных.
    Спасибо!

    Мне CentOS 5.2 последний понравился. Но на 64 битной арче там нужно с подвыподвертами ставить виртуалки

  22. quick

    я ставил винду под виндой. Сетку настраивал как хост. потом объединял подключение во внешку и полученный виртуальный адаптер в мост.
    после этого происал IP с одной подсети и у меня появлися полноценный комп в локалке. Пингуется со всех компов.
    Теперь предстоит сделать это под mandriva 2009 :)

    P.S. Большое спасибо Автору за хорошую статью.

  23. Pentarh Udi

    Короче поворотил я эту виртуалбокс. Полный отстой. 64 бита не умеет, несколько процессоров тоже. Постоянные проблемы с malloc’ом гостевой системы (запускаешь инсталл какого нить объемного RPM – хана, гостевая суспендится, хотя памяти достаточно), постоянные какие то глюки. Короче в сад. Virtuozzo/OpenVZ и VMWare форева

  24. Semm

    Использую как основную ось – ubuntu 8.4
    Поставил виртуалбокс, на него WinXP, но не могу с сетью разобраться.
    Поясните как сделать, чтобы виртуальная машина была видна из локальной сети?

  25. Alex

    В общем установил на виртуальной машине две ОСи : Windows 2003 & XP Pro. Теперь горю желанием обьеденить их в одну виртуальную сеть(чтобы тазики друг друга видели).Как это реализовать?Кто подскажет?
    Виртуалка установлена на ХР.

  26. Vladyslav Lazarenko

    I tried Virtual Box few days ago. Not bad. But not good enough. I stay with Parallels Desktop. Virtual Box has the worse integration with Mac OS X Desktop I ever seen, crashes from time to time. Look & feel is ridiculous. Yeah, you might say that Virtual Box is free. Correct, but I prefer to pay for good software instead of using bad for free.

  27. denver-22

    lasc, как можно дать доступ к реальному диску? В QEMU я это нашел. А вот в VB – нет.
    Причем это интересует, чтобы не через Общие папки. А на этапе загрузки. Вы же говорите, что даже ОСь на реальной машине можно менять.

  28. lasc

    sudo VBoxManage internalcommands createrawvmdk -filename /home/andrew/.VirtualBox/HardDisks/Vista.vmdk -rawdisk /dev/sda -register

    denver-22 вот примерно так, у них на сайте расписано

  29. denver-22

    Как я понял, в этом примере разделу /dev/sda назначают имя Vista.vmdk. А уже в самой программе этот vmdk уже можно выбрать для монтирования?
    Если так, то могли бы вы помочь с этим же примером для хостовой Винды? Как команду вводить в командной строке? А то она у меня ругается на пробелы в путях (к примеру в “Program files”). Может я явно как-то не так команду пишу.

  30. Durson

    Пожскажите как настроить сеть на виртуальной машине VirtualBox-2.0.6-39760-Win_x86 которая установлена на Windows Vista. А на виртуальной машине установлена Ubuntu 8.04.1? Я впринципе плохо разбираюсь в виртуальных машинах и в Linux так что если это возможно расскажите попроще:)

  31. Dan

    Thanks. It works fine.

  32. Vasiliy

    Установил VB на XP. Гостевая – тоже XP. Всё работает, но есть проблема с клонированием виртуальной машины. Делал 3 “снимка”. Когда пытаюсь клонировать в.м., копия не содержит информации о “снимках”. Но мало того, клонируется не текущее состояние в.м., а самый первый снимок. Это очень неудобно. Может быть я что-то не так делаю или чего-то не знаю? Клонирование делал так:
    “C:\Program Files\Sun\xVM VirtualBox\VBoxManage.exe” clonehd 1.vdi 2.vdi
    где 1.vdi – оригинал, 2.vdi – имя файла для клона виртуального HDD.

    Пока вижу только один способ сделать копию на текущий момент (долго, но наверняка):
    1) подключить 2-й виртуальный HDD
    2) в гостевой машине загрузиться с CD с акронисом или аналогичной программой
    3) записать образ первого HDD ввиде файла на второй HDD и отмонтировать 2-й диск.
    4) использовать 2-й диск для развёртывания системы в других в.м. У новых в.м. (копий) “аппаратная” конфигурация, желательно, должна быть такой-же, как у оригинала (количество и типы сетевых адаптеров, например).

    Есть ещё одна догадка как сделать полную копию (включая информацию о снимках), но для этого нужно потратить какое-то время на изучение XML-файлов конфигурации в.м.
    В папке …\Machines\ИмяМашины есть файл конфигурации в.м. (XML) и папка Snapshots. У каждого снимка есть uuid, совпадающего с именем файла в папке Snapshots. Есть вероятность, что это имя ничего не значит и в самом файле снимка не хранится, тогда можно просто переименовать файлы и поправить соответствующие uuid в конфиге скопированной в.м., и копия будет работать.
    Я пробовал сделать просто копию всей папки, а основной vdi-файл клонировал VirtualBox’ом. Клонированная машина запускалась (последнее состояние), снимки видны. Но когда (при включенной копии) пытаешься запустить в.м.-оригинал, оно пишет ошибку, типа не могу открыть файлы – жалуется на файлы из папки Snapshots. Либо VB пытается использовались файлы из папки Snapshots оригинала или просто не может открыть более одного файла с таким-же uuid.
    Короче, как появится время буду копать дальше.

  33. !_v01d

    Хей хилопци. Есть тут маководы? Я тут как раз бьюсь с загрузкой USB флешки на VirtualBox под Mac OS X. пока нарыл следующее: http://agnipulse.com/2009/07/boot-your-usb-drive-in-virtualbox/
    Из чего следует галавная страка которую буду пределывать
    VBoxManage internalcommands createrawvmdk -filename path\to\usb.vmdk -rawdisk \\.\PhysicalDrive1 -register
    (так как данная строка под OS Win, то будем переделывать под Mac OS X)
    1) Для начала ищем какое у нас устройство флеш, для чего вставляем флешку в порт и она автомантируется.
    пишем в Terminal: df
    Filesystem 512-blocks Used Available Capacity Mounted on
    /dev/disk0s2 311909984 241228304 70169680 78% /
    devfs 219 219 0 100% /dev
    fdesc 2 2 0 100% /dev
    map -hosts 0 0 0 100% /net
    map auto_home0 0 0 100% /home
    /dev/disk1s1 7842760 4680 7838080 1% /Volumes/V01DFLASH
    Где V01DFLASH имя примонтированной флешки моей флешки, отсюда /dev/disk1s1 это его USB Drive устройство.
    Теперь командой sudo umount -f /Volumes/V01DFLASH отмонтируем флешку (незабудти вести пароль администратора). Это необходимо для работы другими программа, потому как в примонтрованном состоянии флешка недосутпна для других опираций.
    2) Порыскав, погуглив узнаю, что VBoxManage присутствует в пакете VirtualBox в Mac OS X.
    Он находится в самом пакете VirtualBox.app для этого преходим в него черет Terminal
    cd /Applications/VirtualBox.app/Contents/MacOS/
    (В том случае если у вас приложение VirtualBox.app лежит в паке Applications, иначе нужно подправить)
    3) теперь пишем VBoxManage internalcommands createrawvmdk -filename ~/usb.vmdk -rawdisk /dev/disk1s1 -register
    4) Запускаем в оболочке VirtualBox и создаем новую машину в качестве Primary Master харда указываем usb.vdmk.
    По идее все должно загрузиться, но вот у меня после всехо этих опираций просто курсор, стоит… =( Я чуству что где-то близок … а статью написал чтоб самому, что-ть не забыть. Если кто подскажет?

  34. АндрейК

    и тут тролятник :( , короч, не слушайте никого, я ставил виртбох как на линух, так на окна. ФСЁ!!! работает, и оч. неплохо. единственное ограничение 128 мегабайт для виртуального графич. адаптера. В остальном – супер!

  35. MorsS

    А я здесь нашел как же всё таки установить VirtualBox на Linux http://stiel.ru/ustanovka-virtualbox-v-linux/

Оставить комментарий

Указать свой сайт могут только зарегистрированные пользователи. Регистрация или вход.

Архив

Добавить статью

Станьте автором нашего сайта!

Какие материалы подходят для публикации? — Такие.

Присылайте статьи на editors@developers.org.ua.

Подробнее.

Популярные теги

Все теги

Комментарии

Последние комментарии

интернет-магазин цифровой техники

Бытовая техника
Холодильники
Купить часы
Телевизоры ЖК
Стиральные машины
Швейцарские часы