Megosztás a következőn keresztül:


Saját integrációs szolgáltatások létrehozása

A Windows 10 évfordulós frissítésétől kezdve bárki létrehozhat olyan alkalmazásokat, amelyek Hyper-V socketek használatával kommunikálnak a Hyper-V gazdagép és virtuális gépei között. Ez egy új címcsaládot és speciális végpontot tartalmazó Windows Socket, amely a virtuális gépeket célozza meg. Az Hyper-V szoftvercsatornákon keresztüli összes kommunikáció hálózatkezelés nélkül fut, és minden adat ugyanazon a fizikai memórián marad. A Hyper-V szoftvercsatornákat használó alkalmazások hasonlóak a Hyper-V integrációs szolgáltatásaihoz.

Ez a dokumentum egy egyszerű, Hyper-V szoftvercsatornákra épülő program létrehozását ismerteti.

Támogatott gazdagép operációs rendszere

  • Windows 10 és újabb verziók
  • Windows Server 2016 és újabb verziók

Támogatott vendég operációs rendszer

Megjegyzés:

A támogatott Linux-vendégnek kerneltámogatással kell rendelkeznie a következőhöz:

CONFIG_VSOCKET=y
CONFIG_HYPERV_VSOCKETS=y

Képességek és korlátozások

  • Kernel módú vagy felhasználói módú műveletek támogatása
  • Csak adatfolyam
  • Nincs blokkmemória (nem a legjobb biztonsági mentéshez/videóhoz)

Kezdő lépések

Követelmények:

  • C/C++ fordító. Ha nincs ilyen, nézze meg a Visual Studio Community-t.
  • Windows SDK – előre telepítve a Visual Studio 2015-ben a 3. és újabb frissítéssel.
  • Legalább egy virtuális géppel rendelkező számítógép, amely a megadott gazda operációs rendszerek egyikét futtatja. - ez az alkalmazás tesztelésére használható.

Megjegyzés: A Hyper-V csatlakozók API-ja nyilvánosan elérhetővé vált a Windows 10 évfordulós frissítésében. A HVSocketet használó alkalmazások bármely Windows 10-gazdagépen és vendégen futnak, de csak windowsos SDK-val fejleszthetők az 14290-nél későbbi buildnél.

Új alkalmazás regisztrálása

A Hyper-V csatlakozók használatához az alkalmazást regisztrálni kell a Hyper-V gazdagép nyilvántartásában.

Ha regisztrálja a szolgáltatást a beállításjegyzékben, a következőt kapja:

  • WMI-kezelés az elérhető szolgáltatások engedélyezéséhez, letiltásához és listázásához
  • Engedély a virtuális gépekkel való közvetlen kommunikációhoz

A következő PowerShell regisztrál egy "HV Socket Demo" nevű új alkalmazást. Ezt rendszergazdaként kell futtatni. Manuális utasítások alább.

$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

Beállításjegyzék helye és adatai:

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

Ezen a beállításjegyzék-helyen számos grafikus felhasználói felület jelenik meg. Ezek a csomagban foglalt szolgáltatásaink.

A beállításjegyzék adatai szolgáltatásonként:

  • Service GUID
    • ElementName (REG_SZ) -- ez a szolgáltatás barátságos neve

A saját szolgáltatás regisztrálásához hozzon létre egy új beállításkulcsot a saját GUID-ját és barátságos nevét alkalmazva.

A barátságos név az új alkalmazásához lesz társítva. A teljesítményszámlálókban és más olyan helyeken jelenik meg, ahol a GUID nem megfelelő.

A beállításjegyzék-bejegyzés a következőképpen néz ki:

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

Megjegyzés:

A Linux-vendég szolgáltatás GUID azonosítója a VSOCK protokollt használja, amely svm_cid és svm_port révén történik a címzés, nem pedig GUID használatával. A Windows-szal való következetlenség áthidalásához a jól ismert GUID-t használják a gazdagép szolgáltatássablonjaként, amely portot képez a vendégben. A szolgáltatás GUID-azonosítójának testreszabásához egyszerűen módosítsa az első "00000000" értéket a kívánt portszámra. Például: a "00000ac9" a 2761-es port.

// 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
  */

Tipp: Ha GUID azonosítót szeretne létrehozni a PowerShellben, és azt a vágólapra szeretné másolni, futtassa a következőt:

(New-Guid).Guid | clip.exe

Hyper-V-csatlakozó létrehozása

A legalapvetőbb esetben egy foglalat definiálásához címcsaládra, kapcsolattípusra és protokollra van szükség.

