Как мне сгенерировать новое окно Vagrant на основе файла.bin или.vdi?
Я хочу создать блок 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 ответа
Я понял, что 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
Я не знаю, как создать новую бродячую среду из существующего.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 для 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
и рм рабочий каталог.
Затем начните новый проект, как и в любой коробке:
$ vagrant init -m <box-name>