¿Cómo genero un nuevo cuadro de Vagrant basado en un archivo .bin o .vdi?

0

Quiero crear un cuadro de Vagrant basado en la salida de otro cuadro de Vagrant. El primero construye un archivo .bin. Idealmente, me gustaría crear un nuevo cuadro de Vagrant basado en este archivo. Algo como

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

Sin embargo da un error.

bsdtar.EXE: Error al abrir el archivo: Formato de archivo no reconocido

Puedo convertir de .bin a .vdi, pero aún no es suficiente para crear un cuadro Vagrant.

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

Todavía da el mensaje de 'error al abrir el archivo'. ¿Cómo creo un cuadro de Vagrant a partir de una imagen de disco de VirtualBox?

Chloe
fuente

Respuestas:

0

No sé cómo crear un nuevo entorno vagrant a partir de un .vdi por ejemplo, pero puede asociar un entorno vagrant con una máquina Vbox existente y luego generar una caja de la VM vagrant:

Vaya al directorio del proyecto vagrant, luego cree un nombre de archivo id en el lugar correcto con otro 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

Si el proyecto solo tiene una máquina virtual, entonces debe ser igual a default.

Inyecta directamente lo que haya entre {} en la línea de resultados del grep al archivo sin nueva línea.

La máquina virtual debe estar en Virtualbox para VBoxManage list vms trabajar

Compruebe si el cambio fue tenido en cuenta:

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

Si el estado errante devuelve una línea con nuestro y "no creado" significa que no funcionó, de lo contrario está bien y luego puede ejecutar vagrant up <vm-short-name> para entrar en la máquina virtual y probarlo, modificarlo, limpiarlo, etc.

Luego puedes empaquetarlo en una caja:

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

Añádelo al repositorio local de la caja:

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

Limpieza con vagrant destroy y rm el directorio de trabajo.

Luego inicia un nuevo proyecto como con cualquier caja:

$ vagrant init -m <box-name>
lee-pai-long
fuente
0

Me di cuenta de que Vagrantfile es solo Ruby, así que simplemente utilicé Ruby para generar el VDI y Vagrant para adjuntar el VDI a la caja. El único problema es que requiere un cuadro de marcador de posición ficticio, y después de reemplazar el medio de almacenamiento, ¡nunca eliminará la imagen de disco del marcador de posición! No sé cómo arreglar eso.

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
Chloe
fuente