Я хочу создать блок Vagrant на основе выходных данных другого блока Vagrant. Первый создает файл .bin. В идеале я хотел бы создать новую коробку Vagrant на основе этого файла. Что-то вроде

$ mkdir node2 ; cd node2
$ vagrant init node2 ../build/qMp_3.2.1-Clearance_VirtualBox_x86_factory_20170406-2203.bin --minimal
$ vagrant up

Однако это дает ошибку

bsdtar.EXE: Ошибка при открытии архива: нераспознанный формат архива

Я могу конвертировать из .bin в .vdi, но этого все равно недостаточно для создания Vagrant box.

vboxmanage convertfromraw --format vdi qMp_3.2.1-Clearance_VirtualBox_x86_factory_20180325-0702.bin qmp-nycmesh-3.2.1.vdi

Он по-прежнему выдает сообщение об ошибке открытия архива. Как мне создать Vagrant box из образа диска VirtualBox?

2 ответа2

0

Я понял, что Vagrantfile - это просто Ruby, поэтому я использовал Ruby для генерации VDI и Vagrant для подключения VDI к коробке. Единственная проблема заключается в том, что для этого требуется фиктивная коробка-заполнитель, а после замены носителя она никогда не удалит образ диска-заполнителя! Я не знаю, как это исправить.

Vagrant.configure("2") do |config|
  latest_bin = `ls -t ../build/*.bin | head -1`.strip
  #latest_bin = Dir.glob('../build/*.bin').sort{ |a,b| File.new(a).stat <=> File.new(b).stat }.last
  vdi_file = 'nycmesh-qmp-openwrt.vdi'
  system "vboxmanage convertfromraw --format vdi #{latest_bin} #{vdi_file}" unless File.exist?(vdi_file)
  config.vm.box = "centos/7" # dummy box
  config.vm.provider "virtualbox" do |vb|
    # add the newly created build disk firmware
    vb.customize ['storageattach', :id, '--storagectl', 'IDE', '--port', 0, '--device', 0, '--type', 'hdd', '--medium', "nycmesh-qmp-openwrt.vdi"]
  end
0

Я не знаю, как создать новую бродячую среду из существующего .vdi, скажем так, но вы можете связать бродячую среду с существующей машиной Vbox и затем сгенерировать коробку из бродячей виртуальной машины:

Перейдите в каталог проекта vagrant, затем создайте идентификатор имени файла в нужном месте с помощью VM UUID:

$ cd <vagrant-project-folder> && \
$ echo -n \
$ `VBoxManage list vms \
$  | grep <vm-short-name> \
$  | sed 's/.*{\(.*\)}[^{]*$/\1/'` \
$ > .vagrant/machines/<vm-short-name>/virtualbox/id

Если проект имеет только одну виртуальную машину, он должен быть равен значению по default .

Он напрямую вставляет все, что находится между {} в строке результата grep, в файл без перевода строки.

Виртуальная машина должна быть включена в Virtualbox, чтобы VMS VBoxManage list vms работал

Проверьте, было ли изменение учтено:

$ vagrant status \
> | grep -qE '<vm-short-name>.*not created'

Если статус vagrant возвращает строку с нашим и "не создан", это означает, что он не работает, в противном случае все в порядке, и вы можете запустить vagrant up <vm-short-name> чтобы войти в ВМ и проверить его, настроить его, почисти и т.д.

Затем вы можете упаковать его в коробку:

$ vagrant package --output <box-name>.box

Добавьте его в окно локального хранилища:

$ vagrant box add <box-name> <box-name>.box

Очистка с помощью vagrant destroy и rm рабочего каталога.

Затем инициируйте новый проект, как и в любом другом окне:

$ vagrant init -m <box-name>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .