Man page - vsock(7)

Packages contains this manual

Available languages:

en fr ru ro

Manual

vock

NOM
SYNOPSIS
DESCRIPTION
Formats d’adresse
Migration Ă  chaud
Ioctls
Communication locale
ERREURS
VERSIONS
VOIR AUSSI
TRADUCTION

NOM

vsock – Famille d’adresses VSOCK de Linux

SYNOPSIS

#include <sys/socket.h>
#include <linux/vm_sockets.h>

stream_socket = socket(AF_VSOCK, SOCK_STREAM, 0);
datagram_socket
= socket(AF_VSOCK, SOCK_DGRAM, 0);

DESCRIPTION

La famille d’adresses VSOCK simplifie la communication entre des machines virtuelles et l’hĂŽte sur lesquelles elles s’exĂ©cutent. Cette famille d’adresses est utilisĂ©e par les agents clients et les services d’hyperviseur ayant besoin d’un canal de communication qui soit indĂ©pendant de la configuration rĂ©seau de la machine virtuelle.

Les types de socket autorisĂ©s sont SOCK_STREAM et SOCK_DGRAM . SOCK_STREAM fournit des flux d’octets orientĂ©s connexion, avec leur distribution garantie et dans le bon ordre. SOCK_DGRAM fournit un service de paquets de datagrammes sans connexion avec une distribution au mieux et un ordre au mieux. La disponibilitĂ© de ces types de socket dĂ©pend de l’hyperviseur sous-jacent.

Un nouveau socket est créé avec

socket(AF_VSOCK, socket_type, 0);

Quand un processus veut Ă©tablir une connexion, il appelle connect (2) avec l’indication de l’adresse du socket de destination. Le socket est automatiquement liĂ© Ă  un port libre s’il n’est pas liĂ©.

Un processus peut Ă©couter les connexions entrantes en se reliant d’abord Ă  une adresse de socket avec bind (2) puis en appelant listen (2).

Les donnĂ©es sont transmises en utilisant les familles d’appels systĂšme send (2) ou write (2) et les donnĂ©es sont reçues en utilisant les familles d’appels systĂšme recv (2) ou read (2).

Formats d’adresse

Une adresse de socket est dĂ©finie sous forme de combinaison d’un CID (Context Identifier) de 32 bits et un numĂ©ro de port de 32 bits. Le CID identifie la source ou la destination qui sont soit une machine virtuelle, soit l’hĂŽte. Le numĂ©ro de port diffĂ©rencie les divers services en cours d’exĂ©cution sur une seule machine.

struct sockaddr_vm {
sa_family_t svm_family; /* Famille d’adresses : AF_VSOCK */
unsigned short svm_reserved1;
unsigned int svm_port; /* N° port dans l’ordre d’octets de l’hîte */
unsigned int svm_cid; /* Adresse dans l’ordre d’octets de l’hîte */
unsigned char svm_zero[sizeof(struct sockaddr) -
sizeof(sa_family_t) -
sizeof(unsigned short) -
sizeof(unsigned int) -
sizeof(unsigned int)];
};

svm_family est toujours dĂ©fini Ă  AF_VSOCK . svm_reserved1 est toujours dĂ©fini Ă  zĂ©ro. svm_port contient le numĂ©ro de port dans l’ordre d’octets de l’hĂŽte. Les numĂ©ros de port en dessous de 1024 sont appelĂ©s ports privilĂ©giĂ©s . Seulement un processus avec la capacitĂ© CAP_NET_BIND_SERVICE peut bind (2) Ă  ces numĂ©ros de port. svm_zero doit ĂȘtre rempli de zĂ©ros.

Il existe plusieurs adresses spĂ©ciales : VMADDR_CID_ANY (-1U) signifie n’importe quelle adresse pour la liaison, VMADDR_CID_HYPERVISOR (0) est rĂ©servĂ©e aux services internes de l’hyperviseur, VMADDR_CID_LOCAL (1) est l’adresse bien connue pour les communications locales (loopback), VMADDR_CID_HOST (2) est l’adresse bien connue de l’hĂŽte.

La constante spĂ©ciale VMADDR_PORT_ANY (-1U) signifie n’importe quel port pour la liaison.

Migration Ă  chaud

Des sockets sont affectés pour la migration à chaud de machines virtuelles. Les sockets SOCK_STREAM connectés deviennent déconnectés quand les machines virtuelles migrent vers un nouvel hÎte. Les applications doivent se reconnecter quand cela se produit.

Le CID local peut varier Ă  travers une migration Ă  chaud si l’ancien CID n’est pas disponible sur le nouvel hĂŽte. Les scripts liĂ©s sont automatiquement mis Ă  jour vers le nouveau CID.

Ioctls

Les ioctls suivants sont disponibles sur le périphérique /dev/vsock .
IOCTL_VM_SOCKETS_GET_LOCAL_CID

Obtention du CID de la machine locale. L’argument est un pointeur vers un unsigned int .

ioctl(fd, IOCTL_VM_SOCKETS_GET_LOCAL_CID, &cid);

Envisager d’utiliser VMADDR_CID_ANY lors de la liaison au lieu d’obtenir le CID local avec IOCTL_VM_SOCKETS_GET_LOCAL_CID .

Communication locale

VMADDR_CID_LOCAL (1) dirige les paquets vers le mĂȘme hĂŽte qui les a gĂ©nĂ©rĂ©s. Cela est utile pour tester les applications sur un seul hĂŽte et pour le dĂ©bogage.

Le CID local obtenu avec IOCTL_VM_SOCKETS_GET_LOCAL_CID peut ĂȘtre utilisĂ© pour le mĂȘme but, mais l’utilisation de VMADDR_CID_LOCAL est prĂ©fĂ©rable.

ERREURS

EACCES

Impossibilité de lier à un port privilégié sans la capacité CAP_NET_BIND_SERVICE .

EADDRINUSE

Impossibilité de lier à un port déjà utilisé.

EADDRNOTAVAIL

Impossibilité de trouver un port libre pour la liaison ou impossibilité de lier à un CID non local.

EINVAL

ParamĂštres non autorisĂ©s. Cela comprend l’essai de lier Ă  un socket dĂ©jĂ  liĂ©, la fourniture d’une structure sockaddr_vm non valable et d’autres erreurs de validation d’entrĂ©e.

ENOPROTOOPT

Option non valable de socket dans setsockopt (2) ou getsockopt (2).

ENOTCONN

Impossibilité de réaliser une opération sur un socket non connecté.

EOPNOTSUPP

OpĂ©ration non prise en charge. Cela comprend l’indicateur MSG_OOB non implĂ©mentĂ© pour la famille send (2) d’appels systĂšme et MSG_PEEK pour la famille recv (2) d’appels systĂšme.

EPROTONOSUPPORT

NumĂ©ro de protocole de socket non autorisĂ©. Le protocole devrait toujours ĂȘtre zĂ©ro.

ESOCKTNOSUPPORT

Type de socket non pris en charge dans socket (2). Seulement SOCK_STREAM et SOCK_DGRAM sont autorisés.

VERSIONS

La prise en charge pour VMware (VMCI) est disponible depuis Linux 3.9. KVM (virtio) est pris en charge depuis Linux 4.8. Hyper-V l’est depuis Linux 4.14.

VMADDR_CID_LOCAL est pris en charge depuis Linux 5.6. La communication locale dans le client et dans l’hĂŽte est prise en charge depuis Linux 5.6. Les versions prĂ©cĂ©dentes ne gĂ©raient la communication locale que dans le client (mais pas dans l’hĂŽte) et seulement avec certains transports (VMCI et virtio).

VOIR AUSSI

bind (2), connect (2), listen (2), recv (2), send (2), socket (2), capabilities (7)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .