Legen Sie die Speichergröße beim Erstellen der VM VirtualBox fest


41

Gibt es eine Möglichkeit, die Speichergröße für die VM beim Erstellen festzulegen? Ich werde Vagrant verwenden, bin mir jedoch nicht sicher, ob dies in VirtualBox oder in einer Einstellung, die ich in die Vagrant-Datei aufnehmen kann, erforderlich ist.


Google für "Vagrant Disk Size Virtualbox" und finden Sie diesen Beitrag auf AskUbuntu .
Eyoung100

2
@ eyoung100 ah danke, ich schätze, das bestätigt, dass es nicht vor dem Erstellen der vm getan werden kann.
a7omiton

Nun, es ist möglich, wenn Sie die VirtualDisk ohne Vagrant erstellen, aber dann müssen Sie Vagrant nicht verwenden, wenn Sie das möchten.
Eyoung100

@ eyoung100 es schien nur ein zusätzlicher Schritt zu sein, die Größe der VM nach dem Erstellen zu ändern
a7omiton

Vagrant zerstört die VM, nachdem Sie Vagrant IIRC heruntergefahren haben.
eyoung100

Antworten:


23

Das vagrant-disksize Plugin macht dies einfach. Erstellen Sie ein Debian-9-VM mit einer 20-GB-Festplatte.

minimal:

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

oder mithilfe der automatischen Installationslogik für das 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

Funktioniert nicht mit Ubuntu 17.10 (Artful Aardvark) # 10: github.com/sprotheroe/vagrant-disksize/issues/10
David

2
Es funktionierte für Ubuntu 16.04 LTS. Wie Sie bereits erwähnt haben, installieren Sie das Plugin einfach mit dem folgenden Befehl: vagrant plugin install vagrant-disksizeDanke!
Edenshaw

1
Scheint nur zu funktionieren, um die Festplatte zu erweitern, nicht um sie zu verkleinern.
Xenoid

Lief wie am Schnürchen.
4.

8

Dies ist nur möglich, wenn Sie die UUID der betreffenden Festplatte kennen. Wenn Sie dies tun würden, müssten Sie Folgendes in Ihrem haben 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

Wo "size in megabytes"ist die HD-Größe in Megabyte und "disk id"ist die UUID der Festplatte ( nicht die VM)

Alternativ können Sie dies über VBoxManage tun:

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

Wenn Sie die alternative Lösung verwenden, wird der zusätzliche Speicherplatz in der tatsächlichen virtuellen Maschine nicht erstellt, oder?
a7omiton

Es stimmt, es wird nur die Größe der Festplatte
geändert

7
Wie in den anderen Threads erwähnt, funktioniert dies normalerweise nicht, da die meisten Vagrant-Boxen mit .vmdkvirtuellen Festplattendateien anstelle des .VDIvon VBoxManage bevorzugten Formats erstellt werden.
Mark Hudson

@MarkHudson Tut mir leid, das war mir nicht bewusst (ich habe diese Antwort nur basierend auf meinen Kenntnissen von VirtualBox und der Vagrant-Dokumentation gemacht, ich benutze Vagrant nicht wirklich oft). Vielen Dank für den Hinweis! Kann VirtualBox die Größe von VMDKs nicht ändern? Ich habe es nie versucht. Wird meine Antwort aktualisieren.
Felixphew

6

Ich denke , einige allgemeine Probleme Beheben von dieser kann Ihnen helfen.


Und das ist der wesentliche Teil

Erhöhen Sie den Speicherplatz

Normalerweise (leider) wird die Cloud Base Box mit VMDK-Festplattenformaten geliefert. Wenn Sie Glück haben und Ihr Festplattenformat VDI ist, können Sie dies direkt so lösen. Da VMDK jedoch nicht erweitert werden kann, müssen Sie Ihrer VM eine weitere Festplatte hinzufügen. Wenn es schwierig ist, dies manuell vorzunehmen, können Sie sich dies von Vagrant aus vorstellen? Nun, jetzt, wo ich es gelöst habe, ist es nicht so schwierig:

Erstellen Sie ein Skript mit dem Namen "bootstrap.sh" in Ihrem Arbeitsverzeichnis und fügen Sie folgende Zeilen hinzu:

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

VolGroup und lv_root können sich auf verschiedenen Distributionen ändern. Aber es funktioniert bei mir auch unter Ubuntu.

Und dann füge diesen Code zu deiner Vagrantdatei hinzu:

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

Dadurch wird eine VDI-Festplattendatei mit einer Kapazität von 100 GB erstellt. Und ist an Ihr Betriebssystem angeschlossen.

Dieses Problem wird gelöst, wenn Sie Cloud-Vagrant-Boxen erstellen, z. B. AWS EC2-Instanzen mit Vagrant: D

Erhöhen Sie den Swap-Speicher

Bei der Installation von Oracle Fusion Middleware-Produkten ist eine gewisse Menge an Swap-Speicher erforderlich, die Base Box wird jedoch mit einer geringen Menge an Swap-Speicher geliefert.

Um dies zu beheben, fügen Sie dieses Skript mit dem Namen "raise_swap.sh" in Ihr Arbeitsverzeichnis ein:

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

Wenn Sie Ihre Box jetzt zerstören und aufrüsten, steht Ihnen eine neue Box mit 8 GB Swap-Speicher und 100 GB zusätzlichem Speicherplatz zur Verfügung.


Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzuschließen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert.
Tejas

Hatte geändert,
Forelax

4

Wie ich das in Vagrantfile gemacht habe. Für Leute die suchen ...

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

Ich habe dies getan, aber die neue Festplatte hat nicht zugewiesenen freien Speicherplatz. Wie kann ich der aktiven primären Partition den verfügbaren Speicher zuweisen?
Eifersucht

Dies ist eine funktionierende Lösung. Sie müssen zwar einige Parameter bearbeiten, je nachdem, welches Bild Sie verwenden.
Servermanfail

2

@Anders hatte die Antwort, die für mich am besten funktionierte (Initialisierung der Box mit mehr Speicher), aber ich musste ein paar kleine Änderungen vornehmen, die es tatsächlich einfacher machten.

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

Für Centos7 habe ich Yujies Antwort verwendet, jedoch mit ein paar Änderungen. Verwenden Sie zuerst einen IDE-Controller und bearbeiten Sie das --storagectl:

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

Dann sind in der bootstrap.sh die Datenträgernamen unterschiedlich und das Dateisystem ist XFS, so dass dies wird

sudo pvcreate /dev/sdb
sudo vgextend VolGroup00 /dev/sdb
sudo lvextend /dev/VolGroup00/LogVol00 /dev/sdb
sudo xfs_growfs /
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.