vsock(7)

الاسم
vsock - عائلة عناوين VSOCK في لينكس

موجز
#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);

الوصف
عائلة عناوين VSOCK تسهل الاتصال بين الآلات الافتراضية والمضيف الذي تعمل عليه. تُستخدم هذه العائلة من قبل وكلاء الضيف وخدمات المراقب المفرط التي تحتاج إلى قناة اتصال مستقلة عن تكوين شبكة الآلة الافتراضية.

أنواع المقابس الصالحة هي SOCK_STREAM و SOCK_DGRAM. يوفر SOCK_STREAM تيارات بايت موجهة للاتصال مع تسليم مضمون وبالترتيب. يوفر SOCK_DGRAM خدمة حزم بيانات غير متصلة مع تسليم بأفضل جهد وترتيب بأفضل جهد. توفر هذه الأنواع يعتمد على المراقب المفرط الأساسي.

يُنشأ مقبس جديد باستخدام

    socket(AF_VSOCK, socket_type, 0);

عندما تريد عملية إنشاء اتصال، تستدعي connect(2) مع عنوان مقبس وجهة معين. يُربط المقبس آليًا بمنفذ حر إذا كان غير مربوط.

يمكن لعملية الاستماع للاتصالات الواردة عن طريق الربط أولاً بعنوان مقبس باستخدام bind(2) ثم استدعاء listen(2).

تُنقل البيانات باستخدام عائلات استدعاءات النظام send(2) أو write(2) وتُستقبل البيانات باستخدام عائلات استدعاءات النظام recv(2) أو read(2).

  تنسيق العنوان
يُعرف عنوان المقبس كتركيبة من معرف سياق (CID) 32 بت ورقم منفذ 32 بت. يحدد CID المصدر أو الوجهة، وهي إما آلة افتراضية أو المضيف. يميز رقم المنفذ بين خدمات متعددة تعمل على جهاز واحد.

    struct sockaddr_vm {
        sa_family_t    svm_family;    /* Address family: AF_VSOCK */
        unsigned short svm_reserved1;
        unsigned int   svm_port;      /* Port # in host byte order */
        unsigned int   svm_cid;       /* Address in host byte order */
        unsigned char  svm_zero[sizeof(struct sockaddr) -
                                sizeof(sa_family_t) -
                                sizeof(unsigned short) -
                                sizeof(unsigned int) -
                                sizeof(unsigned int)];
    };

يُضبط svm_family دائمًا على AF_VSOCK. يُضبط svm_reserved1 دائمًا على 0. يحتوي svm_port على رقم المنفذ بترتيب بايت المضيف. تُسمى أرقام المنافذ الأقل من 1024 المنافذ المميزة. فقط عملية تمتلك قدرة CAP_NET_BIND_SERVICE يمكنها bind(2) لهذه الأرقام. يجب ملء svm_zero بالأصفار.

هناك عدة عناوين خاصة: VMADDR_CID_ANY (-1U) يعني أي عنوان للربط؛ VMADDR_CID_HYPERVISOR (0) محجوز للخدمات المضمنة في المراقب المفرط؛ VMADDR_CID_LOCAL (1) هو العنوان المعروف للاتصال المحلي (الاسترجاع)؛ VMADDR_CID_HOST (2) هو العنوان المعروف للمضيف.

الثابت الخاص VMADDR_PORT_ANY (-1U) يعني أي رقم منفذ للربط.

  الترحيل المباشر
تتأثر المقابس بالترحيل المباشر للآلات الافتراضية. تصبح مقابس SOCK_STREAM المتصلة غير متصلة عندما ترحل الآلة الافتراضية إلى مضيف جديد. يجب على التطبيقات إعادة الاتصال عند حدوث ذلك.

قد يتغير CID المحلي عبر الترحيل المباشر إذا لم يكن CID القديم متاحًا على المضيف الجديد. تُحدث المقابس المربوطة آليًا إلى CID الجديد.

  Ioctls
أوامر ioctl التالية متاحة على جهاز /dev/vsock.

IOCTL_VM_SOCKETS_GET_LOCAL_CID
    الحصول على CID للجهاز المحلي. الوسيطة هي مؤشر إلى unsigned int.

        ioctl(fd, IOCTL_VM_SOCKETS_GET_LOCAL_CID, &cid);

    اعتبر استخدام VMADDR_CID_ANY عند الربط بدلاً من الحصول على CID المحلي باستخدام IOCTL_VM_SOCKETS_GET_LOCAL_CID.

  اتصال محلي
يوجه VMADDR_CID_LOCAL (1) الحزم إلى نفس المضيف الذي أنشأها. هذا مفيد لاختبار التطبيقات على مضيف واحد ولتصحيح الأخطاء.

يمكن استخدام CID المحلي الذي تم الحصول عليه باستخدام IOCTL_VM_SOCKETS_GET_LOCAL_CID لنفس الغرض، لكن من الأفضل استخدام VMADDR_CID_LOCAL.

الأخطاء

EACCES
    غير قادر على الربط بمنفذ مميز بدون صلاحية CAP_NET_BIND_SERVICE.

EADDRINUSE
    غير قادر على الربط بمنفذ قيد الاستخدام بالفعل.

EADDRNOTAVAIL
    غير قادر على إيجاد منفذ شاغر للربط أو غير قادر على الربط بمعرف CID غير محلي.

EINVAL
    معاملات غير صالحة. يشمل ذلك: محاولة ربط مقبس مرتبط بالفعل، تقديم بنية sockaddr_vm غير صالحة، وأخطاء أخرى في التحقق من المدخلات.

ENOPROTOOPT
    خيار مقبس غير صالح في setsockopt(2) أو getsockopt(2).

ENOTCONN
    غير قادر على تنفيذ العملية على مقبس غير متصل.

EOPNOTSUPP
    العملية غير مدعومة. يشمل ذلك: العلم MSG_OOB غير المنفذ لعائلة استدعاءات النظام send(2) والعلم MSG_PEEK لعائلة استدعاءات النظام recv(2).

EPROTONOSUPPORT
    رقم بروتوكول مقبس غير صالح. يجب أن يكون البروتوكول دائماً 0.

ESOCKTNOSUPPORT
    نوع مقبس غير مدعوم في socket(2). فقط SOCK_STREAM و SOCK_DGRAM صالحان.

الإصدارات
دعم VMware (VMCI) متاح منذ لينكس 3.9. KVM (virtio) مدعوم منذ لينكس 4.8. Hyper-V مدعوم منذ لينكس 4.14.

VMADDR_CID_LOCAL مدعوم منذ لينكس 5.6. الاتصال المحلي في الضيف وعلى المضيف متاح منذ لينكس 5.6. الإصدارات السابقة دعمت فقط الاتصال المحلي داخل الضيف (ليس على المضيف)، ومع بعض الناقلات فقط (VMCI و virtio).

انظر أيضًا
bind(2), connect(2), listen(2), recv(2), send(2), socket(2), capabilities(7)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.