Programm-Kommunikation zwischen VMs

T_55

Lieutenant
Registriert
Feb. 2013
Beiträge
638
Hallo,

ich würde gerne ein Programm (läuft auf VM Linux Wine) mit einem anderem Programm (läuft auf anderer VM oder auf Wirtsystem) kommunizieren lassen.
Dabei wäre es gut wenn es so etwas wie ein shared memory gäbe und auch eine Auslöserfunktion damit wenn ein Programm shared memory Daten verändert hat, das andere Programm dann darüber informiert wird und gegebenfalls etwas macht. Am besten performant wie möglich.

Gibt es irgendwelche Lösungen für solch eine Verbindung zwischen Programmen in unterschiedlichen Maschinen?

Grüße
 
Übers virtuelle Netzwerk?! Das VMs nicht auf dem Speicher eines anderen VMs zugreifen können ist ja gerade der Sinn der Sache. Man kann aber meist ein Verzeichnis auf dem ausführenden Rechner freigeben auf das die VMs Zugriff haben um Dateien auszutauschen.
 
WINE ist keine virtuelle Maschine, eine VM ist etwas komplett anderes.
Eine VM simuliert die Hardware, WINE ist eher ein Übersetzer, sorgt dafür das ein Programm mit einem System kommunizieren und funktionieren kann für das es nicht geschrieben wurde.
 
martinallnet schrieb:
WINE ist keine virtuelle Maschine
Das ist klar, um es nochmal genauer zu sagen: Ein für Windows kompiliertes Programm soll in einer VM mit Linux durch Wine laufen und mit einem anderen Programm ausserhalb dieser VM kommunizieren.


Atlan3000 schrieb:
Übers virtuelle Netzwerk?! Das VMs nicht auf dem Speicher eines anderen VMs zugreifen können ist ja gerade der Sinn der Sache. Man kann aber meist ein Verzeichnis auf dem ausführenden Rechner freigeben auf das die VMs Zugriff haben um Dateien auszutauschen.

Wäre das performant und sicher? Wenn die VM, mit dem Windowskompilierten Programm kompromittiert werden würde, sollte das Wirtsystem oder die andere VM wo das andere Programm drauf läuft davon isoliert bleiben.

Es gibt wohl bei VMware VMCI (Virtual Machine Communication Interface) https://pubs.vmware.com/vmci-sdk/
http://www.searchdatacenter.de/definition/VMware-VMCI-Virtual-Machine-Communication-Interface
Diese Kommunikation umgeht die Netzwerkschicht und die Nähe zum Speicherbus des Hosts macht die Kommunikation schneller und eliminiert Latenz.

Hier wird KVM, MPICH2, VMPI angesprochen https://hal.archives-ouvertes.fr/hal-00368622/file/vhpc08.pdf

Weiteres: http://www.comconsult-research.de/vm-kommunikation/ oder https://forums.virtualbox.org/viewtopic.php?f=10&t=62123

Da ich mich noch nicht mit dem Thema auskenne bin ich nicht sicher welche Varianten geeignet sind um effektiv Programme auf verschiedenen VMs möglichst performant miteinander kommunizieren zu lassen?

Grüße
 
T_55 schrieb:
Das ist klar, um es nochmal genauer zu sagen: Ein für Windows kompiliertes Programm soll in einer VM mit Linux durch Wine laufen und mit einem anderen Programm ausserhalb dieser VM kommunizieren.

Die Antwort lautet,
ganz einfach bis unmöglich... - es kommt drauf an, über was es kommunizieren soll.
Direkten Zugriff auf Speicherbereiche könnte es nur mit extra dafür designten Programmen geben - mangels bedarf also so gut wie nie.
 
Robo32 schrieb:
es kommt drauf an, über was es kommunizieren soll
Genau das wäre meine Frage. Welche Möglichkeit wäre effektiv also im Sinne von "einfach" und "performant", vielleicht ein Kompromiss aus beiden...
 
Ich glaube, du gehst das Ganze falsch an. Du musst erstmal herausfinden, welches Interface beide Programme unterstützen, bevor Du Dich an die Umsetzung innerhalb von virtuellen Umgebungen kümmern kannst.

Speziell dann, wenn du keinen Sourcecode hast und die Programme nicht zur direkten Kommunikation mieinander ausgelegt sind (spezielles API, Netzwerk direkt oder Netzwerk dateibasiert), wird es schwierig oder gar unmöglich.
 
