参考:
http://www.360doc.com/content/22/0505/16/67252277_1029878535.shtml
VHDX 有个不好的问题就是,如果在里面存放过文件再删除,那么已经使用过的空间不会压缩,导致空间一直被占用。那么就需要想办法压缩空间。
还有一点,就是当文件删除时,实际上并没有真正的清空。需要用 0 覆盖对应的空间,才能压缩完成。windows下解决方案很多,linux 的比较少见,所以记录下。
1. 取消开机启动项,避免占用磁盘。
vi /etc/rc.local
对于我的系统,注释掉这行即可。dpd 是我开机的自定义守护脚本,如果没有可忽略。
2. 卸载磁盘
可以使用 df -h 查看磁盘的挂载
可以看到我这里有
/dev/sda1 - /dev/sde1 五块盘
分别卸载。
sudo umount /dev/sda1
sudo umount /dev/sdb1
...
如果卸载不了,可以使用
这里的 xxx 就是刚才的挂载点
sudo lsof +D /xxx/disk/xxx
第一列的 command 就是占用的进程名称。
pkill 进程名称 然后立即卸载即可。
3. 使用 zerofree 填充
没装就先 :
sudo yum install zerofree
4. 压缩磁盘
Optimize-VHD -Path C:\YourVHDX.vhdx -Mode Prezeroed,这个不用在磁盘管理工具里面附加VHDX,不是NTFS,附加了对效率也没提升。
5. 注意图形化中的压缩时没用的。即使已经 zerofree 过。
还是要靠 powershell
以下是参考的原文(因为很多网站后面内容就没了,所以拷贝一份):
首先明确:hyper-v管理器里面“设置-硬盘驱动器-编辑-选择操作-压缩”并没有明显的效果。
然后区分几个关键词:
hyper-v里面的“压缩(compact)”:虚机里磁盘的可用空间不变,虚拟磁盘文件大小变小(因为是回收虚机因删除文件释放出来的磁盘空间,所以不可能压缩到比虚机里磁盘总已用空间还小)
hyper-v里面的“收缩”:虚机里磁盘的可用空间变小。(不可能影响已用空间)
磁盘管理工具(diskmgmt.msc)里面的“压缩卷”:使磁盘的可用空间变小。(不可能影响已用空间)最后看方案:
1.有人给出的方案:碎片整理无效,还有反作用,应该先收缩,再压缩,再扩展。
如:先在磁盘管理工具里面“操作-附加VHD”,然后在有可用空间的分区上右键“压缩卷”(只支持NTFS,而且过程漫长,无进度条),然后分离VHD,在hyper-v管理器里面压缩,就有效果。
2.也有方案:建一个新的虚拟磁盘,使用diskgen或者Ghost11把原来磁盘的内容(按文件或者文件系统或者partition2partition拷过来),然后把新的虚拟磁盘当原来的磁盘用。
这两个感觉都不是很好,速度慢或根本没有进度条不知道过程如何了;或者不支持linux;或者新磁盘的有些硬件特征会改变。看下面的:
3.对NTFS文件,用Windows Server PowerShell里面的Optimize-VHD小命令(cmdlet),操作如下:a.先在磁盘管理工具里面“操作-附加VHD”,记得勾选“read-only”(必不可少)b.打开PowerShell,输入Optimize-VHD -Path C:\YourVHDX.vhdx -Mode Full。运行后很快就OK了,磁盘文件显著变小了。关于Optimize-VHD详细一点的说明可参考:https://docs.microsoft.com/zh-tw/powershell/module/hyper-v/optimize-vhd?view=win10-ps4.Linux系统,压缩前,要在虚机层面将标记为DELETE的文件彻底删除,也就是将虚机磁盘上的位置0。(具体置零的方法:**systemrescue cd,用该cd启动虚机,运行zerofree,如zerofree /dev/sda1),然后再压缩。 这是国外论坛上给的方法,老外说这个systemrescuecd小巧好用,值得一试,**网站:https://www./。然后Optimize-VHD -Path C:\YourVHDX.vhdx -Mode Prezeroed,这个不用在磁盘管理工具里面附加VHDX,不是NTFS,附加了对效率也没提升。
这两个方案应该是比较靠谱的,方案3亲测有效。