Kendi tümleştirme hizmetlerinizi oluşturun

Windows 10 Yıldönümü Güncelleştirmesi'nde başlayarak, herkes Hyper-V yuvalarını kullanarak Hyper-V konağı ile sanal makineleri arasında iletişim kuran uygulamalar yapabilir( yeni adres ailesine sahip bir Windows Yuvası ve sanal makineleri hedeflemek için özel uç nokta). Hyper-V yuvaları üzerinden yapılan tüm iletişimler ağ kullanmadan çalışır ve tüm veriler aynı fiziksel bellekte kalır. Hyper-V yuvaları kullanan uygulamalar, Hyper-V'nin tümleştirme hizmetlerine benzer.

Bu belge, Hyper-V yuvaları üzerinde oluşturulmuş basit bir program oluşturma işleminde yol gösterir.

Desteklenen Ana Bilgisayar İşletim Sistemi

  • Windows 10 ve üzeri
  • Windows Server 2016 ve üzeri

Desteklenen Konuk İşletim Sistemi

Uyarı

Desteklenen bir Linux konuğu şu için çekirdek desteğine sahip olmalıdır:

CONFIG_VSOCKET=y
CONFIG_HYPERV_VSOCKETS=y

Özellikler ve Sınırlamalar

  • Çekirdek modu veya kullanıcı modu eylemlerini destekler
  • Yalnızca veri akışı
  • Blok belleği yok (yedekleme/video için en iyisi değildir)

Başlangıç Yapmak

Gereksinimler:

  • C/C++ derleyicisi. Yoksa Visual Studio Topluluğu'na göz atın
  • Windows SDK -- Visual Studio 2015'te Güncelleştirme 3 ve üzeri ile önceden yüklenmiş.
  • En az bir vitual makineyle belirtilen konak işletim sistemlerinden birini çalıştıran bir bilgisayar. -- bu, uygulamanızı test etme amaçlıdır.

Not: Hyper-V yuvaları için API, Windows 10 Yıldönümü Güncelleştirmesi'nde genel kullanıma sunuldu. HVSocket kullanan uygulamalar herhangi bir Windows 10 ana bilgisayarında ve konukta çalışır, ancak yalnızca derleme 14290'dan sonraki bir Windows SDK'sı ile geliştirilebilir.

Yeni uygulama kaydetme

Hyper-V yuvalarını kullanabilmek için uygulamanın Hyper-V Konağın kayıt defterine kaydedilmesi gerekir.

Hizmeti kayıt defterine kaydederek şunları elde edersiniz:

  • Kullanılabilir hizmetleri etkinleştirmek, devre dışı bırakmak ve listelemek için WMI yönetimi
  • Sanal makinelerle doğrudan iletişim kurma izni

Aşağıdaki PowerShell , "HV Socket Demo" adlı yeni bir uygulama kaydeder. Bu, yönetici olarak çalıştırılmalıdır. Aşağıdaki el ile yönergeler.

$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

Kayıt defteri konumu ve bilgileri:

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

Bu kayıt defteri konumunda birkaç GUID göreceksiniz. Bunlar bizim kutu içi hizmetlerimiz.

Hizmet başına kayıt defterindeki bilgiler:

  • Service GUID
    • ElementName (REG_SZ) -- bu hizmetin kolay adıdır

Kendi hizmetinizi kaydetmek için kendi GUID'nizi ve kolay adınızı kullanarak yeni bir kayıt defteri anahtarı oluşturun.

Kolay ad yeni uygulamanızla ilişkilendirilecek. Performans sayaçlarında ve GUID'nin uygun olmadığı diğer yerlerde görünür.

Kayıt defteri girdisi şöyle görünür:

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

Uyarı

Linux konuğu için Hizmet GUID'i, guid yerine ve svm_cidsvm_port üzerinden adreslenen VSOCK protokollerini kullanır. Bu tutarsızlığı Windows ile köprü oluşturmak için, konakta konuktaki bir bağlantı noktasına çevrilen hizmet şablonu olarak iyi bilinen GUID kullanılır. Hizmet GUID'nizi özelleştirmek için ilk "000000000" değerini istediğiniz bağlantı noktası numarasıyla değiştirmeniz yeterlidir. Örneğin: "00000ac9", 2761 numaralı bağlantı noktasıdır.

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

Bahşiş: PowerShell'de GUID oluşturmak ve panoya kopyalamak için şunu çalıştırın:

(New-Guid).Guid | clip.exe

Hyper-V yuvası oluşturma

