Установить размер хранилища при создании виртуальной машины VirtualBox

41

Есть ли способ установить размер хранилища для виртуальной машины при ее создании? Я буду использовать Vagrant, но не уверен, нужно ли это делать в VirtualBox или в настройках, которые я могу включить в Vagrantfile (я проверил документы, но там нет никаких признаков)

a7omiton
источник
Найдите Google Vagrant Disk Size Virtualbox и найдите этот пост в AskUbuntu .
eyoung100
2
@ Eyoung100 Ах, спасибо, я думаю, это подтверждает, что это не может быть сделано до создания виртуальной машины.
a7omiton
Что ж, это возможно, если вы создадите VirtualDisk без Vagrant, но тогда вам не нужно будет использовать vagrant, если вы этого хотите.
eyoung100
@ eyoung100 это просто казалось дополнительным шагом, когда нужно было изменить размер виртуальной машины после ее создания
a7omiton
Vagrant уничтожает виртуальную машину после того, как вы все равно выключите Vagrant IIRC.
eyoung100

Ответы:

23

vagrant-disksize Плагин делает это легко. Создайте Debian-9 VM с жестким диском на 20 ГБ.

минимально:

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

или, используя логику автоматической установки для плагина:

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
Майк
источник
Не работает с Ubuntu 17.10 (
Дэвид,
2
Это работало на Ubuntu 16.04 LTS. Как вы упомянули, просто установите плагин с помощью команды: vagrant plugin install vagrant-disksizeСпасибо!
Edenshaw
1
Кажется, работает только для расширения диска, а не для его сжатия.
ксеноид
Работал как шарм.
будет
8

Это невозможно, если вы не знаете UUID данного диска. Если бы вы это сделали, вам понадобится следующее 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

где "size in megabytes"размер HD в мегабайтах, и "disk id"UUID диска ( не виртуальной машины)

Кроме того, вы можете сделать это через VBoxManage:

$ VBoxManage list hdds
[get the UUID of the disk in question from the output]
$ VBoxManage modifyhd [UUID] --resize [size in MiB]
felixphew
источник
Использование альтернативного решения не приведет к созданию дополнительного пространства для хранения на фактической виртуальной машине, или это так?
a7omiton
Правда, он просто изменит размер жесткого диска, тогда вам придется увеличить раздел в виртуальной
машине
7
Как уже упоминалось в других потоках, это обычно не работает, так как большинство ящиков Vagrant создаются с .vmdkфайлами виртуальных дисков, а не в .VDIформате, предпочитаемом VBoxManage.
Марк Хадсон
@MarkHudson К сожалению, я не знал об этом (я только что сделал этот ответ, основываясь на своих знаниях о VirtualBox и документации по Vagrant, я не очень часто использую Vagrant). Спасибо за указание на это! Может ли VirtualBox не изменять размер VMDK? Я никогда не пробовал это. Буду обновлять мой ответ.
Феликсфью
6

Я думаю Разрешающая некоторые общие вопросы о этом может помочь вам.


И это важная часть

Увеличение дискового пространства

Обычно (к сожалению) облачная базовая коробка поставляется с дисками форматов VMDK. Если вам повезло, и ваш формат диска VDI, вы можете решить это прямо так. Но VMDK не может быть расширен, поэтому вам нужно добавить еще один диск в вашу виртуальную машину. Если сделать это вручную сложно, можете ли вы представить себе это с помощью Vagrant? Ну, теперь, когда я решил, это не так сложно

Создайте скрипт под названием «bootstrap.sh» в вашем рабочем каталоге и добавьте следующие строки:

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

VolGroup и lv_root могут меняться на разных дистрибутивах. Но у меня это работает и в Ubuntu.

А затем добавьте этот код в ваш 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
...

Это создает файл VDI-диска емкостью 100 ГБ. И прилагается к вашей ОС.

Эта проблема решается, когда вы создаете облачные блоки Vagrant, такие как экземпляры AWS EC2 с Vagrant: D

Увеличение памяти подкачки

Когда я устанавливаю продукты Oracle Fusion Middleware, им требуется некоторый объем подкачки, но базовый блок поставляется с небольшим объемом подкачки.

Чтобы решить эту проблему, добавьте в свой рабочий каталог скрипт с именем «incre_swap.sh»:

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

Если вы сейчас уничтожите и обновите свой ящик, у вас будет новый ящик с добавленной 8 ГБ памяти подкачки и 100 ГБ дополнительного дискового пространства.

Forelax
источник
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
Теджас
Понял. Изменился,
Forelax
4

Как я это сделал в Vagrantfile. Для людей, которые ищут ...

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
Андерс
источник
Я сделал это, но на новом диске есть свободное пространство, как я могу выделить доступную память для активного основного раздела?
Eifersucht
Это рабочее решение. Хотя вам придется редактировать довольно много параметров в зависимости от того, какое изображение вы используете.
servermanfail
2

У @Anders был ответ, который работал лучше всего для меня (инициализация коробки с большим объемом памяти), но мне пришлось сделать несколько небольших изменений, которые на самом деле сделали его проще.

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
источник
1

Для Centos7 я использовал ответ Yujie, но с парой изменений. Сначала используйте контроллер IDE, отредактировав --storagectl:

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

Затем в файле bootstrap.sh имена томов отличаются, а файловая система - XFS, поэтому

sudo pvcreate /dev/sdb
sudo vgextend VolGroup00 /dev/sdb
sudo lvextend /dev/VolGroup00/LogVol00 /dev/sdb
sudo xfs_growfs /
Крис Брукинг
источник