Ustaw rozmiar magazynu podczas tworzenia VM VirtualBox


41

Czy istnieje sposób, aby ustawić rozmiar magazynu maszyny wirtualnej podczas jej tworzenia? Będę używać Vagrant, ale nie jestem pewien, czy jest to coś, co należy zrobić w VirtualBox, czy ustawienie, które mogę dołączyć do Vagrantfile (sprawdziłem dokumenty, ale nie wydaje się, żeby to było jakieś wskazanie)


Google dla „Vagrant Disk Size Virtualbox” i znajdź ten post na AskUbuntu .
eyoung100

2
@ eyoung100 ah dzięki, myślę, że to potwierdza, że ​​nie można tego zrobić przed utworzeniem vm.
a7omiton

Cóż, może to zrobić, jeśli utworzysz VirtualDisk bez Vagrant, ale wtedy nie będziesz musiał używać Vagrant, jeśli chcesz.
eyoung100

@ eyoung100 wydawało się, że to dodatkowy krok, zmiana rozmiaru maszyny wirtualnej po jej utworzeniu
a7omiton

Vagrant niszczy maszynę wirtualną po tym, jak zamknąłeś włóczęgę IIRC.
eyoung100

Odpowiedzi:


23

vagrant-disksize Plugin sprawia, że to łatwe. Utwórz debian-9 VM z dyskiem twardym 20 GB.

minimalnie:

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

lub używając logiki automatycznej instalacji wtyczki:

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

Nie działa z Ubuntu 17.10 (Artful Aardvark) # 10: github.com/sprotheroe/vagrant-disksize/issues/10
David

2
Działa z Ubuntu 16.04 LTS. Jak wspomniałeś, po prostu zainstaluj wtyczkę za pomocą polecenia: vagrant plugin install vagrant-disksizeDzięki!
Edenshaw

1
Wydaje się, że działa tylko w celu rozszerzenia dysku, a nie jego zmniejszenia.
ksenoid

Działa jak urok.
wny

8

Nie jest to możliwe, chyba że znasz identyfikator UUID danego dysku. Jeśli tak, musisz mieć następujące dane 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

gdzie "size in megabytes"jest rozmiar HD w megabajtach, a "disk id"UUID dysku ( nie VM)

Alternatywnie możesz to zrobić za pomocą VBoxManage:

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

Wykonanie alternatywnego rozwiązania nie stworzyłoby dodatkowej przestrzeni dyskowej w rzeczywistej maszynie wirtualnej, czy też nie?
a7omiton

To prawda, że ​​po prostu zmieni rozmiar dysku twardego, a następnie będziesz musiał powiększyć partycję na maszynie wirtualnej
felixphew

7
Jak wspomniano w innych wątkach, zwykle to nie działa, ponieważ większość pudełek Vagrant jest tworzona z .vmdkplikami dysków wirtualnych zamiast .VDIformatu preferowanego przez VBoxManage.
Mark Hudson

@MarkHudson Niestety, nie byłem tego świadomy (właśnie udzieliłem odpowiedzi na podstawie mojej wiedzy o VirtualBox i dokumentacji Vagrant, tak naprawdę nie używam Vagrant). Dzięki za zwrócenie na to uwagi! Czy VirtualBox nie może zmienić rozmiaru VMDK? Nigdy tego nie próbowałem. Zaktualizuje moją odpowiedź.
felixphew

6

Myślę Rozwiązywanie niektórych typowych problemów z tym może pomóc.


I to jest zasadnicza część

Zwiększ miejsce na dysku

Zwykle (niestety) podstawowa baza chmurowa jest dostarczana z formatami dysków VMDK. Jeśli masz szczęście, a Twój format dysku to VDI, możesz rozwiązać ten problem bezpośrednio w ten sposób. Ale VMDK nie można rozwinąć, więc musisz dodać kolejny dysk do maszyny wirtualnej. Jeśli ręczne wykonanie tego jest trudne, czy możesz zrobić to z Vagrant? Cóż, teraz, kiedy rozwiązałem, nie jest takie trudne:

Utwórz skrypt o nazwie „bootstrap.sh” w katalogu roboczym i dodaj następujące wiersze:

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

VolGroup i lv_root mogą zmieniać się w różnych dystrybucjach. Ale działa również dla mnie na Ubuntu.

A następnie dodaj ten kod do swojego pliku 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
...

Spowoduje to utworzenie pliku dysku VDI o pojemności 100 GB. I jest dołączony do twojego systemu operacyjnego.

Ten problem został rozwiązany, gdy tworzysz pudełka Vagrant w chmurze, takie jak instancje AWS EC2 z Vagrant: D

Zwiększ pamięć wymiany

Gdy instaluję produkty Oracle Fusion Middleware, wymagają one pewnej ilości pamięci wymiany, ale w pudełku podstawowym jest niewielka ilość wymiany.

Aby rozwiązać ten problem, dodaj ten skrypt o nazwie „Increase_swap.sh” do katalogu roboczego:

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

Jeśli teraz zniszczysz i ulepszysz swoje pudełko, otrzymasz nowe pudełko z dodaną 8 GB pamięci wymiany i 100 GB dodatkowego miejsca na dysku.


Chociaż ten link może odpowiedzieć na pytanie, lepiej jest dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
Tejas,

Rozumiem. Zmieniono
Forelax,

4

Jak to zrobiłem w Vagrantfile. Dla osób szukających ...

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

Zrobiłem to, ale nowy dysk ma nieprzydzielone wolne miejsce, jak mogę przypisać dostępną pamięć do aktywnej partycji podstawowej?
eifersucht

To działa rozwiązanie. Chociaż musisz edytować kilka parametrów w zależności od używanego obrazu.
servermanfail

2

@Anders miał odpowiedź, która najbardziej mi odpowiadała (inicjowanie pudełka z większą pamięcią), ale musiałem wprowadzić kilka drobnych poprawek, które w rzeczywistości upraszczały.

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

W przypadku Centos7 użyłem odpowiedzi Yujie, ale z kilkoma zmianami. Najpierw użyj kontrolera IDE, edytując --storagectl:

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

Następnie w bootstrap.sh nazwy woluminów są różne, a systemem plików jest XFS, więc tak się dzieje

sudo pvcreate /dev/sdb
sudo vgextend VolGroup00 /dev/sdb
sudo lvextend /dev/VolGroup00/LogVol00 /dev/sdb
sudo xfs_growfs /
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.