cgroup_namespaces(7)

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

الوصف
للحصول على نظرة عامة على مساحات الأسماء، انظر namespaces(7).

مساحات أسماء cgroup تُظهِر عرض cgroups الخاصة بعملية (انظر cgroups(7)) كما تُرى عبر /proc/pid/cgroup و /proc/pid/mountinfo.

لكل مساحة اسم cgroup مجموعتها الخاصة من أدلة جذر cgroup. هذه الأدلة الجذرية هي النقاط الأساسية للمواقع النسبية المعروضة في السجلات المقابلة في ملف /proc/pid/cgroup. عندما تنشئ عملية مساحة اسم cgroup جديدة باستخدام clone(2) أو unshare(2) مع العلم CLONE_NEWCGROUP، تصبح أدلة cgroups الحالية أدلة جذر cgroup لمساحة الاسم الجديدة. (ينطبق هذا على كل من تسلسلات cgroups الإصدار 1 والتسلسل الموحد cgroups الإصدار 2.)

عند قراءة عضويات cgroup لعملية "هدف" من /proc/pid/cgroup، سيكون اسم المسار المعروض في الحقل الثالث من كل سجل نسبيًا إلى دليل جذر عملية القراءة للتسلسل الهرمي cgroup المقابل. إذا كان دليل cgroup للعملية الهدف يقع خارج دليل جذر مساحة اسم cgroup لعملية القراءة، فسيظهر اسم المسار إدخالات ../ لكل مستوى سلف في التسلسل الهرمي cgroup.

توضح جلسة الصدفة التالية تأثير إنشاء مساحة اسم cgroup جديدة.

أولاً، (كمستخدم فائق) في صدفة في مساحة اسم cgroup الأولية، ننشئ cgroup فرعيًا في التسلسل الهرمي freezer، ونضع عملية في ذلك cgroup سنستخدمها كجزء من العرض التوضيحي أدناه:

    # mkdir -p /sys/fs/cgroup/freezer/sub2;
    # sleep 10000 &    # Create a process that lives for a while
    [1] 20124
    # echo 20124 > /sys/fs/cgroup/freezer/sub2/cgroup.procs;

ثم ننشئ cgroup فرعيًا آخر في التسلسل الهرمي freezer ونضع الصدفة في ذلك cgroup:

    # mkdir -p /sys/fs/cgroup/freezer/sub;
    # echo $$;                      # Show PID of this shell
    30655
    # echo 30655 > /sys/fs/cgroup/freezer/sub/cgroup.procs;
    # cat /proc/self/cgroup | grep freezer;
    7:freezer:/sub

بعد ذلك، نستخدم unshare(1) لإنشاء عملية تشغل صدفة جديدة في مساحات اسم cgroup و mount جديدة:

    # PS1='sh2# ' unshare -Cm bash;

من الصدفة الجديدة التي بدأها unshare(1)، نفحص بعد ذلك ملفات /proc/pid/cgroup لكل من الصدفة الجديدة، وعملية في مساحة اسم cgroup الأولية (init، مع PID 1)، والعملية في cgroup الشقيق (sub2):

    sh2# cat /proc/self/cgroup | grep freezer;
    7:freezer:/
    sh2# cat /proc/1/cgroup | grep freezer;
    7:freezer:/..
    sh2# cat /proc/20124/cgroup | grep freezer;
    7:freezer:/../sub2

من مخرجات الأمر الأول، نرى أن عضوية freezer cgroup للصدفة الجديدة (الموجودة في نفس cgroup مثل الصدفة الأولية) تُعرض معرفة نسبيًا إلى دليل جذر freezer cgroup الذي أُنشئ عند إنشاء مساحة اسم cgroup الجديدة. (بالمصطلحات المطلقة، الصدفة الجديدة في freezer cgroup /sub، ودليل جذر التسلسل الهرمي freezer cgroup في مساحة اسم cgroup الجديدة هو أيضًا /sub. وبالتالي، تُعرض عضوية cgroup للصدفة الجديدة كـ '/'.)

ومع ذلك، عندما ننظر في /proc/self/mountinfo نرى الشذوذ التالي:

    sh2# cat /proc/self/mountinfo | grep freezer;
    155 145 0:32 /.. /sys/fs/cgroup/freezer ...

الحقل الرابع من هذا السطر (/..) يجب أن يُظهر الدليل في نظام ملفات cgroup الذي يشكل جذر هذا mount. نظرًا لأنه بتعريف مساحات اسم cgroup، أصبح دليل freezer cgroup الحالي للعملية دليل جذر freezer cgroup الخاص بها، يجب أن نرى '/' في هذا الحقل. المشكلة هنا هي أننا نرى إدخال mount لنظام ملفات cgroup المقابل لمساحة اسم cgroup الأولية (التي نظام ملفات cgroup الخاص بها متجذر بالفعل في الدليل الأب لـ sub). لإصلاح هذه المشكلة، يجب إعادة mount نظام ملفات freezer cgroup من الصدفة الجديدة (أي، تنفيذ mount من عملية في مساحة اسم cgroup الجديدة)، وبعد ذلك نرى النتائج المتوقعة:

    sh2# mount --make-rslave /;     # Don't propagate mount events
                                   # to other namespaces
    sh2# umount /sys/fs/cgroup/freezer;
    sh2# mount -t cgroup -o freezer freezer /sys/fs/cgroup/freezer;
    sh2# cat /proc/self/mountinfo | grep freezer;
    155 145 0:32 / /sys/fs/cgroup/freezer rw,relatime ...

المعايير
لينكس.

ملاحظات
يتطلب استخدام مساحات اسم cgroup نواة مهيأة بالخيار CONFIG_CGROUPS.

يخدم التظهير المقدم من مساحات اسم cgroup عددًا من الأغراض:

•   يمنع تسرب المعلومات حيث تصبح مسارات دليل cgroup خارج الحاوية مرئية للعمليات في الحاوية. مثل هذه التسريبات يمكن، على سبيل المثال، أن تكشف معلومات عن إطار الحاوية للتطبيقات المحتواة.

•   يسهل مهام مثل ترحيل الحاويات. التظهير المقدم من مساحات اسم cgroup يسمح بعزل الحاويات عن معرفة أسماء مسارات cgroups السلف. بدون هذا العزل، يجب تكرار أسماء مسارات cgroup الكاملة (المعروضة في /proc/self/cgroups) على النظام الهدف عند ترحيل حاوية؛ يجب أيضًا أن تكون أسماء المسارات هذه فريدة، حتى لا تتعارض مع أسماء مسارات أخرى على النظام الهدف.

•   يسمح بحصر أفضل للعمليات المحتواة، لأنه من الممكن mount أنظمة ملفات cgroup للحاوية بحيث لا تستطيع عمليات الحاوية الوصول إلى أدلة cgroup السلف. خذ، على سبيل المثال، السيناريو التالي:

    •   لدينا دليل cgroup، /cg/1، مملوك لمعرف المستخدم 9000.

    •   لدينا عملية X، مملوكة أيضًا بواسطة معرف المستخدم 9000، موضوعة في فضاء أسماء تحت مجموعة التحكم /cg/1/2 (أي، وُضعت X في فضاء أسماء مجموعة تحكم جديد عبر clone(2) أو unshare(2) مع العلم CLONE_NEWCGROUP).

    في غياب فضاء أسماء مجموعة التحكم، لأن دليل مجموعة التحكم /cg/1 مملوك (وقابل للكتابة) بواسطة UID 9000 والعملية X مملوكة أيضًا بواسطة معرف المستخدم 9000، ستكون العملية X قادرة على تعديل محتويات ملفات مجموعات التحكم (أي تغيير إعدادات مجموعة التحكم) ليس فقط في /cg/1/2 ولكن أيضًا في دليل مجموعة التحكم السلف /cg/1. وضع العملية X في فضاء أسماء تحت دليل مجموعة التحكم /cg/1/2، مع عمليات وصل مناسبة لنظام ملفات مجموعة التحكم (كما هو موضح أعلاه)، يمنعها من تعديل الملفات في /cg/1، لأنها لا تستطيع حتى رؤية محتويات ذلك الدليل (أو أدلة مجموعة التحكم السلف الأبعد). مع الإنفاذ الصحيح للحدود الهرمية، يمنع هذا العملية X من الهروب من الحدود المفروضة بواسطة مجموعات التحكم السلف.

انظر أيضًا
unshare(1), clone(2), setns(2), unshare(2), proc(5), cgroups(7), credentials(7), namespaces(7), user_namespaces(7)

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

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

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