可能是一个愚蠢的问题(抱歉!)但是在VMWare ESXi中,有没有什么方法可以在同一刀片上的VM之间共享内存,这样两个VM可以通过共享内存块执行进程间通信而不是使用消息传递?我知道我可以在虚拟机之间共享内存,但这是我感兴趣的进程间通信。目的是两个虚拟机可以非常快速地访问内存数据库但是(与托管操作系统解决方案不同)如果虚拟机出现故障,其他VM仍然可以继续前进。
答案 0 :(得分:1)
根据vSockets API文档,它说:
"最初的VMCI库是作为Workstation 6.0的实验性C语言接口发布的。 VMCI包括数据报API和共享内存API。两个接口都在Workstation 6.5中停止使用。"
所以现在看来你只能使用vmci SOCK_DGRAM或SOCK_STREAM套接字。这些行为与tcp / ip套接字一样,网上有很多关于如何编写使用它们的代码的信息,你基本上只需要头文件vmci_sockets.h然后离开。
您会发现vsocket通信的客户端很简单,但您需要编写某种服务器才能在ESXi主机上运行以托管您的数据库,这是一个棘手的部分。如果你在ESXi上启用了ssh并且有一个嗅探器,你会发现一个非常类似unix的系统和/ dev / vsock设备你可以查询以获得vsocket协议系列(对于你的客人可能会有所不同,你需要调用ioctl)。不幸的是(我试过这个)只是简单地编译一个64位静态链接的Linux二进制文件只会产生一个段错误,因为ESXi操作系统与Linux不够相似。
有一个SDK可以尝试用来创建程序,但它并不适合胆小的人,有些人花了几天时间才试图让它编译,所以你可以尝试这条路线如果你想要,但我不推荐它。 Google for" VMWare ESXi工具链"。
但是,如果您正在寻找更快的途径让自己的服务器在ESXi上运行,并且准备使用Python,那么您会发现5.5和6.0都带有相当最新的Python(Python ESXi v6.0上的2.7.9)。 VMWare无意中删除了.py库文件,只留下了.pyc文件,因此您不能轻易看出它是否与标准版本不同,但它确实足以使基本套接字服务器运行。
Python套接字模块并不了解vmci套接字系列,因此您需要使用ctypes来绕过它直接调用c库套接字函数。您可以使用纯python创建套接字,甚至可以调用listen(),例如bind()隐式地希望你处理sockaddr_in结构。
因此,您需要检查vmci_sockets.h标头,并提出Python ctypes结构和函数来镜像您在C中使用的结构和函数,例如:
class sockaddr_vm(Structure):
_fields_ = [("svm_family", c_ushort),
("svm_reserved1", c_ushort),
("svm_port", c_uint),
("svm_cid", c_uint),
("svm_zero", c_uint),
]
然后可以将其传递到您可以访问的libc bind / recvfrom / sendto调用:
libc = cdll.LoadLibrary("libc.so.6")
然后你可以绕过Pythons套接字模块绑定你的套接字,即
addr = sockaddr_vm()
addr.svm_family = af # address family obtained from ioctl
addr.svm_reserved1 = 0
addr.svm_cid = VMADDR_CID_ANY # 0xffffffff
addr.svm_port = port
addr.svm_zero = 0
# s is the socket, created with python socket.socket()
out = libc.bind(s.fileno(), pointer(addr), sizeof(addr))
在ESXi上Python的一个警告是你似乎在你可以使用的内存中受到限制:我尝试分配一个16MB的缓冲区,Python拒绝给我带内存错误,但这不是问题对于我当时正在做的事情,所以我没有费心去寻找解决方法。我怀疑有一个设置可以解决这个问题。
在ESXi启动时启动脚本是为读者留下的练习,但这应该可以帮助您入门。玩得开心!
答案 1 :(得分:0)
VMCI是您需要的。遗憾的是,VMCI在vSphere 6及更高版本的VM之间不推荐使用。