2016-10-05 8 views
0

おそらく愚かな質問ですが、VMWare ESXi内では、2つのVMがプロセス間通信を実行できるように同じブレード上のVM間でメモリを共有する方法はありますか?メッセージングを使用するのではなく、共有メモリブロックを介して?私はVM間でメモリを共有することができますが、私が興味を持っているプロセス間通信です.2つの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ソケットと同じように動作し、それらを使用するコードの記述方法についてはネット上に多くの情報があります。基本的にはvmci_sockets.hヘッダーが必要です。

vsocket通信のゲスト側は簡単ですが、DBをホストするためにESXiホスト上で実行するために何らかの種類のサーバーを作成する必要があります。これは難しい部分です。 ESXi上でsshを有効にして周囲を覗き込むと、vsocketプロトコルファミリを取得するために照会できる/ dev/vsockデバイスを持つ非常にUNIX系のシステムが見つかります(ゲストとは異なる場合があります。 ioctl)。残念ながら、64ビットの静的にリンクされたLinuxバイナリをコンパイルするだけでは、ESXi OSがLinuxと十分に似ていないため、segfault以上のものは得られません。

プログラムを作成するために使用しようとすることができるSDKがありますが、それほど心配ではありませんが、文字通り日数を費やしてコンパイルするだけで、必要に応じてこのルートを試すことができます私はそれをお勧めしません。 Google for "VMWare ESXi toolchain"

しかし、自分のサーバーをESXi上で実行するためのより速いルートを探していて、Pythonを使用する準備ができているなら、5.5と6.0の両方にかなり最新のPython(Python 2.7 ESXi v6.0では.9)。 VMWareはうまくいけない.pyライブラリファイルを削除して.pycファイルだけを残して、これが標準バージョンと異なるかどうかを簡単に確認することはできませんが、基本的なソケットサーバーを実行するには十分機能しています。

Pythonソケットモジュールはvmciソケットファミリを認識しないため、ctypesを使用してcライブラリソケット関数を直接呼び出すことを回避する必要があります。純粋なPythonを使用してソケットを作成することもできます。 bind()は暗黙のうちにsockaddr_in構造体を扱うことを期待しています。

ですから、例えば、vmci_sockets.hヘッダを検査する必要がある、とあなたがCから使用したいものをミラーリングするための構造と機能をctypesはPythonのを考え出すだろう。

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の上のPythonの

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

1つの警告は、あなたが一緒にプレイすることができ、メモリに制限されているように見えるということです。私は16メガバイトのバッファを割り当てしようとしたPythonはメモリエラーを私にそれを与えることを拒否したが、これは「wasn私はその時に何をしていたのかというと問題だったので、その周りに道を見つけようとはしなかった。私はそれを修正できる設定があると思う。

ESXiのブート時にスクリプトを開始することは、読者の練習として残していますが、これはあなたを始めにするはずです。楽しむ!

0

VMCIが必要です。残念ながら、VMCIは、vSphere 6以上のVM間で非推奨になりました。

関連する問題