UNSHARE(1) دستورات کاربر UNSHARE(1)

unshare - اجرای برنامه با فضاهای نام جداشده از والد

unshare [options] [program [arguments]]

دستور unshare فضاهای نام جدیدی (بر اساس گزینه‌های خط فرمان توصیف‌شده در ادامه) ایجاد کرده و سپس program مشخص‌شده را اجرا می‌کند. اگر program داده نشده باشد، "${SHELL}" اجرا می‌شود (پیش‌فرض: /bin/sh).

به طور پیش‌فرض، یک فضای نام جدید تنها تا زمانی که فرآیندهای عضو داشته باشد باقی می‌ماند. می‌توان یک فضای نام جدید را حتی در زمانی که هیچ فرآیند عضوی ندارد، با اتصال سوارکردن (bind mount) فایل‌های /proc/pid/ns/type به یک مسیر در سیستم‌فایل ماندگار کرد. فضای نامی که به این شیوه ماندگار شده است می‌تواند متعاقباً با nsenter(1) حتی پس از پایان یافتن program وارد شود (به جز فضاهای نام PID که در آن‌ها به یک فرآیند init همواره در حال اجرا نیاز است). زمانی که یک فضای نام ماندگار دیگر مورد نیاز نباشد، می‌توان با استفاده از umount(8) برای حذف اتصال سوارکردن آن را از حالت ماندگار خارج کرد. برای جزئیات بیشتر به بخش مثال‌ها (EXAMPLES) مراجعه کنید.

ابزار unshare از نسخه ۲.۳۶ util-linux از فایل‌های /proc/[pid]/ns/pid_for_children و /proc/[pid]/ns/time_for_children برای فضاهای نام ماندگار PID و TIME استفاده می‌کند. این تغییر نیازمند هسته لینوکس ۴.۱۷ یا جدیدتر است.

انواع زیر از فضاهای نام را می‌توان با unshare ایجاد کرد:

فضای نام سوارکردن (mount namespace)

سوار کردن و پیاده کردن سیستم‌های فایل روی سایر بخش‌های سیستم تأثیری نخواهد گذاشت، به جز سیستم‌های فایلی که صراحتاً به عنوان اشتراکی علامت‌گذاری شده‌اند (با mount --make-shared؛ پرچم‌های shared را در /proc/self/mountinfo یا findmnt -o+PROPAGATION ببینید). برای جزئیات بیشتر، mount_namespaces(7) را ببینید.

ابزار unshare از نسخه ۲.۲۷ util-linux انتشار (propagation) را به طور خودکار در فضای نام سوارکردن جدید روی private تنظیم می‌کند تا اطمینان حاصل شود که فضای نام جدید واقعاً جدا شده است. غیرفعال کردن این ویژگی با گزینه --propagation unchanged امکان‌پذیر است. توجه داشته باشید که private پیش‌فرض هسته است.

فضای نام UTS (UTS namespace)

تنظیم نام میزبان (hostname) یا نام دامنه (domainname) روی سایر بخش‌های سیستم تأثیری نخواهد گذاشت. برای جزئیات بیشتر، uts_namespaces(7) را ببینید.

فضای نام IPC (IPC namespace)

فرآیند دارای فضای نام مستقلی برای صف‌های پیام POSIX و همچنین صف‌های پیام System V، مجموعه‌های سمافور و بخش‌های حافظه اشتراکی خواهد بود. برای جزئیات بیشتر، ipc_namespaces(7) را ببینید.

فضای نام شبکه (network namespace)

فرآیند دارای پشته‌های مستقل IPv4 و IPv6، جدول‌های مسیریابی IP، قوانین فایروال، درخت‌های دایرکتوری /proc/net و /sys/class/net، سوکت‌ها و غیره خواهد بود. برای جزئیات بیشتر، network_namespaces(7) را ببینید.

فضای نام PID (PID namespace)

فرآیندهای فرزند مجموعه‌ای مجزا از نگاشت‌های شناسه فرآیند به فرآیند (PID-to-process) نسبت به والد خود خواهند داشت. برای جزئیات بیشتر، pid_namespaces(7) را ببینید.

فضای نام cgroup (cgroup namespace)

فرآیند نمایی مجازی‌سازی‌شده از /proc/self/cgroup خواهد داشت و سوارکردن‌های cgroup جدید از ریشه cgroup فضای نام سرچشمه خواهند گرفت. برای جزئیات بیشتر، cgroup_namespaces(7) را ببینید.

فضای نام کاربر (user namespace)

فرآیند مجموعه‌ای متمایز از UIDها، GIDها و قابلیت‌ها (capabilities) خواهد داشت. برای جزئیات بیشتر، user_namespaces(7) را ببینید.

