随着vm的使用,预分配的磁盘空间可能会逐渐填满。虽然qcow是一种动态增长的虚拟磁盘格式,但一开始也舍不得分配太多(其实真的建议一开始多分配点,省事儿!)。所以,难免会遇到要给qcow虚拟磁盘扩容的情景。
但是virtualbox自带的工具,不支持直接resize qcow磁盘。会报下面的错误:
>> .\VBoxManage.exe modifymedium 529b1ef0-005f-4e42-a70f-74dbc5086864 --resize 102400
0%...VBOX_E_NOT_SUPPORTED
VBoxManage.exe: error: Failed to resize medium
VBoxManage.exe: error: Resizing to new size 107374182400 is not yet supported for medium 'D:\VMs\ubuntu20.04.6\ubuntu20.04.6.qcow'
VBoxManage.exe: error: Details: code VBOX_E_NOT_SUPPORTED (0x80bb0009), component MediumWrap, interface IMedium
VBoxManage.exe: error: Context: "enum RTEXITCODE __cdecl handleModifyMedium(struct HandlerArg *)" at line 937 of file VBoxManageDisk.cpp
所以,我们只能复制一份原磁盘,在virtualbox菜单上打开,管理→工具→虚拟介质管理,(这一步不确定要不要关闭虚拟机,我是关机之后操作的)
这一步要格外注意,如果选择最上层,只会复制基础镜像,如果在基础镜像上创建过备份点,复制之后是不会带着些备份点的(别问我怎么知道)。可能进入系统之后仿佛回退到很久之前,这就是因为漏复制了备份点(快照)的缘故。要复制带备份点的镜像也很简单,直接选择对应的快照,复制这个差分镜像(可以看到镜像类型是Differencing,大小只有43.46MB,因为他是对比父节点的差分镜像,但最后复制出来还会很大,因为会连带父节点一起复制),一定会包含基础镜像的。
然后,把虚拟机挂载的盘片切换为复制之后扩容的虚拟磁盘,
然后启动虚拟机,在虚拟机内执行磁盘容量的刷新。因为虚拟机内部感知不到外部的磁盘大小变动,所以需要借助工具重新分区(resize)。
分区前:
分区:
分区后:
resize后:
至于如何扩容,推荐用cfdisk /dev/sda
,里面直接有个resize选项,扩容之后不影响原始分区的数据,可称得上是无痛扩容。扩容之后,文件系统不会立刻感知到容量变化。还需要执行resize2fs /dev/sda3
来刷新一下,当然,不同的文件系统命令可能不一样,如xfs用xfs_grow
。参考 https://www.cnblogs.com/st2021/p/14607988.html
这样,就扩容成功了。然后之前复制的那个原虚拟磁盘,就可以删除了。