Íme egy egyszerű szoftvercsatorna-definíció

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

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

Hyper-V foglalat esetén:

  • Címcsalád – AF_HYPERV (Windows) vagy AF_VSOCK (Linux-vendég)
  • típus SOCK_STREAM
  • protokoll – HV_PROTOCOL_RAW (Windows) vagy 0 (Linux-vendég)

Íme egy példa a deklarációra/példányosításra:

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

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

Kötés a Hyper-V foglalathoz

A Bind hálózati csatlakozót társít kapcsolati adatokkal.

A függvénydefiníciót az alábbiakban átmásoljuk konvencióként, a kötésről itt olvashat bővebben.

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

A standard Internet Protocol címcsaládhoz tartozó socket-címmel (AF_INET), amely a gazdagép IP-címéből és a gazdagépen lévő portszámból áll, ellentétben a AF_HYPERV socket-cím a virtuális gép azonosítóját és a fent definiált alkalmazásazonosítót használja a kapcsolat létrehozásához. Ha egy Linux-vendég AF_VSOCK kötése a svm_cid és a svm_port használatával történik.

Mivel Hyper-V szoftvercsatornák nem függenek hálózati veremtől, TCP/IP-címtől, DNS-től stb., a szoftvercsatornavégpontnak nem IP-címre, nem gazdagépnévre volt szüksége, amely továbbra is egyértelműen leírja a kapcsolatot.

A Hyper-V csatlakozó csatlakozó címének definíciója:

// 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)];
};

Az IP-cím vagy a gazdagépnév helyett az AF_HYPERV végpontok erősen támaszkodnak két globálisan egyedi azonosítóra.

  • Virtuálisgép-azonosító – ez a virtuális gépenként hozzárendelt egyedi azonosító. A virtuális gép azonosítója a következő PowerShell-kódrészlet használatával található.

    (Get-VM -Name $VMName).Id
    
  • Szolgáltatásazonosító – a fent említett GUID, amellyel az alkalmazás regisztrálva van a Hyper-V gazdagép-regisztrációs adatbázisban.

VMID helyettesítő karakterek is rendelkezésre állnak, ha a kapcsolat nem egy adott virtuális géphez kapcsolódik.

VMID helyettesítő karakterek

Név GUID (globálisan egyedi azonosító) Leírás
HV_GUID_ZERO 00000000-0000-0000-0000-000000000000 A figyelőknek ehhez a VmId-hez kell csatlakozniuk, hogy minden partícióról tudjanak kapcsolatokat fogadni.
HV_GUID_WILDCARD 00000000-0000-0000-0000-000000000000 A figyelőknek ehhez a VmId-hez kell csatlakozniuk, hogy minden partícióról tudjanak kapcsolatokat fogadni.
HV_GUID_BROADCAST FFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF
HV_GUID_CHILDREN 90db8b89-0d35-4f79-8ce9-49ea0ac8b7cd Helyettesítő karakterek címe gyermekeknek. A figyelőknek ehhez a VmId-hez kell kapcsolódnia, hogy elfogadják a kapcsolatot a gyermekeikkel.
HV_GUID_LOOPBACK e0e16197-dd56-4a10-9195-5ee7a155a838 Visszacsatolási cím. Ezzel a virtuálisgép-azonosítóval ugyanahhoz a partícióhoz csatlakozik, mint a csatlakozó.
HV_GUID_PARENT a42e7cda-d03f-480c-9cc2-a4de20abb878 Szülőcím. A VmId használatával csatlakozik az összekötő szülőpartíciójához.

* HV_GUID_PARENT A virtuális gép szülője a hosztgép. A tároló szülője a tároló gazdagépe. A virtuális gépen futó tárolóból való csatlakozás a tárolót üzemeltető virtuális géphez fog csatlakozni. Ez a VmId a következő forrásról fogad csatlakozást: (konténerek belül): Konténergazda. (Virtuális gépen belül: Tárológazda/ nincs tároló): virtuálisgép-gazdagép. (Nem a virtuális gépen belül: Tárológazda/ nincs tároló): Nem támogatott.

Támogatott foglalatparancsok

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

A HvSocket szoftvercsatorna beállításai

Név típus Leírás
HVSOCKET_CONNECTED_SUSPEND ULONG Ha ez a socket opció nem nullára van állítva, a virtuális gép szüneteltetésekor a socketek nem bontják le a kapcsolatot.

Teljes WinSock API

Hyper-V Integration Services-referencia