فضای نام زمان (time namespace)

فرآیند می‌تواند نمایی متمایز از CLOCK_MONOTONIC و/یا CLOCK_BOOTTIME داشته باشد که با استفاده از /proc/self/timens_offsets قابل تغییر است. برای جزئیات بیشتر، time_namespaces(7) را ببینید.

-i, --ipc[=file]

ایجاد یک فضای نام IPC جدید. اگر file مشخص شده باشد، فضای نام با ایجاد یک اتصال سوارکردن (bind mount) در file ماندگار می‌شود.

-m, --mount[=file]

ایجاد یک فضای نام سوارکردن جدید. اگر file مشخص شده باشد، فضای نام با ایجاد یک اتصال سوارکردن در file ماندگار می‌شود. توجه داشته باشید که file باید روی نقطه‌ای سوار شده باشد که نوع انتشار آن shared نباشد (در غیر این صورت خطا رخ می‌دهد). در صورت عدم اطمینان از تنظیمات فعلی از دستور findmnt -o+PROPAGATION استفاده کنید. همچنین مثال‌های زیر را ببینید.

-n, --net[=file]

ایجاد یک فضای نام شبکه جدید. اگر file مشخص شده باشد، فضای نام با ایجاد یک اتصال سوارکردن در file ماندگار می‌شود.

-p, --pid[=file]

ایجاد یک فضای نام PID جدید. اگر file مشخص شده باشد، فضای نام با ایجاد یک اتصال سوارکردن در file ماندگار می‌شود. (ایجاد یک فضای نام PID ماندگار در صورتی که گزینه --fork نیز مشخص نشده باشد با شکست مواجه خواهد شد.)

همچنین گزینه‌های --fork و --mount-proc را ببینید.

-u, --uts[=file]

ایجاد یک فضای نام UTS جدید. اگر file مشخص شده باشد، فضای نام با ایجاد یک اتصال سوارکردن در file ماندگار می‌شود.

-U, --user[=file]

ایجاد یک فضای نام کاربر جدید. اگر file مشخص شده باشد، فضای نام با ایجاد یک اتصال سوارکردن در file ماندگار می‌شود.

-C, --cgroup[=file]

ایجاد یک فضای نام cgroup جدید. اگر file مشخص شده باشد، فضای نام با ایجاد یک اتصال سوارکردن در file ماندگار می‌شود.

-T, --time[=file]

ایجاد یک فضای نام زمان جدید. اگر file مشخص شده باشد، فضای نام با ایجاد یک اتصال سوارکردن در file ماندگار می‌شود. از گزینه‌های --monotonic و --boottime می‌توان برای مشخص کردن آفست متناظر در فضای نام زمان استفاده کرد.

-f, --fork

منشعب کردن program مشخص‌شده به عنوان یک فرآیند فرزند از unshare به جای اجرای مستقیم آن. این گزینه هنگام ایجاد یک فضای نام PID جدید مفید است. توجه داشته باشید که وقتی unshare منتظر فرآیند فرزند است، سیگنال‌های SIGINT و SIGTERM را نادیده می‌گیرد و هیچ سیگنالی را به فرزند ارسال نمی‌کند. لازم است سیگنال‌ها مستقیماً به فرآیند فرزند ارسال شوند.

--keep-caps

هنگامی که گزینه --user داده شده است، اطمینان حاصل می‌کند که قابلیت‌های اعطا شده در فضای نام کاربر در فرآیند فرزند حفظ شوند.

--kill-child[=signame]

هنگامی که unshare خاتمه می‌یابد، باعث می‌شود signame به فرآیند فرزند منشعب‌شده ارسال شود. ترکیب این گزینه با --pid امکان خاتمه آسان و قابل‌اطمینان کل درخت فرآیند زیر unshare را فراهم می‌کند. در صورت مشخص نشدن، signame به طور پیش‌فرض SIGKILL است. این گزینه مستلزم --fork است.

--mount-proc[=mountpoint]

درست پیش از اجرای برنامه، سیستم‌فایل proc را در mountpoint سوار می‌کند (پیش‌فرض /proc است). این گزینه هنگام ایجاد یک فضای نام PID جدید مفید است. همچنین مستلزم ایجاد یک فضای نام سوارکردن جدید است چرا که در غیر این صورت سوار کردن /proc برنامه‌های موجود در سیستم را مختل می‌کند. سیستم‌فایل proc جدید صراحتاً به صورت خصوصی سوار می‌شود (با MS_PRIVATE|MS_REC).

--mount-binfmt[=mountpoint]

