Bagikan melalui


Membuat layanan integrasi Anda sendiri

Mulai pembaruan Windows 10 Anniversary, siapa pun dapat membuat aplikasi yang berkomunikasi antara host Hyper-V dan komputer virtualnya menggunakan soket Hyper-V -- Soket Windows dengan keluarga alamat baru dan titik akhir khusus untuk menargetkan komputer virtual. Semua komunikasi melalui soket Hyper-V berjalan tanpa menggunakan jaringan dan semua data tetap berada di memori fisik yang sama. Aplikasi yang menggunakan soket Hyper-V mirip dengan layanan integrasi Hyper-V.

Dokumen ini menjelaskan cara membuat program sederhana yang dibangun di atas soket Hyper-V.

OS Host yang Didukung

  • Windows 10 dan yang lebih baru
  • Windows Server 2016 dan yang lebih baru

OS Tamu yang Didukung

Nota

Tamu Linux yang didukung harus memiliki dukungan kernel untuk:

CONFIG_VSOCKET=y
CONFIG_HYPERV_VSOCKETS=y

Kemampuan dan Batasan

  • Mendukung tindakan mode kernel atau mode pengguna
  • Aliran data saja
  • Tidak ada memori blok (bukan yang terbaik untuk cadangan/video)

Memulai Langkah Pertama

Persyaratan:

  • Pengkompilasi C/C++. Jika Anda tidak memilikinya, lihat Komunitas Visual Studio
  • Windows SDK -- telah diinstal sebelumnya di Visual Studio 2015 dengan Pembaruan 3 dan yang lebih baru.
  • Komputer yang menjalankan salah satu sistem operasi host yang ditentukan dengan setidaknya satu komputer vitual. -- ini untuk menguji aplikasi Anda.

Nota: API untuk soket Hyper-V tersedia untuk umum di Windows 10 Anniversary Update. Aplikasi yang menggunakan HVSocket akan berjalan pada host dan tamu Windows 10 apa pun tetapi hanya dapat dikembangkan dengan Windows SDK lebih lambat dari build 14290.

Mendaftarkan aplikasi baru

Untuk menggunakan soket Hyper-V, aplikasi harus terdaftar di registri host Hyper-V.

Dengan mendaftarkan layanan di registri, Anda mendapatkan:

  • Manajemen WMI untuk mengaktifkan, menonaktifkan, dan mencantumkan layanan yang tersedia
  • Izin untuk berkomunikasi dengan komputer virtual secara langsung

PowerShell berikut akan mendaftarkan aplikasi baru bernama "HV Socket Demo". Ini harus dijalankan sebagai administrator. Petunjuk manual di bawah ini.

$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

Lokasi dan informasi registri:

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

Di lokasi registri ini, Anda akan melihat beberapa GUID. Itu adalah layanan in-box kami.

Informasi dalam registri per layanan:

  • Service GUID
    • ElementName (REG_SZ) -- ini adalah nama ramah layanan

Untuk mendaftarkan layanan Anda sendiri, buat kunci registri baru menggunakan GUID Anda sendiri dan nama yang mudah diingat.

Nama yang mudah diingat akan dikaitkan dengan aplikasi baru Anda. Ini akan muncul di penghitung kinerja dan tempat lain di mana GUID tidak sesuai.

Entri registri terlihat seperti ini:

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

Nota

GUID Layanan untuk tamu Linux menggunakan protokol VSOCK yang membahas melalui svm_cid dan svm_port bukan guid. Untuk menjembatani inkonsistensi ini dengan Windows, GUID terkenal digunakan sebagai templat layanan pada host yang diterjemahkan ke port di tamu. Untuk menyesuaikan GUID Layanan Anda cukup ubah "00000000" pertama ke nomor port yang diinginkan. Misalnya: "00000ac9" adalah port 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
  */

Ujung: Untuk menghasilkan GUID di PowerShell dan menyalinnya ke clipboard, jalankan:

(New-Guid).Guid | clip.exe

