2016-10-05 2 views
0

아마도 VMWare ESXi 내에서 (VMWare ESXi 내에서) 두 VM이 프로세스 간 통신을 수행 할 수 있도록 동일한 블레이드의 VM간에 메모리를 공유 할 수있는 방법이 있습니까? 메시징을 사용하는 대신 공유 메모리 블록을 통해? VM을 통해 메모리를 공유 할 수 있다는 것을 알고 있지만 관심있는 프로세스 간 통신입니다. 목표는 두 VM이 메모리 db를 실제로 빠르게 액세스 할 수 있지만 VM이 다운되면 호스트 된 OS 솔루션과 달리 다른 VM도 여전히 기분 좋게 계속 진행할 수 있습니다.VMWare ESXi 메모리 데이터베이스에서 단일 블레이드의 VM간에 공유

답변

1

vSockets API 문서에 따르면, 그것은 말한다.

는 "원래 VMCI 라이브러리 VMCI가 데이터 그램 API 및 공유 메모리 API를 포함 6.0 워크 스테이션과 실험 C 언어 인터페이스로 출시 된 두 인터페이스. Workstation 6.5에서 단종되었습니다. "

이제는 vmci SOCK_DGRAM 또는 SOCK_STREAM 소켓 만 사용할 수있는 것 같습니다. 이것들은 tcp/ip 소켓처럼 동작하며, net을 사용하는 코드를 작성하는 방법에 대한 정보가 많습니다. 기본적으로 헤더는 vmci_sockets.h가 필요하며 해제해야합니다.

vsocket 통신의 게스트 측은 간단하지만 DB를 호스트하기 위해 ESXi 호스트에서 실행할 서버를 작성해야합니다. 이는 까다로운 부분입니다. ESXi에서 ssh를 활성화하고 주변에서 스니핑을하면 vsocket 프로토콜 패밀리를 얻기 위해 질의 할 수있는/dev/vsock 장치와 함께 현저한 유닉스 계열 시스템을 발견 할 수 있습니다 (게스트마다 다를 수 있습니다. ioctl). 불행히도 ESXi OS가 Linux와 충분히 유사하지 않으므로 정적으로 링크 된 64 비트 Linux 바이너리를 간단하게 컴파일하면 (물론 시도해 보았을 때) segfault 이상을 얻을 수 없습니다.

프로그램을 만드는 데 사용할 수있는 SDK가 있지만 희미한 마음이 들지 않는 사람도 있습니다. 원하는 경우이 경로를 시도 할 수 있도록 컴파일하는 데 문자 그대로 일이 소요되었지만 나는 그것을 추천하지 않는다. "VMWare ESXi toolchain"용 Google.

그러나 ESXi에서 실행되는 자신의 서버를 얻는 더 빠른 경로를 찾고 Python을 사용할 준비가되어 있으면 5.5와 6.0 모두 상당히 최신 Python (Python 2.7 ESXi v6.0에서 .9). VM웨어는 도움이되지 않는 .py 라이브러리 파일을 단지 .pyc 파일로 남겨 두었으므로 표준 버전과 다른지 쉽게 알 수 없지만 기본 소켓 서버를 실행할만큼 충분히 기능적입니다.

파이썬 소켓 모듈은 vmci 소켓 제품군을 이해하지 못하기 때문에 ctypes를 사용하여 c 라이브러리 소켓 함수를 직접 호출해야합니다. pure python을 사용하여 소켓을 만들 수 있으며, listen()을 호출 할 수도 있습니다. bind()는 암시 적으로 sockaddr_in 구조체를 다루기를 기대합니다.

그래서 당신은 당신이 C에서 사용하려는 사람, 예를 반영하기 위해 vmci_sockets.h 헤더를 검사하고, 파이썬은 구조와 기능을하는 ctypes을 마련해야합니다

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의 바인드 /에 recvfrom/sendto가 호출에 전달 :

libc = cdll.LoadLibrary("libc.so.6") 

그리고 당신은 파이썬 소켓 모듈을 우회하여 소켓, 즉 바인딩 할 수 있습니다ESXi를 파이썬의

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)) 

하나주의해야 할 당신이 놀 수있는 메모리에 제한 될 것이다 : 나는 16 메가 바이트 버퍼를 할당 시도하고 파이썬은 메모리 오류가 나에게 그것을 제공을 거부 그러나이 '년후 그 당시에 내가 뭘했는지에 대한 문제가 없었으므로 나는 그 길을 찾으려고 애썼지 않았다. 그 문제를 해결할 수있는 환경이 있다고 생각합니다.

ESXi 부팅시 스크립트를 시작하는 것은 독자의 연습으로 남겨 두지 만 시작하면됩니다. 재미있어!

0

VMCI가 필요합니다. 불행히도 VMCI는 vSphere 6 이상의 VM간에 사용되지 않습니다.

관련 문제