Definir tamanho do armazenamento na criação do VM VirtualBox

41

Existe uma maneira de definir o tamanho de armazenamento da VM para criá-la? Eu usarei o Vagrant, mas não tenho certeza se isso é algo que precisa ser feito no VirtualBox ou uma configuração que eu possa incluir no Vagrantfile (verifiquei os documentos, mas parece não haver indicação)

a7omiton
fonte
Pesquise no Google por "Vagrant Disk Size Virtualbox" e encontre esta publicação no AskUbuntu .
eyoung100
2
@ eyoung100 ah obrigado, acho que isso confirma que não pode ser feito antes da criação do vm.
a7omiton
Bem, isso pode acontecer se você criar o VirtualDisk sem o Vagrant, mas não precisará usar o vagrant se quiser.
eyoung100
@ eyoung100 que parecia ser apenas uma etapa extra, ter que redimensionar a VM depois de criá-la
a7omiton
O Vagrant destrói a VM depois de desligar o vagrant de qualquer maneira IIRC.
eyoung100

Respostas:

23

O vagrant-disksize plugin facilita isso. Crie um debian-9 vm com um disco rígido de 20 gb.

minimamente:

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

ou, usando a lógica de instalação automática para o plug-in:

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
Mike
fonte
Não funciona com o Ubuntu 17.10 (Artful Aardvark) # 10: github.com/sprotheroe/vagrant-disksize/issues/10
David
2
Funcionou para o Ubuntu 16.04 LTS. Como você mencionou, basta instalar o plugin com o comando: vagrant plugin install vagrant-disksizeObrigado!
Edenshaw # 28/18
1
Parece funcionar apenas para estender o disco, não para reduzi-lo.
Xenoid #
Funcionou como um encanto.
wny
8

Não é possível, a menos que você conheça o UUID do disco em questão. Se o fez, você precisaria ter o seguinte no seu 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

onde "size in megabytes"está o tamanho do HD em megabytes e "disk id"é o UUID do disco ( não a VM)

Como alternativa, você pode fazer isso via VBoxManage:

$ VBoxManage list hdds
[get the UUID of the disk in question from the output]
$ VBoxManage modifyhd [UUID] --resize [size in MiB]
felixphew
fonte
Fazer a solução alternativa não criaria o espaço de armazenamento extra na máquina virtual real, ou será?
a7omiton
É verdade, ela só vai redimensionar o disco rígido, você teria, então, a crescer a partição na VM
felixphew
7
Conforme mencionado nos outros threads, isso geralmente não funciona, pois a maioria das caixas do Vagrant é criada com .vmdkarquivos de disco virtual, em vez do .VDIformato preferido pelo VBoxManage.
Mark Hudson #
@ MarkHudson Desculpe, eu não sabia disso (acabei de responder com base no meu conhecimento do VirtualBox e da documentação do Vagrant, não uso muito o Vagrant). Obrigado por apontar isso! O VirtualBox não pode redimensionar VMDKs? Eu nunca tentei. Atualizará minha resposta.
Felixphew 22/05
6

Acho Resolver alguns problemas comuns de isso pode ajudá-lo.


E esta é a parte essencial

Aumentar espaço em disco

Normalmente (infelizmente), a caixa base da nuvem vem com formatos de discos VMDK. Se você tiver sorte e o formato do seu disco for VDI, poderá resolver isso diretamente dessa maneira. Mas, como o VMDK não pode ser expandido, é necessário adicionar outro disco à sua VM. Se fazer isso manualmente é difícil, você consegue fazer imagens usando o Vagrant? Bem, agora que resolvi não é tão difícil:

Crie um script chamado "bootstrap.sh" no seu diretório de trabalho e adicione estas linhas:

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

VolGroup e lv_root podem mudar em diferentes distribuições. Mas funciona para mim no Ubuntu também.

E adicione este código ao seu arquivo Vagrant:

...
  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
...

Isso cria um arquivo de disco VDI com 100 GB de capacidade. E está anexado ao seu sistema operacional.

Esse problema é resolvido quando você cria caixas do Vagrant na nuvem, como instâncias do AWS EC2 com o Vagrant: D

Aumentar memória de troca

Quando instalo os produtos Oracle Fusion Middleware, eles exigem uma certa quantidade de memória de troca, mas a caixa base vem com uma pequena quantidade de troca.

Para resolver isso, adicione este script chamado "raise_swap.sh" no seu diretório de trabalho:

#!/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

Se você destruir e instalar sua caixa agora, terá uma nova caixa com 8 GB de memória de troca adicionada e 100 GB de espaço em disco adicional.

Forelax
fonte
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada.
Tejas
O que você precisa
saber é o seguinte
4

Como eu fiz isso no Vagrantfile. Para pessoas que pesquisam ...

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
Anders
fonte
Eu fiz isso, mas o novo disco tem espaço livre não atribuído. Como atribuir a memória disponível à partição primária ativa?
Eifersucht 27/03
Esta é uma solução funcional. Embora você precise editar alguns parâmetros, dependendo da imagem que está usando.
servermanfail
2

@ Anders teve a resposta que funcionou melhor para mim (inicializar a caixa com mais memória), mas eu tive que fazer alguns pequenos ajustes que realmente a tornaram mais simples.

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
ShaneMit
fonte
1

Para Centos7, usei a resposta de Yujie, mas com algumas mudanças. Primeiro use um controlador IDE, editando o --storagectl:

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

Em seguida, no bootstrap.sh, os nomes dos volumes são diferentes e o sistema de arquivos é XFS; portanto, isso se torna

sudo pvcreate /dev/sdb
sudo vgextend VolGroup00 /dev/sdb
sudo lvextend /dev/VolGroup00/LogVol00 /dev/sdb
sudo xfs_growfs /
Chris Brooking
fonte