Establecer el tamaño de almacenamiento en la creación de VM VirtualBox


41

¿Hay alguna forma de establecer el tamaño de almacenamiento para la VM al crearlo? Usaré Vagrant, pero no estoy seguro de si esto es algo que debe hacerse en VirtualBox o una configuración que pueda incluir en Vagrantfile (verifiqué documentos pero no parece haber ninguna indicación)


Google para "Vagrant Disk Size Virtualbox" y encuentra esta publicación en AskUbuntu .
eyoung100

2
@ eyoung100 ah gracias, supongo que eso confirma que no se puede hacer antes de crear el vm.
a7omiton

Bueno, puede hacerlo si crea el VirtualDisk sin Vagrant, pero no necesitaría usar vagrant si así lo desea.
eyoung100

@ eyoung100 solo parecía un paso adicional, tener que cambiar el tamaño de la VM después de crearla
a7omiton

Vagabundo destruye la máquina virtual después de que apagues el vagabundo de todos modos IIRC.
eyoung100

Respuestas:


23

El vagrant-disksize complemento lo hace fácil. Cree un debian-9 vm con un disco duro de 20 gb.

mínimamente:

Vagrant.configure("2") do |config|
    config.vm.box = "debian/stretch64" 
    config.disksize.size = "20GB"
end

o, usando la lógica de instalación automática para el complemento:

Vagrant.configure("2") do |config|

    required_plugins = %w( vagrant-vbguest vagrant-disksize )
    _retry = false
    required_plugins.each do |plugin|
        unless Vagrant.has_plugin? plugin
            system "vagrant plugin install #{plugin}"
            _retry=true
        end
    end

    if (_retry)
        exec "vagrant " + ARGV.join(' ')
    end

    config.vm.box = "debian/stretch64" 
    config.disksize.size = "20GB"
end

No funciona con Ubuntu 17.10 (Artful Aardvark) # 10: github.com/sprotheroe/vagrant-disksize/issues/10
David

2
Funcionó para Ubuntu 16.04 LTS. Como mencionas, solo instala el complemento con el comando: vagrant plugin install vagrant-disksize¡Gracias!
Edenshaw

1
Parece que solo funciona para extender el disco, no para reducirlo.
xenoid

Trabajado como un encanto.
wny

8

No es posible a menos que conozca el UUID del disco en cuestión. Si lo hiciera, necesitaría tener lo siguiente en su Vagrantfile:

Vagrant.configure("2") do |config|
  # ... (other config)

  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyhd", "disk id", "--resize", "size in megabytes"]
  end
end

donde "size in megabytes"es el tamaño de HD en megabytes y "disk id"es el UUID del disco ( no la VM)

Alternativamente, puede hacer esto a través de VBoxManage:

$ VBoxManage list hdds
[get the UUID of the disk in question from the output]
$ VBoxManage modifyhd [UUID] --resize [size in MiB]

Hacer la solución alternativa no crearía el espacio de almacenamiento adicional en la máquina virtual real, ¿o sí?
a7omiton

Es cierto, solo cambiará el tamaño del disco duro, luego tendría que hacer crecer la partición en la VM
felixphew

77
Como se mencionó en los otros subprocesos, esto generalmente no funciona ya que la mayoría de los cuadros de Vagrant se crean con .vmdkarchivos de disco virtual en lugar del .VDIformato preferido por VBoxManage.
Mark Hudson

@MarkHudson Lo siento, no estaba al tanto de esto (acabo de hacer esta respuesta en base a mi conocimiento de VirtualBox y la documentación de Vagrant, realmente no uso mucho Vagrant). ¡Gracias por señalar esto! ¿VirtualBox no puede cambiar el tamaño de VMDK? Nunca lo he intentado. Actualizaré mi respuesta.
felixphew

6

Creo que resolver algunos problemas comunes de esto puede ayudarte.


Y esta es la parte esencial.

Aumentar el espacio en disco

Normalmente (lamentablemente), el cuadro base de la nube viene con formatos de discos VMDK. Si tiene suerte y su formato de disco es VDI, puede resolver esto directamente de esta manera. Pero, VMDK no se puede expandir, por lo que debe agregar otro disco a su VM. Si hacer esto manualmente es difícil, ¿puedes crear imágenes haciendo esto desde Vagrant? Bueno, ahora que lo resolví no es tan difícil:

Cree un script llamado "bootstrap.sh" en su directorio de trabajo y agregue estas líneas:

pvcreate /dev/sdb
vgextend VolGroup /dev/sdb
lvextend /dev/VolGroup/lv_root /dev/sdb
resize2fs /dev/VolGroup/lv_root

VolGroup y lv_root pueden cambiar en diferentes distribuciones. Pero también funciona para mí en Ubuntu.

Y luego agregue este código a su Vagrantfile:

...
  config.vm.provider :virtualbox do |vb|
  ...
  # Validate this should be run it once
  if ARGV[0] == "up" && ! File.exist?("./disk1.vdi")
    vb.customize [
      'createhd',
      '--filename', "./disk1.vdi",
      '--format', 'VDI',
      # 100GB
      '--size', 100 * 1024
    ]

    vb.customize [
      'storageattach', :id,
      '--storagectl', 'SATA Controller',
      '--port', 1, '--device', 0,
      '--type', 'hdd', '--medium',
      file_to_disk
    ]
  end

  if ARGV[0] == "up" && ! File.exist?("./disk1.vdi")
    # Run script to map new disk
    config.vm.provision "bash", path: "bootstrap.sh"
    # Run script to increase swap memory
    config.vm.provision "bash", path: "increase_swap.sh"
  end
