Иногда возникает надобность запустить виртуальную машину на сервере без X11 к которому у вас есть доступ только по SSH. Запустить виртуальную машину на компьютере без X11 можно при помощи утилиты VBoxHeadless входящей в поставку VirtualBox. Создание и управление виртуальными машинами тоже легко осуществляется утилитой VBoxManage. А получить доступ к удаленному рабочему столу можно при помощи VirtualBox Remote Desktop Extension входящим в VirtualBox Extension Pack. Это позволит пробросить виртуальный экран который вы обычно видите в GUI-версии виртуалбокса по протоколу RDP. Как это все настроить, будет рассказано в статье. 

Установка VirtualBox

Основной пакет есть в основном репозитарии:

pacman -S virtualbox

Также нам понадобится Extension Pack, который в Arch можно установить из  AUR при помощи yaourt:

yaourt -S virtualbox-ext-oracle

Тут нельзя не упомянуть удобство AUR ArchLinux. Например на других системах в которых нет пользовательских репозитариев вам придется сначала узнать вашу версию (при помощи VBoxManage -v), зайти на https://www.virtualbox.org/wiki/Download_Old_Builds_4_3, найти там версию и ссылку для екстеншен пака, затем скачать его например так

wget http://download.virtualbox.org/virtualbox/4.3.10/Oracle_VM_VirtualBox_Extension_Pack-4.3.10-93012.vbox-extpack

а потом еще и установить

VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-***.vbox-extpack

Согласитесь вызов yaourt выглядит куда проще.

После установки обязательно необходимо указать настройку vrdeextpack вот таким образом:

VBoxManage setproperty vrdeextpack "Oracle VM VirtualBox Extension Pack"

Если не указать это свойство (или не установив Extension Pack) при запуске ВМ будет получена ошибка "webSocketsHandshake: invalid client header".

Последним действием после установки есть добавление модулей в автозагрузку:

sudo vim /etc/modules-load.d/virtualbox.conf
vboxdrv
vboxnetadp
vboxnetflt

Перезагружаем модули:

systemctl restart systemd-modules-load

Создание виртуальной машины 

Назовем arch типа ArchLinux:

VBoxManage createvm --name arch --ostype ArchLinux --register

В выводе получаем что-то вроде:

/etc/vbox/vbox.cfg: line 2: default_policy: command not found
Virtual machine 'arch' is created and registered.
UUID: e9d90d49-6d8a-4006-b55c-afe45368e78c
Settings file: '/home/vanya/VirtualBox VMs/arch/arch.vbox'

Настраиваем машину:

VBoxManage modifyvm arch --memory 2048 --floppy disabled --audio none --nic1 bridged --bridgeadapter1 enp3s0 --vram 4 --accelerate3d off --boot1 disk --acpi on --cableconnected1 on --usb off --vrde on --vrdeport 3390

--nic1 bridged указывает на использование адаптера в режиме "Сетевого моста", то есть виртуальная машина при включении попадет в ту же локальную сеть в которой находится сервер и получит IP от DHCP сервера, если он есть в сети. В простейшем случае можно использовать Nat. Еще один момент на который стоит обратить внимание - это параметр --vrdeport 3390, который задает порт на котором по которому будет доступна машина из вне. Естественно для доступа из интернета этот порт должен быть проброшен на роутере (некоторые роутеры называют это "виртуальными серверами").

Подключение жесткого диска

Я буду подключать существующий диск archl.vmdk из папки vm, на котором уже содержится предварительно установленный ArchLinux (в обычном VirtualBox на моем копьютере).

VBoxManage storagectl arch --name "IDE Controller" --add ide
VBoxManage storageattach arch --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium vm/archl.vmdk

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

Запустить машину можно так:

VBoxHeadless --startvm arch

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

VBoxHeadless --startvm arch &

Еще один важный момент - если вы используете SSH то при отключении процессам будет отправлен SIGHUP (hang up signal), что их убъет. Решить это легко, используя:

nohup VBoxHeadless --startvm arch &

Для подключения можем использовать например KRDC и freerdp.

Ограничение доступа

Если ваш сервер имеет анонсируемый айпи, или используемый порт "3390" проброшен на такой айпи, то злоумышленникам не составит труда онаружить открытый порт 3390 и получить управление вашей виртуалкой. Что бы это исправить нужно настроить авторизацию.

Устанавливаем общее для всех машин свойство:

 

VBoxManage setproperty vrdeauthlibrary "VBoxAuthSimple" 

Указываем тип для нашей машины:

 

VBoxManage modifyvm "arch" --vrdeauthtype external 

Теперь сгенерим хеш нашего пароля:

 

VBoxManage internalcommands passwordhash "пароль" 

В ответ получим Password hash., например a851183338b789aff87345d742bf13c5f0a89af0ff7c5fc91d7f8 

И указываем его в внастройке:

VBoxManage setextradata "arch" "VBoxAuthSimple/users/<имя юзера который владеет вм>" a851183338b789aff87345d742bf13c5f0a89af0ff7c5fc91d7f8 

Перезапустив ВМ, подключение возможно лишь по логину и паролю.