Что касается установки — то в нашем образе Xubuntu VirtualBox уже есть. Можно установить его либо через репозиторий, либо через deb пекет (рассматриваю семейство ubuntu).

Добавляем репозиторий:

sudo wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add —
sudo wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add —
sudo add-apt-repository «deb http://download.virtualbox.org/virtualbox/debian bionic contrib»
sudo apt-get update

Теперь собственно установка:

#Установка VirtualBox
sudo apt install virtualbox-6.0 -y

Теперь нужно кое что настроить у пользователя, добавить его в группы:

#Добавляем нашего пользователя хостовой машины в группу vboxusers, что бы он мог их запускать
sudo adduser user vboxusers

#Добавляем нашего пользователя хостовой машины в группу disk, что бы пользователь мог подключать реальные диски системы к виртуальной машине
sudo adduser user disk

#А это нужно уже в виртуальной машине, если она основана на linux, пользователя user добавить в группу vboxsf, что бы он мог работать с передаваемыми папками из хостовой машины в виртуальную
sudo adduser user vboxsf

Теперь рассмотрим вопрос о том как подключить реальные диски к виртуальной машине. Начиная с версии Ubuntu 16.04 стала наблюдаться проблема изменения имен дисков при перезагрузке системы, т.е. раньше диск был, например sdb, после перезагрузки он мог поменять свое имя, скажем на sdc. Поэтому создавать ссылку на диск по его имени я думаю лучше не делать. В linux существует обозначение дисков по uuid, но так обозначаются только партиции диска, а нам нужен диск полностью. Для дисков (и для партиций то же) существует определение по id, для того что бы получить полный список этой нумерации, нужно ввести команду:

ls /dev/disk/by-id/

и мы получим список (что-то вроде):

ata-Samsung_SSD_850_PRO_256GB_S1SUNWAFA00295J
ata-Samsung_SSD_850_PRO_256GB_S1SUNWAFA00295J-part1
ata-Samsung_SSD_850_PRO_256GB_S1SUNWAFA00295J-part2
ata-Samsung_SSD_850_PRO_256GB_S1SUNWAFA00295J-part5
ata-Samsung_SSD_850_PRO_256GB_S1SUNWAFA00295J-part6
ata-Samsung_SSD_850_PRO_256GB_S1SUNWAFA00295J-part7
ata-ST3000DM001-9YN166_W1F15WWL
ata-ST3000DM001-9YN166_W1F15WWL-part1
ata-ST31500541AS_9XW0A8B7
ata-ST31500541AS_9XW0A8B7-part1
ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N1LX74T3
ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N1LX74T3-part1
nvme-eui.0025385471b1e089
nvme-eui.0025385471b1e089-part1
nvme-Samsung_SSD_960_EVO_500GB_S3EUNX0J407558P
nvme-Samsung_SSD_960_EVO_500GB_S3EUNX0J407558P-part1
wwn-0x5000c5001fd80852
wwn-0x5000c5001fd80852-part1
wwn-0x5000c5005363aac7
wwn-0x5000c5005363aac7-part1
wwn-0x50014ee261bc91d0
wwn-0x50014ee261bc91d0-part1
wwn-0x500253887003d196
wwn-0x500253887003d196-part1
wwn-0x500253887003d196-part2
wwn-0x500253887003d196-part5
wwn-0x500253887003d196-part6
wwn-0x500253887003d196-part7

для создания диска, указывающего на физический, даём команду:

VBoxManage internalcommands createrawvmdk -filename drive.vmdk -rawdisk /dev/disk/by-id/nvme-Samsung_SSD_960_EVO_500GB_S3EUNX0J407558P

и получаем файл drive.vmdk, который затем можно будет использовать в виртуальной машине.

Когда диск уже будет подключен к виртуальной машине, нужно не забыть поменять его тип на «сквозной». Заходим в меню файл, выбираем менеджер виртуальных носителей

выбираем нужный нам диск и дважды по нему щелкаем мышью

После чего задаем тип — «сквозной», и применить.

Для того, что бы можно было «прикрутить» систему «стуков» по портам, нам нужно нашу виртуальную машину завести в виртуальную сеть, для этого — заходим в меню файл и выбираем менеджер сетей хоста:

нажимаем кнопку создать и получаем новую виртуальную сеть:

Можно настроить параметры сети, если это нужно. Таких сетей при необходимости можно создать несколько, тем самым можно сервера разграничить друг относительно друга.

Далее в виртуальной машине заходим на вкладку сеть и

в качестве типа подключения выбираем «Виртуальный адаптер хоста», а в имени выбираем ту сеть к которой мы собрались цеплять наш сервер.

Теперь только осталось настроить файервол на хостовой машине, но это позже.

Что касается автозапуска виртуальных машин (как сервиса), то тут начиная с версии ubuntu 16.04 была большая проблема, которая в основном была связана с правильным выключением. Дело в том, что начиная с версии ubuntu 16.04 система стала использовать systemd для запуска служб. Я нашел в итернете статью , где человек наконец-то справился с проблемой корректной остановки виртуальных серверов.

Вот в общем-то суть:

Создаем файл запуска наших виртуальных машин как сервиса:

sudo mousepad /etc/systemd/system/vm_autostart@.service

[Unit]
Description=VM %I
After=network.target vboxdrv.service
Before=runlevel2.target shutdown.target

[Service]
User=user
Group=vboxusers
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes

ExecStart=/usr/bin/VBoxManage startvm %I —type headless
ExecStop=/usr/bin/VBoxManage controlvm %I savestate

[Install]
WantedBy=multi-user.target

нужно заменить пользователя user на Вашего пользователя. Затем обновляем сервис systemd

#Обновляем сервис systemd
sudo systemctl daemon-reload

Теперь можно добавлять или удалять виртуальную машину в автозагрузку:

# Для добавления виртуальной машины в автозагрузку (в место vm_name подставляем имя нашей виртуальной машины)
sudo systemctl enable vm_autostart@vm_name

# Для удаления виртуальной машины из автозагрузки (в место vm_name подставляем имя нашей виртуальной машины)
sudo systemctl disable vm_autostart@vm_name

так же можно использовать команды, для управления службой:

# Для проверки статуса виртуальной машины vm_name
sudo systemctl status vm_autostart@vm_name

# Для старта виртуальной машины vm_name
sudo systemctl start vm_autostart@vm_name

# Для остановки виртуальной машины vm_name
sudo systemctl stop vm_autostart@vm_name

Тут есть особенность, если виртуальная машина была запущена, как сервис и вы, зашли на пример на нее через RDP и дали команду на выключение, то хоть виртуальная машина и выключится, но непосредственно сервис, который ее стартовал будет продолжать работать. И если Вы дадите команду на запуск сервиса для этой машины, то он не как не отработает, ведь для системы он все еще работает. Так что в этом случае приходится сначала дать команду на останов сервиса, а уж потом давать команду на запуск виртуальной машины. Ну в общем то это не проблема.

Для удобства работы с виртуальными машинами, я создаю три файла (для каждой машины), через которые могу управлять ими.

Файл старта виртуальной машины (vm_start.sh):

#Сначала на всякий случай останавливаем сервис
sudo systemctl stop vm_autostart@vm_name
#А теперь стартуем
sudo systemctl start vm_autostart@vm_name

Файл остановки сервиса виртуальной машина (vm_stop.sh):

#Останавливаем сервис виртуальной машины
sudo systemctl stop vm_autostart@vm_name

И наконец мне иногда, для создания копии данных с дисков виртуальной машины, нужно именно корректно выключить ее, а не сохранять состояние. Для этого есть файл (vm_stop_acpi.sh):

#Даем команду на выключение виртуальной машины
sudo -H -u user /usr/bin/VBoxManage controlvm «vm_name» acpipowerbutton

Здесь не забываем менять user на имя пользователя от которого виртуальная машина запускается, ну и конечно имя виртуальной машины vm_name, на нашу.

Второй вариант автостарта виртуальных машин VirtaulBox:

С выходом Virtual Box 7.0 стала проявляться проблема, что виртуальные машина не всегда стартуют при автозагрузке, описанной выше.

Настройка сервиса автозапуска виртуальной машины

Создайте файл sudo mousepad /etc/default/virtualbox, с таким содержимым:

# virtualbox defaults file
VBOXAUTOSTART_DB=/etc/vbox
VBOXAUTOSTART_CONFIG=/etc/vbox/autostart.cfg

