UNSHARE(1) أوامر المستخدم UNSHARE(1)

الاسم

unshare - تشغيل برنامج في مساحات أسماء جديدة

موجز

unshare [خيارات] [برنامج [وسائط]]

الوصف

يُنشئ الأمر unshare مساحات أسماء جديدة (كما هو محدد في خيارات سطر الأوامر الموضحة أدناه) ثم يُنفّذ البرنامج المحدد. إذا لم يُعطَ البرنامج، تُشغّل "${SHELL}" (المبدئي: /bin/sh).

مبدئياً، تستمر مساحة الأسماء الجديدة فقط طالما أنها تحتوي على عمليات عضوة. يمكن جعل مساحة الأسماء الجديدة مستمرة حتى لو لم تكن تحتوي على عمليات عضوة عن طريق وصل ملفات /proc/معرّف-العملية/ns/نوع وصلاً رابطاً بمسار نظام ملفات. مساحة الأسماء التي جُعلت مستمرة بهذه الطريقة يمكن ولوجها لاحقاً باستخدام nsenter(1) حتى بعد إنهاء البرنامج (باستثناء مساحات أسماء PID حيث يتطلب الأمر عملية init قيد التشغيل الدائم). بمجرد عدم الحاجة لمساحة أسماء مستمرة، يمكن إلغاء استمرارها باستخدام umount(8) لإزالة الوصل الرابط. راجع قسم أمثلة لمزيد من التفاصيل.

يستخدم unshare منذ util-linux الإصدار 2.36 ملفات /proc/[pid]/ns/pid_for_children و /proc/[pid]/ns/time_for_children لمساحات أسماء PID و TIME المستمرة. يتطلب هذا التغيير نواة لينكس 4.17 أو أحدث.

يمكن إنشاء الأنواع التالية من مساحات الأسماء باستخدام unshare:

نطاق تسمية الوصل

لن يؤثر وصل وفصل أنظمة الملفات على بقية النظام، باستثناء أنظمة الملفات الموسومة صراحةً بأنها مشاركة (باستخدام mount --make-shared؛ انظر /proc/self/mountinfo أو findmnt -o+PROPAGATION من أجل وسوم shared). لمزيد من التفاصيل، راجع mount_namespaces(7).

يضبط unshare آلياً منذ util-linux الإصدار 2.27 الانتشار إلى private في مساحة أسماء وصل جديدة للتأكد من أن مساحة الأسماء الجديدة غير مشاركة حقاً. يمكن تعطيل هذه الميزة باستخدام الخيار --propagation unchanged. لاحظ أن private هو المبدئي للنواة.

نطاق تسمية UTS

ضبط اسم المضيف أو اسم النطاق لن يؤثر على بقية النظام. لمزيد من التفاصيل، راجع uts_namespaces(7).

IPC namespace

سيكون للعملية نطاق تسمية مستقل لصفوف رسائل POSIX بالإضافة إلى صفوف رسائل System V، ومجموعات السيمافور وقطع الذاكرة المشتركة. لمزيد من التفاصيل، راجع ipc_namespaces(7).

network namespace

سيكون للعملية كدسات IPv4 و IPv6 مستقلة، وجداول توجيه IP، وقواعد جدار الحماية، وأشجار أدلة /proc/net و /sys/class/net، والمقابس، وما إلى ذلك. لمزيد من التفاصيل، راجع network_namespaces(7).

PID namespace

سيكون للأبناء مجموعة متميزة من تخطيطات معرفات العمليات (PID-to-process) عن أبيهم. لمزيد من التفاصيل، راجع pid_namespaces(7).

نطاق تسمية cgroup

سيكون للعملية عرض وهمي لـ /proc/self/cgroup، وستجذر عمليات وصل cgroup الجديدة عند جذر cgroup لنطاق التسمية. لمزيد من التفاصيل، راجع cgroup_namespaces(7).

نطاق تسمية المستخدم

