Imposta le dimensioni di archiviazione alla creazione di VM VirtualBox


41

C'è un modo per impostare le dimensioni di archiviazione per la macchina virtuale al momento della sua creazione? Userò Vagrant, ma non sono sicuro se questo è qualcosa che deve essere fatto in VirtualBox o un'impostazione che posso includere nel Vagrantfile (ho controllato i documenti ma non sembra esserci alcuna indicazione)


Google per "Vagrant Disk Size Virtualbox" e trova questo post su AskUbuntu .
eyoung100,

2
@ eyoung100 ah grazie, immagino che ciò confermi che non può essere fatto prima di creare il vm.
a7omiton,

Bene, può farlo se crei VirtualDisk senza Vagrant, ma non avresti bisogno di usare Vagrant se lo desideri.
eyoung100,

@ eyoung100 mi è sembrato un ulteriore passo, dover ridimensionare la VM dopo averla
creata

Vagrant distrugge la VM dopo aver spento Vagrant comunque IIRC.
eyoung100,

Risposte:


23

Il vagrant-disksize plugin lo rende facile. Crea un debian-9 vm con un disco rigido da 20 GB.

minimamente:

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

oppure, usando la logica di installazione automatica per il plugin:

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

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

2
Ha funzionato per Ubuntu 16.04 LTS. Come accennato, basta installare il plugin con il comando: vagrant plugin install vagrant-disksizeGrazie!
Edenshaw,

1
Sembra funzionare solo per estendere il disco, non per ridurlo.
xenoide,

Ha funzionato come un fascino.
wny

8

Non è possibile se non si conosce l'UUID del disco in questione. In tal caso, è necessario disporre di quanto segue nel proprio 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

dove "size in megabytes"è la dimensione HD in megabyte ed "disk id"è l'UUID del disco ( non la VM)

In alternativa, puoi farlo tramite VBoxManage:

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

Fare la soluzione alternativa non creerebbe lo spazio di archiviazione aggiuntivo nella macchina virtuale effettiva, o lo sarà?
a7omiton,

È vero, ridimensionerà semplicemente il disco rigido, quindi dovresti far crescere la partizione nella VM
felixphew

7
Come menzionato negli altri thread, questo di solito non funziona poiché la maggior parte delle caselle Vagrant sono create con .vmdkfile su disco virtuale anziché nel .VDIformato preferito da VBoxManage.
Mark Hudson,

@MarkHudson Spiacente, non ero a conoscenza di questo (ho appena fatto questa risposta in base alla mia conoscenza di VirtualBox e della documentazione di Vagrant, non uso molto Vagrant). Grazie per averlo segnalato! VirtualBox non può ridimensionare i VMDK? Non l'ho mai provato. Aggiornerò la mia risposta.
felixphew,

6

Penso che risolvere alcuni problemi comuni di questo potrebbe aiutarti.


E questa è la parte essenziale

Aumenta lo spazio su disco

Normalmente (purtroppo), il cloud base box viene fornito con i formati di dischi VMDK. Se sei fortunato e il tuo formato disco è VDI, puoi risolverlo direttamente in questo modo. Tuttavia, VMDK non può essere espanso, quindi è necessario aggiungere un altro disco alla VM. Se fare questo manualmente è difficile, puoi immaginare di farlo da Vagrant? Bene, ora che ho risolto non è così difficile:

Crea uno script chiamato "bootstrap.sh" nella tua directory di lavoro e aggiungi queste righe:

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

VolGroup e lv_root possono cambiare su diverse distribuzioni. Ma funziona anche per me su Ubuntu.

E quindi aggiungi questo codice al tuo 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
...

Questo crea un file su disco VDI con 100 GB di capacità. Ed è collegato al tuo sistema operativo.

Questo problema viene risolto quando si creano box cloud Vagrant, come istanze AWS EC2 con Vagrant: D

Aumenta memoria di scambio

Quando installo i prodotti Oracle Fusion Middleware, richiedono una certa quantità di memoria di swap, ma la scatola base viene fornita con una piccola quantità di swap.

Per risolvere questo problema, aggiungi questo script chiamato "aumenta_swap.sh" nella tua directory di lavoro:

#!/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 distruggi e rimuovi la tua scatola ora, avrai una nuova scatola con 8 GB di memoria di swap aggiunti e 100 GB di spazio su disco aggiuntivo.


Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.
Tejas,

Capito. È cambiato,
Forelax,

4

Come l'ho fatto in Vagrantfile. Per le persone che cercano ...

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

L'ho fatto ma il nuovo disco ha spazio libero non assegnato, come posso assegnare la memoria disponibile alla partizione primaria attiva?
Eifersucht,

Questa è una soluzione funzionante. Anche se devi modificare alcuni parametri a seconda dell'immagine che stai usando.
servermanfail

2

@Anders ha avuto la risposta che ha funzionato meglio per me (inizializzando la scatola con più memoria) ma ho dovuto fare alcune piccole modifiche che in realtà lo hanno reso più semplice.

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

Per Centos7 ho usato la risposta di Yujie ma con un paio di modifiche. Per prima cosa usa un controller IDE, modificando il --storagectl:

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

Quindi in bootstrap.sh i nomi dei volumi sono diversi e il file system è XFS, quindi diventa

sudo pvcreate /dev/sdb
sudo vgextend VolGroup00 /dev/sdb
sudo lvextend /dev/VolGroup00/LogVol00 /dev/sdb
sudo xfs_growfs /
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.