演示环境:Windows 10 主机 + Ubuntu 18.04 客户机 + VMware Workstation Pro 15,虚拟机磁盘设置在一块256G的SSD上

目标:虚拟机磁盘占用了Windows 10主机的SSD大量空间,现在要压缩这块vmdk来减少磁盘占用

这块vmdk的设置如下,并没有预分配磁盘空间:

虚拟磁盘的设定

看,它占了95GB的SSD空间!简直不可思议!实际上:

实际上这个盘只用了9.5GB

实际上他喵的才仅仅用了9.5GB啊!那么问题来了,该如何才能把那么大的磁盘空间压缩压缩?

接下来就是痛苦的尝试各种 解决方案:

  • 1. 很自然的就想到直接去点击设置里面的那个压缩按钮,然后1秒钟,提示压缩完成。满心欢喜原来压缩这么快,然后看了一下windows资源管理器中的文件大小就知道,根本就没给你压缩
  • 2. dd命令填充0,然后删除文件,然后关闭客户机,然后再去点击那个压缩按钮。过程我就不罗嗦了,dd的过程花了好几分钟,结果还然是1秒钟提示压缩完成。
  • 3. 首先先做个defrag。 sudo e4defrag / 执行完之后再重复2中的步骤,结果依旧是1秒钟。 fuck you~
  • 4. 在3的步骤中执行到删除文件后,再加上一个压缩命令 sudo vmware-toolbox-cmd disk shrinkonly 。结果是不支持?
emm…..?

为什么他喵的不支持???看了一下这个错误的搜索结果,大致分为两种情况:有磁盘快照或者是预分配磁盘。然而我并没有使用任何磁盘快照,也不可能去预分配磁盘。

  • 5. 既然上面这些办法都不好使,那么就用vmware宿主机中的vmware-vdiskmanager吧!执行结果是:Failed to shrink the disk ‘D:\xxx.vmdk’ : An error occurred while writing a file; the disk is full. Data has not been saved. Free some disk space and try again (0x8).

disk is full。。。嗯,什么意思?是说我宿主机的磁盘空间不够了吗?

于是我默默的查看了一下D盘的可用空间,提示为79GB。难道说我得有150GB剩余空间才能成功压缩吗?

抱着试试看的想法,把SSD盘中的乱七八糟的文件搬到其他盘中,现在剩余空间是135GB,先来试试看好不好用。

剩余135GB,试一下看看

首先是关闭客户机 ,以防万一,我把vmware也给X了,重新执行命令。。。

开始压缩了。。。

喔激动一下,它开始shrink了,看来确实是宿主机磁盘空间不够了,所以shrink不了?

压缩完成之后,这个vmdk的大小变成了:

成功压缩了

吃惊,大小居然能压缩到8.83GB这么小!


总结:通过上述实践过程,发现一个要压缩Linux格式的vmdk文件大小的前提条件,而这个前提条件却是各种高票回答都没有提及的:存放vmdk文件的磁盘一定要有足够大的可用空间才能压缩,否则就会1秒钟或者压缩失败。由于磁盘已经被我压缩掉了,而且还是那么多操作都做过来的,所以有些疑问:是否真的需要这么多步骤?是否只要dd后删除dd出来的文件,然后直接点击vmware设置中的压缩按钮就可以了?这些就留待日后有时间吃饱了撑的慢慢测试了

问题现象1:可以看到出错对话框上有类似PUR-Authentication failure提示,下一步可能会让你登录Microsoft账户,等你满心欢喜输入好账号密码后,提示你个错误界面

问题现象2:无法登录microsoft账户

解决思路:不要着急按照百度上的提示来,什么新建用户,什么重置电脑,虽然能够达到所需的效果,但是:重置电脑后那么多软件一个个再重新安装重新配置也得花上好半天功夫;新建个用户看上去省事,但是这是不是代表只能用新建的用户去下app?如果真的是这样,那就跟重置电脑没太大区别,还不如重置电脑了。。。

于是乎,在Google上有一个用户也发现了类似问题: https://social.technet.microsoft.com/Forums/en-US/7e3c7ee9-0ac5-4357-8247-6c439b53d415/purauthentication-failure-when-installing-an-app-from-microsoft-store-from-hybrid-azure-ad-joined?forum=win10itprogeneral

按照他的说法,只要启动了Microsoft Account Sign-in Assistant服务,就可以登录了

回过头看了一下系统的服务,确确实实,这个服务被禁用了。。。然后就是手动恢复这个服务,然后后面就相当顺利的登录账号,下载app

问题解决,撒花

卸载要根据系统版本的不同,使用不同的方法

一、不要想着通过Store去卸载,因为那里面只有安装的按钮,没有卸载的按钮

二、在win10系统版本为秋季创意者更新(Fall Creators Update),也就是RS3,也就是1709之前,可以使用lxrun命令进行卸载操作。没有图,没有命令,也不想去研究,因为我早就更新到1903了。

三、 秋季创意者更新之后,lxrun命令就被移除了,执行lxrun只会提示不是内部或外部命令,也不是可运行的程序或批处理文件。这个时候就需要用wslconfig命令来进行卸载了。

列出当前已经安装且随时可用的发行版:

wslconfig /list

列出所有发行版,包括正在安装、卸载和已损坏的发行版:

wslconfig /list /all

卸载已经安装的发行版:

wslconfig /unregister <这里填你要卸载的名称,只能填写使用wslconfig /list或者wslconfig /list /all中所包含的,不是随便填的>

卸载后也可以在 Store 重新安装发行版。

示例:wslconfig /unregister Ubuntu 会将 Ubuntu 从当前可用的WSL发行版中彻底删除,之后运行 wslconfig /list 时该发行版便不会被列出。该发行版所占用的磁盘空间也会被释放。

注意: 卸载发行版时,会永久删除所有与该发行版有关的数据和设置。

四、卸载完成之后最好再做这么一步:到开始菜单中,找到你安装的发行版,右键,卸载,以保证它彻底被卸载了

如果对wslconfig的其他用处感兴趣,可以参考这里: https://blog.z4hd.cf/wslconfig-usage/