سيكون للعملية مجموعة متميزة من معرفات المستخدمين (UIDs)، ومعرفات المجموعات (GIDs) والقدرات. لمزيد من التفاصيل، راجع user_namespaces(7).

نطاق تسمية الوقت

يمكن للعملية أن تمتلك عرضاً متميزاً لـ CLOCK_MONOTONIC و/أو CLOCK_BOOTTIME والذي يمكن تغييره باستخدام /proc/self/timens_offsets. لمزيد من التفاصيل، راجع time_namespaces(7).

الخيارات

-i، --ipc[=ملف]

إنشاء مساحة أسماء IPC جديدة. إذا حُدد ملف، فستُجعل مساحة الأسماء مستمرة عن طريق إنشاء وصل رابط عند ملف.

-m، --mount[=ملف]

إنشاء مساحة أسماء وصل جديدة. إذا حُدد ملف، فستُجعل مساحة الأسماء مستمرة عن طريق إنشاء وصل رابط عند ملف. لاحظ أن ملف يجب أن يقع على وصلة ليس نوع انتشارها shared (وإلا سيحدث خطأ). استخدم الأمر findmnt -o+PROPAGATION عندما لا تكون متأكداً من الإعداد الحالي. انظر أيضاً الأمثلة أدناه.

-n، --net[=ملف]

أنشئ مساحة أسماء شبكة جديدة. إذا حُدد ملف، فستُجعل مساحة الأسماء مستمرة عن طريق إنشاء وصل ربط عند ملف.

-p، --pid[=ملف]

أنشئ مساحة أسماء PID جديدة. إذا حُدد ملف، فستُجعل مساحة الأسماء مستمرة عن طريق إنشاء وصل ربط عند ملف. (سيفشل إنشاء مساحة أسماء PID مستمرة إذا لم يُحدد الخيار --fork أيضاً).

انظر أيضاً الخيارين --fork و --mount-proc.

-u، --uts[=ملف]

إنشاء مساحة أسماء UTS جديدة. إذا حُدد ملف، فستُجعل مساحة الأسماء مستمرة عن طريق إنشاء وصل رابط عند ملف.

-U، --user[=ملف]

أُنشئت مساحة أسماء مستخدم جديدة. إذا حُدد الـ ملف، فستُجعل مساحة الأسماء مستمرة عبر إنشاء وصل ربط (bind mount) عند الـ ملف.

-C، --cgroup[=ملف]

أُنشئت مساحة أسماء cgroup جديدة. إذا حُدد الـ ملف، فستُجعل مساحة الأسماء مستمرة عبر إنشاء وصل ربط عند الـ ملف.

-T، --time[=ملف]

أُنشئت مساحة أسماء وقت جديدة. إذا حُدد الـ ملف، فستُجعل مساحة الأسماء مستمرة عبر إنشاء وصل ربط عند الـ ملف. يمكن استخدام الخيارين --monotonic و --boottime لتحديد الإزاحة المقابلة في مساحة أسماء الوقت.

-f، --fork

فُرّع الـ برنامج المحدد كعملية ابنة لـ unshare بدلاً من تشغيله مباشرة. يفيد هذا عند إنشاء مساحة أسماء PID جديدة. لاحظ أنه عندما ينتظر unshare العملية الابنة، فإنه يتجاهل الإشارات SIGINT و SIGTERM ولا يمرر أي إشارات إلى الابن. من الضروري إرسال الإشارات إلى العملية الابنة مباشرة.

--forward-signals

توجيه إشارات SIGTERM و SIGINT التي تتلقاها عملية unshare الأب إلى العملية الابن. عند عدم تحديد هذا الخيار، يتجاهل unshare هذه الإشارات أثناء انتظار خروج العملية الابن (السلوك المبدئي منذ util-linux 2.36). يسمح هذا للأب بالبقاء حياً بينما تعالج العملية الابن الإشارات.

