namespaces(7)

الاسم
namespaces - نظرة عامة على مساحات أسماء لينكس

الوصف
تغلف مساحة الاسم موردًا نظاميًا عامًا في تجريد يجعل العمليات داخل مساحة الاسم ترى أن لديها مثيلًا معزولًا خاصًا بها من المورد العام. تكون التغييرات على المورد العام مرئية للعمليات الأخرى الأعضاء في مساحة الاسم، لكنها غير مرئية للعمليات الأخرى. أحد استخدامات مساحات الأسماء هو تنفيذ الحاويات.

توفر هذه الصفحة إشارات إلى معلومات حول أنواع مساحات الأسماء المختلفة، وتصف ملفات /proc المرتبطة، وتلخص واجهات برمجة التطبيقات للعمل مع مساحات الأسماء.

  أنواع مساحات الأسماء
يوضح الجدول التالي أنواع مساحات الأسماء المتاحة على لينكس. يظهر العمود الثاني من الجدول قيمة العلم المستخدمة لتحديد نوع مساحة الاسم في واجهات برمجة التطبيقات المختلفة. يحدد العمود الثالث صفحة الدليل التي توفر تفاصيل حول نوع مساحة الاسم. العمود الأخير هو ملخص للموارد التي تعزلها مساحة الاسم.

مساحة الاسم | علم | الصفحة | تعزل
مجموعة التحكم | CLONE_NEWCGROUP | cgroup_namespaces(7) | دليل جذر مجموعة التحكم
IPC | CLONE_NEWIPC | ipc_namespaces(7) | نظام IPC في System V، قوائم انتظار الرسائل POSIX
الشبكة | CLONE_NEWNET | network_namespaces(7) | أجهزة الشبكة، المجموعات، والمنافذ، وما إلى ذلك
الوصل | CLONE_NEWNS | mount_namespaces(7) | نقاط الوصل
PID | CLONE_NEWPID | pid_namespaces(7) | معرفات العمليات
الوقت | CLONE_NEWTIME | time_namespaces(7) | ساعات الإقلاع والأحادية
المستخدم | CLONE_NEWUSER | user_namespaces(7) | معرفات المستخدم والمجموعة
UTS | CLONE_NEWUTS | uts_namespaces(7) | اسم المضيف واسم نطاق NIS

  واجهة برمجة تطبيقات مساحات الأسماء
بالإضافة إلى ملفات /proc المتنوعة الموصوفة أدناه، تتضمن واجهة برمجة تطبيقات مساحات الأسماء استدعاءات النظام التالية:

clone(2)
    ينشئ استدعاء النظام clone(2) عملية جديدة. إذا حددت وسيطة flags للاستدعاء واحدًا أو أكثر من أعلام CLONE_NEW* المذكورة أعلاه، فتُنشأ مساحات أسماء جديدة لكل علم، ويُجعل العملية التابعة عضوًا في تلك المساحات. (ينفذ استدعاء النظام هذا أيضًا عددًا من الميزات غير المرتبطة بمساحات الأسماء.)

setns(2)
    يسمح استدعاء النظام setns(2) للعملية المستدعية بالانضمام إلى مساحة اسم موجودة. تُحدد مساحة الاسم المراد الانضمام إليها عبر واصف ملف يشير إلى أحد ملفات /proc/pid/ns الموصوفة أدناه.

unshare(2)
    ينقل استدعاء النظام unshare(2) العملية المستدعية إلى مساحة اسم جديدة. إذا حددت وسيطة flags للاستدعاء واحدًا أو أكثر من أعلام CLONE_NEW* المذكورة أعلاه، فتُنشأ مساحات أسماء جديدة لكل علم، ويُجعل العملية المستدعية عضوًا في تلك المساحات. (ينفذ استدعاء النظام هذا أيضًا عددًا من الميزات غير المرتبطة بمساحات الأسماء.)

