As expected, first we need to install VirtualBox.
sudo wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
echo "deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian focal contrib" \
| sudo tee /etc/apt/sources.list.d/virtualbox.list
sudo apt update
sudo apt-get install --yes virtualbox-6.1
sudo systemctl status vboxdrv
sudo usermod -aG vboxusers $USER
Since our server is headless, we will need a remote acces. This means installing Oracle’s extension pack with RDP support. You should be good installing this on your home system but you will need license for production deployments.
VBOXVER=`vboxmanage -v | cut -dr -f1`
wget -P /tmp \
https://download.virtualbox.org/virtualbox/$VBOXVER/Oracle_VM_VirtualBox_Extension_Pack-$VBOXVER.vbox-extpack
vboxmanage extpack install /tmp/Oracle_VM_VirtualBox_Extension_Pack-$VBOXVER.vbox-extpack
With installation ready, we can approach creating VM. I’ll give an example of the Ubuntu Desktop but really anything goes.
mkdir -p /srv/virtualbox
vboxmanage createvm \
--ostype Ubuntu_64 \
--basefolder "^^/srv/virtualbox^^" \
--register \
--name "^^Test^^"
vboxmanage modifyvm "^^Test^^" \
--memory 1024 \
--nic1 nat \
--vrde on --vrdeport ^^33890^^
vboxmanage createhd \
--filename "^^/srv/virtualbox/Test/Test.vdi^^" \
--format VDI --size ^^10240^^
vboxmanage storagectl "^^Test^^" \
--name "SATA" \
--add sata
vboxmanage storageattach "^^Test^^" \
--storagectl SATA --port 0 --type hdd \
--medium "/srv/virtualbox/Test/Test.vdi"
vboxmanage storageattach "^^Test^^" \
--storagectl SATA --port 15 --type dvddrive \
--medium ^^/tmp/ubuntu-20.04-desktop-amd64.iso^^
If you are using firewall, make sure to allow port through. For example, iptables
would need the following adjustment.
iptables -A INPUT -p tcp --dport 33890 -j ACCEPT
With this, we’re finally ready to start the virtual machine.
vboxmanage startvm "^^Test^^" --type headless
To connect to it just use any Remote Desktop application.
PS: Authentication for RDP is highly recommended and you should probably check documentation to see what works best for you.