0046 — Оптический привод в ВМ Vagrant
Я по работе вынужден часто поднимать систему с нуля. Разумеется, делать это вручную или клонировать существующую ВМ не очень эффективно. Примерно год назад я стал использовать для этого Vagrant, и всё было бы хорошо, но в образах, которые я использую, старая версия VirtualBox Guest Additions.
Особенностью ВМ, создаваемых в Vagrant, является то, что в них по умолчанию не создаётся оптический привод.
Вчера немного допилил свой Vagrantfile
, и теперь он выглядит так:
# frozen_string_literal: true
Vagrant.configure('2') do |config|
config.vm.box = '***'
config.vm.box_url = '******'
vms = [
# Главный узел
{ name: 'aac', hostname: 'aac', cpus: 4, memory: 4, ip: 11 },
# Остальные узлы
{ name: 'node1', hostname: 'exc1', cpus: 2, memory: 2, ip: 12 },
{ name: 'node2', hostname: 'exc2', cpus: 2, memory: 2, ip: 13 },
{ name: 'node3', hostname: 'hop1', cpus: 2, memory: 2, ip: 14 },
{ name: 'node4', hostname: 'exc3', cpus: 2, memory: 2, ip: 15 }
]
vms.each do |vm|
config.vm.define vm[:name] do |node|
node.vm.hostname = vm[:hostname]
node.vm.provider 'virtualbox' do |vbox|
vbox.cpus = vm[:cpus]
vbox.memory = vm[:memory] * 1024 + 256 # 256 MB for Vagrant
# Создание привода DVD и монтирование дополнений
vbox.customize ['storageattach',
:id,
'--storagectl',
'SATA Controller',
'--type',
'dvddrive',
'--port',
'1',
'--medium',
'emptydrive']
end
node.vm.network 'private_network',
ip: format('192.168.56.%d', vm[:ip])
end
end
config.vm.provision 'shell', inline: <<~SCRIPT
echo "nameserver 77.88.8.8" | sudo tee /etc/resolv.conf > /dev/null
echo "nameserver 77.88.8.1" | sudo tee -a /etc/resolv.conf > /dev/null
echo "nameserver 1.1.1.1" | sudo tee -a /etc/resolv.conf > /dev/null
SCRIPT
end
Самые интересные строки вот эти:
vbox.customize['storageattach',
:id, # ID виртуальной машины
'--storagectl',
'SATA Controller',
'--type',
'dvddrive',
'--port',
'1',
'--medium',
'emptydrive']
Идентификатор виртуальной машины будет известен только после её создания. Все остальные параметры взял из документации утилиты VBoxManage, используемой для управления ВМ VirtualBox из CLI.
Теперь после создания ВМ в ней доступен привод CD-ROM, но он сейчас пустой.
В документации написано, что если задать вместо emptydrive
значение additions
, то будет диск с VirtualBox Additions, но у меня такой код не заработал. Ничего страшного, можно выключить все ВМ, изменить значение параметра и запустить уже существующие машины: в этом случае всё отрабатывает как и ожидалось.
Обновление самих VirtualBox Linux Additions уже дело техники:
sudo apt-get update && \
sudo apt-get install \
build-essential \
make \
linux-headers-$(uname -r) --yes && \
sudo mount -o ro /dev/sr0 /media/cdrom && \
sudo /bin/bash /media/cdrom/VBoxLinuxAdditions.run