共享文件夹配置

image.png

将自己的user加入vboxsf group

sudo usermod -aG vboxsf $(whoami)

压缩虚拟机硬盘

参考Using ZeroFree to shrink a VirtualBox Linux Image

参考Shrinking VirtualBox Linux images with ZeroFree

VirtualBox/KVM: Reduce VM sizes

参考fstrim说明

虚拟机中有些文件被删除,但是并不能被host感知到,从而还是会占用host的磁盘空间。常见的作法为在guest os中将未使用的空间全部写为空(0),然后在host os中,对虚拟机文件进行压缩。

将guest os中没有未使用的空间置空大体有两种方式:
方式1. 通过工具置空

  • 方式1.1:针对ext2,ext3,ext4文件系统
    借助zerofree进行置空。zerofree需要文件系统只读mount的时候才能操作。通常需要重启guest os在启动时进入安全模式进行。有的vm没有安全模式,可以挂载一个光盘启动系统,在这个系统中mount硬盘操作。
  • 方式1.2:针对XFS文件系统
    直接通过fstrim进行操作,不要求只读mount。但是由于virtualbox或者guest os本身的一些限制,fstrim可能不可用。

方式2. 通过dd

[root@dw1-seg2 ~]# dd if=/dev/zero of=/zero_fill_file bs=1M status=progress
401057251328 bytes (401 GB, 374 GiB) copied, 1590 s, 252 MB/s
dd: error writing '/zero_fill_file': No space left on device
382579+0 records in
382578+0 records out
401162567680 bytes (401 GB, 374 GiB) copied, 1590.33 s, 252 MB/s
[root@dw1-seg2 ~]# ll -h /zero_fill_file
-rw-r--r-- 1 root root 374G Oct 31 01:57 /zero_fill_file
[root@dw1-seg2 ~]# rm -f /zero_fill_file

这种方式通过不断在一个临时文件中写入0,最终耗尽文件系统空间。然后删除该临时文件。
virtualbox的文件系统一般选择按需扩展,如设置最大400GB,但是不是开始就分配400GB,而是开始按照需要分配一定大小,再有新的需求再扩展。
上述dd操作,在guest os中最终将374GB空余空间置空,耗时较长。但是实际上在压缩前host os中看到的空间占用没有变化。

总结
因为2在分配的文件系统比较大的时候,耗时较长。首选方式1,在1难以搞定的时候再考虑2。

准备活动

guest os中检查空间占用

[root@dw1-seg2 vagrant]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       400G   27G  374G   7% /

host中检查空间占用
image.png

估计压缩收益
host os和guest os中的占用空间大小的差值即为压缩后释放的空间。如上面例子可释放空间为38-27大约为12GB。可以事先判断是否值得进行压缩。

查看文件系统类型
根据文件系统的类型,分区大小选择适合的操作方式。
如下blkid显示我的分区为XFS类型,适用于fstrim或者dd的方式,同时由于/dev/sda1比较大,采用dd的方式会比较慢(主要和实际的分区<如sda1>大小有关,和整个设备<如sda>大小无关,如果sda1分配的较小如20GB,则会很快)。

[root@dw1-seg2 vagrant]# fdisk -l
Disk /dev/sda: 400 GiB, 429496729600 bytes, 838860800 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xef431952

Device     Boot Start       End   Sectors  Size Id Type
/dev/sda1  *     2048 838860766 838858719  400G 83 Linux
[root@dw1-seg2 vagrant]# blkid /dev/sda1
/dev/sda1: UUID="a62c5b49-755e-41b0-9d36-de3d95e17232" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="ef431952-01"

XFS文件系统fstrim置零

直接在guest os的root下操作

[root@dw2-seg2 ~]# fstrim -v /

the discard operation is not supported 处理
fstrim可能出现如下错误,可以如下尝试

[root@dw2-seg2 ~]# fstrim -v /
fstrim: /: the discard operation is not supported

修改/etc/fstab,添加discard


UUID=a62c5b49-755e-41b0-9d36-de3d95e17232 /                       xfs     defaults        0 0

UUID=a62c5b49-755e-41b0-9d36-de3d95e17232 /                       xfs     defaults,discard        0 0

remount后重试(我的重试也没有成功)

[root@dw2-seg2 ~]# mount -o remount /
[root@dw2-seg2 ~]# fstrim -v /

ext?系统文件系统zerofree置零 - systemrescuecd

如果vm重启没有找到进入安全模式的方式,可以考虑使用systemrescuecd。systemrescuecd是一个可以从光盘引导的系统,其中内置一些工具,用于系统恢复等目的。其中自带zerofree程序。

下载systemrescuecd
systemrescuecd

添加虚拟光驱
image.png
添加systemrescuecd到虚拟光驱
image.png

启动进入systemrescuecd
启动虚拟机即可进入systemrescuecd系统。
image.png

检查磁盘分区类型
检查磁盘设备及分区

fdisk -l

image.png

检查文件系统,如果出现Bad magic number in super-block则说明非ext?系统,不能用进行zerofree操作

e2sfck -f /dev/sda1

也可以通过blkid进一步确认文件系统类型,对于XFS不能进行zerofree操作

blkid /dev/sda1

以下操作来源于这里,我的系统为XFS,没有进行验证。

mkdir /mnt/ss
## 只读mount
mount -n -o ro -t ext4 /dev/sda1 /mnt/ss
## 检查剩余空间
du -h -s /mnt/ss
## zerofree操作
zerofree /dev/sda1

方式2dd

如上所述,这种方式简单,但对大分区不推荐,会耗费更多时间。

通过dd将剩余空间置零

[root@dw1-seg2 ~]# dd if=/dev/zero of=/zero_fill_file bs=1M status=progress
401057251328 bytes (401 GB, 374 GiB) copied, 1590 s, 252 MB/s
dd: error writing '/zero_fill_file': No space left on device
382579+0 records in
382578+0 records out
401162567680 bytes (401 GB, 374 GiB) copied, 1590.33 s, 252 MB/s
[root@dw1-seg2 ~]# ll -h /zero_fill_file
-rw-r--r-- 1 root root 374G Oct 31 01:57 /zero_fill_file

删除临时文件

[root@dw1-seg2 ~]# rm -f /zero_fill_file

关闭guest os

shutdown -h now

host os中进行压缩

通过上面的方法将未使用空间置零后,来到host os中进行压缩。

// 查看hdd列表
C:\Program Files\Oracle\VirtualBox>VBoxManage.exe list hdds

// 压缩
C:\Program Files\Oracle\VirtualBox>VBoxManage.exe modifymedium --compact "D:\softdata\virtualbox\VirtualBox VMs\dw1-seg2\box-disk001.vdi"
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

压缩后磁盘文件大小,与guest os中 df查看的占用大小相当。
image.png


黑暗森林
12 声望3 粉丝

弱小和无知不是生存的障碍,傲慢才是!


引用和评论

0 条评论