Появилась у нас недавно задача, под которую выделять отдельный реальный сервер жалко, а юзать один сервер совместно с другими задачами геморно.
Давно хотели попробовать (модную нынче) виртуализацию, когда на одном физическом сервере располагается более одной системы и вот как раз такой случай.
На просторах тырнета с помощью гугла была найдена статейка «Ставим VirtualBox на FreeBSD без использования X11«, собственно хорошая статья для старта разборок с виртуализацией.
Приведу копию статьи с моими дополнениями после нее.
Текущая актуальная версия порта VirtualBox — 3.2.4. Начиная, с 3.1.0 версии порт разбит на два: virtualbox-ose-kmod (модули ядра) и virtualbox-ose (сам virtualbox).
В текущей версии порта решена проблема с установкой VirtualBox без X11 и со встроенным vnc сервером. Поэтому процесс установки сводится к стандартным действиям.
Действия по шагам:
# cd /usr/ports/net/libvncserver
# make
# make install
# cd /usr/ports/emulators/virtualbox-ose-kmod
# make
# make install
После этого ставим непосредственно VirtualBox:
# cd /usr/ports/emulators/virtualbox-ose
# make config
далее, выбираем нужные нам опции:
# make
# make install
Добавляем загрузку модуля VirtualBox и запуск скрипта для возможности работы адаптера виртульной машины в bridge-режиме (без нее — только NAT):
# echo ‘vboxdrv_load=»YES»‘ >> /boot/loader.conf
# echo ‘vboxnet_enable=»YES»‘ >> /etc/rc.conf
Чтобы лишний раз не перезагружаться, вручную грузим модуль и скрипт:
# kldload vboxdrv
# /usr/local/etc/rc.d/vboxnet start
Создание и настройка виртуальной машины
Создаем виртуальную машину (посмотреть все возможные ostype: VBoxManage list ostypes)
# VBoxManage createvm --name MicroXP --ostype WindowsXP --register --basefolder /usr/vbox
Задаем парамерты виртуалки (bridgeadapter1 указывает адаптер хоста, к которому привязываем виртуалку)
# VBoxManage modifyvm MicroXP --memory 512 --floppy disabled --audio none --nic1 bridged --bridgeadapter1 em0 --vram 4 --accelerate3d off --boot1 disk --acpi on --cableconnected1 on
Создаем жесткий диск, размер указывается в мегабайтах
# VBoxManage createhd --filename /usr/local/vbox/iso/MicroXP.vdi --size 1000 --register
Создаем контроллер на виртуалке
# VBoxManage storagectl MicroXP --name "IDE Controller" --add ide
Подключаем диск к контроллеру
# VBoxManage storageattach MicroXP --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium /usr/local/vbox/MicroXP.vdi
Подключаем установочный образ к контроллеру
# VBoxManage storageattach MicroXP --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium /usr/local/vbox/MicroXP-v0.82.iso
Устанавливаем загрузку с установочного образа
# VBoxManage modifyvm MicroXP --boot1 dvd
Далее, запускаем машину и указываем ей параметры vnc:
# VBoxHeadless -s MicroXP -n -m 5900 -o password
Подключаемся любым vnc-клиентом (например, RealVNC или UltraVNC) и ставим ОС.
—————————————————
Добавлено 24.01.2013
Внимание.
Virtualbox с версии 4.2 изменил работу виртуалок с VNC. Теперь вместо ключа -n нужно запускать так:
# VBoxManage setproperty vrdeextpack VNC
# VBoxManage modifyvm MicroXP --vrdeproperty VNCPassword=password
# VBoxManage modifyvm MicroXP --vrdeauthlibrary null
# VBoxManage modifyvm MicroXP --vrdeport 5900
# VBoxHeadless --startvm MicroXP
Ссылки:
—————————————————
Затем нужно поставить guest additions в виртуалку, без них vnc сервер иногда глючит:
# VBoxManage storageattach MicroXP --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium /usr/local/lib/virtualbox/additions/VBoxGuestAdditions_3.2.4.iso
После этого, виртуальная машина готова к использованию.
Правда, несмотря на установленные guest additions, заставить работать курсор мыши мне не удалось.
—————————
Мои дополнения/заметки
Вышеописанным способом мне удалось установить две виртуальные машины с OS:
- FreeBSD 8.1 — в кач-ве сервера
- Windows XP — в кач-ве клиента
Запускать с vnc нужно тогда когда необходим доступ к консоли сервера, т.е. получается как удаленная KVM.
Если нужно просто запустить уже готовую и настроенную виртуальную машину, то пользуем:
# VBoxManage startvm MicroXP --type headless
Останавливаем виртуальную машину через acpi:
# VBoxManage controlvm MicroXP acpipowerbutton
или более жестко:
# VBoxManage controlvm MicroXP poweroff
Выставляем hdd как загрузчик, послее того как установили OS:
# VBoxManage modifyvm MicroXP --boot1 disk
Отцепить установочный диск:
# VBoxManage storageattach MicroXP —storagectl «IDE Controller» —port 1 —device 0 —medium none
Просмотр всех запущенных машин:
# VBoxManage list runningvms
Просмотр всех зарегистрированных машин:
# VBoxManage list vms
Просмотр информации о виртуальной машине:
# VBoxManage showvminfo MicroXP
Backup
Бекап виртуальных машин можно сделать через команду export, перед выполнением команды export необходимо выключить виртуалку или поставить сделать сохранение состояния:
Выключение:
# VBoxManage controlvm MicroXP poweroff
Сохранение состояния:
# VBoxManage controlvm MicroXP savestate
После чего можно выполнить export:
# VBoxManage export MicroXP -o /usr/WinXP.ovf
Внимание: после выполнения команды на выключение или команды на сохранения состояния виртуальную машину необходимо запускать снова, не забудьте об этом.
Недавно я заморочился над темой автоматического резервного копирование виртуальных машин Virtualbox, чтобы они сами ежедневно бекапились. Почитал в Инете каждый «во что горазд» делает. Кто то через export, кто то через clonehd, а кто то через snapshot.
Поразмыслив я для себя все же остановился на варианте с export. Для выполнения задачи резервного копирования виртуальных машин Virtualbox я накатал скрипт на PERL, который запихнул в /etc/crontab OS FreeBSD.
Кому интересно, то вот исходник скрипта для backup`а всех запущенных виртуальных машин: http://subnets.ru/files/virtualbox_backup.pl.txt
Что делает скрипт автоматического backup`а для virtualbox машин:
- получает листинг всех запущенных виртуальных машин, которые и будут подвергаться бекапу
- создает директорию для backup`а: /some/path/backup/год/месяц/день/имя_виртуальной_машины
- создает в backup дире файл readme.txt куда помещает вывод команды showvminfo по бекапируемой виртуалке
- выполняет savestate виртуальной машины
- выполняет export виртуальной машины
- выполняет запуск виртуальной машины
- после завершения бекапирования всех запущенных машин, скрипт выполняет удаление папки с бекапом месячной давности
Import
Импорт виртуальных машин:
Может понадобиться или при восстановлении из backup`а или просто при переносе на другой физический сервер.
По умолчанию каталог для хранения виртуальных машин является home каталогом юзера под котором вы вошли в систему, чтобы изменить местоположение выполним:
# mkdir -p /usr/vbox/machines
# mkdir /usr/vbox/hdd
# VBoxManage setproperty machinefolder /usr/vbox/machines
# VBoxManage setproperty hdfolder /usr/vbox/hdd
Сначала проверим как оно импортнется:
# VBoxManage import /usr/WinXP.ovf --dry-run
Если все ОК, то теперь можно импортить:
# VBoxManage import /usr/WinXP.ovf
Отныне все виртуалки будут «жить» в каталоге /usr/vbox.
Добавить ещё сетевуху можно командой:
# VBoxManage modifyvm MicroXP --nic2 bridged --bridgeadapter2 vlan4 --cableconnected2 on
Этим мы добавили вторую сетевую карту, забриджевали её с vlan4 на реальном сервере.
Все последущие карты добавляются/изменяются/удаляются так же с указанием —nicX, где X это номер карты
Махнуть MAC-адрес на втором адаптере можно командой:
# VBoxManage modifyvm MicroXP --macaddress2 auto
MAC-адрес будет выбран автоматически, либо можно самому задать мак:
# VBoxManage modifyvm MicroXP --macaddress2 444444444444
Удалить любую сетевуху из виртуалки можно по её номеру, мы удалим вторую, которую создали выше:
# VBoxManage modifyvm MicroXP --nic2 none
Проблем или отличий в работе виртуальной машины и реальной я не заметил. Все работает как надо.
Виртуальные машины помогут вам либо решить задачу с нехваткой реальных серверов под какую либо задачу, либо отличный способ для того чтобы создать тестовый стенд для тестирования чего либо.
Например мы собирали тестовый стенд из 3-х виртуалок и гоняли на них BGP с использованием Quagga.
—————————
Добавлено 24.01.2013
Внимание. Virtualbox с версии 4.2 инсталит свои модули в папку с ядром /boot/kernel вместо папки /boot/modules:
# ls -la /boot/kernel/vbox*
-r-xr-xr-x 1 root wheel 243579 24 янв 17:38 /boot/kernel/vboxdrv.ko
-r-xr-xr-x 1 root wheel 639853 24 янв 17:38 /boot/kernel/vboxdrv.ko.symbols
-r-xr-xr-x 1 root wheel 9075 24 янв 17:38 /boot/kernel/vboxnetadp.ko
-r-xr-xr-x 1 root wheel 48281 24 янв 17:38 /boot/kernel/vboxnetadp.ko.symbols
-r-xr-xr-x 1 root wheel 23080 24 янв 17:38 /boot/kernel/vboxnetflt.ko
-r-xr-xr-x 1 root wheel 76126 24 янв 17:38 /boot/kernel/vboxnetflt.ko.symbols
Поэтому если вы апгрейднули версию Virtualbox и у вас полезли ошибки такого плана:
# /usr/local/etc/rc.d/vboxnet start
/usr/local/etc/rc.d/vboxnet: WARNING: Can't load vboxnetflt module.
А в /var/log/messages у вас появилось:
kernel: link_elf: symbol ng_free_item undefined
То вам необходимо:
- выгрузить vboxdrv.ko если он загружен: # kldunload vboxdrv.ko
- пересобрать virtualbox-ose-kmod
- загрузить vboxdrv: # kldload vboxdrv.ko
- # /usr/local/etc/rc.d/vboxnet start
Если и это не помогает, то нужно пересобрать ядро, а потом снова повторить вышеописанную процедуру.
Пересбор ядра:
# cd /usr/src
# make kernel KERNCONF=YOUR_KERNEL_NAME
И с этого момента не забывайте, что если вы по какой то причине пересобирали ядро, то вам нужно после этого пересобирать и virtualbox-ose-kmod.
Ссылки:
—————————
Ссылки
З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА ! Пожалуйста, уважайте чужой труд.
Автор: Николаев Дмитрий (virus (at) subnets.ru)