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

a7o*_*ton 42 virtualbox vagrant

有没有办法在创建 VM 时设置它的存储大小?我将使用 Vagrant,但不确定这是否需要在 VirtualBox 中完成或我可以包含在 Vagrantfile 中的设置(我检查了文档,但似乎没有任何迹象)

小智 25

vagrant-disksize 插件使这变得容易。创建一个带有 20GB 硬盘的 debian-9 虚拟机。

最低限度:

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

或者,使用插件的自动安装逻辑:

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
Run Code Online (Sandbox Code Playgroud)

  • 它适用于 Ubuntu 16.04 LTS。正如您所提到的,只需使用以下命令安装插件:`vagrant plugin install vagrant-disksize` 谢谢! (3认同)
  • 似乎只能扩展磁盘,而不是缩小它。 (3认同)

fel*_*hew 9

除非您知道相关磁盘的 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
Run Code Online (Sandbox Code Playgroud)

其中"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]
Run Code Online (Sandbox Code Playgroud)

  • 正如其他线程中提到的,这通常不起作用,因为大多数 Vagrant box 是使用 `.vmdk` 虚拟磁盘文件创建的,而不是 VBoxManage 首选的 `.VDI` 格式。 (8认同)

For*_*lax 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
Run Code Online (Sandbox Code Playgroud)

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
...
Run Code Online (Sandbox Code Playgroud)

这将创建一个容量为 100GB 的 VDI 磁盘文件。并附加到您的操作系统。

当您创建云 Vagrant 盒子时,这个问题就解决了,比如使用 Vagrant 的 AWS EC2 实例:D

增加交换内存

当我安装 Oracle 融合中间件产品时,它们需要一定量的交换内存,但基本框带有少量交换。

要解决此问题,请在您的工作目录中添加名为“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
Run Code Online (Sandbox Code Playgroud)

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


小智 5

我是如何在 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
Run Code Online (Sandbox Code Playgroud)