هذا الخيار مفيد عندما تتلقى عملية unshare الأب إشارات SIGTERM أو SIGINT (على سبيل المثال، أثناء إعادة تشغيل النظام أو من مدير العمليات)، وتريد إخطار العملية الابن بطلبات الإغلاق الهادئ لتتمكن من إجراء عمليات التنظيف. إذا كانت العملية الابن تملك معالجات إشارات (مثل معالجات trap في الصدفة)، فإن تفعيل هذا الخيار يسمح بتنفيذها.

يتضمن هذا الخيار --fork.

--keep-caps

عند إعطاء خيار --user، يتم التأكد من أن الإمكانات الممنوحة في مساحة أسماء المستخدم محفوظة في العملية الابنة.

--kill-child[=signame]

عند إنهاء unshare، أُرسلت الإشارة signame إلى العملية الابن المشتقة. بدمج هذا مع --pid، يُسمح بقتل شجرة العمليات بالكامل أسفل unshare بسهولة وموثوقية. في حال عدم تحديدها، تُستخدم الإشارة الافتراضية SIGKILL. يتضمن هذا الخيار استخدام --fork.

--mount-proc[=نقطة-الوصل]

قُبيل تشغيل البرنامج، وُصل نظام ملفات proc عند نقطة الوصل نقطة-الوصل (الافتراض هو /proc). يفيد هذا عند إنشاء مساحة أسماء PID جديدة. كما يتضمن إنشاء مساحة أسماء وصل جديدة لأن وصل /proc قد يتسبب بخلاف ذلك في تداخل مع البرامج الموجودة في النظام. وُصل نظام ملفات proc الجديد صراحة بصفته خاصاً (باستخدام MS_PRIVATE|MS_REC).

--mount-binfmt[=نقطة-الوصل]

قبل تشغيل البرنامج مباشرة، وُصل نظام ملفات binfmt_misc عند نقطة_الوصل (المبدئي هو /proc/sys/fs/binfmt_misc). كما يتضمن إنشاء مساحة أسماء وصل جديدة لأن وصل binfmt_misc قد يربك البرامج الموجودة على النظام بخلاف ذلك. وُصل نظام ملفات binfmt_misc الجديد صراحة كخاص (باستخدام MS_PRIVATE|MS_REC).

--map-user uid|خيار

شُغّل البرنامج فقط بعد مطابقة معرّف المستخدم الفعلي الحالي مع الـ uid. إذا حُدد هذا الخيار عدة مرات، فستكون الأولوية للظهور الأخير. يتضمن هذا الخيار --user.

--map-users inneruid:outeruid:count|auto|subids|all

شُغّل البرنامج فقط بعد مطابقة كتلة معرّفات المستخدمين ذات الحجم count التي تبدأ عند outeruid بكتلة معرّفات المستخدمين التي تبدأ عند inneruid. تُنشأ هذه المطابقة عبر newuidmap(1) إذا شُغّل unshare دون امتيازات. إذا تداخل نطاق معرّفات المستخدمين مع المطابقة المحددة بواسطة --map-user، فستُزال "فجوة" من المطابقة. قد يؤدي هذا إلى عدم مطابقة أعلى معرّف مستخدم في المطابقة. استخدم --map-users عدة مرات لمطابقة أكثر من كتلة من معرّفات المستخدمين. تطابق القيمة الخاصة auto أول كتلة من معرّفات المستخدمين المملوكة للمستخدم الفعلي من /etc/subuid بكتلة تبدأ عند معرّف المستخدم 0. تطابق القيمة الخاصة subids نفس الكتلة تطابقاً ذاتياً. تنشئ القيمة الخاصة all خريطة تمرير لكل معرّف مستخدم متاح في مساحة الأسماء الأب. يتضمن هذا الخيار --user.