Beide Programme werden von mir geschrieben und kompiliert insofern habe ich im Prinzip Einfluss auf das alles. Ich arbeite mit C++
Bisher habe ich nur Programme geschrieben die nicht Kommunizieren daher habe ich wenig Ahnung von diesem Thema und suche sozusagen eine sinnvolle Möglichkeit die beschriebene Kommunikation durchzuführen.
 
Dann solltest Du herausfinden, welche Netzwerkfunktionen ueber Wine gemappt werden (kenne mich mit Wine leider gar nicht aus). Wenn TCP/IP ueber beide Programmumgebungen verfuegbar ist, dann wuerde ich einen TCP/IP Socket empfehlen oder evtl. einen simplen Dateiabtausch direk ueber CIFS oder als normalen Dateizugriff ueber gemappten Dateipfad mit C++.

Da VMCI speziell auf VMware bezogen ist, geht das mit grosser Wahrscheinlichkeit nicht ueber ein Wine Emulation. Insofern werden nur Standard Netzwerkfunktionen uebrig bleiben.
 
Danke für die guten Tipps, ich weiß noch nicht genau was mappen ist aber habe gelesen, dass Wine Unterstützung für TCP/IP-Netzwerke bietet und auf jeden Fall haben Programme unter Wine normalen Internetzugang. Das mit dem Dateipfad ist dann sowas wie freigegebene Ordner vermute ich.
Solange die VM das Hostsystem nicht kompromittieren kann hört sich doch "Standard Netzwerkfunktionen" für den Zweck gut an.

Was ich mich noch frage ist, wie man es macht, dass Lesen und Schreiben keine Zugriffsprobleme machen und wie ein Programm dem anderen sozusagen ein Signal sendet das dort dann zB eine Funktion auslöst. Das sind wahrscheinlich die Netzwerk-Basics die mir noch fehlen...
Im Prinzip läuft es darauf hinaus, dass die Programme sich gegenseitig Daten zur Verfügung stellen sollen und wenn sie das machen danach sofort dem anderen Programm ein Signal schicken das es neue Daten gibt damit gearbeitet werden kann.
 
Zuletzt bearbeitet:
Genau -- Mit "mappen" meinte ich eine Ordnerfreigabe im Netzwerk. Ich arbeite hier nur mit englischen Betriebssystemen, da fallen mir manchmal die deutschen Fachbegriffe nicht ein.

Und ja, über die Synchronisierung musst Du Dir natürlich schon Gedanken machen - Manche Applikationen benutzen eine separate .LCK ("Locked") Datei, um anzuzeigen, dass die Synch-Datei im Schreibmodus ist; in der .LCK Datei steht dann z.B. der Computername, der die Haupt-Datei im Schreibmodus aktiv hat. Du musst dann halt dafuer sorgen, dass, wenn ein Programm die Haupt-Datei zum Schreiben geöffnet hat, (z.B. eine LCK Datei existiert), die andere Applikation nur im Lesemodus zugreift - wenn überhaupt. Und wenn Schreibzugriff fertig ist, dann LCK Datei löschen.
Nicht die effizienteste Möglichkeit, da viele Schreibzugriffe erfolgen; aber es gibt da viele Möglichkeiten, um das Problem anzugehen -- da musst Du halt ein wenig experimentieren. Alternativ wäre wie gesagt die direkte Socket-Programmierung; da musst Du Dir die entsprechenden API Aufrufe ansehen.

Ich würde erstmal klein anfangen - vielleicht der Versuch, von jeweils einer Applikation ein "Ping" auf die IP Addresse von dem anderen System zu machen, um zu sehen, dass die Netzwerkverbindung von Wine/VM und der anderen VM funktioniert. Dann weitersehen, ob eine Ordnerfreigabe darüber möglich ist.

Viel Glück bei Deinem Vorhaben - ich muss mich hier erstmal raushalten; ich bin die nächsten paar Tage sehr beschäftigt.
 
Super danke, nach einigem Recherchieren bin ich bei boost asio hängen geblieben da werde ich mich mal reinarbeiten.

Ich hab nochmal eine generelle Frage denn man hätte doch zwei Möglichkeiten:
1. Programm A läuft auf Host und Programm B auf VM mit Wine
2. Programm A läuft auf VM und Programm B auf VM mit Wine

Für Variante 2 könnte man zB bei Virtualbox einen extra Netzwerkadapter einstellen somit gäbe es ein internes Netzwerk zwischen den VMs
Wenn man jetzt sagt Programm A soll in möglichst sicherer Umgebung bleiben wäre Variante 2 dann "sicherer" weil dann die Brücke über ein zusätzliches Internes Netzwerk geht oder ist das ein Trugschluss?
 
Zurück
Oben