Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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
- Windows 10 dan yang lebih baru
- Windows Server 2016 dan yang lebih baru
- Tamu Linux dengan Layanan Integrasi Linux. Lihat Komputer virtual Linux dan FreeBSD yang didukung untuk Hyper-V di Windows
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) atauAF_VSOCK(tamu Linux) - jenis-
SOCK_STREAM - protokol -
HV_PROTOCOL_RAW(Windows) atau0(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).IdID 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. |