vsock(7) Miscellaneous Information Manual vsock(7) NUME vsock - familia de adrese Linux VSOCK SINOPSIS #include #include stream_socket = socket(AF_VSOCK, SOCK_STREAM, 0); datagram_socket = socket(AF_VSOCK, SOCK_DGRAM, 0); DESCRIERE Familia de adrese VSOCK faciliteaza comunicarea intre mainile virtuale i gazda pe care ruleaza. Aceasta familie de adrese este utilizata de agenii invitai i de serviciile hipervizorului care au nevoie de un canal de comunicare independent de configuraia reelei mainilor virtuale. Tipurile de soclu valide sunt SOCK_STREAM i SOCK_DGRAM. SOCK_STREAM ofera fluxuri de octei orientate spre conexiune cu livrare garantata, in ordine. SOCK_DGRAM ofera un serviciu de pachete de datagrame fara conexiune, cu livrare i ordonare cu cel mai puin-efort. Disponibilitatea acestor tipuri de soclu depinde de hipervizorul de subiacent. Un nou socket este creat cu socket(AF_VSOCK, socket_type, 0); Cand un proces dorete sa stabileasca o conexiune, acesta apeleaza connect(2) cu o anumita adresa de soclu de destinaie. Soclul este asociat in mod automat unui port liber, daca nu este asociat. Un proces poate asculta conexiunile primite, mai intai conectandu-se la o adresa de soclu folosind bind(2) i apoi apeland listen(2). Datele sunt transmise cu ajutorul familiilor de apeluri de sistem send(2) sau write(2), iar datele sunt primite cu ajutorul familiilor de apeluri de sistem recv(2) sau read(2). Formatul adreselor O adresa de soclu este definita ca o combinaie intre un identificator de context (,,Context Identifier": CID) pe 32 de bii i un numar de port pe 32 de bii. CID-ul identifica sursa sau destinaia, care este fie o maina virtuala, fie o gazda. Numarul portului face diferena intre mai multe servicii care ruleaza pe o singura maina. struct sockaddr_vm { sa_family_t svm_family; /* Familia de adrese: AF_VSOCK */ unsigned short svm_reserved1; unsigned int svm_port; /* Numarul portului in ordinea octeilor gazdei */ unsigned int svm_cid; /* Adresa in ordinea octeilor gazdei */ unsigned char svm_zero[sizeof(struct sockaddr) - sizeof(sa_family_t) - sizeof(unsigned short) - sizeof(unsigned int) - sizeof(unsigned int)]; }; svm_family este intotdeauna stabilit la AF_VSOCK. svm_reserved1 este intotdeauna stabilit la 0. svm_port conine numarul portului in ordinea octeilor gazda. Numerele de port mai mici de 1024 se numesc porturi privilegiate. Numai un proces cu capacitatea CAP_NET_BIND_SERVICE poate efectua bind(2) la aceste numere de port. svm_zero trebuie sa fie umplut cu zerouri. Exista mai multe adrese speciale: VMADDR_CID_ANY (-1U) inseamna orice adresa pentru conectare; VMADDR_CID_HYPERVISOR (0) este rezervata pentru serviciile integrate in hipervizor; VMADDR_CID_LOCAL (1) este adresa bine cunoscuta pentru comunicarea locala (loopback); VMADDR_CID_HOST (2) este adresa bine cunoscuta a gazdei. Constanta speciala VMADDR_PORT_ANY (-1U) inseamna orice numar de port pentru asociere. Migrare la cald Soclurile sunt afectate de migrarea la cald a mainilor virtuale. Soclurile SOCK_STREAM conectate se deconecteaza atunci cand maina virtuala migreaza catre o noua gazda. Aplicaiile trebuie sa se reconecteze atunci cand se intampla acest lucru. CID-ul local se poate schimba in timpul migraiei la cald daca vechiul CID nu este disponibil pe noua gazda. Soclurile asociate sunt actualizate automat la noul CID. Ioctl-uri Urmatoarele ioctl-uri sunt disponibile pe dispozitivul /dev/vsock. IOCTL_VM_SOCKETS_GET_LOCAL_CID Obine CID-ul mainii locale. Argumentul este un indicator catre un unsigned int. ioctl(fd, IOCTL_VM_SOCKETS_GET_LOCAL_CID, &cid); Luai in considerare utilizarea VMADDR_CID_ANY atunci cand va conectai in loc sa obinei CID-ul local cu IOCTL_VM_SOCKETS_GET_LOCAL_CID. Comunicarea locala VMADDR_CID_LOCAL (1) direcioneaza pachetele catre aceeai gazda care le-a generat. Acest lucru este util pentru testarea aplicaiilor pe o singura gazda i pentru depanare. CID-ul local obinut cu IOCTL_VM_SOCKETS_GET_LOCAL_CID poate fi utilizat in acelai scop, dar este preferabil sa se utilizeze VMADDR_CID_LOCAL. ERORI-IEIRE EACCES Nu se poate face conectarea la un port privilegiat fara capacitatea CAP_NET_BIND_SERVICE. EADDRINUSE Nu se poate face conectarea la un port care este deja utilizat. EADDRNOTAVAIL Nu se poate gasi un port liber pentru conectare sau nu se poate conecta la un CID nelocal. EINVAL Parametrii nevalabili. Aceasta include: incercarea de a asocia un soclu care este deja asociat, furnizarea unei structuri sockaddr_vm nevalide i alte erori de validare a datelor de intrare. ENOPROTOOPT Opiune de soclu nevalida in setsockopt(2) sau getsockopt(2). ENOTCONN Nu se poate efectua o operaie pe un soclu neconectat. EOPNOTSUPP Operaia nu este acceptata. Aceasta include: fanionul MSG_OOB care nu este implementat pentru familia de apeluri de sistem send(2) i MSG_PEEK pentru familia de apeluri de sistem recv(2). EPROTONOSUPPORT Numar de protocol de soclu nevalid. Protocolul trebuie sa fie intotdeauna 0. ESOCKTNOSUPPORT Tip de soclu neacceptat in socket(2). Numai SOCK_STREAM i SOCK_DGRAM sunt valabile. VERSIUNI Suportul pentru VMware (VMCI) a fost disponibil incepand cu Linux 3.9. KVM (virtio) este disponibil incepand cu Linux 4.8. Hyper-V este disponibil incepand cu Linux 4.14. VMADDR_CID_LOCAL este disponibil incepand cu Linux 5.6. Comunicarea locala in invitat i pe gazda este disponibila incepand cu Linux 5.6. Versiunile anterioare ofereau suport numai pentru comunicarea locala in cadrul unui oaspete (nu i pe gazda) i numai cu anumite transporturi (VMCI i virtio). CONSULTAI I bind(2), connect(2), listen(2), recv(2), send(2), socket(2), capabilities(7) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.9.1 2 mai 2024 vsock(7)