ioctl(2)
    يمكن استخدام عمليات ioctl(2) المتنوعة لاكتشاف معلومات حول مساحات الأسماء. تُوصف هذه العمليات في ioctl_nsfs(2).

يتطلب إنشاء مساحات أسماء جديدة باستخدام clone(2) وunshare(2) في معظم الحالات القدرة CAP_SYS_ADMIN، لأنه في مساحة الاسم الجديدة، سيكون لدى المنشئ القدرة على تغيير الموارد العالمية المرئية للعمليات الأخرى التي تُنشأ لاحقًا في مساحة الاسم أو تنضم إليها. مساحات أسماء المستخدم هي الاستثناء: منذ Linux 3.8، لا يُطلب أي امتياز لإنشاء مساحة اسم مستخدم.

  الدليل /proc/pid/ns/
لكل عملية دليل فرعي /proc/pid/ns/ يحتوي على مدخل واحد لكل مساحة اسم تدعم التلاعب بها بواسطة setns(2):

    $ ls -l /proc/$$/ns | awk '{print $1, $9, $10, $11}'
    total 0
    lrwxrwxrwx. cgroup -> cgroup:[4026531835]
    lrwxrwxrwx. ipc -> ipc:[4026531839]
    lrwxrwxrwx. mnt -> mnt:[4026531840]
    lrwxrwxrwx. net -> net:[4026531969]
    lrwxrwxrwx. pid -> pid:[4026531836]
    lrwxrwxrwx. pid_for_children -> pid:[4026531834]
    lrwxrwxrwx. time -> time:[4026531834]
    lrwxrwxrwx. time_for_children -> time:[4026531834]
    lrwxrwxrwx. user -> user:[4026531837]
    lrwxrwxrwx. uts -> uts:[4026531838]

يُبقي الوصل الرابط (انظر mount(2)) لأحد الملفات في هذا الدليل إلى مكان آخر في نظام الملفات مساحة الاسم المقابلة للعملية المحددة بواسطة pid حية حتى إذا أنهيت جميع العمليات الموجودة حاليًا في مساحة الاسم.

فتح أحد الملفات في هذا الدليل (أو ملف تم وصله ربطاً بأحد هذه الملفات) يُرجع مقبض ملف لمساحة الأسماء المقابلة للعملية المحددة بواسطة pid. طالما بقي واصف الملف هذا مفتوحاً، ستبقى مساحة الأسماء حية، حتى لو أنهت جميع العمليات في مساحة الأسماء. يمكن تمرير واصف الملف إلى setns(2).

في لينكس 3.7 والإصدارات الأقدم، كانت هذه الملفات مرئية كروابط صلبة. منذ لينكس 3.8، تظهر كروابط رمزية. إذا كانت عمليتان في نفس مساحة الأسماء، فإن معرفات الجهاز وأرقام العقدة للروابط الرمزية /proc/pid/ns/xxx ستكون متطابقة؛ يمكن للتطبيق التحقق من ذلك باستخدام حقلي stat.st_dev و stat.st_ino المُرجَعين بواسطة stat(2). محتوى هذا الرابط الرمزي هو سلسلة تحتوي على نوع مساحة الأسماء ورقم العقدة كما في المثال التالي:

    $ readlink /proc/$$/ns/uts
    uts:[4026531838]

الروابط الرمزية في هذا الدليل الفرعي هي كما يلي:

/proc/pid/ns/cgroup (منذ لينكس 4.6)
    هذا الملف هو مقبض لمساحة أسماء cgroup للعملية.

/proc/pid/ns/ipc (منذ لينكس 3.0)
    هذا الملف هو مقبض لمساحة أسماء IPC للعملية.

/proc/pid/ns/mnt (منذ لينكس 3.8)
    هذا الملف هو مقبض لمساحة أسماء الوصل للعملية.

/proc/pid/ns/net (منذ لينكس 3.0)
    هذا الملف هو مقبض لمساحة أسماء الشبكة للعملية.

/proc/pid/ns/pid (منذ لينكس 3.8)
    هذا الملف هو مقبض لمساحة أسماء PID للعملية. هذا المقبض دائم طوال عمر العملية (أي أن عضوية مساحة أسماء PID للعملية لا تتغير أبداً).

/proc/pid/ns/pid_for_children (منذ لينكس 4.12)
    هذا الملف هو مقبض لمساحة أسماء PID للعمليات الفرعية المنشأة بواسطة هذه العملية. يمكن أن يتغير هذا نتيجة لاستدعاءات unshare(2) و setns(2) (انظر pid_namespaces(7))، لذلك قد يختلف الملف عن /proc/pid/ns/pid. يكتسب الرابط الرمزي قيمة فقط بعد إنشاء أول عملية فرعية في مساحة الأسماء. (قبل ذلك، سيعيد readlink(2) للرابط الرمزي مخزناً فارغاً.)

/proc/pid/ns/time (منذ لينكس 5.6)
    هذا الملف هو مقبض لمساحة أسماء الوقت للعملية.

/proc/pid/ns/time_for_children (منذ لينكس 5.6)
    هذا الملف هو مقبض لمساحة أسماء الوقت للعمليات الفرعية المنشأة بواسطة هذه العملية. يمكن أن يتغير هذا نتيجة لاستدعاءات unshare(2) و setns(2) (انظر time_namespaces(7))، لذلك قد يختلف الملف عن /proc/pid/ns/time.

/proc/pid/ns/user (منذ لينكس 3.8)
    هذا الملف هو مقبض لمساحة أسماء المستخدم للعملية.

/proc/pid/ns/uts (منذ لينكس 3.0)
    هذا الملف هو مقبض لمساحة أسماء UTS للعملية.

يُحكم الإذن بإلغاء الإشارة أو قراءة (readlink(2)) هذه الروابط الرمزية بواسطة فحص وضع الوصول ptrace PTRACE_MODE_READ_FSCREDS؛ انظر ptrace(2).

  دليل /proc/sys/user
تُظهر الملفات في الدليل /proc/sys/user (الموجود منذ لينكس 4.9) حدودًا على عدد مساحات الأسماء من أنواع مختلفة التي يمكن إنشاؤها. الملفات هي كما يلي:

max_cgroup_namespaces
    يُحدد القيمة في هذا الملف حدًا لكل مستخدم على عدد مساحات أسماء cgroup التي يمكن إنشاؤها في مساحة اسم المستخدم.

max_ipc_namespaces
    يُحدد القيمة في هذا الملف حدًا لكل مستخدم على عدد مساحات أسماء ipc التي يمكن إنشاؤها في مساحة اسم المستخدم.

max_mnt_namespaces
    يُحدد القيمة في هذا الملف حدًا لكل مستخدم على عدد مساحات أسماء الوصل التي يمكن إنشاؤها في مساحة اسم المستخدم.

max_net_namespaces
    يُحدد القيمة في هذا الملف حدًا لكل مستخدم على عدد مساحات أسماء الشبكة التي يمكن إنشاؤها في مساحة اسم المستخدم.

max_pid_namespaces
    يُحدد القيمة في هذا الملف حدًا لكل مستخدم على عدد مساحات أسماء PID التي يمكن إنشاؤها في مساحة اسم المستخدم.

max_time_namespaces (منذ لينكس 5.7)
    يُحدد القيمة في هذا الملف حدًا لكل مستخدم على عدد مساحات أسماء الوقت التي يمكن إنشاؤها في مساحة اسم المستخدم.

max_user_namespaces
    يُحدد القيمة في هذا الملف حدًا لكل مستخدم على عدد مساحات أسماء المستخدم التي يمكن إنشاؤها في مساحة اسم المستخدم.

max_uts_namespaces
    يُحدد القيمة في هذا الملف حدًا لكل مستخدم على عدد مساحات أسماء uts التي يمكن إنشاؤها في مساحة اسم المستخدم.