En temel durumda, yuva tanımlamak için bir adres ailesi, bağlantı türü ve protokol gerekir.

Basit bir yuva tanımı aşağıdadır

// 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 yuva için:

  • Adres ailesi - AF_HYPERV (Windows) veya AF_VSOCK (Linux konuğu)
  • tür- SOCK_STREAM
  • protocol - HV_PROTOCOL_RAW (Windows) veya 0 (Linux konuğu)

Aşağıda örnek bir bildirim/örnek oluşturma verilmiştir:

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

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

Hyper-V yuvaya bağlama

Bağlama, bir yuvayı bağlantı bilgileriyle ilişkilendirir.

İşlev tanımı, rahatsızlık için aşağıya kopyalanmıştır , buradan bağlama hakkında daha fazla bilgi edinin.

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

Konak makinesinin IP adresini ve bu konaktaki bir bağlantı noktası numarasını içeren standart bir İnternet Protokolü adresi ailesinin () yuva adresinin (AF_INETsockaddr) aksine, yuva adresi bağlantı kurmak için AF_HYPERV sanal makinenin kimliğini ve yukarıda tanımlanan uygulama kimliğini kullanır. Bir Linux konuğundan AF_VSOCK bağlama ve kullanıyorsa svm_cidsvm_port.

Hyper-V yuvaları bir ağ yığınına, TCP/IP'ye, DNS'ye vb. bağlı olmadığından yuva uç noktasının ip olmayan, ana bilgisayar adı olmayan bir biçime ihtiyacı vardı.

Hyper-V yuva adresinin tanımı aşağıdadır:

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

IP veya ana bilgisayar adı yerine, AF_HYPERV uç noktaları iki GUID'ye büyük ölçüde dayanır:

  • VM Kimliği – Bu, VM başına atanan benzersiz kimliktir. Vm'nin kimliği aşağıdaki PowerShell kod parçacığı kullanılarak bulunabilir.

    (Get-VM -Name $VMName).Id
    
  • Hizmet Kimliği – Uygulamanın Hyper-V ana bilgisayar kayıt defterine kaydedildiği , yukarıda açıklanan GUID.

Belirli bir sanal makineye bağlantı olmadığında bir dizi VMID joker karakteri de kullanılabilir.

VMID Joker Karakterleri

İsim GUID Description
HV_GUID_ZERO 00000000-0000-0000-0000-000000000000 Dinleyiciler, tüm bölümlerden bağlantıyı kabul etmek için bu VmId'ye bağlanmalıdır.
HV_GUID_WILDCARD 00000000-0000-0000-0000-000000000000 Dinleyiciler, tüm bölümlerden bağlantıyı kabul etmek için bu VmId'ye bağlanmalıdır.
HV_GUID_BROADCAST FFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF
HV_GUID_CHILDREN 90db8b89-0d35-4f79-8ce9-49ea0ac8b7cd Çocuklar için joker karakter adresi. Dinleyiciler, alt öğelerinden gelen bağlantıyı kabul etmek için bu VmId'ye bağlanmalıdır.
HV_GUID_LOOPBACK e0e16197-dd56-4a10-9195-5ee7a155a838 Geri döngü adresi. Bu VmId'nin kullanılması bağlayıcıyla aynı bölüme bağlanır.
HV_GUID_PARENT a42e7cda-d03f-480c-9cc2-a4de20abb878 Üst adres. Bu VmId'nin kullanılması bağlayıcının üst bölümüne bağlanır.*

* HV_GUID_PARENT Sanal makinenin üst öğesi ana bilgisayarıdır. Kapsayıcının üst öğesi kapsayıcının konağıdır. Sanal makinede çalışan bir kapsayıcıdan bağlanmak, kapsayıcıyı barındıran VM'ye bağlanır. Bu VmId'de dinlemek şu bağlantılardan bağlantı kabul eder: (Kapsayıcıların içinde): Kapsayıcı konağı. (VM'nin içinde: Kapsayıcı konağı/kapsayıcı yok): VM konağı. (VM içinde değil: Kapsayıcı konağı/kapsayıcı yok): Desteklenmez.

Desteklenen yuva komutları

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

HvSocket Yuva Seçenekleri

İsim Türü Description
HVSOCKET_CONNECTED_SUSPEND ULONG Bu yuva seçeneği sıfır olmayan bir değere ayarlandığında, sanal makine duraklatıldığında yuvaların bağlantısı kesilmez.

WinSock API'lerini tamamlama

Hyper-V Integration Services başvurusu