- после обновления до версии 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.confvboxnet_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.confvboxheadless_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
- Сетевые карты