Đặt kích thước lưu trữ khi tạo VM VirtualBox


41

Có cách nào để đặt kích thước lưu trữ cho VM khi tạo nó không? Tôi sẽ sử dụng Vagrant, nhưng không chắc đây có phải là thứ cần được thực hiện trong VirtualBox hay cài đặt tôi có thể đưa vào Vagrantfile (tôi đã kiểm tra tài liệu nhưng dường như không có bất kỳ dấu hiệu nào)


Google cho "Hộp ảo kích thước ổ đĩa ảo" và tìm bài đăng này trên AskUbfox .
Eyoung100

2
@ eyoung100 ah cảm ơn, tôi đoán điều đó xác nhận rằng nó không thể được thực hiện trước khi tạo vm.
a7omiton

Chà, có thể nếu bạn tạo VirtualDisk mà không có Vagrant, nhưng sau đó bạn không cần phải sử dụng vagrant nếu bạn muốn điều đó.
Eyoung100

@ eyoung100 có vẻ như là một bước bổ sung, phải thay đổi kích thước VM sau khi tạo nó
a7omiton

Vagrant phá hủy VM sau khi bạn tắt II II.
Eyoung100

Câu trả lời:


23

Các vagrant-disksize plugin làm cho điều này dễ dàng. Tạo một debian-9 vm với ổ cứng 20gb.

tối thiểu:

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

hoặc, sử dụng logic tự động cài đặt cho 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

Không hoạt động với Ubuntu 17.10 (Artful Aardvark) # 10: github.com/sprotheroe/vagrant-disksize/issues/10
David

2
Nó hoạt động cho Ubuntu 16.04 LTS. Như bạn đã đề cập, chỉ cần cài đặt plugin với lệnh: vagrant plugin install vagrant-disksizeCảm ơn!
Edenshaw

1
Có vẻ như chỉ hoạt động để mở rộng đĩa, không thu nhỏ nó.
xenoid

Làm việc như người ở.
1:51

8

Không thể trừ khi bạn biết UUID của đĩa được đề cập. Nếu bạn đã làm, bạn sẽ cần phải có những điều sau đây 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

nơi "size in megabytes"là kích thước HD tính bằng megabyte, và "disk id"là UUID của đĩa ( không VM)

Ngoài ra, bạn có thể làm điều này thông qua VBoxManage:

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

Thực hiện giải pháp thay thế sẽ không tạo thêm không gian lưu trữ trong máy ảo thực tế, hay sẽ vậy?
a7omiton

Đúng vậy, nó sẽ thay đổi kích thước ổ đĩa cứng, sau đó bạn sẽ phải phát triển phân vùng trong VM
felixphew

7
Như đã đề cập trong các luồng khác, điều này thường không hoạt động vì hầu hết các hộp Vagrant được tạo bằng .vmdkcác tệp đĩa ảo thay vì .VDIđịnh dạng được VBoxManage ưa thích.
Mark Hudson

@MarkHudson Xin lỗi, tôi không biết điều này (Tôi chỉ thực hiện câu trả lời này dựa trên kiến ​​thức về VirtualBox và tài liệu Vagrant, tôi không thực sự sử dụng Vagrant nhiều). Cảm ơn đã chỉ ra điều này! VirtualBox không thể thay đổi kích thước VMDK? Tôi chưa bao giờ từng thử qua nó. Sẽ cập nhật câu trả lời của tôi.
felixphew

6

Tôi nghĩ Giải quyết một số vấn đề phổ biến về điều này có thể giúp bạn.


Và đây là phần thiết yếu

Tăng dung lượng đĩa

Thông thường (thật đáng buồn), hộp cơ sở đám mây đi kèm với các định dạng đĩa VMDK. Nếu bạn may mắn và định dạng đĩa của bạn là VDI, bạn có thể giải quyết điều này trực tiếp như thế này. Nhưng, VMDK không thể được mở rộng, vì vậy bạn cần thêm một đĩa khác vào VM của mình. Nếu làm điều này bằng tay là khó, bạn có thể chụp ảnh làm điều này từ Vagrant không? Chà, bây giờ tôi đã giải quyết được không khó lắm:

Tạo một tập lệnh có tên "bootstrap.sh" trên thư mục làm việc của bạn và thêm các dòng sau:

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

Volgroup và lv_root có thể thay đổi trên các bản phân phối khác nhau. Nhưng nó cũng hoạt động với tôi trên Ubuntu.

Và sau đó thêm mã này vào Vagrantfile của bạn:

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

Điều này tạo ra một tệp đĩa VDI với dung lượng 100GB. Và được gắn vào hệ điều hành của bạn.

Vấn đề này được giải quyết khi bạn tạo các hộp Vagrant trên đám mây, như các phiên bản AWS EC2 với Vagrant: D

Tăng bộ nhớ hoán đổi

Khi tôi cài đặt các sản phẩm Oracle Fusion Middleware, chúng yêu cầu một số lượng bộ nhớ trao đổi, nhưng hộp cơ sở đi kèm với một lượng nhỏ trao đổi.

Để giải quyết vấn đề này, hãy thêm tập lệnh này có tên "tăng_swap.sh" vào thư mục làm việc của bạn:

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

Nếu bạn phá hủy và mở hộp của mình ngay bây giờ, bạn sẽ có một hộp mới với 8GB bộ nhớ trao đổi được thêm vào và 100GB dung lượng đĩa bổ sung.


Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
Tejas

Hiểu rồi. Đã thay đổi,
Forelax

4

Làm thế nào tôi làm điều này trong Vagrantfile. Đối với những người tìm kiếm ...

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

Tôi đã làm điều này nhưng đĩa mới có không gian trống chưa được chỉ định, làm cách nào tôi có thể gán bộ nhớ khả dụng cho phân vùng chính đang hoạt động?
eifersucht

Đây là một giải pháp làm việc. Mặc dù bạn phải chỉnh sửa khá nhiều thông số tùy thuộc vào hình ảnh bạn đang sử dụng.
servermanfail

2

@Anders đã có câu trả lời phù hợp nhất với tôi (khởi tạo hộp có nhiều bộ nhớ hơn) nhưng tôi đã phải thực hiện một vài điều chỉnh nhỏ thực sự làm cho nó đơn giản hơn.

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

Đối với Centos7, tôi đã sử dụng câu trả lời của Yujie nhưng với một vài thay đổi. Đầu tiên sử dụng bộ điều khiển IDE, chỉnh sửa --storagectl:

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

Sau đó, trong bootstrap.sh, tên âm lượng là khác nhau và hệ thống tệp là XFS, vì vậy điều này trở thành

sudo pvcreate /dev/sdb
sudo vgextend VolGroup00 /dev/sdb
sudo lvextend /dev/VolGroup00/LogVol00 /dev/sdb
sudo xfs_growfs /
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.