درست پیش از اجرای برنامه، سیستم‌فایل binfmt_misc را در mountpoint سوار می‌کند (پیش‌فرض /proc/sys/fs/binfmt_misc است). همچنین مستلزم ایجاد یک فضای نام سوارکردن جدید است چرا که در غیر این صورت سوار کردن binfmt_misc برنامه‌های موجود در سیستم را مختل می‌کند. سیستم‌فایل binfmt_misc جدید صراحتاً به صورت خصوصی سوار می‌شود (با MS_PRIVATE|MS_REC).

--map-user uid|name

اجرای برنامه تنها پس از اینکه شناسه کاربر مؤثر فعلی به uid نگاشت شد. اگر این گزینه چندین بار مشخص شود، آخرین مورد اولویت خواهد داشت. این گزینه مستلزم --user است.

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

اجرای برنامه تنها پس از اینکه بلوکی از شناسه‌های کاربر با اندازه count که از outeruid شروع می‌شود به بلوکی از شناسه‌های کاربر که از inneruid شروع می‌شود نگاشت شد. اگر unshare بدون دسترسی‌های ریشه اجرا شده باشد، این نگاشت با newuidmap(1) ایجاد می‌شود. اگر محدوده شناسه‌های کاربر با نگاشت مشخص‌شده توسط --map-user همپوشانی داشته باشد، یک "حفره" از نگاشت حذف خواهد شد. این ممکن است منجر به نگاشت نشدن بالاترین شناسه کاربر در نگاشت شود. برای نگاشت بیش از یک بلوک از شناسه‌های کاربر، چندین بار از --map-users استفاده کنید. مقدار ویژه auto اولین بلوک از شناسه‌های کاربر متعلق به کاربر مؤثر از /etc/subuid را به بلوکی که از شناسه کاربر 0 شروع می‌شود نگاشت می‌کند. مقدار ویژه subids همان بلوک را به صورت همانی نگاشت می‌کند. مقدار ویژه all یک نگاشت عبوری (pass-through) برای هر شناسه کاربر موجود در فضای نام والد ایجاد می‌کند. این گزینه مستلزم --user است.

قبل از نسخه ۲.۳۹ util-linux، این گزینه یک آرگومان جداشده با ویرگول به صورت outeruid,inneruid,count دریافت می‌کرد اما آن قالب اکنون جهت هماهنگی با ترتیبی که در /proc/[pid]/uid_map و گزینه سوارکردن X-mount.idmap استفاده می‌شود، منسوخ شده است.

--map-group gid|name

اجرای برنامه تنها پس از اینکه شناسه گروه مؤثر فعلی به gid نگاشت شد. اگر این گزینه چندین بار مشخص شود، آخرین مورد اولویت خواهد داشت. این گزینه مستلزم --setgroups=deny و --user است.

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

اجرای برنامه تنها پس از اینکه بلوکی از شناسه‌های گروه با اندازه count که از outergid شروع می‌شود به بلوکی از شناسه‌های گروه که از innergid شروع می‌شود نگاشت شد. اگر unshare بدون دسترسی‌های ریشه اجرا شده باشد، این نگاشت با newgidmap(1) ایجاد می‌شود. اگر محدوده شناسه‌های گروه با نگاشت مشخص‌شده توسط --map-group همپوشانی داشته باشد، یک "حفره" از نگاشت حذف خواهد شد. این ممکن است منجر به نگاشت نشدن بالاترین شناسه گروه در نگاشت شود. برای نگاشت بیش از یک بلوک از شناسه‌های گروه، چندین بار از --map-groups استفاده کنید. مقدار ویژه auto اولین بلوک از شناسه‌های گروه متعلق به گروه مؤثر از /etc/subgid را به بلوکی که از شناسه گروه 0 شروع می‌شود نگاشت می‌کند. مقدار ویژه subids همان بلوک را به صورت همانی نگاشت می‌کند. مقدار ویژه all یک نگاشت عبوری برای هر شناسه گروه موجود در فضای نام والد ایجاد می‌کند. این گزینه مستلزم --user است.

قبل از نسخه ۲.۳۹ util-linux، این گزینه یک آرگومان جداشده با ویرگول به صورت 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) در فضای نام کاربر تازه‌ایجادشده نگاشت شدند. این امر به دست آوردن قابلیت‌های مورد نیاز برای مدیریت جنبه‌های مختلف فضاهای نام تازه‌ایجادشده (مانند پیکربندی رابط‌ها در فضای نام شبکه یا سوار کردن سیستم‌های فایل در فضای نام سوارکردن) را حتی در صورت اجرا بدون دسترسی ریشه به راحتی ممکن می‌سازد. به عنوان یک ویژگی صرفاً جهت راحتی، این گزینه از موارد کاربرد پیچیده‌تر، مانند نگاشت چندین محدوده از UIDها و GIDها، پشتیبانی نمی‌کند. این گزینه مستلزم --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) است.

