Vagrant,如何指定磁盘大小?

68

我想确保我的开发环境有足够的空闲空间来安装工具和其他东西。我找不到任何有关告诉Vagrant我想要的最小磁盘大小的配置选项。这是可能的吗?还是我需要创建自己的Box?


1
Vagrant已经支持自定义磁盘大小(包括磁盘调整大小)。您可以在此处查看我的答案以获取详细信息:https://dev59.com/lFUL5IYBdhLWcg3wx6dw#71848893 - W1M0R
7个回答

130

我使用了 Vagrant 插件 vagrant-disksize 调整磁盘大小。

它可以帮助指定初始磁盘大小,而且它管用!

在命令行中运行以下命令:

vagrant plugin install vagrant-disksize

并在您的 Vagrantfile 中使用以下内容:

vagrant.configure('2') do |config|
    config.vm.box = 'ubuntu/xenial64'
    config.disksize.size = '50GB'
end

8
使用此插件后,我销毁了原来的虚拟机并执行了 vagrant up 命令,以便让更大的磁盘得以使用。由于虚拟机操作系统未能识别新的磁盘空间,因此 vagrant halt;vagrant up 命令无效。为了避免修复这个新问题,我选择重新创建虚拟机,这种方法对我有效。 - Buttle Butkus
您还可以使用gparted live cd https://gparted.org/download.php启动虚拟机,并在不破坏旧磁盘的情况下调整磁盘大小。我想这完全取决于您特定情况中哪个更困难。 - Lance
请注意,这会扩展磁盘而不是逻辑卷或分区。它们必须以与您使用的框有关的方式进行扩展。请参见此处的Ubuntu示例:https://github.com/sprotheroe/vagrant-disksize/issues/37#issuecomment-573349769 - Chris L. Barnes
这个解决方案在OSX Monterey中不起作用。它无法调整硬盘大小。 - aironman
1
@geckos Vagrant已经支持自定义磁盘大小(包括磁盘调整)。您可以在此处查看我的答案以获取详细信息:https://dev59.com/lFUL5IYBdhLWcg3wx6dw#71848893 - W1M0R
显示剩余2条评论

30

安装Vagrant插件vagrant-disksize

vagrant plugin install vagrant-disksize

如果希望在启动Vagrant时确保用户已安装插件,则可以在Vagrantfile开头添加以下内容:

# Install vagrant-disksize to allow resizing the vagrant box disk.
unless Vagrant.has_plugin?("vagrant-disksize")
    raise  Vagrant::Errors::VagrantError.new, "vagrant-disksize plugin is missing. Please install it using 'vagrant plugin install vagrant-disksize' and rerun 'vagrant up'"
end

在Vagrantfile中设置所需的磁盘大小

vagrant.configure('2') do |config|
    config.disksize.size = '50GB'
end

更新现有的vagrant box

  1. 执行以上所有步骤。
  2. 运行vagrant halt & vagrant up(您应该会看到类似于“调整磁盘大小:旧32768 MB,要求51200 MB,新51200 MB”的消息)。
  3. SSH连接到vagrant box。
  4. 运行sudo cfdisk /dev/sda
  5. 使用箭头键选择您的磁盘,可能是sdaX。我的是sda3。
  6. 然后选择使用箭头键调整大小。接受建议的磁盘大小。
  7. 然后选择写入。并回答是。
  8. 您现在可以选择退出。
  9. 运行sudo resize2fs -p -F /dev/sdaX, 你应该会看到类似于:“文件系统/dev/sda3已挂载在/上;需要在线调整大小 旧的描述块=4,新的描述块=6 /dev/sda3的文件系统现在是11933952(4k)个块长。 ”
  10. 运行df,查看您的磁盘大小是否已增加。

1
我尝试使用这种方法,但在cfdisk中没有'resize'选项。从这里开始该怎么办? - linksassin
3
第九步sudo resize2fs -p -F /dev/sda1 给我报错信息:resize2fs: Bad magic number in super-block while trying to open /dev/sda1Couldn't find valid filesystem superblock。请问能否帮忙解决? - Damodar Bashyal
你使用的是哪个版本的Vagrant?我收到了关于Vagrant需要Virtualbox的错误,但安装vbox 6.1失败。我找不到可行的组合。 - KevinDTimm
@DamodarBashyal:如下面的答案所述,sudo xfs_growfs /dev/sdaX 是 XFS 文件系统的有效命令。 - marc.guenther
在5和6之间,如果您想要扩大磁盘并且有足够的自由空间,您需要使用sfdisk重新排序分区。请参见此答案 - Sadman Sakib
显示剩余2条评论

10

Vagrant最近在VirtualBox提供者中添加了实验性支持自定义磁盘大小(包括磁盘调整大小)。一些常见的用法情况可以在此处此处找到。

要启用此功能,请修改Vagrantfile(参见下面的示例),在您的shell中设置VAGRANT_EXPERIMENTAL="disks"环境变量,然后运行vagrant up命令。

这是一个示例Vagrantfile,使用bento/ubuntu-20.04基础镜像(其基于LVM)经过Vagrant 2.2.19测试:


Vagrant.configure("2") do |config|
  ...
  config.vm.disk :disk, size: "150GB", primary: true
  config.vm.box = "bento/ubuntu-20.04"
  config.vm.box_version = "202005.21.0"
  config.vm.box_check_update = false
  ...
end

您应该在vagrant up期间看到以下输出(或类似输出):
==> vagrant: You have requested to enabled the experimental flag with the following features:
==> vagrant:
==> vagrant: Features:  disks
==> vagrant:
==> vagrant: Please use with caution, as some of the features may not be fully
==> vagrant: functional yet.
Bringing machine 'server' up with 'virtualbox' provider...
==> server: Clearing any previously set forwarded ports...
==> server: Clearing any previously set network interfaces...
==> server: Preparing network interfaces based on configuration...
    server: Adapter 1: nat
==> server: Forwarding ports...
    server: 22 (guest) => 49222 (host) (adapter 1)
    server: 4200 (guest) => 49280 (host) (adapter 1)
    server: 4243 (guest) => 49243 (host) (adapter 1)
==> server: Configuring storage mediums...
    server: Disk 'vagrant_primary' needs to be resized. Resizing disk...

这个过程可能需要一段时间才能完成(在我的情况下,需要1到2小时)。

使用vagrant ssh进入您的虚拟机,然后使用以下命令(基于此答案)收集有关文件系统的信息,然后扩展LVM卷。 如果您的基本框不使用LVM,则不应使用这些命令。

# Understand your partitions.
> lsblk
> df -lhT /
> sudo fdisk -l /dev/sda
> sudo vgdisplay
> sudo parted /dev/sda print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 161GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 
Number  Start   End     Size    Type      File system  Flags
1      1049kB  538MB   537MB   primary   fat32        boot
2      539MB   68.7GB  68.2GB  extended
5      539MB   68.7GB  68.2GB  logical                lvm

# Resize your partitions.
> sudo parted /dev/sda resizepart 2 100%
> sudo parted /dev/sda resizepart 5 100%
> sudo parted /dev/sda print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 161GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 
Number  Start   End    Size   Type      File system  Flags
1      1049kB  538MB  537MB  primary   fat32        boot
2      539MB   161GB  161GB  extended
5      539MB   161GB  161GB  logical                lvm

# Resize your LVM physical volume to match the new partition extents.
> sudo pvresize /dev/sda5
> sudo vgdisplay
Alloc PE / Size       16255 / <63.50 GiB
Free  PE / Size       22016 / 86.00 GiB

# Resize your LVM logical volume to fill the available Free space.
> sudo lvdisplay
--- Logical volume ---
LV Path                /dev/vgvagrant/root
> sudo lvextend -l+100%FREE /dev/vgvagrant/root
Size of logical volume vgvagrant/root changed from <62.54 GiB (16010 extents) to <148.54 GiB (38026 extents).
Logical volume vgvagrant/root successfully resized.

# Apply the changes to the filesystem.
> sudo resize2fs /dev/vgvagrant/root
> df -lhT /
Filesystem                 Type  Size  Used Avail Use% Mounted on
/dev/mapper/vgvagrant-root ext4  146G   55G   85G  40% /

