×Закрыть

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

Введение

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, о которых шла речь в статье
  • Популярное

38 комментариев

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

Люди помогите не могу ни как привязать к Ubuntu папки из винды??? Пк WinXP, VBox Ubuntu.

Хост W7HP, создал гостевую WinXP. Перенес vdi простым копированием на хост XP. На этом хосте через интефейс создал новую машину, в качестве ВЖД указал скопированный файл. При старте, после ввода пароля юзера, получаю сообщение о критической ошибке (как вариант — начинается перезагрузка).Что не так, как побороть?

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

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

Хей хилопци. Есть тут маководы? Я тут как раз бьюсь с загрузкой USB флешки на VirtualBox под Mac OS X. пока нарыл следующее: http://agnipulse.com/2009/07/b.../Из чего следует галавная страка которую буду пределывать VBoxManage internalcommands createrawvmdk -filename pathtousb.vmdk -rawdisk \.PhysicalDrive1 -register (так как данная строка под OS Win, то будем переделывать под Mac OS X) 1) Для начала ищем какое у нас устройство флеш, для чего вставляем флешку в порт и она автомантируется.пишем в Terminal: dfFilesystem 512-blocks Used Available Capacity Mounted on/dev/disk0s2 311909984 241228304 70169680 78% /devfs 219 219 0 100% /devfdesc 2 2 0 100% /devmap -hosts 0 0 0 100% /netmap 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 для этого преходим в него черет Terminalcd /Applications/VirtualBox.app/Contents/MacOS/ (В том случае если у вас приложение VirtualBox.app лежит в паке Applications, иначе нужно подправить) 3) теперь пишем VBoxManage internalcommands createrawvmdk -filename ~/usb.vmdk -rawdisk /dev/disk1s1 -register4) Запускаем в оболочке VirtualBox и создаем новую машину в качестве Primary Master харда указываем usb.vdmk.По идее все должно загрузиться, но вот у меня после всехо этих опираций просто курсор, стоит... = (Я чуству что где-то близок..., а статью написал чтоб самому, что-ть не забыть. Если кто подскажет?

я сделал вот так:
VBoxManage internalcommands createrawvmdk -filename /Users/zapp/VirtualBox VMs/usb_drive.vmdk -rawdisk /dev/disk2

В вашем примере disk1s1 — это уже раздел диска! Нужно писать просто disk1...

Установил VB на XP. Гостевая — тоже XP. Всё работает, но есть проблема с клонированием виртуальной машины. Делал 3 «снимка». Когда пытаюсь клонировать в.м., копия не содержит информации о «снимках». Но мало того, клонируется не текущее состояние в.м., а самый первый снимок. Это очень неудобно. Может быть я что-то не так делаю или чего-то не знаю? Клонирование делал так: «C: Program FilesSunxVM VirtualBoxVBoxManage.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.Короче, как появится время буду копать дальше.

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

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

sudo VBoxManage internalcommands createrawvmdk -filename /home/andrew/.VirtualBox/HardDisks/Vista.vmdk -rawdisk /dev/sda -registerdenver-22 вот примерно так, у них на сайте расписано

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

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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Подписаться на комментарии