Membuat soket Hyper-V

Dalam kasus yang paling mendasar, menentukan soket memerlukan keluarga alamat, jenis koneksi, dan protokol.

Berikut adalah definisi soket sederhana

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

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

Untuk soket Hyper-V:

  • Keluarga alamat - AF_HYPERV (Windows) atau AF_VSOCK (tamu Linux)
  • jenis- SOCK_STREAM
  • protokol - HV_PROTOCOL_RAW (Windows) atau 0 (tamu Linux)

Berikut adalah contoh deklarasi/instansiasi:

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

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

Ikat ke soket Hyper-V

Ikatan mengaitkan soket dengan informasi koneksi.

Definisi fungsi disalin di bawah ini untuk keyakinan, baca selengkapnya tentang ikatan di sini.

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

Berbeda dengan alamat soket (sockaddr) untuk keluarga alamat Protokol Internet standar (AF_INET) yang terdiri dari alamat IP komputer host dan nomor port pada host tersebut, alamat soket untuk AF_HYPERV menggunakan ID komputer virtual dan ID aplikasi yang ditentukan di atas untuk membuat koneksi. Jika mengikat dari tamu AF_VSOCK Linux menggunakan svm_cid dan svm_port.

Karena soket Hyper-V tidak bergantung pada tumpukan jaringan, TCP/IP, DNS, dll. titik akhir soket memerlukan non-IP, bukan nama host, format yang masih jelas menggambarkan koneksi.

Berikut adalah definisi untuk alamat soket soket Hyper-V:

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

Sebagai pengganti IP atau nama host, titik akhir AF_HYPERV sangat bergantung pada dua GUID:

  • ID VM – ini adalah ID unik yang ditetapkan per VM. ID VM dapat ditemukan menggunakan cuplikan PowerShell berikut.

    (Get-VM -Name $VMName).Id
    
  • ID Layanan – GUID, dijelaskan di atas, dengan mana aplikasi terdaftar di registri host Hyper-V.

Ada juga sekumpulan wildcard VMID yang tersedia ketika koneksi tidak ke komputer virtual tertentu.

Wildcard VMID

Nama GUID Description
HV_GUID_ZERO 00000000-0000-0000-0000-000000000000 Listener harus mengikat VmId ini untuk menerima koneksi dari semua partisi.
HV_GUID_WILDCARD 00000000-0000-0000-0000-000000000000 Listener harus mengikat VmId ini untuk menerima koneksi dari semua partisi.
HV_GUID_BROADCAST FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF
HV_GUID_CHILDREN 90db8b89-0d35-4f79-8ce9-49ea0ac8b7cd Alamat kartubebas untuk anak-anak. Listener harus mengikat VmId ini untuk menerima koneksi dari turunannya.
HV_GUID_LOOPBACK e0e16197-dd56-4a10-9195-5ee7a155a838 Alamat loopback. Menggunakan VmId ini terhubung ke partisi yang sama dengan konektor.
HV_GUID_PARENT a42e7cda-d03f-480c-9cc2-a4de20abb878 Alamat induk. Menggunakan VmId ini terhubung ke partisi induk konektor.*

* HV_GUID_PARENT Induk komputer virtual adalah host-nya. Induk kontainer adalah host kontainer. Menyambungkan dari kontainer yang berjalan di komputer virtual akan terhubung ke VM yang menghosting kontainer. Mendengarkan VmId ini menerima koneksi dari: (Kontainer dalam): Host kontainer. (Di dalam VM: Host kontainer/ tanpa kontainer): Host VM. (Tidak di dalam VM: Host kontainer/ tanpa kontainer): Tidak didukung.

Perintah soket yang didukung

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

Opsi Soket HvSocket

Nama Tipe Description
HVSOCKET_CONNECTED_SUSPEND ULONG Ketika opsi soket ini diatur ke soket nilai bukan nol tidak terputus saat komputer virtual dijeda.

Api WinSock Lengkap

referensi layanan integrasiHyper-V