8
如果你的vagrant box使用了LVM并且已经被创建,相比Firze的答案,需要额外执行以下步骤:
  • 安装Vagrant插件vagrant-disksize。
vagrant plugin install vagrant-disksize
  • 在Vagrantfile中设置所需的磁盘大小。
vagrant.configure('2') do |config|
    config.disksize.size = '300GB'
end
  • 重启Vagrant盒子(您应该会看到类似“已调整磁盘大小...”的内容)
vagrant halt
vagrant up
  • SSH 到 vagrant box

  • 使用 vgdisplay 命令检查旧的大小:

vgdisplay
  --- Volume group ---
  VG Name               vagrant-vg
  System ID             
  Format                lvm2
  ...
  Alloc PE / Size       16200 / 63.28 GiB
  Free  PE / Size       0 / 0  

假设设备名称为/dev/sda,您需要调整扩展分区和逻辑分区的大小:
parted /dev/sda
p
Number  Start   End     Size    Type      File system  Flags
 1      1049kB  768MB   767MB   primary   ext2         boot
 2      769MB   68.7GB  67.9GB  extended
 5      769MB   68.7GB  67.9GB  logical                lvm

resizepart 2 321GB
resizepart 5 321GB
p
Number  Start   End    Size   Type      File system  Flags
 1      1049kB  768MB  767MB  primary   ext2         boot
 2      769MB   322GB  321GB  extended
 5      769MB   321GB  320GB  logical                lvm
quit

然后,LVM应该能够看到这个修改:
pvresize /dev/sda5

vgdisplay
  Alloc PE / Size       16200 / 63.28 GiB
  Free  PE / Size       60148 / 234.95 GiB
  • 扩展LVM组:
lvextend  -L+234.95 /dev/vagrant-vg/root 
  Size of logical volume vagrant-vg/root changed from 62.32 GiB (15955 extents) to 297.27 GiB (76102 extents).
  Logical volume root successfully resized.

vgdisplay
  Alloc PE / Size       76347 / 298.23 GiB
  Free  PE / Size       1 / 4.00 MiB
  • 最后,调整文件系统的大小:
resize2fs /dev/vagrant-vg/root

df -h
/dev/mapper/vagrant--vg-root  293G   59G  222G  21% /

3
这应该使用提供者完成,即VirtualBox配置设置示例为:

https://www.vagrantup.com/docs/virtualbox/configuration.html

config.vm.provider "virtualbox" do |v| v.customize ["modifyvm", :id, "--cpuexecutioncap", "50"] end

配置.vm提供者"virtualbox",其中|v|是变量名,在其内部进行自定义["modifyvm",:id,"--cpuexecutioncap","50"]。

https://www.virtualbox.org/manual/ch08.html#vboxmanage-list

但在修改vm部分中,我没有看到任何与磁盘调整相关的内容!也许你可以尝试附加一个次要磁盘!

https://gist.github.com/leifg/4713995


4
很遗憾Vagrant没有一种便携的方法来做这件事。通过提供者来完成会把Vagrantfile锁定到该提供者...无论如何,谢谢! - geckos

2
安装vagrant-disksize插件后,像其他回答中提到的那样,如果您无法使用resize2fs调整分区大小,则很可能是因为它仅支持ext *格式的文件系统类型。您可以通过运行mount并查找列出您的设备来检查文件系统类型。如果设备未使用ext4文件系统,则很可能正在使用xfs。如果是这种情况,请使用sudo xfs_growfs /dev/sdaX来调整设备上的文件系统大小,其中“X”是要调整大小的设备分区。

2
我需要从rubygems.org下载并安装 vagrant-disksize插件。
安装vagrant-disksize插件。
$ vagrant plugin install --plugin-clean-sources --plugin-source https://rubygems.org vagrant-disksize

在vagrantfile中配置磁盘大小
Vagrant.configure("2") do |config|            
  config.vm.box = "centos/8"                  
  config.vm.network "public_network"          
  config.disksize.size = "11240MB"            
end 

                                      

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接