我正在尝试在多个虚拟机 (Ubuntu 18) 之间共享一个磁盘。虚拟机托管在 Azure 中,磁盘是 Azure 托管磁盘。我已将磁盘连接到两个虚拟机并挂载它们。我可以看到每个虚拟机上的分区,以及我创建的测试文件 test.txt。但是,通过 SSH 进入 VM1 时对 txt 文件内容的更新不会反映在 VM22 中。相反,VM2 显示之前的值,直到我卸载并重新挂载驱动器。
我是 Ubuntu/Linux 的新手,正在尝试弄清楚该去哪里找。我最初的想法是...
- 也许我使用的文件系统 (gpt) 无法以这种方式支持多个并发访问,我必须使用其他文件系统?如果是这样,哪个更合适?
- 虚拟机在安装时似乎会复制该文件,但写入操作不会共享。
- 也许这就是问题所在,可以将其关闭吗?
- 或许这是 Azure 的问题,尽管我不再相信这是问题。
- 也许存在权限问题,因为不同机器的用户帐户不同。我知道 Linux 包含文件 + 目录基础上的权限,这是首要关注的问题。
还有其他想法吗?
答案1
共享托管磁盘需要与集群管理器或类似设备结合使用才能处理并发性,Azure 功能实际上只是能够从技术上将其连接到多个 VM。请参阅文档这里:
共享托管磁盘本身不提供可使用 SMB/NFS 访问的完全托管文件系统。您需要使用集群管理器(如 Windows Server 故障转移集群 (WSFC) 或 Pacemaker)来处理集群节点通信和写入锁定。
正如 Tero 提到的,你所做的就是导致数据丢失。
答案2
GPT 是一种分区机制,而不是文件系统。
大多数文件系统的设计都假定对底层块设备具有独占访问权限。例如,缓存依赖于缓存层可以看到所有操作这一事实。
您的设置违反了该假设,这就是您看到此类行为的原因。您很幸运只看到了这么小的问题。任何较大的操作都必然会导致数据丢失,因为文件系统元数据由任何一方在自己的时间更新。
现在,正确的解决方案取决于您的确切要求。
您真的需要块设备级别的共享访问吗?
如果是,那么你需要使用群集文件系统。
或者您只需要两台服务器能够访问同一组文件?
在这种情况下,您应该在一台服务器上设置 NFS 服务器,在第二台服务器上设置 NFS 客户端。