قبل إصدار util-linux رقم 2.39، كان هذا الخيار يتوقع معطى مفصولاً بفاصلة على الصيغة outeruid,inneruid,count ولكن هذه الصيغة مهجورة الآن من أجل الاتساق مع الترتيب المستخدم في /proc/[pid]/uid_map وخيار الوصل X-mount.idmap.

--map-group gid|خيار

شُغّل البرنامج فقط بعد مطابقة معرّف المجموعة الفعلي الحالي مع الـ gid. إذا حُدد هذا الخيار عدة مرات، فستكون الأولوية للظهور الأخير. يتضمن هذا الخيار --setgroups=deny و --user.

--map-groups innergid:outergid:count|auto|subids|all

شُغّل البرنامج فقط بعد مطابقة كتلة معرّفات المجموعات ذات الحجم count التي تبدأ عند outergid بكتلة معرّفات المجموعات التي تبدأ عند innergid. تُنشأ هذه المطابقة عبر newgidmap(1) إذا شُغّل unshare دون امتيازات. إذا تداخل نطاق معرّفات المجموعات مع المطابقة المحددة بواسطة --map-group، فستُزال "فجوة" من المطابقة. قد يؤدي هذا إلى عدم مطابقة أعلى معرّف مجموعة في المطابقة. استخدم --map-groups عدة مرات لمطابقة أكثر من كتلة من معرّفات المجموعات. تطابق القيمة الخاصة auto أول كتلة من معرّفات المستخدمين المملوكة للمستخدم الفعلي من /etc/subgid بكتلة تبدأ عند معرّف المجموعة 0. تطابق القيمة الخاصة subids نفس الكتلة تطابقاً ذاتياً. تنشئ القيمة الخاصة all خريطة تمرير لكل معرّف مجموعة متاح في مساحة الأسماء الأب. يتضمن هذا الخيار --user.

قبل إصدار util-linux رقم 2.39، كان هذا الخيار يتوقع معطى مفصولاً بفاصلة على الصيغة outergid,innergid,count ولكن هذه الصيغة مهجورة الآن من أجل الاتساق مع الترتيب المستخدم في /proc/[pid]/gid_map وخيار الوصل X-mount.idmap.

--map-auto

طوبقت أول كتلة من معرّفات المستخدمين المملوكة للمستخدم الفعلي من /etc/subuid بكتلة تبدأ عند معرّف المستخدم 0. وبنفس الطريقة، طوبقت أيضاً أول كتلة من معرّفات المجموعات المملوكة للمجموعة الفعلية من /etc/subgid بكتلة تبدأ عند معرّف المجموعة 0. يهدف هذا الخيار إلى التعامل مع الحالة الشائعة حيث يمكن لأول كتلة من معرّفات المستخدمين والمجموعات التابعة مطابقة كامل مساحة معرّفات المستخدمين والمجموعات. هذا الخيار يعادل تحديد --map-users=auto و --map-groups=auto.

--map-subids

طوبقت أول كتلة من معرّفات المستخدمين المملوكة للمستخدم الفعلي من /etc/subuid تطابقاً ذاتياً. وبنفس الطريقة، طوبقت أيضاً تطابقاً ذاتياً أول كتلة من معرّفات المجموعات المملوكة للمجموعة الفعلية من /etc/subgid. هذا الخيار يعادل تحديد --map-users=subids و --map-groups=subids.

-r، --map-root-user

شُغّل البرنامج فقط بعد مطابقة معرّفات المستخدم والمجموعة الفعلية الحالية بمعرّف المستخدم (UID) ومعرّف المجموعة (GID) للمستخدم الخارق (superuser) في مساحة أسماء المستخدم المنشأة حديثاً. يتيح هذا الحصول بسهولة على القدرات اللازمة لإدارة جوانب مختلفة من مساحات الأسماء المنشأة حديثاً (مثل تكوين الواجهات في مساحة أسماء الشبكة أو وصل أنظمة الملفات في مساحة أسماء الوصل) حتى عند التشغيل دون امتيازات. لكونها مجرد ميزة تسهيلية، فهي لا تدعم حالات الاستخدام الأكثر تعقيداً، مثل مطابقة نطاقات متعددة من UIDs و GIDs. يتضمن هذا الخيار --setgroups=deny و --user. هذا الخيار يعادل --map-user=0 --map-group=0.