VBOXAUTOSTART_DB — определяет абсолютный путь к каталогу базы данных автозапуска, обычно это /etc/vbox. 

VBOXAUTOSTART_CONFIG — определяет путь к конфигурации автозапуска виртуальной машины. Настройка конфигурации автостарта, создайте файл.

sudo mousepad /etc/vbox/autostart.cfg

Содержимое файла (смените user — на вашего пользователя):

# Default policy is to deny starting a VM, the other option is "allow".
default_policy = deny
# User is allowed to start virtual machines but starting them
# will be delayed for 10 seconds
user = {
    allow = true
    startup_delay = 10
}
# Alice is not allowed to start virtual machines, useful to exclude certain users
# if the default policy is set to allow.
alice = {
    allow = false
}
  • default_policy — определяет, разрешать или запрещать автоматический запуск виртуальной машины по умолчанию. В примере выше мы отказали кому-либо в автоматическом запуске виртуальной машины и явно разрешили одному пользователю user.
  • username (user) — с помощью политики запрета по умолчанию вы можете определить конкретных пользователей, которым разрешено автоматически запускать виртуальную машину (allow = trues). Вы также можете определить, как долго задерживать запуск виртуальной машины. 10 секунд используется в этой демонстрации.

Если вы являетесь единственным пользователем, то вы можете просто вписать так:

default_policy=allow

Определение владельца директории базы данных автозапуска

Для определения владельца директории базы данных автозапуска выполните следующие команды:

sudo chgrp vboxusers /etc/vbox
sudo usermod -a -G vboxusers ceasar

Назначьте группе разрешения на запись в каталоге базы данных автозапуска:

sudo chmod 1775 /etc/vbox

Как user, вы можете включить автозапуск для отдельных машин. Для этого необходимо сначала определить путь к каталогу базы данных.

VBoxManage setproperty autostartdbpath /etc/vbox

Добавление виртуальной машины в автозапуск

vboxmanage modifyvm redos --autostart-enabled on

где redos — это UUID или имя вашей виртуальной машины. 

Для каждой запускаемой виртуальной машины можно задать время задержки автостарта (машина при этом должна быть выключена):

VBoxManage modifyvm redos --autostart-delay время_задержки

где redos — это UUID или имя вашей виртуальной машины. 

Так же можно задать тип отключения виртуальной машины при выключении/перезагрузки сервиса автозапуска

VBoxManage modifyvm redos --autostop-type вариант_выключения

где redos — это UUID или имя вашей виртуальной машины и где вариант_выключения может принимать следующие значения:

acpishutdown - равносильно правильному завершению работы системы 
poweroff - грубое отключение питанияя
savestate - сохранение состояния виртуальной машины
disabled - убрать виртуальную машину из сервииса автовыключения


Перезапуск службы автозапуска:

sudo service vboxautostart-service restart

Посмотреть состояние сервиса:

sudo service vboxautostart-service status

Принудительный старт виртуальной машины как сервиса

sudo -H -u user /usr/bin/VBoxManage startvm redos --type headless

где user — имя пользователя от которого стартует виртуальная машина redos — это UUID или имя вашей виртуальной машины. 

Принудительная остановка одной из запущеных виртуальных машин

sudo -H -u user /usr/bin/VBoxManage controlvm redos acpipowerbutton

где user — имя пользователя от которого стартует виртуальная машина redos — это UUID или имя вашей виртуальной машины. 

Подобным образом можно остановить одну из виртуальных машин путём сохранения её состояния:

sudo -H -u user /usr/bin/VBoxManage controlvm redos savestate

где user — имя пользователя от которого стартует виртуальная машина redos — это UUID или имя вашей виртуальной машины.

Здесь можно закачать все необходимые скрипты для настройки данного метода.

Так же хотелось бы отметить, что при данном методе иногда возникают не очень приятные ситуации, при которых виртуальные машины потом напроч отказываются запускаться, приходится менять разрешения на файлы самой виртуальной машины. Ну и лучше всё таки где т о иметь прозапас копию виртуальной машины.

Так что этот метод хоть и более функционален и для Virtual Box 7.0 работает стабильнее, но у него тоже есть слабые места… к сожалению.