原创

【VM】文件共享与文件同步的问题

前言

如果你们团队在使用虚拟机开发环境,那肯定会遇到这样的问题:怎么让项目的文件在虚拟机和真实机器之间共享?你们可能会发现,对于稍微大一点的项目,大部分共享方法都会有些不尽如人意的地方。

文件共享 vs 文件同步

文件共享就像是在你的电脑和其他人的电脑之间建立一个公共的文件柜,你可以直接从他们的电脑里拿取文件,而不需要先拷贝到自己的电脑里。这种方式的好处是你能够更快速地拿到文件,但缺点是有时候别人的电脑可能会出现问题,导致你的文件也受到影响。

而文件同步就好像是一个文件搬运工,他会把你电脑里的文件复制一份到他的电脑里,然后再把他的电脑里的文件复制一份回你的电脑里,确保两边电脑里的文件是一样的。这种方式的好处是你的文件不会因为别人电脑的问题而受到影响,但缺点是要花更多的时间和精力。

主机到虚拟机文件共享/同步的问题

我尝试过多种方法来将主机上的文件与虚拟机同步或共享,比如NFS、Samba、Rsync、SSHFS和Virtualbox共享文件夹驱动程序等。最终,我发现它们都存在一些问题,主要包括以下几个方面:

性能问题

这一问题的影响程度可能有所不同,但通常随着项目规模的增大而变得更加严重。如果您在基于Unix的主机上运行Linux虚拟机,您可能会发现NFS的性能还算不错,但仍然无法达到与本机操作相媲美的水平。

兼容性问题

如果不介意性能问题(例如,项目对IO要求不高),那么最终真正让你感到疲惫不堪的将是兼容性问题。

大多数文件共享方法都需要设置文件权限,这太过于繁琐了。此外,根据选择的共享方法,主机将无法通过inotify API察觉虚拟机内部的文件更改(尽管Samba似乎支持此功能)。而如果您的使用场景需要设置Linux ACLs(访问控制列表),那就别指望了(虽然从技术上讲可以通过特定驱动程序的ACL机制来解决,但这几乎没有什么实质性的帮助,参见下一点)。如果您选择这种方式,符号链接也不再可行。

无论您选择哪种方法,很可能都需要牺牲功能/或性能。

复杂性

这不应该让人感到意外,因为任何文件共享或同步机制都不可避免地会给您的工作流程增加一定的复杂性。即使您偏爱的方法99%的时间都能正常运行,剩下的1%也会花费您大量时间并引起矛盾。在这里,最终目标是尽量将复杂性降到最低。

关于文件同步的注意事项

Rsync在这里值得特别提一下(实际上不仅限于Rsync,任何文件同步方法都是如此)。它消除了上述提到的前两个问题,但是它通过增加复杂性来弥补在性能和兼容性方面节省下来的部分。这种复杂性有两个方面:

有时候需要人工同步、确认

它可以监视主机上的文件更改,并自动将这些文件与虚拟机进行同步(就像Vagrant使用其vagrant rsync-auto命令一样)。但是,当您或应用程序在虚拟机内部进行更改并需要将它们同步回主机时,这一过程很容易出现问题。这会导致自动从主机到虚拟机的同步中意外覆盖文件的风险,或者引发第二个问题:

配置复杂

Rsync 的配置选项较多,需要一些学习和经验才能正确地配置和使用。对于新手来说,可能需要花费一些时间来理解并正确配置 Rsync。

解决方案(也不算是解决方案)

将文件保留在虚拟机内部!!

似乎是解决上述大多数问题的明显方法!尽管存在一些轻微的缺点,但这给您带来了许多好处:

原生性能

就没啥好说的了,速度特别快,应用自行管理(该人工管理还是人工管理)。

最佳兼容性

由于所有项目文件都存储在本机文件系统中,无需在功能上做出妥协。无需强制映射用户ID或处理像我之前遇到的SSHFS挂载问题等特定驱动程序问题。各种意想不到的问题(可能会由特定的文件共享方法引起的问题)。

安全性

将所有文件存储在虚拟机中的一个好处是,所有项目文件现在都位于虚拟机中。虽然一开始可能感觉不自然,但实际上很有道理。毕竟,开发环境就在虚拟机中,为什么项目文件应该例外呢?

如果担心在虚拟机故障时无法访问文件,那就应该定期将代码提交和推送到版本控制系统。这种方法的唯一真正的缺点是操作方面的问题:只能在虚拟机运行时访问文件。不过,这可能都不是问题。

从主机访问虚拟机内的文件

与其与虚拟机共享文件,您可以考虑将它们存储在虚拟机的本机文件系统中,并与主机(即主机在此充当客户端)共享。这与WSL2使用9P文件服务器的方式有些类似,可以使用您喜欢的几乎任何文件服务器实现。我使用NFS,因为在虚拟机上设置它非常简单,并且在主机上挂载也很容易。

我能看到的这种方法唯一的缺点是主机上的文件输入/输出性能降低,在大多数情况下应该是可以容忍的。如果使用的是像phpStorm这样的IDE,如果它在挂载的网络共享上访问项目,索引项目可能需要更长的时间,但这种对输入/输出要求较高的操作通常不会经常进行,因此这是为了能够在本机文件系统上运行应用程序及其带来的所有其他优势而支付的小代价。如果使用的是VSCode,有远程开发扩展可以通过SSH直接在编辑器中查看文件,因此无需手动挂载。

一般来说,使用虚拟机时应该希望尽可能地将所有内容隔离在虚拟机内部,以减少在不同主机上设置虚拟机时的损耗(时间,内存等)。对我来说,文件共享和网络是使用虚拟机时的两个主要痛点,其中后者是两者中较小的问题。

本文来自:【VM】文件共享与文件同步的问题-小码农,转载请保留本条链接,感谢!

温馨提示:
本文最后更新于 2023年09月01日,已超过 330 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我
正文到此结束
本文目录