-c، --map-current-user

تشغيل البرنامج فقط بعد تخطيط معرفات المستخدم والمجموعة الفعالة الحالية إلى نفس معرف المستخدم (UID) ومعرف المجموعة (GID) في مساحة أسماء المستخدم المنشأة حديثاً. يتضمن هذا الخيار --setgroups=deny و --user. هذا الخيار يكافئ --map-user=$(id -ru) --map-group=$(id -rg).

--owner uid:gid

اضبط المستخدم والوصول المالكين عند إنشاء مساحة أسماء مستخدم. يحدد هذان المستخدم في مساحة أسماء الأب الذي يملك صلاحية CAP_SYS_ADMIN في مساحة أسماء الابن الجديدة ويمكنه استخدام setns(2) إليها. يسمح هذا الخيار لمستخدم ذي امتيازات بإنشاء مساحة أسماء نيابة عن آخر لا يملكها، مستخدماً امتيازاته لمسح المعرفات و/أو وصل مساحة الأسماء في نظام الملفات. يتضمن هذا --user.

--propagation private|shared|slave|unchanged

ضبط وسم انتشار الوصل بشكل متكرر في مساحة أسماء الوصل الجديدة. المبدئي هو ضبط الانتشار إلى private. يمكن تعطيل هذه الميزة باستخدام المعطى unchanged. يُتجاهل الخيار بصمت عندما لا تُطلب مساحة أسماء الوصل (--mount).

--setgroups allow|deny

السماح باستدعاء النظام setgroups(2) أو رفضه في مساحة أسماء مستخدم.

لتكون العملية قادرة على استدعاء setgroups(2)، يجب أن تمتلك العملية المستدعية على الأقل CAP_SETGID. ولكن منذ إصدار لينكس 3.19، يُطبق قيد إضافي: تمنح النواة الإذن باستدعاء setgroups(2) فقط بعد ضبط خريطة معرف المجموعة (GID) (/proc/معرّف-العملية*/gid_map*). تكون خريطة GID قابلة للكتابة من قبل root عند تفعيل setgroups(2) (أي allow، وهو المبدئي)، وتصبح خريطة GID قابلة للكتابة من قبل العمليات غير المميزة عند تعطيل setgroups(2) نهائياً (باستخدام deny).

-R، --root دليل

تشغيل الأمر مع ضبط دليل الجذر إلى دليل.

-w، --wd دليل

تغيير دليل العمل إلى دليل.

-S، --setuid uid

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

-G، --setgid gid

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

-l، --load-interp سلسلة_محارف

تحميل تعريف binfmt_misc في مساحة الأسماء (يتضمن --mount-binfmt). المعطى سلسلة_محارف هو :name:type:offset:magic:mask:interpreter:flags. لمزيد من التفاصيل حول تسجيل أنواع الملفات الثنائية الجديدة، انظر https://www.kernel.org/doc/Documentation/admin-guide/binfmt-misc.rst. لإدارة الوسم F في flags مع معامل --root، يُوصل binfmt_misc مرتين، مرة قبل chroot لتحميل المفسر من نظام ملفات المستدعِي، ومرة بعده لجعله متاحاً من مساحة مستخدم chroot.

--monotonic إزاحة

ضبط إزاحة CLOCK_MONOTONIC التي ستُستخدم في مساحة أسماء الوقت التي وُلج إليها. يتطلب هذا الخيار فصل مساحة أسماء وقت باستخدام --time.

--boottime إزاحة

