الوصف¶
يُنشئ
الأمر 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
اعرض
الإصدار
واخرج.
أمثلة¶
ينشئ
الأمر
التالي
مساحة
أسماء 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
الملف
مفتوح
بواسطة
النواة مع
رموز
الاستيثاق
والأمن
الخاصة
بالملف
نفسه،
ويُحمّل
فور
تسجيله.