.\" -*- coding: UTF-8 -*- .\" Copyright 2021, Christian Brauner .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH mount_setattr 2 "11 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم mount_setattr \- يغير خصائص الوصل أو شجرة الوصل .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP /* تعريف ثوابت \fBAT_*\fP */ \fB#include \fP .P \fBint mount_setattr(int \fP\fIdirfd\fP\fB, const char *\fP\fIpath\fP\fB, unsigned int \fP\fIflags\fP\fB,\fP \fB struct mount_attr *\fP\fIattr\fP\fB, size_t \fP\fIsize\fP\fB);\fP .fi .SH الوصف نداء النظام \fBmount_setattr\fP() هو جزء من مجموعة مرافق الوصل المعتمدة على واصفات الملفات في لينكس. .P يغير \fBmount_setattr\fP() خصائص الوصل لوصلة ما أو لشجرة وصل كاملة. إذا كان \fIpath\fP نسبياً، فسيُفسر بالنسبة إلى الدليل الذي يشير إليه واصف الملف \fIdirfd\fP. وإذا كان \fIdirfd\fP هو القيمة الخاصة \fBAT_FDCWD\fP، فسيُفسر \fIpath\fP بالنسبة إلى دليل العمل الحالي للعملية المستدعِية. وإذا كان \fIpath\fP سلسلة فارغة وحُدد \fBAT_EMPTY_PATH\fP في \fIflags\fP، فستُغير خصائص الوصل للوصلة المحددة بواسطة \fIdirfd\fP. (انظر \fBopenat\fP(2) لشرح سبب فائدة المعامل \fIdirfd\fP.) .P يستخدم نداء النظام \fBmount_setattr\fP() بنية قابلة للتوسيع (\fIstruct mount_attr\fP) للسماح بالتوسعات المستقبلية. أي توسعات لـ \fBmount_setattr\fP() ليست من نوع الأعلام ستُنفذ كحقول جديدة تُلحق بهذه البنية، وتؤدي القيمة الصفرية في الحقل الجديد إلى تعامل النواة كما لو أن حقل التوسعة هذا غير موجود. لذلك، \fIيجب\fP على المستدعِي ملء هذه البنية بالأصفار عند التهيئة. انظر القسم الفرعي "القابلية للتوسع" تحت \fBNOTES\fP لمزيد من التفاصيل. .P عادة ما يُحدد المعامل \fIsize\fP كـ \fIsizeof(struct mount_attr)\fP. ومع ذلك، إذا كان المستدعِي يستخدم نواة تدعم \fIstruct mount_attr\fP ممتدة، ولكنه لا ينوي استخدام هذه الميزات، فمن الممكن تمرير حجم نسخة سابقة من البنية مع البنية الممتدة. وهذا يسمح للنواة بعدم نسخ الأجزاء اللاحقة من البنية التي لا تُستخدم على أي حال. مع كل توسعة تغير حجم \fIstruct mount_attr\fP، ستكشف النواة عن تعريف على الشكل \fBMOUNT_ATTR_SIZE_VER\fP\fInumber\fP \&. على سبيل المثال، الماكرو الخاص بحجم النسخة الأولية من \fIstruct mount_attr\fP هو \fBMOUNT_ATTR_SIZE_VER0\fP. .P يمكن استخدام المعامل \fIflags\fP لتعديل سلوك تحليل اسم المسار. القيم المدعومة هي: .TP \fBAT_EMPTY_PATH\fP إذا كان \fIpath\fP سلسلة فارغة، فستُغير خصائص الوصل في \fIdirfd\fP نفسه. .TP \fBAT_RECURSIVE\fP يغير خصائص الوصل لشجرة الوصل كاملة. .TP \fBAT_SYMLINK_NOFOLLOW\fP لا يتبع الروابط الرمزية اللاحقة. .TP \fBAT_NO_AUTOMOUNT\fP لا يطلق عمليات الوصل الآلي. .P المعامل \fIattr\fP لـ \fBmount_setattr\fP() هو مؤشر إلى بنية \fImount_attr\fP، الموصوفة في \fBmount_attr\fP(2type). .P تُستخدم العضوان \fIattr_set\fP و \fIattr_clr\fP لتحديد خصائص الوصل التي يُفترض ضبطها أو مسحها لوصلة ما أو لشجرة وصل. الأعلام المضبوطة في \fIattr_set\fP تُفعل خاصية في الوصل أو شجرة الوصل، والأعلام المضبوطة في \fIattr_clr\fP تزيل خاصية من الوصل أو شجرة الوصل. .P عند تغيير خصائص الوصل، ستقوم النواة أولاً بمسح الأعلام المحددة في حقل \fIattr_clr\fP، ثم تضبط الأعلام المحددة في حقل \fIattr_set\fP. على سبيل المثال، هذه الإعدادات: .P .in +4n .EX struct mount_attr attr = { .attr_clr = MOUNT_ATTR_NOEXEC | MOUNT_ATTR_NODEV, .attr_set = MOUNT_ATTR_RDONLY | MOUNT_ATTR_NOSUID, }; .EE .in .P تكافئ الخطوات التالية: .P .in +4n .EX unsigned int current_mnt_flags = mnt\->mnt_flags; \& /* * مسح كل الأعلام المضبوطة في .attr_clr، * مسح MOUNT_ATTR_NOEXEC و MOUNT_ATTR_NODEV. */ current_mnt_flags &= \(tiattr\->attr_clr; \& /* * الآن ضبط كل الأعلام المضبوطة في .attr_set، * تطبيق MOUNT_ATTR_RDONLY و MOUNT_ATTR_NOSUID. */ current_mnt_flags |= attr\->attr_set; \& mnt\->mnt_flags = current_mnt_flags; .EE .in .P نتيجة لهذا التغيير، تصبح الوصلة أو شجرة الوصل (أ) للقراءة فقط؛ (ب) تمنع تنفيذ برامج set\-user\-ID و set\-group\-ID؛ (ج) تسمح بتنفيذ البرامج؛ و (د) تسمح بالوصول إلى الأجهزة. .P تغييرات متعددة بنفس مجموعة الأعلام المطلوبة في \fIattr_clr\fP و \fIattr_set\fP مضمونة بأنها متساوية القوى (idempotent) بعد تطبيق التغييرات. .P سمات الوصل التالية يمكن تحديدها في حقلي \fIattr_set\fP أو \fIattr_clr\fP: .TP \fBMOUNT_ATTR_RDONLY\fP إذا ضُبط في \fIattr_set\fP، فإنه يجعل الوصلة للقراءة فقط. وإذا ضُبط في \fIattr_clr\fP، فإنه يزيل إعداد القراءة فقط إذا كان مضبوطاً على الوصلة. .TP \fBMOUNT_ATTR_NOSUID\fP إذا ضُبط في \fIattr_set\fP، فإنه يجعل الوصلة لا تحترم بتات وضع set\-user\-ID و set\-group\-ID وقدرات الملفات عند تنفيذ البرامج. وإذا ضُبط في \fIattr_clr\fP، فإنه يمسح قيود set\-user\-ID و set\-group\-ID وقدرات الملفات إذا كانت مضبوطة على هذه الوصلة. .TP \fBMOUNT_ATTR_NODEV\fP إذا ضُبط في \fIattr_set\fP، فإنه يمنع الوصول إلى الأجهزة في هذه الوصلة. وإذا ضُبط في \fIattr_clr\fP، فإنه يزيل القيد الذي كان يمنع الوصول إلى الأجهزة في هذه الوصلة. .TP \fBMOUNT_ATTR_NOEXEC\fP إذا ضُبط في \fIattr_set\fP، فإنه يمنع تنفيذ البرامج في هذه الوصلة. وإذا ضُبط في \fIattr_clr\fP، فإنه يزيل القيد الذي كان يمنع تنفيذ البرامج في هذه الوصلة. .TP \fBMOUNT_ATTR_NOSYMFOLLOW\fP إذا ضُبط في \fIattr_set\fP، فإنه يمنع تتبع الروابط الرمزية في هذه الوصلة. وإذا ضُبط في \fIattr_clr\fP، فإنه يزيل القيد الذي كان يمنع تتبع الروابط الرمزية في هذه الوصلة. .TP \fBMOUNT_ATTR_NODIRATIME\fP إذا ضُبط في \fIattr_set\fP، فإنه يمنع تحديث وقت الوصول للأدلة في هذه الوصلة. وإذا ضُبط في \fIattr_clr\fP، فإنه يزيل القيد الذي كان يمنع تحديث وقت الوصول للأدلة. لاحظ أن \fBMOUNT_ATTR_NODIRATIME\fP يمكن دمجه مع إعدادات وقت الوصول الأخرى، وهو متضمن في إعداد noatime. جميع إعدادات وقت الوصول الأخرى حصرية تبادلياً. .TP \fBMOUNT_ATTR__ATIME\fP \- تغيير إعدادات وقت الوصول قيم وقت الوصول المدرجة أدناه هي تعداد يتضمن القيمة صفر، وتُعبر عنها البتات المحددة بواسطة القناع \fBMOUNT_ATTR__ATIME\fP. ورغم أن هذه البتات هي تعداد (على عكس أعلام الوصل الأخرى مثل \fBMOUNT_ATTR_NOEXEC\fP)، إلا أنها تُمرر مع ذلك في \fIattr_set\fP و \fIattr_clr\fP للاتساق مع \fBfsmount\fP(2)، الذي أدخل هذا السلوك. .IP لاحظ أنه نظراً لأن قيم وقت الوصول هي تعداد وليست قيم بتات، فإن المستدعِي الذي يرغب في الانتقال إلى إعداد وقت وصول مختلف لا يمكنه ببساطة تحديد إعداد وقت الوصول في \fIattr_set\fP، بل يجب عليه أيضًا تضمين \fBMOUNT_ATTR__ATIME\fP في حقل \fIattr_clr\fP. ستتحقق النواة من أن \fBMOUNT_ATTR__ATIME\fP ليس مضبوطاً بشكل جزئي في \fIattr_clr\fP (أي أن جميع البتات في حقل بت \fBMOUNT_ATTR__ATIME\fP إما مضبوطة أو ممسوحة)، ومن أن \fIattr_set\fP لا يحتوي على أي بتات لوقت الوصول مضبوطة إذا لم يكن \fBMOUNT_ATTR__ATIME\fP مضبوطاً في \fIattr_clr\fP. .RS .TP \fBMOUNT_ATTR_RELATIME\fP عند الوصول إلى ملف عبر هذه الوصلة، يُحدث آخر وقت وصول للملف (atime) فقط إذا كانت القيمة الحالية لـ atime أقل من أو تساوي آخر وقت تعديل للملف (mtime) أو آخر وقت لتغيير الحالة (ctime). .IP لتفعيل إعداد وقت الوصول هذا على وصلة أو شجرة وصل، يجب ضبط \fBMOUNT_ATTR_RELATIME\fP في \fIattr_set\fP وضبط \fBMOUNT_ATTR__ATIME\fP في حقل \fIattr_clr\fP. .TP \fBMOUNT_ATTR_NOATIME\fP لا يُحدث أوقات الوصول (لجميع أنواع) الملفات في هذه الوصلة. .IP لتفعيل إعداد وقت الوصول هذا على وصلة أو شجرة وصل، يجب ضبط \fBMOUNT_ATTR_NOATIME\fP في \fIattr_set\fP وضبط \fBMOUNT_ATTR__ATIME\fP في حقل \fIattr_clr\fP. .TP \fBMOUNT_ATTR_STRICTATIME\fP يُحدث دائماً وقت الوصول الأخير (atime) عند الوصول إلى الملفات في هذه الوصلة. .IP لتفعيل إعداد وقت الوصول هذا على وصلة أو شجرة وصل، يجب ضبط \fBMOUNT_ATTR_STRICTATIME\fP في \fIattr_set\fP وضبط \fBMOUNT_ATTR__ATIME\fP في حقل \fIattr_clr\fP. .RE .TP \fBMOUNT_ATTR_IDMAP\fP إذا ضُبط في \fIattr_set\fP، فإنه ينشئ وصلة معنونة بالمعرفات (ID\-mapped mount). يؤخذ تعيين المعرف من مساحة اسم المستخدم المحددة في \fIuserns_fd\fP ويُربط بالوصلة. .IP بما أنه لا يُدعم تغيير تعيين معرف الوصلة بعد تعيينه، فإنه من غير الصالح تحديد \fBMOUNT_ATTR_IDMAP\fP في \fIattr_clr\fP. .IP لمزيد من التفاصيل، انظر القسم الفرعي "الوصلات المعنونة بالمعرفات" تحت NOTES. .P يُستخدم حقل \fIpropagation\fP لتحديد نوع انتشار الوصل أو شجرة الوصل. هذا الحقل إما أن يحتوي على القيمة صفر، مما يعني ترك نوع الانتشار دون تغيير، أو يحتوي على إحدى القيم التالية: .TP \fBMS_PRIVATE\fP يحول جميع الوصلات إلى وصلات خاصة. .TP \fBMS_SHARED\fP يحول جميع الوصلات إلى وصلات مشتركة. .TP \fBMS_SLAVE\fP يحول جميع الوصلات إلى وصلات تابعة. .TP \fBMS_UNBINDABLE\fP يحول جميع الوصلات إلى وصلات غير قابلة للربط. .P لمزيد من التفاصيل حول أنواع الانتشار المذكورة أعلاه، انظر \fBmount_namespaces\fP(7). .SH "قيمة الإرجاع" عند النجاح، يرجع \fBmount_setattr\fP() صفراً. وعند حدوث خطأ، يرجع \-1 ويُضبط \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBEBADF\fP المسار \fIpath\fP نسبي ولكن \fIdirfd\fP ليس \fBAT_FDCWD\fP ولا واصف ملف صالح. .TP \fBEBADF\fP \fIuserns_fd\fP ليس واصف ملف صالح. .TP \fBEBUSY\fP حاول المستدعِي تغيير الوصلة إلى \fBMOUNT_ATTR_RDONLY\fP، لكن الوصلة لا تزال تحتوي على ملفات مفتوحة للكتابة. .TP \fBEBUSY\fP حاول المستدعِي إنشاء وصلة معنونة بالمعرفات عبر رفع \fBMOUNT_ATTR_IDMAP\fP وتحديد \fIuserns_fd\fP لكن الوصلة لا تزال تحتوي على ملفات مفتوحة للكتابة. .TP \fBEINVAL\fP اسم المسار المحدد عبر المعاملين \fIdirfd\fP و \fIpath\fP لـ \fBmount_setattr\fP() ليس نقطة وصل. .TP \fBEINVAL\fP ضُبطت قيمة غير مدعومة في \fIflags\fP. .TP \fBEINVAL\fP حُددت قيمة غير مدعومة في حقل \fIattr_set\fP لـ \fImount_attr\fP. .TP \fBEINVAL\fP حُددت قيمة غير مدعومة في حقل \fIattr_clr\fP لـ \fImount_attr\fP. .TP \fBEINVAL\fP حُددت قيمة غير مدعومة في حقل \fIpropagation\fP لـ \fImount_attr\fP. .TP \fBEINVAL\fP ضُبط أكثر من واحد من \fBMS_SHARED\fP أو \fBMS_SLAVE\fP أو \fBMS_PRIVATE\fP أو \fBMS_UNBINDABLE\fP في حقل \fIpropagation\fP لـ \fImount_attr\fP. .TP \fBEINVAL\fP حُدد إعداد وقت الوصول في حقل \fIattr_set\fP دون ضبط \fBMOUNT_ATTR__ATIME\fP في حقل \fIattr_clr\fP. .TP \fBEINVAL\fP حُدد \fBMOUNT_ATTR_IDMAP\fP في \fIattr_clr\fP. .TP \fBEINVAL\fP حُددت قيمة واصف ملف في \fIuserns_fd\fP تتجاوز \fBINT_MAX\fP. .TP \fBEINVAL\fP حُددت قيمة واصف ملف صالحة في \fIuserns_fd\fP، لكن واصف الملف لا يشير إلى مساحة اسم مستخدم. .TP \fBEINVAL\fP نظام الملفات الأساسي لا يدعم الوصلات المعنونة بالمعرفات. .TP \fBEINVAL\fP الوصلة المراد عنونتها بالمعرف ليست وصلة منفصلة؛ أي أن الوصلة لم تكن مرئية مسبقاً في مساحة اسم وصل. .TP \fBEINVAL\fP حُدد إعداد وقت وصول جزئي في \fIattr_clr\fP بدلاً من ضبط \fBMOUNT_ATTR__ATIME\fP. .TP \fBEINVAL\fP تقع الوصلة خارج مساحة اسم الوصل الخاصة بالمستدعِي. .TP \fBEINVAL\fP نُظم نظام الملفات الأساسي في مساحة اسم وصل مملوكة لمساحة اسم مستخدم غير أولية .TP \fBENOENT\fP كان اسم المسار فارغاً أو احتوى على مكون غير موجود. .TP \fBENOMEM\fP عند تغيير انتشار الوصل إلى \fBMS_SHARED\fP، تجب تخصيص معرف مجموعة أقران جديد لكل عمليات الوصل التي لا تملك معرف مجموعة أقران مضبوطًا. فشل هذا التخصيص بسبب عدم توفر ذاكرة كافية لتخصيص الهياكل الداخلية ذات الصلة. .TP \fBENOSPC\fP .\" Christian Brauner: i.e., someone has somehow managed to .\" allocate so many peer groups and managed to keep the kernel running .\" (???) that the ida has ran out of ids .\" Note that technically further error codes are possible that are .\" specific to the ID allocation implementation used. عند تغيير انتشار الوصل إلى \fBMS_SHARED\fP، تجب تخصيص معرف مجموعة أقران جديد لكل عمليات الوصل التي لا تملك معرف مجموعة أقران مضبوطًا. فشل هذا التخصيص لأن النواة استنفدت جميع المعرفات المتاحة. .TP \fBEPERM\fP كانت إحدى عمليات الوصل تملك وسمًا واحدًا على الأقل من \fBMOUNT_ATTR_NOATIME\fP أو \fBMOUNT_ATTR_NODEV\fP أو \fBMOUNT_ATTR_NODIRATIME\fP أو \fBMOUNT_ATTR_NOEXEC\fP أو \fBMOUNT_ATTR_NOSUID\fP أو \fBMOUNT_ATTR_RDONLY\fP مضبوطًا وكان العلم مقفلًا. تُقفل سمات الوصل في حالات الوصل التالية: .RS .IP \[bu] 3 أُنشئ وصل جديد أو شجرة وصل تسببت في انتشار الوصل عبر مساحات أسماء المستخدمين (أي الانتشار إلى مساحة أسماء وصل يملكها مساحة أسماء مستخدم مختلفة). ستقفل النواة الأعلام المذكورة أعلاه لمنع تغيير هذه الخصائص الحساسة. .IP \[bu] أُنشئ زوج جديد من مساحة أسماء الوصل والمستخدم. يحدث هذا على سبيل المثال عند تحديد \fBCLONE_NEWUSER | CLONE_NEWNS\fP في \fBunshare\fP(2) أو \fBclone\fP(2) أو \fBclone3\fP(2). تُقفل الأعلام المذكورة أعلاه في مساحة أسماء الوصل الجديدة لمنع تغيير خصائص الوصل الحساسة. نظرًا لأن مساحة أسماء الوصل المنشأة حديثًا ستكون مملوكة لمساحة أسماء المستخدم المنشأة حديثًا، فإن المستدعِي الذي يملك امتيازات في مساحة أسماء المستخدم الجديدة سيكون قادرًا — في غياب هذا القفل — على تغيير خصائص الوصل الحساسة (مثل إعادة وصل وصلة كانت للقراءة فقط لتصبح للقراءة والكتابة في مساحة أسماء الوصل الجديدة). .RE .TP \fBEPERM\fP حُددت قيمة واصف ملف صالحة في \fIuserns_fd\fP، ولكن واصف الملف يشير إلى مساحة أسماء المستخدم المبدئية. .TP \fBEPERM\fP جرت محاولة لإضافة تخطيط معرف (ID mapping) لوصلة تملك بالفعل تخطيط معرف. .TP \fBEPERM\fP لا يملك المستدعِي صلاحية \fBCAP_SYS_ADMIN\fP في مساحة أسماء المستخدم المبدئية. .SH المعايير لينكس. .SH التاريخ .\" commit 7d6beb71da3cc033649d641e1e608713b8220290 .\" commit 2a1867219c7b27f928e2545782b86daaf9ad50bd .\" commit 9caccd41541a6f7d6279928d9f971f6642c361af لينكس 5.12، glibc 2.36. .SH ملاحظات .SS "عمليات الوصل المخططة بالمعرف (ID\-mapped)" يتيح إنشاء وصلة مخططة بالمعرف إمكانية تغيير ملكية جميع الملفات الموجودة تحت هذا الوصل. وبالتالي، تسمح عمليات الوصل المخططة بالمعرف بتغيير الملكية بشكل مؤقت ومحلي. هو تغيير محلي لأن تغييرات الملكية لا تظهر إلا من خلال وصلة محددة؛ ولا يتأثر جميع المستخدمين والمواقع الأخرى التي يُعرض فيها نظام الملفات. وهو تغيير مؤقت لأن تغييرات الملكية مرتبطة بعمر الوصلة. .P كلما تفاعل المستدعِي مع نظام الملفات من خلال وصلة مخططة بالمعرف، سيُطبق تخطيط معرف الوصلة على معرفات المستخدم والمجموعة المرتبطة بكائنات نظام الملفات. يشمل ذلك معرفات المستخدم والمجموعة المرتبطة بـ inodes وأيضًا مفاتيح \fBxattr\fP(7) التالية: .IP \[bu] 3 \fIsecurity.capability\fP، كلما خُزنت صلاحيات نظام الملفات أو أُرجعت بتنسيق \fBVFS_CAP_REVISION_3\fP، الذي يخزن معرف مستخدم جذر بجانب الصلاحيات (انظر \fBcapabilities\fP(7)). .IP \[bu] \fIsystem.posix_acl_access\fP و \fIsystem.posix_acl_default\fP، كلما خُزنت معرفات المستخدم أو معرفات المجموعة في مدخلات \fBACL_USER\fP أو \fBACL_GROUP\fP. .P يجب استيفاء الشروط التالية لإنشاء وصلة مخططة بالمعرف: .IP \[bu] 3 .\" commit bd303368b776eead1c29e6cdda82bde7128b82a7 .\" Christian Brauner .\" Note, currently no filesystems mountable in non-initial user namespaces .\" support ID-mapped mounts. يجب أن يملك المستدعِي صلاحية \fBCAP_SYS_ADMIN\fP في مساحة أسماء المستخدم التي وُصل فيها نظام الملفات. .IP \[bu] .\" fs_flags = FS_ALLOW_IDMAP in kernel sources يجب أن يدعم نظام الملفات الأساسي عمليات الوصل المخططة بالمعرف. حاليًا، تدعم أنظمة الملفات التالية هذه الميزة: .RS .IP \[bu] 3 .PD 0 \fBxfs\fP(5) (منذ لينكس 5.12) .IP \[bu] \fBext4\fP(5) (منذ لينكس 5.12) .IP \[bu] \fBFAT\fP (منذ لينكس 5.12) .IP \[bu] .\" commit 5b9b26f5d0b88b74001dcfe4ab8a8f2f4e744112 \fBbtrfs\fP(5) (منذ لينكس 5.15) .IP \[bu] .\" commit 82cae269cfa953032fbb8980a7d554d60fb00b17 \fBntfs3\fP (منذ لينكس 5.15) .IP \[bu] .\" commit 984fc4e76d63345499f01c0c198a4b44860cf027 \fBf2fs\fP (منذ لينكس 5.18) .IP \[bu] .\" commit 6c459b78d4793afbba6d864c466cc5cd2932459d \fBerofs\fP (منذ لينكس 5.19) .IP \[bu] \fBoverlayfs\fP (دُعمت الطبقات السفلى والعليا المخططة بالمعرف منذ لينكس 5.19) .IP \[bu] \fBsquashfs\fP (منذ لينكس 6.2) .IP \[bu] \fBtmpfs\fP (منذ لينكس 6.3) .IP \[bu] \fBcephfs\fP (منذ لينكس 6.7) .IP \[bu] \fBhugetlbfs\fP (منذ لينكس 6.9) .PD .RE .IP \[bu] يجب ألا تكون الوصلة مخططة بالمعرف بالفعل. وهذا يعني أيضًا أنه لا يمكن تغيير تخطيط المعرف لوصلة ما. .IP \[bu] .\" commit 1bbcd277a53e08d619ffeec56c5c9287f2bf42f يجب ألا تحتوي الوصلة على أي كُتّاب (writers). .IP \[bu] يجب أن تكون الوصلة وصلة منفصلة؛ أي يجب أن تكون قد أُنشئت باستدعاء \fBopen_tree\fP(2) مع العلم \fBOPEN_TREE_CLONE\fP ويجب ألا تكون مرئية بالفعل في مساحة أسماء وصل. (وبعبارة أخرى: يجب ألا تكون الوصلة قد رُبطت بالتسلسل الهرمي لنظام الملفات باستدعاء نظام مثل \fBmove_mount\fP(2).) .P يمكن إنشاء تخطيطات المعرف لمعرفات المستخدم والمجموعة والمشروع. تخطيط المعرف هو في الأساس تخطيط لنطاق من معرفات المستخدم أو المجموعة إلى نطاق آخر أو نفس النطاق من المعرفات. تُكتب تخطيطات المعرف في ملفات التخطيط كأربعة أرقام مفصولة بمسافات بيضاء. يحدد الرقمان الأولان معرف المستخدم أو المجموعة البادئ في كل من مساحتي أسماء المستخدمين. ويحدد الرقم الثالث نطاق تخطيط المعرف. على سبيل المثال، التخطيط لمعرفات المستخدم مثل "1000 1001 1" يشير إلى أن معرف المستخدم 1000 في مساحة أسماء المستخدم للمستدعِي يُخطط إلى معرف المستخدم 1001 في مساحة أسماء المستخدم السلف. وبما أن نطاق الخريطة هو 1، يُخطط المعرف 1000 فقط. .P من الممكن تحديد ما يصل إلى 340 تخطيط معرف لكل نوع من أنواع التخطيط. إذا لم تُخطط أي معرفات مستخدم أو مجموعة، فإن جميع الملفات المملوكة لهذا المعرف غير المخطط ستظهر كما لو كانت مملوكة لمعرف مستخدم الفائض (overflow) أو معرف مجموعة الفائض على التوالي. .P يمكن العثور على مزيد من التفاصيل حول إعداد تخطيطات المعرف في \fBuser_namespaces\fP(7). .P في الحالة الشائعة، تكون مساحة أسماء المستخدم الممرة في \fIuserns_fd\fP (مع \fBMOUNT_ATTR_IDMAP\fP في \fIattr_set\fP) لإنشاء وصلة مخططة بالمعرف هي مساحة أسماء المستخدم الخاصة بحاوية (container). وفي سيناريوهات أخرى ستكون مساحة أسماء مستخدم مخصصة مرتبطة بجلسة تسجيل دخول المستخدم كما هو الحال في الأدلة المنزلية المحمولة في \fBsystemd\-homed.service\fP(8). ومن الجيد أيضًا إنشاء مساحة أسماء مستخدم مخصصة لغرض تخطيط معرف وصلة ما. .P يمكن أن تكون عمليات الوصل المخططة بالمعرف مفيدة في السيناريوهات التالية وغيرها الكثير: .IP \[bu] 3 مشاركة الملفات أو أنظمة الملفات بين مستخدمين متعددين أو أجهزة متعددة، خاصة في السيناريوهات المعقدة. على سبيل المثال، تُستخدم عمليات الوصل المخططة بالمعرف لتنفيذ الأدلة المنزلية المحمولة في \fBsystemd\-homed.service\fP(8)، حيث تسمح للمستخدمين بنقل دليلهم المنزلي إلى جهاز تخزين خارجي واستخدامه على حواسيب متعددة حيث يتم تعيين معرفات مستخدم ومجموعة مختلفة لهم. يجعل هذا من الممكن فعليًا تعيين معرفات مستخدم ومجموعة عشوائية وقت تسجيل الدخول. .IP \[bu] مشاركة الملفات أو أنظمة الملفات من المضيف مع حاويات غير مميزة. يسمح هذا للمستخدم بتجنب الاضطرار إلى تغيير الملكية بشكل دائم عبر \fBchown\fP(2). .IP \[bu] تخطيط معرف نظام الملفات الجذر للحاوية. لا يحتاج المستخدمون لتغيير الملكية دائمًا عبر \fBchown\fP(2). خاصة بالنسبة لأنظمة الملفات الجذرية الكبيرة، يمكن أن يكون استخدام \fBchown\fP(2) مكلفًا للغاية من حيث الوقت والموارد. .IP \[bu] مشاركة الملفات أو أنظمة الملفات بين الحاويات ذات تخطيطات المعرف غير المتداخلة. .IP \[bu] تنفيذ فحص أذونات الوصول الاختياري (DAC) لأنظمة الملفات التي تفتقر لمفهوم الملكية. .IP \[bu] تغيير الملكية بكفاءة على أساس كل وصلة. على عكس \fBchown\fP(2)، فإن تغيير ملكية مجموعات كبيرة من الملفات يتم بلحظة واحدة مع عمليات الوصل المخططة بالمعرف. يفيد هذا بشكل خاص عند الرغبة في تغيير ملكية نظام ملفات جذر كامل لآلة افتراضية أو حاوية كما ذُكر أعلاه. مع الوصلات المخططة بالمعرف، يكفي استدعاء نظام \fBmount_setattr\fP() واحد لتغيير ملكية جميع الملفات. .IP \[bu] مراعاة الملكية الحالية. تحدد تخطيطات المعرف بدقة ما الذي يجب أن يُخطط إليه معرف المستخدم أو المجموعة. وهذا يتناقض مع استدعاء النظام \fBchown\fP(2) الذي لا يمكنه تلقائيًا مراعاة الملكية الحالية للملفات التي يغيرها؛ بل يكتفي بتغيير الملكية إلى معرف المستخدم والمجموعة المحددين. .IP \[bu] .\" تغييرات الملكية المقيدة محليًا ومؤقتًا. تجعل عمليات الوصل المخططة بالمعرف من الممكن تغيير الملكية محليًا، وقصر تغييرات الملكية على وصلات محددة، ومؤقتًا حيث لا تنطبق تغييرات الملكية إلا طالما أن الوصلة موجودة. في المقابل، يؤدي تغيير الملكية عبر استدعاء النظام \fBchown\fP(2) إلى تغيير الملكية عالميًا وبشكل دائم. .SS "سمات الوصل ومعاملات نظام الملفات" تمتلك بعض سمات الوصل (المرتبطة تقليديًا بخيارات نمط \fBmount\fP(8)) معامل نظام ملفات نظير بسلوك مشابه ظاهريًا للمستخدم. على سبيل المثال، الخيار \fI\-o\ ro\fP في \fBmount\fP(8) قد يشير إلى معامل نظام الملفات "للقراءة فقط"، أو سمة الوصل "للقراءة فقط". كلاهما يؤدي إلى جعل كائنات الوصل للقراءة فقط، لكنهما يملكان سلوكًا مختلفًا. .P الفرق بين هذين النوعين من الخيارات هو أن سمات كائن الوصل تُطبق لكل كائن وصل على حدة (مما يسمح لكائنات وصل مختلفة مشتقة من نسخة نظام ملفات معينة أن تملك سمات مختلفة)، بينما تُطبق معاملات نسخة نظام الملفات ("أعلام الكتلة الفائقة \- superblock flags" بلغة مطوري النواة) على جميع كائنات الوصل المشتقة من نفس نسخة نظام الملفات. .P عند استخدام \fBmount\fP(2)، كانت الحدود بين هذين النوعين من خيارات الوصل ضبابية. ومع ذلك، مع \fBmount_setattr\fP() و \fBfsconfig\fP(2)، أصبح التمييز أكثر وضوحًا. تُضبط سمات الوصل باستخدام \fBmount_setattr\fP()، بينما تُضبط معاملات نظام الملفات باستخدام \fBfsconfig\fP(2). .SS "القابلية للتوسع" للسماح بالتوسع المستقبلي، يتطلب \fBmount_setattr\fP() من تطبيق مساحة المستخدم تحديد حجم هيكل \fImount_attr\fP الذي يمرره. بتوفير هذه المعلومات، يمكن لـ \fBmount_setattr\fP() توفير توافق مع الإصدارات اللاحقة والسابقة، حيث يعمل \fIsize\fP كرقم إصدار ضمني. (نظرًا لأن حقول التوسعة الجديدة ستُلحق دائمًا في النهاية، فإن حجم الهيكل سيزداد دائمًا). هذا التصميم لقابلية التوسع مشابه جدًا لاستدعاءات نظام أخرى مثل \fBperf_setattr\fP(2) و \fBperf_event_open\fP(2) و \fBclone3\fP(2) و \fBopenat2\fP(2). .P ليكن \fIusize\fP هو حجم الهيكل كما حدده تطبيق مساحة المستخدم، و \fIksize\fP هو حجم الهيكل الذي تدعمه النواة، وعندها توجد ثلاث حالات للنظر فيها: .IP \[bu] 3 إذا كان \fIksize\fP يساوي \fIusize\fP، فلا يوجد تعارض في الإصدار ويمكن استخدام \fIattr\fP كما هو. .IP \[bu] إذا كان \fIksize\fP أكبر من \fIusize\fP، فهذا يعني وجود بعض حقول التوسعة التي تدعمها النواة ولكن تطبيق مساحة المستخدم لا يدركها. ولأن القيمة الصفرية في أي حقل توسعة مضاف تعني عدم التنفيذ (no\-op)، تعامل النواة جميع حقول التوسعة التي لم يوفرها تطبيق مساحة المستخدم على أنها ذات قيم صفرية. يوفر هذا توافقا مع الإصدارات السابقة. .IP \[bu] إذا كان \fIksize\fP أصغر من \fIusize\fP، فهذا يعني وجود بعض حقول التوسعة التي يدركها تطبيق مساحة المستخدم ولكن النواة لا تدعمها. ولأن أي حقل توسعة يجب أن تعني قيمته الصفرية عدم التنفيذ، يمكن للنواة تجاهل حقول التوسعة غير المدعومة بأمان إذا كانت جميعها صفرية. وإذا كانت أي من حقول التوسعة غير المدعومة غير صفرية، فسيُرجع \-1 ويُضبط \fIerrno\fP على \fBE2BIG\fP. يوفر هذا توافقًا مع الإصدارات اللاحقة. .P نظرًا لأن تعريف \fIstruct mount_attr\fP قد يتغير في المستقبل (بإضافة حقول جديدة عند تحديث ترويسات النظام)، يجب على تطبيقات مساحة المستخدم ملء هيكل \fIstruct mount_attr\fP بالأصفار لضمان أن إعادة تصريف البرنامج بترويسات جديدة لن تؤدي إلى أخطاء زائفة وقت التشغيل. أبسط طريقة هي استخدام تهيئة محددة: .P .in +4n .EX struct mount_attr attr = { .attr_set = MOUNT_ATTR_RDONLY, .attr_clr = MOUNT_ATTR_NODEV }; .EE .in .P بدلًا من ذلك، يمكن ملء الهيكل بالأصفار باستخدام \fBmemset\fP(3) أو وظائف مماثلة: .P .in +4n .EX struct mount_attr attr; memset(&attr, 0, sizeof(attr)); attr.attr_set = MOUNT_ATTR_RDONLY; attr.attr_clr = MOUNT_ATTR_NODEV; .EE .in .P يمكن لتطبيق في مساحة المستخدم يرغب في تحديد الامتدادات التي تدعمها النواة العاملة القيام بذلك عن طريق إجراء بحث ثنائي على \fIsize\fP مع هيكل يحتوي كل بايت فيه على قيمة غير صفرية (للعثور على أكبر قيمة لا تنتج خطأ \fBE2BIG\fP). .SH أمثلة .\" SRC BEGIN (mount_setattr.c) .EX .\" Christian Brauner .\" When writing programs I like to never use relative paths with AT_FDCWD .\" because. Because making assumptions about the current working directory .\" of the calling process is just too easy to get wrong; especially when .\" pivot_root() or chroot() are in play. .\" My absolut preference (joke intended) is to open a well-known starting .\" point with an absolute path to get a dirfd and then scope all future .\" operations beneath that dirfd. This already works with old-style .\" openat() and _very_ cautious programming but openat2() and its .\" resolve-flag space have made this **chef's kiss**. .\" If I can't operate based on a well-known dirfd I use absolute paths .\" with a -EBADF dirfd passed to *at() functions. /* * This program allows the caller to create a new detached mount * and set various properties on it. */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include \& static const struct option longopts[] = { {"map\-mount", required_argument, NULL, \[aq]a\[aq]}, {"recursive", no_argument, NULL, \[aq]b\[aq]}, {"read\-only", no_argument, NULL, \[aq]c\[aq]}, {"block\-setid", no_argument, NULL, \[aq]d\[aq]}, {"block\-devices", no_argument, NULL, \[aq]e\[aq]}, {"block\-exec", no_argument, NULL, \[aq]f\[aq]}, {"no\-access\-time", no_argument, NULL, \[aq]g\[aq]}, { NULL, 0, NULL, 0 }, }; \& int main(int argc, char *argv[]) { int fd_userns = \-1; int fd_tree; int index = 0; int ret; bool recursive = false; const char *source; const char *target; struct mount_attr *attr = &(struct mount_attr){}; \& while ((ret = getopt_long_only(argc, argv, "", longopts, &index)) != \-1) { switch (ret) { case \[aq]a\[aq]: fd_userns = open(optarg, O_RDONLY | O_CLOEXEC); if (fd_userns == \-1) err(EXIT_FAILURE, "open(%s)", optarg); break; case \[aq]b\[aq]: recursive = true; break; case \[aq]c\[aq]: attr\->attr_set |= MOUNT_ATTR_RDONLY; break; case \[aq]d\[aq]: attr\->attr_set |= MOUNT_ATTR_NOSUID; break; case \[aq]e\[aq]: attr\->attr_set |= MOUNT_ATTR_NODEV; break; case \[aq]f\[aq]: attr\->attr_set |= MOUNT_ATTR_NOEXEC; break; case \[aq]g\[aq]: attr\->attr_set |= MOUNT_ATTR_NOATIME; attr\->attr_clr |= MOUNT_ATTR__ATIME; break; default: errx(EXIT_FAILURE, "Invalid argument specified"); } } \& if ((argc \- optind) < 2) errx(EXIT_FAILURE, "Missing source or target mount point"); \& source = argv[optind]; target = argv[optind + 1]; \& /* In the following, \-1 as the \[aq]dirfd\[aq] argument ensures that open_tree() fails if \[aq]source\[aq] is not an absolute pathname. */ \& fd_tree = open_tree(\-1, source, OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC | AT_EMPTY_PATH | (recursive ? AT_RECURSIVE : 0)); if (fd_tree == \-1) err(EXIT_FAILURE, "open(%s)", source); \& if (fd_userns >= 0) { attr\->attr_set |= MOUNT_ATTR_IDMAP; attr\->userns_fd = fd_userns; } \& ret = mount_setattr(fd_tree, "", AT_EMPTY_PATH | (recursive ? AT_RECURSIVE : 0), attr, sizeof(struct mount_attr)); if (ret == \-1) err(EXIT_FAILURE, "mount_setattr"); \& close(fd_userns); \& /* In the following, \-1 as the \[aq]to_dirfd\[aq] argument ensures that open_tree() fails if \[aq]target\[aq] is not an absolute pathname. */ \& ret = move_mount(fd_tree, "", \-1, target, MOVE_MOUNT_F_EMPTY_PATH); if (ret == \-1) err(EXIT_FAILURE, "move_mount() to %s", target); \& close(fd_tree); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBnewgidmap\fP(1)، \fBnewuidmap\fP(1)، \fBclone\fP(2)، \fBmount\fP(2)، \fBunshare\fP(2)، \fBproc\fP(5)، \fBcapabilities\fP(7)، \fBmount_namespaces\fP(7)، \fBuser_namespaces\fP(7)، \fBxattr\fP(7) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .