====== Установка VirtualBox и phpvirtualbox на FreeBSD ======
Виртуализация **KVM** (Kernel-based Virtual Machine) на самой открытой и быстрой операционной системе FreeBSD - что может быть лучше? Для теста здесь используется ОС freebsd 13.2. Обращаем внимание на то, что периодически при попытке сразу после установки ОС собрать virtualBox из сырцов наблюдаются ошибки, вероятно связанные с обновлением портов. В этом случае следует использовать установку через pkg
#
#
pkg install virtualbox-ose
===== После установки ОСи обновляем устанавливаем порты и обновляем их. =====
#
portsnap fetch extract
portsnap fetch update
===== Получаем свежие src ОС =====
# Получаем свежие сырцы
fetch -o /tmp/src.txz http://ftp.freebsd.org/pub/FreeBSD/releases/amd64/`uname -r`/src.txz
cd /; tar xJvf /tmp/src.txz
===== Собираем VirtualBox и модули ядра для его работы =====
# Устанавливаем tmux
/usr/ports/sysutils/tmux
make install clean BATCH=yes
#
# Запускаем tmux
tmux
#
# Порт virtualbox-ose будет компилироваться несколько часов, поэтому выполняем это в tmux
# Порт virtualbox-ose-kmod подтянется сам.
cd /usr/ports/emulators/virtualbox-ose
make install clean BATCH=yes I_DONT_CARE_IF_MY_BUILDS_TARGET_THE_WRONG_RELEASE=yes -j 8
cd /usr/ports/sysutils/lsof
make install clean BATCH=yes -j 8
# Добавляем модуль в загрузку
echo 'vboxdrv_load="YES"' >> /boot/loader.conf
# Загружаем модуль в память
kldload vboxdrv
===== Устанавливаем PhpVirtualBox =====
# Добавляем пользователя, от которого будут работать VM на сервере.
# Пароль сохраняем, он нам потребуется чуть позднее.
adduser vbox
pw groupmod vboxusers -m vbox
# Устанавливаем web-сервер nginx
pkg install -y nginx
# Устанавливаем PhpVirtualBox
cd /usr/ports/www/phpvirtualbox
make install clean BATCH=yes
Обращаю внимание, что **php** установится автоматом при установке phpvirtualbox
===== Конфигурируем VirtualHost для вебморды =====
# Копируем конфиг для php.ini
cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
# Добавляем ссылку на каталог ngnix/conf.d
sed -i.bak '$s/}/\tinclude conf.d\/\*\.conf;\r\n\r\n}/' /usr/local/etc/nginx/nginx.conf
# Создаем директорию для добавления собственных конфигов NgiNX
mkdir /usr/local/etc/nginx/conf.d/
Далее нужно создать конфиг /usr/local/etc/nginx/conf.d/vbox.conf
Укажите URL, по которому будет работать веб-морда phpVBox
server {
listen 80;
server_name URL-URL;
root /usr/local/www;
error_log /var/log/nginx/vbox-error.log warn;
access_log /var/log/nginx/vbox.log;
location / {
root /usr/local/www/nginx;
index index.php index.html;
try_files $uri $uri/ =404;
}
location /phpvirtualbox {
index index.html;
try_files $uri $uri/ =404;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
==== Включаем phpVirtualBox ====
# Добавляем в автозагрузку nginx и php-fpm
sysrc nginx_enable=YES
sysrc php_fpm_enable=YES
# Стартуем сервисы
service php-fpm restart
service nginx restart
==== Стартуем vboxwebserver ====
sysrc vboxwebsrv_enable=YES
sysrc vboxwebsrv_user="vbox"
/usr/local/etc/rc.d/vboxwebsrv start
Сразу проверим, работает ли он:
lsof -i :18083
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vboxwebsr 87849 vbox 8u IPv6 0xfffffe003e89b0e0 0t0 TCP localhost:18083 (LISTEN)
=== Конфигурируем PhpVirtualBox ===
nano /usr/local/www/phpvirtualbox/config.php
/* Username / Password for system user that runs VirtualBox */
var $username = 'vbox'; /* Тут указываем имя пользователя */
var $password = 'Pa$$w0rD'; /* Тут указываем пароль пользователя */
/* SOAP URL of vboxwebsrv (not phpVirtualBox's URL) */
var $location = 'http://localhost:18083/'; /* Тут меняем 127.0.0.1 на locahost */
===== Стартуем все сервисы и проверяем работу VirtualBox и Вебморды=====
sysrc vboxguest_enable=YES
sysrc vboxnet_enable=YES
service vboxnet start
Переходите на [[http://URL-URL/phpvirtualbox/]] и начинайте настройку виртуальных машин. Пароль admin по дефолту admin.
===== PS Не работает в веб-интерфейсе выбор файла для монтирования =====
Если не работает в веб-интерфейсе выбор файла для монтирования, то действуем так:
$ vboxmanage list vms
"app" {5e261d64-68d0-4f20-92eb-82dadde4c54b}
$ vboxmanage storageattach "5e261d64-68d0-4f20-92eb-82dadde4c54b" --storagectl IDE \
--port 0 --device 0 --type dvddrive --medium /home/vbox/iso/debian-11.6.0-amd64-netinst.iso
Если потребовалось сменить hdd диск у виртуальной машины:
# Находим UUID нужного диска в этом списке:
vboxmanage list hdd $DISKUUID
# Находим UUID машины, в которой хотим сменить диск
vboxmanage list vms $VMUUID
"app" {5e261d64-68d0-4f20-92eb-82dadde4c54b}
"mysql" {f5d595f0-c8a0-4359-83f5-185083710a40}
# Меняем диск
vboxmanage storageattach $VMUUID --storagectl "SATA" --device 0 --port 0 --type hdd --medium $DISKUUID
[PHP Modules]
Core
date
hash
json
libxml
mysqlnd
openssl
pcre
Reflection
session
SimpleXML
soap
SPL
standard
xml
[Zend Modules]
===== Предупреждение о возможных багах после установки virtualbox =====
Troubleshooting:
================
Running VirtualBox as non-root user may fail with a fatal error
NS_ERROR_FACTORY_NOT_REGISTERED. In this case delete /tmp/.vbox-*-ipc file.
If you experience "Network: write Failed: Cannot allocate memory" errors
try to increase net.graph.maxdata in /boot/loader.conf
If you are using AIO, then increase these limits (https://bugs.freebsd.org/168298):
vfs.aio.max_buf_aio=8192
vfs.aio.max_aio_queue_per_proc=65536
vfs.aio.max_aio_per_proc=8192
vfs.aio.max_aio_queue=65536
To check if AIO is used use: kldstat -v | grep aio
If you are experiencing VMs freezes with an error in VBox.log such as:
"
00:01:29.590192 AssertLogRel /usr/ports/emulators/virtualbox-ose/work/VirtualBox-6.1.44
/src/VBox/VMM/VMMR3/PGMPhys.cpp(5148) int PGMR3PhysAllocateHandyPages(PVM): RT_SUCCESS(rc)
00:01:29.590221 87/128: idPage=0x3d400 HCPhysGCPhys=000000027eaed000 rc=VERR_NO_MEMORY
00:01:29.590247 Changing the VM state from 'RUNNING' to 'GURU_MEDITATION'
00:01:29.590261 Console: Machine state changed to 'GuruMeditation'
00:01:29.590695 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
00:01:29.590696 !!
00:01:29.590697 !! VCPU0: Guru Meditation -8 (VERR_NO_MEMORY)
"
and see a lot of free RAM, then increase sysctl vm.max_user_wired
(https://bugs.freebsd.org/252227).
For dedicated VM servers, a good start is:
("RAM in GB" - max(1, "RAM in GB" / 32)) * 1024*1024*1024 / PAGE_SIZE
PAGE_SIZE on x86 is 4096.
Examples with different RAM sizes in GB:
16: ( 16-max(1, 16/32)*1024*1024*1024/4096 = 3932160 => 15GB
32: ( 32-max(1, 32/32)*1024*1024*1024/4096 = 8126464 => 31GB
48: ( 48-max(1, 48/32)*1024*1024*1024/4096 = 12189696 => 46.5GB
64: ( 64-max(1, 64/32)*1024*1024*1024/4096 = 16252928 => 62GB
128: (128-max(1,128/32)*1024*1024*1024/4096 = 32505856 => 124GB
256: (256-max(1,256/32)*1024*1024*1024/4096 = 65011712 => 248GB
When assigning IP addresses in host-only mode from ranges outside
of VirtualBox's defaults, the respective ranges need to be listed
in /usr/local/etc/vbox/networks.conf (https://bugs.freebsd.org/259399).
Check the wiki page for known issues and troubleshooting:
https://wiki.freebsd.org/VirtualBox
Please report any problems to emulation@. Thanks!