กำหนดขนาดพื้นที่เก็บข้อมูลในการสร้าง VM VirtualBox


41

มีวิธีการตั้งขนาดการจัดเก็บสำหรับ VM ในการสร้างมันได้หรือไม่ ฉันจะใช้ Vagrant แต่ไม่แน่ใจว่านี่เป็นสิ่งที่ต้องทำใน VirtualBox หรือการตั้งค่าที่ฉันสามารถรวมไว้ใน Vagrantfile (ฉันตรวจสอบเอกสาร แต่ดูเหมือนจะไม่มีข้อบ่งชี้ใด ๆ )


Google สำหรับ "คนจรจัดดิสก์ขนาด Virtualbox" และค้นหาโพสต์ใน AskUbuntu
eyoung100

2
@ eyoung100 อาขอบคุณฉันเดาว่ายืนยันว่ามันไม่สามารถทำได้ก่อนที่จะสร้าง vm
a7omiton

เป็นไปได้ถ้าคุณสร้าง VirtualDisk โดยไม่ต้องใช้ Vagrant แต่คุณไม่จำเป็นต้องใช้คนจรจัดถ้าคุณต้องการ
eyoung100

@ eyoung100 ดูเหมือนว่าเป็นอีกขั้นตอนหนึ่งที่ต้องปรับขนาด VM หลังจากสร้างมัน
a7omiton

คนจรจัดทำลาย VM หลังจากที่คุณปิดช่องคลอด IIRC ต่อไป
eyoung100

คำตอบ:


23

vagrant-disksize ปลั๊กอินทำให้ง่ายนี้ สร้าง debian-9 vm พร้อมฮาร์ดไดรฟ์ 20gb

น้อยที่สุด:

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ขอบคุณ!
Edenshaw

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

จริงมันจะปรับขนาดฮาร์ดไดรฟ์แล้วคุณจะต้องขยายพาร์ติชันใน VM
felixphew

7
ดังที่ได้กล่าวไว้ในเธรดอื่น ๆ ซึ่งมักจะไม่ทำงานเนื่องจากกล่อง Vagrant ส่วนใหญ่ถูกสร้างด้วย.vmdkไฟล์ดิสก์เสมือนแทนที่จะเป็น.VDIรูปแบบที่ VBoxManage ต้องการ
Mark Hudson

@ MarkHudson ขออภัยฉันไม่ทราบ (ฉันเพิ่งตอบไปตามความรู้ของฉันเกี่ยวกับ VirtualBox และเอกสาร Vagrant ฉันไม่ได้ใช้ Vagrant มากนัก) ขอบคุณที่ชี้นำสิ่งนี้! VirtualBox ไม่สามารถปรับขนาด VMDK ได้หรือไม่? ฉันไม่เคยลองเลย จะอัปเดตคำตอบของฉัน
felixphew

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

สิ่งนี้จะสร้างไฟล์ดิสก์ VDI ที่มีความจุ 100GB และเชื่อมต่อกับระบบปฏิบัติการของคุณ

ปัญหานี้ได้รับการแก้ไขเมื่อคุณสร้างกล่องเมฆ Vagrant เช่น AWS EC2 อินสแตนซ์ที่มี Vagrant: D

เพิ่มหน่วยความจำ Swap

เมื่อฉันติดตั้งผลิตภัณฑ์ Oracle Fusion Middleware พวกเขาต้องการหน่วยความจำ swap จำนวนหนึ่ง แต่กล่องฐานมาพร้อมกับจำนวน swap เล็กน้อย

ในการแก้ไขปัญหานี้ให้เพิ่มสคริปต์นี้ชื่อ "เพิ่ม _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

หากคุณทำลายและปรับปรุงกล่องของคุณทันทีคุณจะมีกล่องใหม่ที่เพิ่มหน่วยความจำ swap 8GB และพื้นที่ดิสก์เพิ่มเติม 100GB


ในขณะที่ลิงค์นี้อาจตอบคำถามได้ดีกว่าที่จะรวมส่วนที่สำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง คำตอบสำหรับลิงค์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงมีการเปลี่ยนแปลง
Tejas

เข้าใจแล้วมันเปลี่ยนไปแล้ว
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

นี่เป็นวิธีการแก้ปัญหาการทำงาน แม้ว่าคุณจะต้องแก้ไข params ไม่กี่ขึ้นอยู่กับภาพที่คุณใช้
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 /
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.