Главная
Главная Руководства FreeBSD › FreeBSD 11 и Virtualbox



Автор:

Статья опубликована: 2015-07-16 09:01:30
Последние правки: 2018-11-16 13:08:44

Рано или поздно, но вам обязательно понадобится запустить какую-нибудь другую ОС и тут есть два варианта: использовать отдельную железку или воспользоваться виртуализацией. Я расскажу о втором варианте - Virtualbox на FreeBSD 11.

Важно!
- после обновления до версии 5.2.20 от 2018-10-17, при подключении по VNC к гостевой машине, получаем черный экран. Смог вылечить только откатом при помощи portdowngrade на версию r479538 от 11 сентября 2018.

Немного лирики: начитавшись об умных домах в общем и о сетях 1-wire в частности я решил начать с малого, а именно - с измерения температуры, для чего приобрел мастер 1-wire сети DS9490R и 10 температурных датчиков DS18S20. Для считывания их показаний необходим софт и самое очевидное решение - owfs. Официального порта в FreeBSD нет (UPD ФЕВРАЛЬ 2017 - уже есть, но грузит проц на 100%), но в сети можно найти модификацию под FreeBSD, что я и сделал. Все было хорошо, но только от силы месяц, после чего, скорее всего в результате обновления, система периодически стала падать в core. После отключения файловой системы, куда монтировались температурные датчики, все стало работать ровно.
Также, меня заинтересовала технология zwave, но под FreeBSD не удалось найти ни одного работающего софта для управления сетью zwave, все пишется только под линукс.
Отдельный компьютер под linux ставить не хотелось и я призвал на помощь виртуализацию. Под FreeBSD есть неплохая виртуальная машина и она называется virtualbox. Так как у нас сервер, то никаких X11, благо нынешняя версия virtualbox позволяет установку и без наличия иксов. Управление виртуальными машинами будет только через консоль.

UPD ИЮЛЬ 2015. На данный момент для сервера умного дома я использую Raspberry Pii 2, но опыт работы с виртуалкой был бесценен и я решил сохранить его в этой статье.
А у меня появилась новая задача для виртуализации: мои два провайдера не могут ужиться на одной FreeBSD и потому появилась необходимость запустить виртуальный сервер, чтобы разделить провайдеров.
UPD СЕНТЯБРЬ 2018. Статья обновлена для FreeBSD версии 11.

Оглавление
Исходные данные
Установка
Настройка
Управление через web-интерфейс
Создаем и настраиваем виртуальную машину
Запуск виртуальной машины для установки гостевой ОС
Остановка виртуальной машины
Запуск виртуальной машины в "рабочем" режиме
Автостарт/стоп виртуальных машин
Установка Guest Additions
Удаляем виртуальную машину
Создание резервной копии
Перенос на другой сервер
Эксплуатация
Железо

  • Исходные данные
    # uname -sr
    FreeBSD 11.2-RELEASE-p3
    # pkg info | grep virtualbox
    virtualbox-ose-kmod-5.2.18     VirtualBox kernel module for FreeBSD
    virtualbox-ose-nox11-5.2.18_1  General-purpose full virtualizer for x86 hardware
    

  • Установка
    Начиная с версии 3.1.0 порт разбит на два: virtualbox-ose-kmod (модули ядра) и virtualbox-ose (сам virtualbox).
    # cd /usr/ports/emulators/virtualbox-ose-kmod
    # make install clean
    
    В настройках выбираем:
    [ ] DEBUG   Debug symbols, additional logs and assertions
    [x] VIMAGE  VIMAGE virtual networking support
    
    Далее, ставим серверную версию:
    # cd /usr/ports/emulators/virtualbox-ose-nox11
    # make install clean
    
    В настройках выбираем :
    [ ] PYTHON      Python bindings or support
    [ ] R0LOGGING   Enable R0 logging
    [x] UDPTUNNEL   Build with UDP tunnel support
    [ ] VDE         Build with VDE support
    [x] VNC         Build with VNC support
    [x] WEBSERVICE  Build Webservice
    

  • Настройка
    Загрузка модуля ядра. Добавляем строчку в /boot/loader.conf для запуска модуля при загрузке системы
    vboxdrv_load="YES"
    
    Загружаем модуль, чтобы не перезагружать сервер
    # kldload vboxdrv
    
    Создаем пользователя, под которым будут создаваться и работать виртуальные машины:
    # adduser vbox
    
    Добавляем пользователя vbox в группу vboxusers:
    # pw groupmod vboxusers -m vbox
    
    Загружаем адаптер для работы виртуальной машины в bridge-режиме, watchod и vboxwebsrv. Добавляем строчки в /etc/rc.conf
    vboxnet_enable="YES"
    vboxwatchdog_enable="YES"
    vboxwatchdog_user="vbox"
    
    vboxwebsrv_enable="YES"
    vboxwebsrv_user="vbox"
    
    #vboxheadless_enable="YES"
    #vboxheadless_user="vbox"
    #vboxheadless_delay="1"
    #vboxheadless_stop="acpipowerbutton"
    #vboxheadless_machines="debian1"
    #vboxheadless_debian1_delay="60"
    
    - vboxheadless - для автозапуска и остановки виртуалок когда выключается/включается хост. Раскомментируете, когда будете готовы.

    Запускаем:
    /usr/local/etc/rc.d/vboxnet start
    
    Создаем и регистрируем директорию в которой будут храниться виртуалки:
    # mkdir -p /usr/home/vbox/machines
    # VBoxManage setproperty machinefolder /usr/home/vbox/machines
    
    В директории hdd будут храниться образы дисков, а в директории iso - установочные iso-образы:
    # mkdir /usr/home/vbox/hdd
    # mkdir /usr/home/vbox/iso
    

  • Управление через web-интерфейс
    Для этого необходимо установить порт web/phpvirtualbox. Статья об установке и настройке есть на сайте.


  • Создаем и настраиваем виртуальную машину
    Мой вариант - 32-х разрядная debian.
    Создаем виртуальную машину под пользователем vbox:
    # VBoxManage createvm --name debian1 --ostype Debian --register 
    
    --name debian1 - имя нашей виртуалки
    --ostype Debian - тип гостевой ОС, все возможные варианты можно посмотреть командой
    # VBoxManage list ostypes
    
    --register - регистрируем машину в virtualbox

    Список зарегистрированных виртуалок можно посмотреть командой
    # VBoxManage list vms
    
    Задаем парамерты виртуалки (писать в одну строку)
    # VBoxManage modifyvm debian1 --memory 512 --floppy disabled --audio none --nic1 bridged --bridgeadapter1 ale0 --vram 1 \
    --accelerate3d off --boot1 disk --acpi on --cableconnected1 on --usb on
    
    --memory 512 - объем памяти виртуалки в мегабайтах
    --floppy disabled - без дисковода
    --audio none - без аудио
    --nic1 bridged - тип сетевого включения на хост-машине (NAT, bridged)
    --bridgeadapter1 ale0 - имя сетевой карты на хост-машине, которая будет мостом
    --vram 1 - объем памяти видеокарты в мегабайтах
    --accelerate3d off - 3d ускорение на видео отключено
    --boot1 disk - загрузка виртуалки с HDD
    --acpi on - acpi включена
    --cableconnected1 on - сетевой кабель включен
    --usb on - usb включено

    Создаем жесткий диск
    # VBoxManage createhd --filename /usr/home/vbox/hdd/disk1.vdi --size 60 --variant Fixed
    
    --filename /usr/home/vbox/hdd/disk1.vdi - полное имя файла с диском
    --size 60 - размер в МЕГАБАЙТАХ
    --variant Fixed - файл с диском будет сразу занимать запрошенный размер. Если этот параметр не добавлять, то размер файла с диском будет увеличиваться по мере надобности. По данным разработчиков, Fixed-диски создаются дольше, но работают быстрее.

    Посмотреть информацию о созданном диске можно командой:
    # VBoxManage showhdinfo /usr/home/vbox/hdd/disk1.vdi
    
    Создаем IDE и SATA контроллеры на виртуалке
    # VBoxManage storagectl debian1 --name "IDE Controller" --add ide
    # VBoxManage storagectl debian1 --name "SATA Controller" --add sata
    
    --name "IDE Controller" - название контроллера
    --add ide - тип добавляемого контроллера

    Подключаем виртуальный диск к SATA контроллеру
    # VBoxManage storageattach debian1 --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium \
     /usr/home/vbox/hdd/disk1.vdi
    
    debian1 - название виртуальной машины
    --storagectl "SATA Controller" - название контроллера
    --port 0 - номер порта
    --device 0 - номер устройства
    --type hdd - тип подключаемого диска
    --medium /usr/home/vbox/hdd/disk1.vdi - путь к файлу подключаемого виртуального диска


  • Запуск виртуальной машины для установки гостевой ОС
    Добываем установочный cd-dvd в виде iso-образа, например debian-8.1.0-i386-CD-1.iso. Подключаем установочный iso в виде dvd-привода к IDE контроллеру:
    # VBoxManage storageattach debian1 --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium \
    /usr/home/vbox/iso/debian-8.1.0-i386-CD-1.iso
    
    Задаем виртуальной машине загрузку с dvd:
    # VBoxManage modifyvm debian1 --boot1 dvd
    
    Настраиваем виртуальную машину для запуска с поддержкой подключения по VNC:
    # VBoxManage setproperty vrdeextpack VNC
    # VBoxManage modifyvm debian1 --vrde on
    # VBoxManage modifyvm debian1 --vrdeproperty VNCPassword=PASSWORD
    # VBoxManage modifyvm debian1 --vrdeauthlibrary null
    # VBoxManage modifyvm debian1 --vrdeport 3390
    
    --vrdeproperty VNCPassword=PASSWORD - вместо PASSWORD задаем пароль, который у нас спросят при подключении к виртуалке по VNC. Максимальная длина пароля - 8 знаков. --vrdeport 3390 - порт, на котором виртуалка слушает подключения

    Запускаем
    # VBoxHeadless --startvm debian1 --type headless
    
    Подключаемся к виртуалке любым VNC-клиентом, используем для подключения ip-адрес хост-машины и порт, заданный в настройках виртуалки.

    Для подключения из FreeBSD можно воспользоваться TightVNC

    После успешного подключения устанавливаем на виртуалку гостевую ОС.

    Замечание по гостевой ОС. Виртуальная сетевая карта работает через мост, поэтому она будет иметь свой собственный MAC-адрес, а IP-адрес может получить или с DHCP-сервера, если таковой у вас в сети присутствует, либо надо задать IP адрес руками. Для других пользователей сети виртуальный сервер будет виден как самостоятельное устройство, со своим собственным IP адресом.

    Останавливаем виртуальную машину (см ниже)

    Задаем в качестве загрузочного виртуальный диск, отключаем VNC:
    # VBoxManage modifyvm debian1 --boot1 disk
    # VBoxManage modifyvm debian1 --vrde off
    
    Отключаем установочный диск:
     # VBoxManage storageattach debian1 --storagectl «IDE Controller» --port 1 --device 0 --medium none
    

  • Остановка виртуальной машины
    Останавливаем через acpi
    # VBoxManage controlvm debian1 acpipowerbutton
    
    или
    # VBoxManage controlvm debian1 poweroff
    

  • Запуск виртуальной машины в "рабочем" режиме
    Для работы виртуалки VNC-подключение не нужно, так как настроенная виртуалка может быть доступна через штатные средства, например ssh/rdp.
    Запускаем:
    # VBoxManage modifyvm debian1 --vrde off
    # VBoxManage startvm debian1 --type headless
    
    debian1 - название виртуальной машины


  • Автостарт/стоп виртуальных машин
    Очень полезная штука, запускает и останавливает виртуалки при включении и выключении сервера.
    Добавляем в /etc/rc.conf
    vboxheadless_enable="YES"
    vboxheadless_user="root"
    vboxheadless_delay="1"
    vboxheadless_stop="savestate"
    vboxheadless_machines="debian1 debian2"
    
    vboxheadless_delay - задержка в секундах перед запуском/выключением гостевых машин
    vboxheadless_stop - что делать при выключении машин, доступные значения: poweroff, savestate (по умолчанию; помните, при включении виртуалки время останется таким каким было при выключении), acpipowerbutton, acpisleepbutton
    vboxheadless_machines - тут список машин через пробел. ВАЖНО! В имени машины не должно быть точек (из личного опыта)!


  • Установка Guest Additions
    Вначале надо раздобыть файл VBoxGuestAdditions.iso. Нужно сходить на сайт разработчика, там найти папку с нужной версией, а в ней уже и сам файлик. Качаем его себе в iso. Подключаем этот iso-файл в гостевую ОС как CDROM:
    # VBoxManage storageattach ubuntu --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium \
    /usr/home/vbox/iso/VBoxGuestAdditions_4.3.20.iso
    
    Далее, запускаем гостевую ОС в ней устанавливаем.
    Для гостевой FreeBSD есть порт, emulators/virtualbox-additions.


  • Удаляем виртуальную машину
    Останавливаем виртуальную машину

    Отключаем диск от виртуальной машины:
    # VBoxManage storageattach ubuntu --storagectl «IDE Controller» --port 0 --device 0 --type hdd --medium none
    
    Удаляем диск из менеджера виртуальных носителей:
    # VBoxManage closemedium disk /usr/home/VMs/disk1.vdi --delete
    
    Если система выдаст ошибку:
    VBoxManage: error: Cannot register the hard disk '/usr/home/VMs/disk1.vdi'
     {4d0c5f1e-9121-4147-8804-e411c40b6e46} because a hard disk '/home/VMs/disk1.vdi'
     with UUID {4d0c5f1e-9121-4147-8804-e411c40b6e46} already exists
    VBoxManage: error: Details: code NS_ERROR_INVALID_ARG (0x80070057), component
     VirtualBox, interface IVirtualBox, callee nsISupports
    VBoxManage: error: Context: "OpenMedium(Bstr(pszFilenameOrUuid).raw(), enmDevType,
     enmAccessMode, fForceNewUuidOnOpen, pMedium.asOutParam())" at line 178 of file
     VBoxManageDisk.cpp
    
    то удаляйте не по пути и имени диска, а по его uin:
    # VBoxManage closemedium disk 4d0c5f1e-9121-4147-8804-e411c40b6e46 --delete
    
    --delete - удаление файла с образом диска, без этого параметра диск будет только разрегистрирован в системе, но сам файл останется

    Удаление виртуальной машины:
    # VBoxManage unregistervm ubuntu --delete
    

  • Создание резервной копии
    Вначале надо выключить виртуальную машину или перевести в режим сохранения состояния

    Перевод в режим сохранение состояния
    # VBoxManage controlvm ubuntu savestate
    

  • Перенос на другой сервер
    Сначала останавливаем виртуальную машину, затем экспортируем в файл:
    # VBoxManage export VMNAME -o VMNAME.ova
    
    На новом сервере импортируем:
    VBoxManage import VMNAME.ova
    

  • Эксплуатация
    • После пересборки и установки ядра FreeBSD обязательно переустановите virtualbox-ose-kmod
    • Посмотреть список зарегистрированных виртуальных машин:
      # VBoxManage list vms
      
    • Посмотреть список запущенных машин:
      # VBoxManage list runningvms
      
    • Посмотреть информацию о виртуальной машине:
      # VBoxManage showvminfo ubuntu
      

  • Железо
    • Сетевые карты

      Добавить вторую сетевую карту:
      # VBoxManage modifyvm ubuntu --nic2 bridged --bridgeadapter2 vlan2 --cableconnected2 on
      
      Сетевая карта была забриджена на сетевой адаптер vlan2 хост-системы Сетевые карты виртуалки - это --nicX, где X - это номер карты.

      Удалить вторую сетевую карту
      # VBoxManage modifyvm ubuntu --nic2 none
      
      Сменить MAC на второй сетевой карте:
      # VBoxManage modifyvm ubuntu --macaddress2 auto
      
      в данном случае mac-адрес будет выбран автоматически, но можно задать вручную:
      # VBoxManage modifyvm ubuntu --macaddress2 A0A0A0A0A0
      
    • USB

      Перед добавлением фильтра необходимо остановить виртуальную машину, для которой он добавляется.
      Чтобы это устройство было видно в ВМ, на хост-системе для виртуальной машины необходимо задать фильтр. Данные для фильтра берутся из вывода команды:
      # VBoxManage list usbhost
      

      Удаление USB устройства из гостевой машины
      Удаляем фильтр с индексом 0 из виртуальной машины с названием ubuntu:
      # VBoxManage usbfilter remove 0 --target ubuntu
      

      DS9490R - Мастер 1-Wire сети
      # VBoxManage list usbhost
      Host USB Devices:
      
      UUID:               289cc18d-3748-41f8-9483-eb0b19758a44
      VendorId:           0x04fa (04FA)
      ProductId:          0x2490 (2490)
      Revision:           0.0 (0000)
      Port:               0
      USB version/speed:  0/1
      Manufacturer:       vendor 0x04fa
      Product:            product 0x2490
      Address:            /dev/ugen1.2
      Current State:      Busy
      
      Добавляем usbfilter с номером 0 для виртуалки с именем ubuntu:
      VBoxManage usbfilter add 0 --target ubuntu -name "DS9490 Master" --active yes --vendorid 04FA \
       --productid 2490 --revision 0000 --manufacturer 'vendor 0x04fa' --product 'product 0x2490' --remote no
      

      D-Link DUB-E100. USB сетевой адаптер.
      Крайне не рекомендую использовать с FreeBSD. И похоже, что дело не в железе, а в драйвере этого устройства.
      # VBoxManage list usbhost
      Host USB Devices:
      
      UUID:               0e9d591c-3e51-49ac-85d5-88ef0b2463c3
      VendorId:           0x2001 (2001)
      ProductId:          0x1a02 (1A02)
      Revision:           0.0 (0000)
      Port:               0
      USB version/speed:  0/2
      Manufacturer:       vendor 0x2001
      Product:            product 0x1a02
      Address:            /dev/ugen4.2
      Current State:      Busy
      
      Хост - FreeBSD 10.1, гостевая - FreeBSD 10.2. Прямой проброс usb-устройства. Сетевая карта в гостевой ОС периодически отваливалась, громадные тайм-ауты при пинге локальных устройств, трассировка не проходила вообще. Настраивать шлюз при таких локальных глюках смысла не было.


      Asus USB-N10 Nano. Wi-Fi адаптер.
      # VBoxManage list usbhost
      Host USB Devices:
      
      UUID:               e8f05c8d-2d59-4a7c-9cb2-59a54fce719d
      VendorId:           0x0b05 (0B05)
      ProductId:          0x17ba (17BA)
      Revision:           0.0 (0000)
      Port:               0
      USB version/speed:  0/2
      Manufacturer:       vendor 0x0b05
      Product:            product 0x17ba
      Address:            /dev/ugen4.4
      Current State:      Busy