--propagation private|shared|slave|unchanged

تنظیم بازگشتی پرچم انتشار سوارکردن در فضای نام سوارکردن جدید. مقدار پیش‌فرض تنظیم انتشار روی private است. غیرفعال کردن این ویژگی با آرگومان unchanged امکان‌پذیر است. در صورتی که فضای نام سوارکردن (--mount) درخواست نشده باشد، این گزینه نادیده گرفته می‌شود.

--setgroups allow|deny

مجاز یا غیرمجاز کردن فراخوانی سیستمی setgroups(2) در یک فضای نام کاربر.

برای فراخوانی setgroups(2)، فرآیند فراخواننده باید حداقل قابلیت CAP_SETGID را داشته باشد. اما از لینوکس ۳.۱۹ محدودیت دیگری نیز اعمال می‌شود: هسته تنها پس از تنظیم نگاشت GID (/proc/pid*/gid_map*) اجازه فراخوانی setgroups(2) را می‌دهد. زمانی که setgroups(2) فعال است (یعنی allow، مقدار پیش‌فرض)، نگاشت GID توسط root قابل نوشتن است و زمانی که setgroups(2) به طور دائم غیرفعال می‌شود (با deny)، نگاشت GID توسط فرآیندهای بدون امتیاز قابل نوشتن می‌شود.

-R, --root dir

اجرای دستور با تنظیم دایرکتوری ریشه بر روی dir.

-w, --wd dir

تغییر دایرکتوری کاری به dir.

-S, --setuid uid

تنظیم شناسه کاربری که در فضای نام واردشده استفاده خواهد شد.

-G, --setgid gid

تنظیم شناسه گروهی که در فضای نام واردشده استفاده خواهد شد و حذف گروه‌های تکمیلی.

-l, --load-interp string

بارگذاری تعریف binfmt_misc در فضای نام (مستلزم --mount-binfmt). آرگومان string به صورت :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 offset

تنظیم آفست CLOCK_MONOTONIC که در فضای نام زمان واردشده استفاده خواهد شد. این گزینه نیازمند جداسازی یک فضای نام زمان با --time است.

--boottime offset

تنظیم آفست CLOCK_BOOTTIME که در فضای نام زمان واردشده استفاده خواهد شد. این گزینه نیازمند جداسازی یک فضای نام زمان با --time است.

-h, --help

نمایش متن راهنما و خروج.

-V, --version

نمایش نسخه و خروج.

سوارکردن سیستم‌های فایل proc و sysfs به عنوان root در یک فضای نام کاربر باید محدود شود تا یک کاربر با دسترسی کمتر نتواند به فایل‌های حساسی که یک کاربر با دسترسی بالاتر غیرقابل دسترس کرده است، دسترسی بیشتری پیدا کند. به طور خلاصه قاعده برای proc و sysfs این است که تا حد امکان مشابه یک اتصال سوارکردن (bind mount) باشد.

دستور زیر یک فضای نام PID با استفاده از --fork ایجاد می‌کند تا اطمینان حاصل شود دستور اجراشده در فرآیند فرزندی اجرا می‌شود که (به عنوان اولین فرآیند در فضای نام) دارای PID 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

به عنوان یک کاربر بدون دسترسی ویژه، یک فضای نام کاربر ایجاد کنید که در آن ۶۵۵۳۶ شناسه اول همگی نگاشت شده‌اند و اعتبارنامه‌های کاربر به شناسه‌های 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 هیچ فرآیند عضوی نداشت، همچنان به وجود خود ادامه می‌دهد. سپس فضای نام با حذف اتصال سوارکردن نابود می‌شود.

# 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                # Don't print job status messages
# 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' $!     # Show that background job is unshare(1)
unshare
# kill $!               # Kill unshare(1)
# pidof sleep

دستور pidof(1) هیچ خروجی چاپ نمی‌کند، زیرا فرآیندهای sleep کشته شده‌اند. به طور دقیق‌تر، هنگامی که فرآیند sleep دارای PID 1 در فضای نام (یعنی فرآیند init فضای نام) کشته شد، این امر باعث کشته شدن تمام فرآیندهای دیگر در آن فضای نام گردید. در مقابل، سری مشابهی از دستورها که در آن‌ها از گزینه --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

مثال زیر ایجاد یک فضای نام زمان را نشان می‌دهد که در آن ساعت boottime روی نقطه‌ای چند سال در گذشته تنظیم شده است:

# uptime -p             # Show uptime in initial time namespace
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

مفسر را برای یک نوع مشخص از عدد جادویی تعریف می‌کند

\\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), 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-06-16 util-linux 2.41.5