ضبط إزاحة CLOCK_BOOTTIME التي ستُستخدم في مساحة أسماء الوقت التي وُلج إليها. يتطلب هذا الخيار فصل مساحة أسماء وقت باستخدام --time.

-h، --help

اعرض نص المساعدة ثم اخرج.

-V، --version

اعرض الإصدار واخرج.

ملاحظات

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

أمثلة

ينشئ الأمر التالي مساحة أسماء PID، مع استخدام --fork لضمان تنفيذ الأمر في عملية ابنة (باعتبارها العملية الأولى في مساحة الأسماء) تملك المعرف 1. يضمن الخيار --mount-proc إنشاء مساحة أسماء وصل جديدة متزامنة ووصل نظام ملفات proc(5) جديد يحتوي على معلومات مطابقة لمساحة أسماء PID الجديدة. عندما ينتهي أمر readlink(1)، تُهدم مساحات الأسماء الجديدة آلياً.

# unshare --fork --pid --mount-proc readlink /proc/self
1

كمستخدم غير مميز، أنشئ مساحة أسماء مستخدم جديدة حيث تُخطط بيانات اعتماد المستخدم إلى معرفات root داخل مساحة الأسماء:

$ id -u; id -g
1000
1000
$ unshare --user --map-root-user \
        sh -c 'whoami; cat /proc/self/uid_map /proc/self/gid_map'
root
         0       1000          1
         0       1000          1

كمستخدم غير مميز، أنشئ مساحة أسماء مستخدم حيث تُمثل أول 65536 معرفاً بالكامل، وتُخطط بيانات اعتماد المستخدم إلى معرفات root داخل مساحة الأسماء. يُحدد التخطيط بواسطة المعرفات التابعة المعينة في subuid(5) و subgid(5). أثبت هذا التخطيط بإنشاء ملف بمعرف مستخدم 1 ومعرف مجموعة 1. للاختصار، تُعرض تخطيطات معرف المستخدم فقط:

$ id -u
1000
$ cat /etc/subuid
1000:100000:65536
$ unshare --user --map-auto --map-root-user
# id -u
0
# cat /proc/self/uid_map
         0       1000          1
         1     100000      65535
# touch file; chown 1:1 file
# ls -ln --time-style=+ file
-rw-r--r-- 1 1 1 0  file
# exit
$ ls -ln --time-style=+ file
-rw-r--r-- 1 100000 100000 0  file

يُنشئ أول الأوامر التالية نطاق تسمية UTS مستمرًا جديدًا ويُعدّل اسم المضيف كما يظهر في نطاق التسمية ذاك. ثم يُلج إلى نطاق التسمية باستخدام nsenter(1) لعرض اسم المضيف المعدل؛ توضح هذه الخطوة أن نطاق تسمية UTS يظل موجودًا حتى لو لم يكن لنطاق التسمية أي عمليات أعضاء بعد انتهاء أمر unshare. ثم يُدمر نطاق التسمية عن طريق إزالة وصل الربط (bind mount).

# touch /root/uts-ns
# unshare --uts=/root/uts-ns hostname FOO
# nsenter --uts=/root/uts-ns hostname
FOO
# umount /root/uts-ns

تنشئ الأوامر التالية نطاق تسمية وصل مستمر يُشار إليه بواسطة وصل الربط /root/namespaces/mnt. ولضمان نجاح إنشاء وصل الربط ذاك، جُعل المجلد الأب (/root/namespaces) وصل ربط نوع انتشاره ليس shared.

# mount --bind /root/namespaces /root/namespaces
# mount --make-private /root/namespaces
# touch /root/namespaces/mnt
# unshare --mount=/root/namespaces/mnt

توضح الأوامر التالية استخدام خيار --kill-child عند إنشاء نطاق تسمية PID، لضمان أنه عند إنهاء unshare، تُنهى جميع العمليات داخل نطاق تسمية PID.

