Delen via


Uw eigen integratieservices maken

Vanaf Windows 10 Jubileumupdate kan iedereen toepassingen maken die communiceren tussen de Hyper-V host en de virtuele machines met behulp van Hyper-V sockets- een Windows Socket met een nieuw adresfamilie en een speciaal eindpunt voor het doel van virtuele machines. Alle communicatie via Hyper-V sockets wordt uitgevoerd zonder netwerken te gebruiken en alle gegevens blijven op hetzelfde fysieke geheugen. Toepassingen die gebruikmaken van Hyper-V sockets zijn vergelijkbaar met de integratieservices van Hyper-V.

In dit document wordt uitgelegd hoe u een eenvoudig programma maakt dat is gebouwd op Hyper-V sockets.

Ondersteund host-besturingssysteem

  • Windows 10 en hoger
  • Windows Server 2016 en hoger

Ondersteund gastbesturingssystemen

Opmerking

Een ondersteunde Linux-gast moet kernelondersteuning hebben voor:

CONFIG_VSOCKET=y
CONFIG_HYPERV_VSOCKETS=y

Mogelijkheden en beperkingen

  • Ondersteunt acties voor kernelmodus of gebruikersmodus
  • Alleen gegevensstroom
  • Geen blokgeheugen (niet het beste voor back-up/video)

Aan de slag

Vereisten:

  • C/C++ compiler. Als u er nog geen hebt, bekijkt u Visual Studio Community
  • Windows SDK : vooraf geïnstalleerd in Visual Studio 2015 met Update 3 en hoger.
  • Een computer met een van de hostbesturingssystemen die zijn opgegeven met ten minste één vitual-computer. -- dit is bedoeld voor het testen van uw toepassing.

Notitie: De API voor Hyper-V sockets werd openbaar beschikbaar in Windows 10 Jubileumupdate. Toepassingen die gebruikmaken van HVSocket worden uitgevoerd op elke Windows 10-host en -gast, maar kunnen alleen worden ontwikkeld met een Windows SDK later dan build 14290.

Een nieuwe toepassing registreren

Als u Hyper-V sockets wilt gebruiken, moet de toepassing worden geregistreerd bij het register van de Hyper-V Host.

Door de service in het register te registreren, krijgt u het volgende:

  • WMI-beheer voor het inschakelen, uitschakelen en vermelden van beschikbare services
  • Machtiging om rechtstreeks met virtuele machines te communiceren

Met de volgende PowerShell wordt een nieuwe toepassing met de naam HV Socket Demo geregistreerd. Dit moet worden uitgevoerd als beheerder. Handmatige instructies hieronder.

$friendlyName = "HV Socket Demo"

# Create a new random GUID.  Add it to the services list
$service = New-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\GuestCommunicationServices" -Name ((New-Guid).Guid)

# Set a friendly name
$service.SetValue("ElementName", $friendlyName)

# Copy GUID to clipboard for later use
$service.PSChildName | clip.exe

Registerlocatie en -informatie:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\GuestCommunicationServices\

Op deze registerlocatie ziet u verschillende GUID's. Dat zijn onze in-box diensten.

Informatie in het register per service:

  • Service GUID
    • ElementName (REG_SZ) -- dit is de beschrijvende naam van de service

Als u uw eigen service wilt registreren, maakt u een nieuwe registersleutel met uw eigen GUID en beschrijvende naam.

De beschrijvende naam wordt gekoppeld aan uw nieuwe toepassing. Deze wordt weergegeven in prestatiemeteritems en op andere plaatsen waar een GUID niet geschikt is.

De registervermelding ziet er als volgt uit:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\GuestCommunicationServices\
    999E53D4-3D5C-4C3E-8779-BED06EC056E1\
        ElementName    REG_SZ    VM Session Service
    YourGUID\
        ElementName    REG_SZ    Your Service Friendly Name

Opmerking

De service-GUID voor een Linux-gast maakt gebruik van het VSOCK-protocol dat via een svm_cid en svm_port in plaats van een GUID's adresseert. Als u deze inconsistentie wilt overbruggingen met Windows, wordt de bekende GUID gebruikt als de servicesjabloon op de host die wordt omgezet in een poort in de gast. Als u de service-GUID wilt aanpassen, wijzigt u de eerste '00000000' in het gewenste poortnummer. Bijvoorbeeld: '00000ac9' is poort 2761.

// Hyper-V Socket Linux guest VSOCK template GUID
struct __declspec(uuid("00000000-facb-11e6-bd58-64006a7986d3")) VSockTemplate{};

 /*
  * GUID example = __uuidof(VSockTemplate);
  * example.Data1 = 2761; // 0x00000AC9
  */

Fooi: Als u een GUID in PowerShell wilt genereren en naar het klembord wilt kopiëren, voert u het volgende uit:

(New-Guid).Guid | clip.exe

Een Hyper-V socket maken

In het meest eenvoudige geval vereist het definiëren van een socket een adresfamilie, verbindingstype en protocol.

Hier volgt een eenvoudige socketdefinitie

// Windows
SOCKET WSAAPI socket(
  _In_ int af,
  _In_ int type,
  _In_ int protocol
);

