Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
- Windows 10 és újabb verziók
- Windows Server 2016 és újabb verziók
- Linux-vendégek linuxos integrációs szolgáltatásokkal. A Windows Hyper-V számára támogatott Linux- és FreeBSD-virtuális gépek megtekintése
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) vagyAF_VSOCK
(Linux-vendég) - típus
SOCK_STREAM
- protokoll –
HV_PROTOCOL_RAW
(Windows) vagy0
(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. |