# set +m                # لا تطبع رسائل حالة المهام
# unshare --pid --fork --mount-proc --kill-child -- \
       bash --norc -c '(sleep 555 &) && (ps a &) && sleep 999' &
[1] 53456
#     PID TTY      STAT   TIME COMMAND
      1 pts/3    S+     0:00 sleep 999
      3 pts/3    S+     0:00 sleep 555
      5 pts/3    R+     0:00 ps a
# ps h -o 'comm' $!     # أظهر أن مهمة الخلفية هي unshare(1)
unshare
# kill $!               # أنهِ unshare(1)
# pidof sleep

لا يطبع أمر pidof(1) أي مخرجات، لأن عمليات sleep قد أُنهيت. وبشكل أدق، عندما أُنهيت عملية sleep التي تملك PID 1 في نطاق التسمية (أي عملية البدء في نطاق التسمية)، أدى ذلك إلى إنهاء جميع العمليات الأخرى في نطاق التسمية. على النقيض من ذلك، تظهر سلسلة مماثلة من الأوامر حيث لا يُستخدم خيار --kill-child أنه عند انتهاء unshare، لا تُنهى العمليات في نطاق تسمية PID:

# unshare --pid --fork --mount-proc -- \
       bash --norc -c '(sleep 555 &) && (ps a &) && sleep 999' &
[1] 53479
#     PID TTY      STAT   TIME COMMAND
      1 pts/3    S+     0:00 sleep 999
      3 pts/3    S+     0:00 sleep 555
      5 pts/3    R+     0:00 ps a
# kill $!
# pidof sleep
53482 53480

يوضح المثال التالي إنشاء نطاق تسمية زمني حيث ضُبطت ساعة وقت الإقلاع على نقطة تسبق الحاضر بعدة سنوات:

# uptime -p             # أظهر وقت التشغيل في النطاق الزمني الأولي
up 21 hours, 30 minutes
# unshare --time --fork --boottime 300000000 uptime -p
up 9 years, 28 weeks, 1 day, 2 hours, 50 minutes

يُنفذ المثال التالي chroot إلى المجلد /chroot/powerpc/jessie ويُثبت المفسر /bin/qemu-ppc-static لتنفيذ ملفات powerpc الثنائية.

$  unshare --map-root-user --fork --pid --load-interp=":qemu-ppc:M::\\x7fELF\x01\\x02\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x14:\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff:/bin/qemu-ppc-static:OCF" --root=/chroot/powerpc/jessie /bin/bash -l

يمكن قراءة معامل load-interp كالتالي

qemu-ppc

هو اسم الملف الجديد الذي أُنشئ أسفل /proc/sys/fs/binfmt_misc لتسجيل المفسّر

M

يحدد المفسّر لنوع معين من الأرقام السحرية (magic number)

\\x7fELF\x01\\x02\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x1

هو الرقم السحري للتعرف على الملف المراد تفسيره (في هذه الحالة، ترويسة ELF الخاصة بـ PPC32)

\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff

القناع المراد تطبيقه على الرقم السحري

/bin/qemu-ppc-static

المفسر المراد استخدامه مع الملف

OCF

الملف مفتوح بواسطة النواة مع رموز الاستيثاق والأمن الخاصة بالملف نفسه، ويُحمّل فور تسجيله.

المؤلفين

Mikhail Gusarov <dottedmag@dottedmag.net>، Karel Zak <kzak@redhat.com>

انظر أيضاً

newuidmap(1)، newgidmap(1)، nsenter(1)، lsns(8)، clone(2)، unshare(2)، namespaces(7)، mount(8)

التبليغ عن الأخطاء

لتقارير العِلل، استخدم مُتتبع المشكلات https://github.com/util-linux/util-linux/issues.

التوفر

الأمر unshare جزء من حزمة util-linux التي يمكن تنزيلها من أرشيف نواة لينكس https://www.kernel.org/pub/linux/utils/util-linux/.

2026-05-18 util-linux 2.42.1