VMware 的 Linux 桌面环境卡死、复制以及拖拽不可用问题以及一些小感悟

最近由于在使用 Windows 上的 Docker 客户端的过程中,发现 Docker 的虚拟磁盘的大小不断增长,并且我也经常会强迫症地去用 Optimize-VHD 压缩虚拟磁盘,

另外一个原因是 WSL2 在 Win10 2004 中可用,但为了少点莫名其妙的bug的考虑,还是打算直接要准备一个可用、好用的 Linux 原生桌面环境或者是没有图形界面放在虚拟机中纯粹做服务器用。

顺便提一下关闭 Hyper-V 的过程,首先是将 Windows 组件中的 Hyper-V 和 Containers 功能关闭。之后需要更改一次引导选项,告诉系统禁用 Hyper-V。

1
2
REM 需要管理员权限
bcdedit /set hypervisorlaunchtype off

重启一次,之后可以将这一项删除,原本没有开启 Hyper-V 的系统是没有这个启动选项的。

1
2
REM 需要管理员权限
bcdedit /deletevalue hypervisorlaunchtype

最后,打开设备管理器,到 查看 中选择 显示隐藏的设备,找到 Hyper-V 相关的网卡,理论上是一个虚拟交换机以及一张虚拟网卡,将他们卸载就可以了。

回到正题,虚拟机中我安装的系统是 Fedora 32,内核版本是 5.6.x。

Fedora会自动在安装过程中安装虚拟机所需要的工具,主要就是 open-vm-tools,剪贴板的监听都是它来负责的。

在刚安装完之后设置镜像源、更新软件包的时候我就发现,宿主机和客户机之间复制粘贴真的有时候会失灵,并且拖放几乎不可能成功,从客户机中将文件拖出的时候鼠标永远都拖不出虚拟机的窗口边框。另外,也出现了偶尔图形界面卡死,(这是只是图形界面卡死,客户机系统实际上还是正常的),从主机的资源管理器看 VMX 进程一直吃满着一条线程的占用率。

各种搜之后基本确定是 VMware 对 WayLand 的支持问题。

https://kb.vmware.com/s/article/74671

Note that Drag-and-Drop and Copy-and-Paste is currently not working with Wayland. Log in with an X11 session instead.

我们可以把 GNOME 切换到 X11 协议就可以解决问题了,WayLand 目前已经比较成熟,相较 Xorg 也更加安全,但是 VMware 官方的支持还在开发过程中。

临时的解决办法

在 GNOME 登录时在右下角设置小按钮处选择 GNOME on Xorg,这样登录以后的整个会话的 XDG_SESSION_TYPE 环境变量的值就是 x11,否则默认情况下是 wayland。这时再去尝试拖拽基本问题解决。

登录界面

不过 VMware 的工具使用上还有一些我发现需要注意的

尽量避免拖拽、复制

从宿主机拖入、或者复制粘贴进客户机的文件,我实验经常会出现文件不完整的情况。另外,tools处理拖拽文件的逻辑是,将文件先放到 ~/.cache/vmware/ 下,而且这些文件不会自动删除。如果遇到大型文件,虚拟磁盘很快就会满起来。

说到硬盘满起来,如何压缩

的确可以通过虚拟机设置中的压缩磁盘来实现压缩,但是经过我的实验, VMware 没办法在脱机的情况下分析文件系统,去除不需要的空白的未分配的磁盘块。要彻底压缩,可以这样做

1
2
3
# 最后一个参数是虚拟磁盘挂载后的目录位置
# 不要因为这个命令里包含wipe而以为会清除文件,这个命令主要是做一个相当于手动 trim 的功能。
sudo vmware-toolbox-cmd disk wipe /

这里不建议使用 shrink 子命令,shrink 执行时会先执行 wipe,再执行 shrinkonly,shrinkonly会不管三七二十一把该虚拟机的所有磁盘全都执行压缩。

建议在 wipe 后关机,到设置中执行压缩,你会发现 vmdk 文件小了很多。

另外一个 VMware 技巧,自动挂载共享文件夹

既然拖拽和复制会导致缓存文件,那么用共享文件夹对于大文件拷贝共享就十分方便。

VMware中,这个共享文件夹的文件系统叫做 hgfs (Host-Guest File System)。 我们手动挂载时可以这样执行

1
2
# allow_other使得普通用户可以随意修改访问
sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other 

自动化一点,在 /etc/fstab 中加入

.host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other 0 0

第五列的 0 是 dump 备份设置。

当其值设置为 1 时,将允许dump备份程序备份;设置为0时,忽略备份操作;

第六列的 0 是 fsck 磁盘检查设置。

其值是检查顺序。当其值为 0时,永远不检查;根分区 / 的配置永远为 1。其它分区从 2 开始,数字越小越先检查,如果两个分区的数字相同,则不同物理盘就可以同时检查。

updatedupdated2020-06-062020-06-06