在创建VM VirtualBox时设置存储大小


41

是否可以在创建虚拟机时为其设置存储大小?我将使用Vagrant,但不确定是否需要在VirtualBox或可以在Vagrantfile中包含的设置中完成此操作(我检查了文档,但似乎没有任何指示)


Google搜索“ Vagrant Disk Size Virtualbox”,并在AskUbuntu上找到此信息
eyoung100'2014/

2
@ eyoung100啊,谢谢,我想这确认了在创建虚拟机之前无法完成。
a7omiton 2014年

好吧,如果您创建不带Vagrant的虚拟磁盘,则可以,但是如果您想要的话,则不需要使用vagrant。
eyoung100 2014年

@ eyoung100这似乎只是一个额外的步骤,创建虚拟机后必须重新调整其大小
a7omiton 2014年

无论如何,在您关闭Vagrant之后,Vagrant会销毁VM。
eyoung100 2014年

Answers:


23

vagrant-disksize 插件使此操作变得容易。使用20gb硬盘驱动器创建一个debian-9 vm。

最少:

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(Artful Aardvark)#10:github.com/sprotheroe/vagrant-disksize/issues/10
David

2
它适用于Ubuntu 16.04 LTS。如您所述,只需使用以下命令安装插件:vagrant plugin install vagrant-disksize谢谢!
伊甸肖

1
似乎只能用于扩展磁盘,而不能用于缩小磁盘。
xenoid

像魅力一样工作。
WNY

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 磁盘在VM)

或者,您可以通过VBoxManage执行此操作:

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

做替代解决方案不会在实际的虚拟机中创建额外的存储空间吗?
a7omiton 2014年

没错,它只会调整硬盘的大小,然后您必须在VM中扩大分区
felixphew 2014年

7
如其他线程中所述,这通常不起作用,因为大多数Vagrant盒都是使用.vmdk虚拟磁盘文件创建的,而不是.VDIVBoxManage首选的格式。
Mark Hudson

@MarkHudson抱歉,我没有意识到这一点(我只是根据对VirtualBox和Vagrant文​​档的了解做出了这个答案,我实际上并没有太多使用Vagrant)。感谢您指出了这一点!VirtualBox不能调整VMDK的大小吗?我从来没有尝试过。将更新我的答案。
felixphew,2015年

6

我认为,解决一些常见问题可能会帮助你。


这是必不可少的部分

增加磁盘空间

通常(很难),云基础盒随附VMDK磁盘格式。如果您很幸运,并且磁盘格式为VDI,则可以像这样直接解决。但是,VMDK无法扩展,因此您需要向VM添加另一个磁盘。如果很难手动进行此操作,您是否可以通过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
...

这将创建一个具有100GB容量的VDI磁盘文件。并且已连接到您的操作系统。

当您使用Vagrant:D创建云Vagrant框(如AWS EC2实例)时,此问题已解决。

增加交换内存

当我安装Oracle Fusion Middleware产品时,它们需要一定数量的交换内存,但是基本盒附带少量交换。

要解决此问题,请在您的工作目录上添加以下脚本:“ increase_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

如果现在销毁并装箱,您将拥有一个新箱,其中添加了8GB的交换内存和100GB的额外磁盘空间。


尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。
Tejas 2015年

知道了。变了,
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

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 /
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.