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