...

Esto crea un archivo de disco VDI con 100 GB de capacidad. Y está conectado a su sistema operativo.

Este problema se resuelve cuando crea cuadros Vagrant en la nube, como las instancias AWS EC2 con Vagrant: D

Aumentar memoria de intercambio

Cuando instalo los productos Oracle Fusion Middleware, requieren cierta cantidad de memoria de intercambio, pero la caja base viene con una pequeña cantidad de intercambio.

Para resolver esto, agregue este script llamado "raise_swap.sh" en su directorio de trabajo:

#!/bin/sh

# size of swapfile in megabytes
swapsize=8000

# does the swap file already exist?
grep -q "swapfile" /etc/fstab

# if not then create it
if [ $? -ne 0 ]; then
  echo 'swapfile not found. Adding swapfile.'
  fallocate -l ${swapsize}M /swapfile
  chmod 600 /swapfile
  mkswap /swapfile
  swapon /swapfile
  echo '/swapfile none swap defaults 0 0' >> /etc/fstab
else
  echo 'swapfile found. No changes made.'
fi

# output results to terminal
df -h
cat /proc/swaps
cat /proc/meminfo | grep Swap

Si destruye y sube su caja ahora, tendrá una nueva caja con 8GB de memoria de intercambio agregada y 100GB de espacio de disco adicional.


Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia.
Tejas

Lo tengo. Había cambiado,
Forelax

4

Cómo hice esto en Vagrantfile. Para personas que buscan ...

ubuntu.vm.provider "virtualbox" do |virtualbox|
  virtualbox.name = "Ubuntu_1510_#{Time.now.getutc.to_i}"
  virtualbox.customize [
      "storagectl", :id, 
      "--name", "SATAController", 
      "--controller", "IntelAHCI", 
      "--portcount", "1", 
      "--hostiocache", "on"
  ]
  virtualbox.customize [
      "clonehd", "#{ENV["HOME"]}/VirtualBox VMs/Vagrant Test Boxes/#{virtualbox.name}/box-disk1.vmdk", 
                 "#{ENV["HOME"]}/VirtualBox VMs/Vagrant Test Boxes/#{virtualbox.name}/ubuntu.vdi", 
      "--format", "VDI"
  ]
  virtualbox.customize [
      "modifyhd", "#{ENV["HOME"]}/VirtualBox VMs/Vagrant Test Boxes/#{virtualbox.name}/ubuntu.vdi",
      "--resize", 100 * 1024
  ]
  virtualbox.customize [
      "storageattach", :id, 
      "--storagectl", "SATAController", 
      "--port", "0", 
      "--device", "0", 
      "--type", "hdd",
      "--nonrotational", "on",
      "--medium", "#{ENV["HOME"]}/VirtualBox VMs/Vagrant Test Boxes/#{virtualbox.name}/ubuntu.vdi" 
  ]
end

He hecho esto pero el nuevo disco tiene espacio libre sin asignar, ¿cómo puedo asignar la memoria disponible a la partición primaria activa?
eifersucht

Esta es una solución de trabajo. Aunque tiene que editar algunos parámetros dependiendo de la imagen que esté usando.
servermanfail

2

@Anders tenía la respuesta que funcionó mejor para mí (inicializando la caja con más memoria) pero tuve que hacer algunos pequeños ajustes que en realidad lo hicieron más simple.

ubuntu.vm.provider "virtualbox" do |virtualbox|
virtualbox.name = "Ubuntu_ProjectName"

virtualbox.customize [
  "clonehd", "#{ENV["HOME"]}/VirtualBox VMs/#{virtualbox.name}/box-disk1.vmdk",   # Note that this may not be the correct file name
             "#{ENV["HOME"]}/VirtualBox VMs/#{virtualbox.name}/ubuntu.vdi", 
  "--format", "VDI"
]
virtualbox.customize [
  "modifyhd", "#{ENV["HOME"]}/VirtualBox VMs/#{virtualbox.name}/ubuntu.vdi",
  "--resize", 100 * 1024
]
virtualbox.customize [
  "storageattach", :id, 
  "--storagectl", "SCSI",  # Instead of the first customize section i just referenced the existing SCSI controller as I am on a mac which uses SCSI by default 
  "--port", "0", 
  "--device", "0", 
  "--type", "hdd",
  "--nonrotational", "on",
  "--medium", "#{ENV["HOME"]}/VirtualBox VMs/#{virtualbox.name}/ubuntu.vdi" 
]
end

1

Para Centos7 usé la respuesta de Yujie pero con un par de cambios. Primero use un controlador IDE, editando --storagectl:

    v.customize [
          'storageattach', :id,
          '--storagectl', 'IDE',
          '--port', 1, 
          '--device', 0,
          '--type', 'hdd', 
          '--medium',  ".vagrant/machines/target/virtualbox/disk1.vdi"
        ]

Luego, en bootstrap.sh, los nombres de los volúmenes son diferentes y el sistema de archivos es XFS, por lo que esto se convierte en

sudo pvcreate /dev/sdb
sudo vgextend VolGroup00 /dev/sdb
sudo lvextend /dev/VolGroup00/LogVol00 /dev/sdb
sudo xfs_growfs /
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.