| 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:
نطاق تسمية الوصل
يضبط unshare آلياً منذ util-linux الإصدار 2.27 الانتشار إلى private في مساحة أسماء وصل جديدة للتأكد من أن مساحة الأسماء الجديدة غير مشاركة حقاً. يمكن تعطيل هذه الميزة باستخدام الخيار --propagation unchanged. لاحظ أن private هو المبدئي للنواة.
نطاق تسمية UTS
IPC namespace
network namespace
PID namespace
نطاق تسمية cgroup
نطاق تسمية المستخدم
نطاق تسمية الوقت
الخيارات
-i، --ipc[=ملف]
-m، --mount[=ملف]
-n، --net[=ملف]
-p، --pid[=ملف]
انظر أيضاً الخيارين --fork و --mount-proc.
-u، --uts[=ملف]
-U، --user[=ملف]
-C، --cgroup[=ملف]
-T، --time[=ملف]
-f، --fork
--forward-signals
هذا الخيار مفيد عندما تتلقى عملية unshare الأب إشارات SIGTERM أو SIGINT (على سبيل المثال، أثناء إعادة تشغيل النظام أو من مدير العمليات)، وتريد إخطار العملية الابن بطلبات الإغلاق الهادئ لتتمكن من إجراء عمليات التنظيف. إذا كانت العملية الابن تملك معالجات إشارات (مثل معالجات trap في الصدفة)، فإن تفعيل هذا الخيار يسمح بتنفيذها.
يتضمن هذا الخيار --fork.
--keep-caps
--kill-child[=signame]
--mount-proc[=نقطة-الوصل]
--mount-binfmt[=نقطة-الوصل]
--map-user uid|خيار
--map-users inneruid:outeruid:count|auto|subids|all
قبل إصدار util-linux رقم 2.39، كان هذا الخيار يتوقع معطى مفصولاً بفاصلة على الصيغة outeruid,inneruid,count ولكن هذه الصيغة مهجورة الآن من أجل الاتساق مع الترتيب المستخدم في /proc/[pid]/uid_map وخيار الوصل X-mount.idmap.
--map-group gid|خيار
--map-groups innergid:outergid:count|auto|subids|all
قبل إصدار util-linux رقم 2.39، كان هذا الخيار يتوقع معطى مفصولاً بفاصلة على الصيغة outergid,innergid,count ولكن هذه الصيغة مهجورة الآن من أجل الاتساق مع الترتيب المستخدم في /proc/[pid]/gid_map وخيار الوصل X-mount.idmap.
--map-auto
--map-subids
-r، --map-root-user
-c، --map-current-user
--owner uid:gid
--propagation private|shared|slave|unchanged
--setgroups allow|deny
لتكون العملية قادرة على استدعاء 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 سلسلة_محارف
--monotonic إزاحة
--boottime إزاحة
-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
M
\\x7fELF\x01\\x02\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x1
\\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 |