// Linux guest
int socket(int domain, int type, int protocol);

Voor een Hyper-V socket:

  • Adresfamilie - AF_HYPERV (Windows) of AF_VSOCK (Linux-gast)
  • type- SOCK_STREAM
  • protocol - HV_PROTOCOL_RAW (Windows) of 0 (Linux-gast)

Hier volgt een voorbeeld van een declaratie/instantiëring:

// Windows
SOCKET sock = socket(AF_HYPERV, SOCK_STREAM, HV_PROTOCOL_RAW);

// Linux guest
int sock = socket(AF_VSOCK, SOCK_STREAM, 0);

Binden aan een Hyper-V socket

Bind koppelt een socket aan verbindingsgegevens.

De functiedefinitie wordt hieronder gekopieerd voor convinience, lees hier meer over binding.

// Windows
int bind(
  _In_ SOCKET                s,
  _In_ const struct sockaddr *name,
  _In_ int                   namelen
);

// Linux guest
int bind(int sockfd, const struct sockaddr *addr,
         socklen_t addrlen);

In tegenstelling tot het socketadres (sockaddr) voor een standaard Internet Protocol-adresfamilie (AF_INET) die bestaat uit het IP-adres van de hostmachine en een poortnummer op die host, gebruikt het socketadres voor AF_HYPERV het gebruik van de id van de virtuele machine en de toepassings-id die hierboven is gedefinieerd om een verbinding tot stand te brengen. Als de binding van een Linux-gast AF_VSOCK gebruikmaakt van de svm_cid en de svm_port.

Aangezien Hyper-V sockets niet afhankelijk zijn van een netwerkstack, TCP/IP, DNS, enzovoort, heeft het socketeindpunt een niet-IP-adres nodig, geen hostnaam, indeling die de verbinding nog steeds ondubbelzinnig beschrijft.

Hier volgt de definitie voor het socketadres van een Hyper-V socket:

// Windows
struct SOCKADDR_HV
{
     ADDRESS_FAMILY Family;
     USHORT Reserved;
     GUID VmId;
     GUID ServiceId;
};

// Linux guest
// See include/uapi/linux/vm_sockets.h for more information.
struct sockaddr_vm {
    __kernel_sa_family_t svm_family;
    unsigned short svm_reserved1;
    unsigned int svm_port;
    unsigned int svm_cid;
    unsigned char svm_zero[sizeof(struct sockaddr) -
                   sizeof(sa_family_t) -
                   sizeof(unsigned short) -
                   sizeof(unsigned int) - sizeof(unsigned int)];
};

In plaats van een IP- of hostnaam zijn AF_HYPERV eindpunten sterk afhankelijk van twee GUID's:

  • VM-id: dit is de unieke id die per VM is toegewezen. De id van een VM vindt u met behulp van het volgende PowerShell-fragment.

    (Get-VM -Name $VMName).Id
    
  • Service-id: GUID, zoals hierboven beschreven, waarmee de toepassing is geregistreerd in het Hyper-V hostregister.

Er is ook een set VMID-jokertekens beschikbaar wanneer er geen verbinding is met een specifieke virtuele machine.

VMID-jokertekens

Naam GUID (Globaal Unieke Identificator) Description
HV_GUID_ZERO 00000000-0000-0000-0000-000000000000 Listeners moeten verbinding maken met deze VmId om verbinding van alle partities te accepteren.
HV_GUID_WILDCARD 00000000-0000-0000-0000-000000000000 Listeners moeten verbinding maken met deze VmId om verbinding van alle partities te accepteren.
HV_GUID_BROADCAST FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF
HV_GUID_CHILDREN 90db8b89-0d35-4f79-8ce9-49ea0ac8b7cd Jokertekens voor kinderen. Listeners moeten verbinding maken met deze VmId om verbinding van de onderliggende items te accepteren.
HV_GUID_LOOPBACK e0e16197-dd56-4a10-9195-5ee7a155a838 Loopback-adres. Met deze VmId maakt u verbinding met dezelfde partitie als de connector.
HV_GUID_PARENT a42e7cda-d03f-480c-9cc2-a4de20abb878 Bovenliggend adres. Met deze VmId wordt verbinding gemaakt met de bovenliggende partitie van de connector.*

* HV_GUID_PARENT Het bovenliggende element van een virtuele machine is de host. Het bovenliggende element van een container is de host van de container. Als u verbinding maakt vanaf een container die wordt uitgevoerd op een virtuele machine, wordt verbinding gemaakt met de VM die als host fungeert voor de container. Luisteren op deze VmId accepteert verbinding van: (binnen containers): Containerhost. (Binnen VM: Containerhost/geen container): VM-host. (Niet binnen VM: Containerhost/geen container): Niet ondersteund.

Ondersteunde socketopdrachten

Socket() Bind() Connect() Send() Listen() Accept()

Opties voor HvSocket Socket

Naam Typologie Description
HVSOCKET_CONNECTED_SUSPEND ULONG Wanneer deze socketoptie is ingesteld op een niet-nulwaardesockets, wordt de verbinding niet verbroken wanneer de virtuele machine wordt onderbroken.

Volledige WinSock-API

Naslaginformatie voorHyper-V Integration Services