====== Установка 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!