لاحظ التفاصيل التالية حول هذه الملفات:

•   القيم في هذه الملفات قابلة للتعديل بواسطة العمليات المميزة.

•   القيم التي تُظهرها هذه الملفات هي الحدود لمساحة اسم المستخدم التي تقع فيها عملية الفتح.

•   الحدود لكل مستخدم. يمكن لكل مستخدم في نفس مساحة اسم المستخدم إنشاء مساحات أسماء حتى الحد المُحدد.

•   تنطبق الحدود على جميع المستخدمين، بما في ذلك UID 0.

•   تُطبق هذه الحدود بالإضافة إلى أي حدود أخرى لكل مساحة اسم (مثل تلك الخاصة بمساحات أسماء PID والمستخدم) التي قد تُفرض.

•   عند مواجهة هذه الحدود، يفشل clone(2) و unshare(2) مع الخطأ ENOSPC.

•   بالنسبة لمساحة المستخدم الأولية، تكون القيمة المبدئية في كل من هذه الملفات نصف الحد الأقصى لعدد الخيوط التي يمكن إنشاؤها (/proc/sys/kernel/threads-max). في جميع مساحات المستخدم السليلة، تكون القيمة المبدئية في كل ملف هي MAXINT.

•   عند إنشاء مساحة اسم، يُحسب الكائن أيضًا مقابل مساحات الأسماء السلفية. بشكل أكثر دقة:

    •   لكل مساحة مستخدم مُعرّف مستخدم منشئ.

    •   عند إنشاء مساحة اسم، تُحسب مقابل مُعرّفات المستخدمين المنشئين في كل من مساحات المستخدم السلفية، وتضمن النواة عدم تجاوز حد مساحة الاسم المقابل لمُعرّف المستخدم المنشئ في مساحة الاسم السلفية.

    •   تضمن النقطة المذكورة أعلاه أن إنشاء مساحة مستخدم جديدة لا يمكن استخدامه كوسيلة للهروب من الحدود السارية في مساحة المستخدم الحالية.

  عمر مساحة الاسم
في غياب أي عوامل أخرى، تُزال مساحة الاسم آليًا عند إنهاء آخر عملية في مساحة الاسم أو مغادرتها. ومع ذلك، هناك عدد من العوامل الأخرى التي قد تُبقي مساحة الاسم موجودة حتى لو لم يكن لديها عمليات أعضاء. تتضمن هذه العوامل ما يلي:

•   وجود واصف ملف مفتوح أو نقطة وصل ربط للملف /proc/pid/ns/* المقابل.

•   مساحة الاسم هرمية (أي مساحة PID أو مستخدم)، ولديها مساحة اسم فرعية.

•   إنها مساحة مستخدم تمتلك واحدة أو أكثر من مساحات الأسماء غير المستخدمة.

•   إنها مساحة اسم PID، ويوجد عملية تشير إلى مساحة الاسم عبر رابط رمزي /proc/pid/ns/pid_for_children.

•   إنها مساحة اسم زمن، ويوجد عملية تشير إلى مساحة الاسم عبر رابط رمزي /proc/pid/ns/time_for_children.

•   إنها مساحة اسم IPC، وتشير نقطة وصل مقابلة لنظام ملفات mqueue (انظر mq_overview(7)) إلى مساحة الاسم هذه.

•   إنها مساحة اسم PID، وتشير نقطة وصل مقابلة لنظام ملفات proc(5) إلى مساحة الاسم هذه.

أمثلة
انظر clone(2) وuser_namespaces(7).

انظر أيضًا
nsenter(1), readlink(1), unshare(1), clone(2), ioctl_nsfs(2), setns(2), unshare(2), proc(5), capabilities(7), cgroup_namespaces(7), cgroups(7), credentials(7), ipc_namespaces(7), network_namespaces(7), pid_namespaces(7), user_namespaces(7), uts_namespaces(7), lsns(8), switch_root(8)

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

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

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