SCHROOT(1) Debian sbuild SCHROOT(1)

schroot - ورود امن به یک محیط chroot

schroot [-h|--help | -V|--version | -l|--list | -i|--info | --config | --location | --automatic-session | -b|--begin-session | --recover-session | -r|--run-session | -e|--end-session] [-f|--force] [-n session-name|--session-name=session-name] [-d directory|--directory=directory] [-u user|--user=user] [-p|--preserve-environment] [-s shell|--shell=shell] [-q|--quiet | -v|--verbose] [-c chroot|--chroot=chroot | [--all | --all-chroots | --all-source-chroots | --all-sessions] [--exclude-aliases]] [-o|--option=key=value] [--] [COMMAND [ ARG1 [ ARG2 [ ARGn]]]]

دستور schroot به کاربر اجازه می‌دهد تا یک فرمان یا یک شل ورود (login shell) را در یک محیط chroot اجرا کند. اگر هیچ فرمانی مشخص نشود، یک شل ورود در دایرکتوری کاری فعلی کاربر در داخل chroot آغاز خواهد شد.

فرمان شامل یک برنامه به همراه تعداد دلخواهی از آرگومان‌های اختیاری است. هر آرگومان می‌تواند به طور جداگانه داخل گیومه قرار گیرد.

دایرکتوری‌ای که فرمان یا شل ورود در آن اجرا می‌شود به زمینهٔ اجرا بستگی دارد. برای توضیحات کامل، گزینهٔ --directory را در ادامه ببینید.

تمامی استفاده‌ها از chroot در گزارش‌های وقایع سیستم ثبت خواهد شد. تحت شرایطی خاص، ممکن است از کاربر خواسته شود هویت خود را احراز کند؛ بخش “احراز هویت (Authentication)” را در ادامه ببینید.

اگر هیچ chroot مشخص نشده باشد، نام chroot یا نام‌مستعار ‘default’ به عنوان پیش‌فرضِ جایگزین استفاده خواهد شد. این حالت معادل “--chroot=default” است.

اغلب نیاز است که برنامه‌ها به‌جای اجرا روی سیستم میزبان به طور مستقیم، در یک محیط مجازی‌سازی‌شده اجرا شوند. برخلاف سایر سیستم‌های مجازی‌سازی مانند kvm یا Xen، برنامهٔ schroot کل سیستم را مجازی‌سازی نمی‌کند؛ بلکه تنها فایل‌سیستم را مجازی می‌کند و حتی ممکن است بخش‌هایی از فایل‌سیستم همچنان با میزبان به اشتراک گذاشته شوند. از این رو سریع، سبک و انعطاف‌پذیر است. با این حال، سایر جنبه‌های سیستم مانند حافظهٔ مشترک (shared memory)، شبکه، دستگاه‌ها و غیره را مجازی‌سازی نمی‌کند و بنابراین بسته به کاربرد مورد نظر، ممکن است امنیت کمتری نسبت به سایر سیستم‌ها داشته باشد. برخی از نمونه‌های کاربرد فعلی schroot عبارتند از:

•
اجرای یک برنامهٔ غیرقابل‌اعتماد در یک محیط ایزوله (sandbox)، به گونه‌ای که نتواند با فایل‌های سیستم میزبان تداخل پیدا کند؛ این کار همچنین می‌تواند برای محدود کردن آسیبی که یک سرویس به خطر افتاده می‌تواند به میزبان وارد کند، استفاده شود
•
استفاده از یک محیط تعریف‌شده یا پاک، جهت تضمین تکرارپذیری و یکپارچگی یک وظیفهٔ مشخص
•
استفاده از نسخه‌های مختلف یک سیستم‌عامل، یا حتی سیستم‌های عامل کاملاً متفاوت؛ مثلاً توزیع‌های مختلف GNU/Linux
•
اجرای برنامه‌های ۳۲ بیتی با استفاده از یک chroot ۳۲ بیتی روی یک سیستم میزبان ۶۴ بیتی
•
ساخت خودکار بسته‌های Debian با استفاده از sbuild(1) که هنگام استفاده از اسنپ‌شات‌های LVM یا unionها، هر بسته را در یک اسنپ‌شات chroot دست‌نخورده می‌سازد
•
پشتیبانی از چندین تصویر (image) سیستمی در یک پیکربندی خوشه‌ای (cluster)، جایی که تغییر تصویر پایه زمان‌بر است و/یا پشتیبانی از تمام پیکربندی‌های مورد نیاز کاربران دشوار است: chrootهای مختلف می‌توانند از تمامی پیکربندی‌های مختلفِ مورد نیاز پشتیبانی کنند و به کاربران کلاستر می‌توان دسترسی به chrootهای مورد نیازشان را اعطا کرد (که می‌تواند شامل دسترسی root برای کاربران مورد اعتماد جهت نگهداری تصاویر خودشان باشد)

یک chroot می‌تواند با دسترسی root و مستقیماً با اجرای chroot(8) مورد استفاده قرار گیرد، اما کاربران عادی قادر به استفاده از این فرمان نیستند. schroot با استفاده از همان سازوکار اما با چندین ویژگی اضافی، دسترسی به chrootها را برای کاربران عادی فراهم می‌کند. در حالی که schroot دقیقاً مانند chroot(8) از یک دایرکتوری به عنوان chroot استفاده می‌کند، اما الزامی ندارد که این دایرکتوری حتماً یک دایرکتوری معمولی در فایل‌سیستم باشد. اگرچه این حالت پیش‌فرض است، اما chroot می‌تواند از یک فایل، یک فایل‌سیستم، از جمله اسنپ‌شات‌های LVM و Btrfs و سوارکردن‌های loopback ایجاد شود، یا از یک لایهٔ هم‌پوشان (overlay) unionfs تشکیل گردد. با توجه به قابلیت گسترش توسط کاربر، محدودهٔ ایجاد chroot از منابع مختلف تنها به تخیل شما محدود می‌شود. schroot بررسی دسترسی‌ها را انجام می‌دهد و امکان برپایی خودکار بیشتر محیط chroot، مانند سوار کردن فایل‌سیستم‌های اضافی و سایر وظایف پیکربندی را فراهم می‌سازد. این برپایی خودکار از طریق عملکرد اسکریپت‌های راه‌اندازی (setup scripts) انجام می‌شود که می‌توان آن‌ها را برای انجام هر اقدامِ مورد نیازی سفارشی‌سازی و گسترش داد. اقدامات متداول شامل سوار کردن دایرکتوری خانگی کاربر، تنظیم شبکه و پایگاه‌داده‌های سیستمی و حتی راه‌اندازی سرویس‌ها است. این موارد نیز کاملاً توسط مدیر سیستم قابل سفارشی‌سازی هستند. اسکریپت‌های راه‌اندازی برای تمام انواع chroot اجرا می‌شوند، به استثنای نوع ‘plain’ که ساده‌ترین نوع chroot است و هیچ قابلیت راه‌اندازی خودکاری ارائه نمی‌دهد. پیکربندی schroot با جزئیات بیشتر در schroot.conf(5) شرح داده شده است..SH "گزینه‌ها (OPTIONS)" schroot گزینه‌های زیر را می‌پذیرد:

نمایش خلاصهٔ راهنما.
چاپ اطلاعات نسخه.
فهرست کردن تمام chrootهای موجود.
چاپ اطلاعات دقیق دربارهٔ chrootهای مشخص‌شده.
چاپ پیکربندی chrootهای مشخص‌شده. این گزینه برای بررسی یکسان بودن پیکربندی مورد استفاده با فایل پیکربندی کاربرد دارد. هرگونه یادداشت (کامنت) موجود در فایل اصلی نشان داده نخواهد شد.
چاپ مکان (مسیر) chrootهای مشخص‌شده. توجه داشته باشید نوع‌هایی از chroot که تنها درون یک نشست قابل استفاده هستند، تا زمانی که فعال نشوند مکانی نخواهند داشت.

تنها چاپ پیام‌های ضروری.
چاپ تمام پیام‌ها (پرگو).

مشخص کردن یک chroot یا نشست فعال برای استفاده. این گزینه می‌تواند چندین بار برای تعیین بیش از یک chroot استفاده شود که در این حالت اثری مشابه --all خواهد داشت. نام chroot می‌تواند پیشوندی از یک namespace داشته باشد؛ بخش “Chroot Namespaces” را در ادامه ببینید.
انتخاب تمام chrootها، source chrootها و نشست‌های فعال. هنگامی که دستوری مشخص شده باشد، آن دستور در تمام chrootها، source chrootها و نشست‌های فعال اجرا خواهد شد. در صورت استفاده از --info، اطلاعات تمام chrootها نمایش داده می‌شود. استفاده از این گزینه همراه با یک پوستهٔ ورود (login shell؛ زمانی که دستوری تعیین نشده باشد اجرا می‌شود) منطقی نیست. این گزینه معادل “--all-chroots --all-source-chroots --all-sessions” است.
انتخاب تمام chrootها. همسان با --all، به جز این‌که source chrootها و نشست‌های فعال در نظر گرفته نمی‌شوند.
انتخاب تمام نشست‌های فعال. همسان با --all، به جز این‌که chrootها و source chrootها در نظر گرفته نمی‌شوند.
انتخاب تمام source chrootها. همسان با --all، به جز این‌که chrootها و نشست‌ها در نظر گرفته نمی‌شوند.
عدم انتخاب نام‌های مستعار (aliases) در کنار chrootها. این گزینه تضمین می‌کند که تنها chrootهای واقعی انتخاب شده و هر کدام فقط یک بار فهرست شوند.

تغییر مسیر به directory درون chroot پیش از اجرای دستور یا پوستهٔ ورود. اگر directory در دسترس نباشد، schroot با وضعیت خطا خارج می‌شود.
رفتار پیش‌فرض بدین صورت است (تمام مسیرهای دایرکتوری درون chroot هستند): یک پوستهٔ ورود در دایرکتوری کاری فعلی اجرا می‌شود. اگر این دایرکتوری در دسترس نباشد، به‌ترتیب $HOME (هنگامی که از --preserve-environment استفاده شده باشد)، سپس دایرکتوری خانگی کاربر، و در نهایت / درون chroot امتحان خواهد شد. یک دستور همواره در دایرکتوری کاری فعلی درون chroot اجرا می‌شود. اگر هیچ‌یک از دایرکتوری‌ها در دسترس نباشند، schroot با وضعیت خطا خارج خواهد شد.
اجرا به عنوان کاربری دیگر. حالت پیش‌فرض اجرا با کاربر فعلی است. در صورت نیاز، ممکن است لازم باشد کاربر هویت خود را با یک گذرواژه احراز کند. برای اطلاعات بیشتر، بخش “Authentication” را در ادامه ببینید.
حفظ محیط کاربر درون محیط chroot. حالت پیش‌فرض استفاده از یک محیط تمیز است؛ این گزینه تمام متغیرهای محیطی کاربر را کپی کرده و آن را در نشست اعمال می‌کند. متغیرهای محیطی مجاز تابع محدودیت‌های خاصی هستند؛ بخش “Environment” را در ادامه ببینید.
استفاده از shell به عنوان پوستهٔ ورود. هنگام اجرای یک پوستهٔ ورود، چند پوستهٔ بالقوه به‌ترتیب اولویت بررسی خواهند شد: دستور موجود در متغیر محیطی SHELL (در صورتی که از --preserve-environment استفاده شده یا preserve-environment فعال باشد)، پوستهٔ کاربر در پایگاه‌دادهٔ ‘passwd’، سپس /bin/bash و در نهایت /bin/sh. این گزینه بر این فهرست اولویت داشته و از پوستهٔ تعیین‌شده استفاده خواهد کرد. همچنین در صورت تنظیم بودن کلید پیکربندی shell، این گزینه آن را لغو و بازنویسی می‌کند.
تنظیم یک گزینه. مقدار کلیدهای پیکربندی انتخاب‌شده در schroot.conf را می‌توان با استفاده از این گزینه تغییر داد. این کلید باید در کلید پیکربندی user-modifiable-keys در schroot.conf تعریف شده باشد، یا علاوه بر آن، در صورت اجرا به عنوان (یا جابه‌جایی به) کاربر root در کلید user-modifiable-keys موجود باشد. کلید و مقدار تعیین‌شده در اینجا، در محیط اسکریپت‌های راه‌اندازی (setup scripts) تنظیم می‌شود و در نتیجه می‌توان از آن برای سفارشی‌سازی chroot برای هر نشست استفاده کرد.

آغاز، اجرا و پایان خودکار یک نشست. این عمل، رفتار پیش‌فرض است، بنابراین در استفاده‌های عادی نیازی به تعیین آن نیست.
آغاز یک نشست. یک شناسهٔ یکتای نشست (session ID) در خروجی استاندارد بازگردانده می‌شود. شناسهٔ نشست برای استفاده از سایر گزینه‌های مربوط به نشست مورد نیاز است. توجه داشته باشید که شناسهٔ نشست را می‌توان با استفاده از گزینهٔ --session-name نیز مشخص کرد.
بازیابی یک نشست موجود. اگر یک نشست موجود از دسترس خارج شده باشد، برای نمونه به دلیل راه‌اندازی مجدد سیستم unmount شده باشد، این گزینه نشست را مجدداً برای استفاده در دسترس قرار می‌دهد (مثلاً از طریق mount کردن دوبارهٔ آن). شناسهٔ نشست از طریق گزینهٔ --chroot مشخص می‌شود.
اجرای یک نشست موجود. شناسهٔ نشست با گزینهٔ --chroot مشخص می‌شود.
پایان دادن به یک نشست موجود. شناسهٔ نشست با گزینهٔ --chroot مشخص می‌شود..SS "گزینه‌های نشست (Session options)"
نام‌گذاری یک نشست. session-name مشخص‌شده جایگزین نام پیش‌فرض نشست می‌شود که حاوی یک شناسهٔ نشست (session ID) به‌طور خودکار تولیدشده است. نام نشست نباید شامل مشخص‌کنندهٔ فضای نام باشد، زیرا نشست‌ها همواره درون فضای نام ‘session:’ ایجاد می‌شوند. نام نشست همچنین تابع محدودیت‌های نام‌گذاری chroot است که در schroot.conf(5) مستند شده است.
اجبار در انجام عملیات نشست، حتی اگر در غیر این صورت با شکست مواجه شود. این گزینه ممکن است برای پایان دادن اجباری به یک نشست، حتی در صورت وجود کاربران فعال، به کار رود. این کار تضمین نمی‌کند که نشست به شکلی پاک خاتمه یابد؛ برای نمونه، ممکن است سیستم‌های فایل unmount نشوند.

--
پایان گزینه‌ها. برای مشخص کردن پایان گزینه‌های schroot به کار می‌رود؛ هر گزینه‌ای پس از این به دستوری که در حال اجراست منتقل خواهد شد، نه به schroot.

اگر کاربر، یک کاربر مجاز یا عضوی از گروه‌های مجاز (یا در صورت تغییر به root، از کاربران مجاز root یا گروه‌های مجاز root) برای chroot(های) مشخص‌شده نباشد، مجوز فوراً رد خواهد شد. در صورت تغییر کاربر، چنانچه کاربر اجراکنندهٔ دستور دسترسی داشته باشد، کاربر ملزم خواهد بود تا با استفاده از اطلاعات هویتی کاربری که به آن تغییر می‌یابد، احراز هویت کند.

روی سیستم‌هایی که از ماژول‌های احراز هویت قابل اتصال (PAM) پشتیبانی می‌کنند، schroot از PAM برای احراز هویت و اعطای مجوز به کاربران استفاده خواهد کرد. در صورت نیاز، schroot برای دریافت گذرواژه درخواست خواهد داد. اگر PAM در دسترس نباشد، تمام فرآیندهای احراز هویت به‌طور خودکار با شکست مواجه خواهند شد (تغییر کاربر بدون PAM پشتیبانی نمی‌شود).

توجه داشته باشید که هنگام استفاده از PAM، کاربر root به‌طور پیش‌فرض هیچ امتیاز ویژه‌ای در برنامه ندارد. با این حال، پیکربندی پیش‌فرض PAM به root اجازه می‌دهد بدون گذرواژه وارد شود (pam_rootok.so)، اما می‌توان این مورد را غیرفعال کرد تا از دسترسی root به هرگونه chroot جلوگیری شود مگر آنکه صراحتاً مجاز شده باشد. در چنین شرایطی، root نیز همانند هر کاربر یا گروه دیگری باید به کاربران یا گروه‌های مجاز افزوده شود. اگر PAM در دسترس نباشد، کاربر root مجاز خواهد بود به تمام chrootها دسترسی داشته باشد، حتی زمانی که صراحتاً این دسترسی اعطا نشده باشد.

سه نوع مختلف chroot وجود دارد: chrootهای عادی، chrootهای منبع و chrootهای نشست. این انواع مختلف chroot در فضاهای نام متفاوتی از یکدیگر تفکیک شده‌اند. یک فضای نام، پیشوندی برای نام chroot است. در حال حاضر سه فضای نام وجود دارد: ‘chroot:’، ‘source:’ و ‘session:’. از --list --all برای فهرست کردن تمامی chrootهای موجود در تمامی فضاهای نام استفاده کنید. از آنجا که ‘:’ به عنوان جداکننده میان فضای نام و نام‌های chroot به کار می‌رود، استفاده از این نویسه در نام‌های chroot مجاز نیست.

بسته به کنشی که از schroot درخواست می‌کنید، ممکن است به دنبال chroot در یکی از این سه فضای نام بگردد، یا اینکه یک فضای نام مشخص تعیین شده باشد. برای نمونه، یک chroot با نام “sid”، در صورت گنجاندن فضای نام، در واقع نامش “chroot:sid” است، اما می‌توان فضای نام را برای اکثر کنش‌ها نادیده گرفت.

برخی از انواع chroot، برای نمونه اسنپ‌شات‌های LVM و اسنپ‌شات‌های Btrfs، اسنپ‌شات‌های رونوشت هنگام نوشتن (copy-on-write) با مدیریت نشست را از chroot فراهم می‌کنند. این‌ها همچنین یک source chroot برای دسترسی آسان به سیستم فایلی که به عنوان منبع اسنپ‌شات‌گیری استفاده می‌شود ارائه می‌دهند. این‌ها نیز chrootهای معمولی هستند که تنها اسنپ‌شات‌گیری در آن‌ها غیرفعال شده است. برای یک chroot با نام “sid-snapshot” (یعنی با یک نام کاملاً واجد شرایط به صورت “chroot:sid-snapshot”)، یک chroot منبع متناظر به نام “source:sid-snapshot” نیز وجود خواهد داشت. نسخه‌های پیشین schroot، چروت‌های منبع را با پسوند ‘-source’ ارائه می‌دادند. این‌ها نیز جهت سازگاری فراهم شده‌اند. در این مثال، این chroot با عنوان “chroot:sid-snapshot-source” نامیده خواهد شد. این نام‌های سازگاری در نسخه‌های آینده حذف خواهند شد، بنابراین برنامه‌ها و اسکریپت‌ها باید به جای پسوند قدیمی، به استفاده از نام‌های واجد شرایط با فضای نام روی آورند.

تمام نشست‌های ایجادشده با --begin-session درون فضای نام ‘session:’ قرار می‌گیرند. نشستی که با --session-name نام‌گذاری شده است می‌تواند هر نامی داشته باشد، حتی همان نام chrootای که از آن ایجاد شده است، به شرط آنکه درون این فضای نام یکتا باشد. این مورد در نسخه‌های پیشین schroot که فاقد فضاهای نام بودند مجاز نبود.

تمام کنش‌ها از ‘chroot:’ به عنوان فضای نام پیش‌فرض استفاده می‌کنند، به استثنای برخی کنش‌های مربوط به نشست. گزینه‌های --run-session، --recover-session و --end-session در عوض از ‘session:’ به عنوان فضای نام پیش‌فرض استفاده می‌کنند، چرا که این کنش‌ها روی chrootهای نشست عمل می‌کنند. نتیجه اینکه معمولاً هرگز به فضای نام نیازی نیست مگر زمانی که بخواهید با یک chroot در فضای نامی غیر از پیش‌فرض کار کنید، مانند زمان استفاده از یک chroot منبع. برای برطرف کردن هرگونه ابهام در انتخاب chroot، همواره ممکن است از نام کامل شامل فضای نام استفاده شود، حتی زمانی که لزوماً مورد نیاز نباشد.

کارایی در برخی سیستم‌های فایل، برای نمونه Btrfs، هنگام اجرای dpkg به دلیل تعداد بالای عملیات‌های fsync انجام‌شده نامناسب است. این مشکل می‌تواند با نصب بستهٔ eatmydata و سپس افزودن eatmydata به کلید پیکربندی command-prefix که تمام عملیات‌های fsync را غیرفعال می‌کند، کاهش یابد. توجه داشته باشید که این کار تنها باید در chrootهای اسنپ‌شات انجام شود که در آن‌ها از دست رفتن داده‌ها اهمیتی ندارد. این قابلیت به عنوان مثال هنگام استفاده از یک chroot برای ساخت بسته‌ها مفید است.

ابزار schroot دایرکتوری مناسبی را برای استفاده درون chroot بر اساس اینکه آیا یک شل لاگین تعاملی به کار خواهد رفت یا دستوری فراخوانی می‌شود، و علاوه بر آن در صورت استفاده از گزینهٔ --directory، انتخاب خواهد کرد. در صورت اجرای مستقیم دستورها یا تعیین صریح یک دایرکتوری، برای حفظ ایمنی و یکپارچگی تنها از یک دایرکتوری استفاده خواهد شد، در حالی که برای یک شل لاگین ممکن است احتمالات متعددی آزموده شود. زیربخش‌های زیر توالی جایگزینی را برای هر حالت فهرست می‌کنند. CWD دایرکتوری کاری جاری است و DIR دایرکتوری مشخص‌شده با --directory است.

انتقال
(میزبان → Chroot) توضیح
CWD → CWD رفتار عادی (اگر --directory استفاده نشود)
CWD → $HOME اگر CWD وجود نداشته باشد و --preserve-environment استفاده شود
CWD → passwd pw_dir اگر CWD وجود نداشته باشد (یا --preserve-environment استفاده شود و هیچ $HOMEای وجود نداشته باشد)
CWD → / هیچ‌یک از موارد بالا وجود نداشته باشند
FAIL اگر / وجود نداشته باشد
دستور (Command)
box;
l|lw(4i).
انتقال
(میزبان → Chroot) توضیح
CWD → CWD رفتار عادی (اگر --directory استفاده نشود)
FAIL اگر CWD وجود نداشته باشد

تحت هیچ شرایطی نباید هیچ سازوکار جایگزینی وجود داشته باشد.

انتقال
(میزبان → Chroot) توضیح
CWD → DIR رفتار عادی
FAIL اگر DIR وجود نداشته باشد

تحت هیچ شرایطی نباید هیچ سازوکار جایگزینی وجود داشته باشد.

توجه داشته باشید که --debug=notice فهرست جایگزین‌های داخلی محاسبه‌شده برای نشست را نشان خواهد داد.

% schroot -l↵
chroot:default
chroot:etch
chroot:sid
chroot:testing
chroot:unstable

% schroot -i -c sid↵
  ——— Chroot ———
  Name                   sid
  Description            Debian sid (unstable)
  Type                   plain
  Priority               3
  Users                  rleigh
  Groups                 sbuild
  Root Users
  Root Groups            sbuild
  Aliases                unstable unstable-sbuild unstable-p
owerpc-sbuild
  Environment Filter     ^(BASH_ENV|CDPATH|ENV|HOSTALIASES|I\
FS|KRB5_CONFIG|KRBCONFDIR|KRBTKFILE|KRB_CONF|LD_.*|LOCALDOMA\
IN|NLSPATH|PATH_LOCALE|RES_OPTIONS|TERMINFO|TERMINFO_DIRS|TE\
RMPATH)$
  Run Setup Scripts      true
  Script Configuration   script-defaults
  Session Managed        true
  Personality            linux32
  Location               /srv/chroot/sid

به ترتیب از --all یا چندین بار از -c برای استفاده از همه chrootها یا چندتایی از آن‌ها استفاده کنید.

% schroot -c sid /bin/ls↵
[sid chroot] Running command: “/bin/ls”
CVS          sbuild-chroot.c   sbuild-session.h  schroot.conf.5
Makefile     sbuild-chroot.h   schroot.1         schroot.conf.5.in
Makefile.am  sbuild-config.c   schroot.1.in
Makefile.in  sbuild-config.h   schroot.c
pam          sbuild-session.c  schroot.conf
% schroot -c sid -- ls -1 | head -n 5↵
[sid chroot] Running command: “ls -1”
ABOUT-NLS
AUTHORS
COPYING
ChangeLog
INSTALL

از -- برای مجاز کردن گزینه‌هایی که با ‘-’ یا ‘--’ در دستور اجرایی درون chroot آغاز می‌شوند، استفاده کنید. این کار مانع از تفسیر شدن آن‌ها به عنوان گزینه‌های خود schroot می‌شود. توجه داشته باشید که خط اول به خطای استاندارد و خطوط باقی‌مانده به خروجی استاندارد ارسال شده‌اند. این رفتار عمدی است، تا خروجی برنامه از دستورهای اجرا شده در chroot بتواند در صورت نیاز پایپ و هدایت شود؛ داده‌ها به همان صورتی خواهند بود که گویی دستور مستقیماً روی سیستم میزبان اجرا شده است.

% schroot -c sid -u root↵
Password:
[sid chroot] (rleigh→root) Running login shell: “/bin/bash”
# 

اگر کاربر ‘rleigh’ در root-users در /etc/schroot/schroot.conf بود، یا یکی از گروه‌هایی که به آن تعلق داشت در root-groups قرار داشت، دسترسی ریشه بدون احراز هویت به آن‌ها اعطا می‌شد، اما مرحله مجوزدهی PAM همچنان اعمال می‌شود.

ممکن است یک chroot برای اجرای بیش از یک دستور مورد نیاز باشد. به‌ویژه، هنگامی که chroot به‌صورت لحظه‌ای از یک LV در LVM یا یک فایل روی دیسک ایجاد می‌شود، نیاز است که chroot تا زمان انجام یک کار معین (یا مجموعه‌ای از کارها) پابرجا بماند. نشست‌ها به همین منظور وجود دارند. برای انواع ساده chroot مانند ‘plain’ و ‘directory’، ممکن است نشست‌ها ایجاد شوند اما اکیداً ضروری نیستند.

بیایید با نگاهی به یک chroot با قابلیت پشتیبانی از نشست شروع کنیم:

% schroot -i -c sid-snap↵
  ——— Chroot ———
  Name                   sid-snap
  Description            Debian sid snapshot
  Type                   lvm-snapshot
  Priority               3
  Users                  maks rleigh
  Groups                 sbuild
  Root Users
  Root Groups            root sbuild
  Aliases
  Environment Filter     ^(BASH_ENV|CDPATH|ENV|HOSTALIASES|I\
FS|KRB5_CONFIG|KRBCONFDIR|KRBTKFILE|KRB_CONF|LD_.*|LOCALDOMA\
IN|NLSPATH|PATH_LOCALE|RES_OPTIONS|TERMINFO|TERMINFO_DIRS|TE\
RMPATH)$
  Run Setup Scripts      true
  Script Configuration   script-defaults
  Session Managed        true
  Personality            linux
  Device                 /dev/hda_vg/sid_chroot
  Mount Options          -o atime,async,user_xattr
  Source Users
  Source Groups          root rleigh
  Source Root Users
  Source Root Groups     root rleigh
  LVM Snapshot Options   --size 2G -c 128

توجه داشته باشید که گزینه Session Managed روی ‘true’ تنظیم شده است. این یک پیش‌نیاز برای استفاده از مدیریت نشست است و توسط اکثر انواع chroot پشتیبانی می‌شود. در ادامه، یک نشست جدید ایجاد خواهیم کرد:

% schroot -b -c sid-snap↵
sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f

شناسه نشست (session ID) مربوط به نشست تازه‌ایجادشده در خروجی استاندارد بازگردانده می‌شود. ذخیره کردن آن بدین صورت رایج است:

% SESSION=$(schroot -b -c sid-snap)↵
% echo $SESSION↵
sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f

این نشست می‌تواند درست مانند هر chroot عادی دیگری استفاده شود. نشست بدین شکل خواهد بود:

% schroot -i -c sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f↵
  ——— Session ———
  Name                   sid-snap-46195b04-0893-49bf-beb8-0d\
4ccc899f0f
  Description            Debian sid snapshot
  Type                   lvm-snapshot
  Priority               3
  Users                  maks rleigh
  Groups                 sbuild
  Root Users
  Root Groups            root sbuild
  Aliases
  Environment Filter     ^(BASH_ENV|CDPATH|ENV|HOSTALIASES|I\
FS|KRB5_CONFIG|KRBCONFDIR|KRBTKFILE|KRB_CONF|LD_.*|LOCALDOMA\
IN|NLSPATH|PATH_LOCALE|RES_OPTIONS|TERMINFO|TERMINFO_DIRS|TE\
RMPATH)$
  Run Setup Scripts      true
  Script Configuration   script-defaults
  Session Managed        true
  Personality            linux
  Mount Location         /var/lib/schroot/mount/sid-snap-461\
95b04-0893-49bf-beb8-0d4ccc899f0f
  Path                   /var/lib/schroot/mount/sid-snap-461\
95b04-0893-49bf-beb8-0d4ccc899f0f
  Mount Device           /dev/hda_vg/sid-snap-46195b04-0893-\
49bf-beb8-0d4ccc899f0f
  Device                 /dev/hda_vg/sid_chroot
  Mount Options          -o atime,async,user_xattr
  Source Users
  Source Groups          root rleigh
  Source Root Users
  Source Root Groups     root rleigh
  LVM Snapshot Device    /dev/hda_vg/sid-snap-46195b04-0893-\
49bf-beb8-0d4ccc899f0f
  LVM Snapshot Options   --size 2G -c 128
اکنون که نشست ایجاد شد، می‌توان دستورها را درون آن اجرا کرد:
% schroot -r -c sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f -- \
  uname -sr↵
I: [sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f chroot] Running \
command: “uname -sr”
Linux 2.6.18-3-powerpc
% schroot -r -c $SESSION -- uname -sr↵
I: [sid-snap-fe170af9-d9be-4800-b1bd-de275858b938 chroot] Running \
command: “uname -sr”
Linux 2.6.18-3-powerpc

هنگامی که تمام دستورهای مورد نظر در نشست اجرا شدند، می‌توان به نشست پایان داد:

% schroot -e -c sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f↵
% schroot -e -c $SESSION↵

در نهایت، نام نشست‌ها ممکن است طولانی و نامناسب باشد. می‌توان به‌جای استفاده از شناسه نشست که به‌طور خودکار ایجاد می‌شود، یک نام مشخص کرد:

% schroot -b -c sid-snap -n my-session-name↵
my-session-name

اگر چیزی به‌درستی کار نمی‌کند و از روی پیام‌های خطا مشخص نیست که مشکل از کجاست، گزینه --debug=level را برای فعال کردن پیام‌های اشکال‌زدایی به کار ببرید. این کار اطلاعات بسیار بیشتری فراهم می‌کند. سطوح معتبر اشکال‌زدایی به ترتیب افزایش حساسیت عبارتند از: ‘none’، و ‘notice’، ‘info’، ‘warning’ و ‘critical’. هرچه سطح حساسیت پایین‌تر باشد، خروجی بیشتری تولید خواهد شد.

اگر همچنان با مشکل مواجه هستید، می‌توانید با توسعه‌دهندگان از طریق فهرست ایمیل تماس بگیرید:
Debian buildd-tools Developers
<buildd-tools-devel@lists.alioth.debian.org>

در معماری‌های mips و mipsel، هسته‌های لینوکس تا نسخه ۲.۶.۱۷ و خود آن، پشتیبانی ناقصی از personality(2) دارند که منجر به شکست در تعیین personality می‌شود. این مسئله به‌صورت خطای “Operation not permitted” (EPERM) مشاهده خواهد شد. برای دور زدن این مشکل، personality را روی ‘undefined’ تنظیم کنید، یا هسته را به نسخه‌ای جدیدتر ارتقا دهید.

به‌طور پیش‌فرض، متغیرهای محیطی حفظ نمی‌شوند و متغیرهای محیطی زیر تعریف می‌شوند: HOME، LOGNAME، PATH، SHELL، TERM (در صورت تعریف بودن از قبل، حفظ می‌شود) و USER. متغیرهای محیطی SCHROOT_COMMAND، SCHROOT_USER، SCHROOT_GROUP، SCHROOT_UID و SCHROOT_GID در داخل chroot تنظیم می‌شوند و به ترتیب دستور در حال اجرا، نام کاربر، نام گروه، شناسه کاربر و شناسه گروه را مشخص می‌کنند. علاوه بر این، متغیرهای محیطی SCHROOT_SESSION_ID، SCHROOT_CHROOT_NAME و SCHROOT_ALIAS_NAME به ترتیب شناسه نشست، نام اولیه chroot پیش از ایجاد نشست و نام مستعار مورد استفاده برای شناسایی اولیه chroot انتخاب‌شده را مشخص می‌کنند.

متغیرهای محیطی زیر که بالقوه خطرناک هستند، به‌طور پیش‌فرض برای امنیت حذف می‌شوند: BASH_ENV، CDPATH، ENV، HOSTALIASES، IFS، KRB5_CONFIG، KRBCONFDIR، KRBTKFILE، KRB_CONF، LD_.*، LOCALDOMAIN، NLSPATH، PATH_LOCALE، RES_OPTIONS، TERMINFO، TERMINFO_DIRS و TERMPATH. در صورت تمایل، کلید پیکربندی environment-filter امکان ویرایش فهرست استثناها را فراهم می‌کند؛ برای جزئیات بیشتر به schroot.conf(5) مراجعه کنید.

/etc/schroot/schroot.conf
فایل سراسری تعریف‌های chroot در سیستم. مالک این فایل باید کاربر ریشه (root) باشد و نباید توسط دیگران قابل نوشتن باشد.
/etc/schroot/chroot.d
تعریف‌های تکمیلی chroot می‌توانند درون فایل‌هایی در این دایرکتوری قرار گیرند. با آن‌ها دقیقاً مانند /etc/schroot/schroot.conf رفتار می‌شود. هر فایل می‌تواند شامل یک یا چند تعریف chroot باشد. توجه داشته باشید که نام فایل‌ها در این دایرکتوری، از همان قوانین نام‌گذاری run-parts(8) هنگام اجرا با گزینه --lsbsysinit پیروی می‌کنند.
/etc/schroot/setup.d
دایرکتوری‌های سراسری اسکریپت‌های راه‌اندازی chroot در سیستم. ببینید: schroot-setup(5).
/etc/pam.d/schroot
پیکربندی PAM.

/usr/lib/schroot
دایرکتوری حاوی برنامه‌های کمکی مورد استفاده توسط اسکریپت‌های راه‌اندازی.

هر دایرکتوری شامل یک دایرکتوری یا فایل با نام هر نشست است. همه انواع chroot از تمام دایرکتوری‌های زیر استفاده نمی‌کنند.

/var/lib/schroot/session
دایرکتوری حاوی پیکربندی نشست برای هر نشست فعال.
/var/run/schroot/mount
دایرکتوری مورد استفاده برای سوار کردن (mount) سیستم‌های فایلی که توسط هر نشست فعال استفاده می‌شوند.
/var/lib/schroot/union/underlay
دایرکتوری مورد استفاده برای منبع پیوند سیستم فایل (underlay).
/var/lib/schroot/union/overlay
دایرکتوری مورد استفاده برای لایه روکش قابل نوشتن پیوند سیستم فایل (overlay).
/var/lib/schroot/unpack
دایرکتوری مورد استفاده برای استخراج chrootهای فایلی.

Roger Leigh.

Copyright © 2005-2012 Roger Leigh <rleigh@codelibre.net>

schroot یک نرم‌افزار آزاد است: شما می‌توانید تحت شرایط «اجازه‌نامه عمومی همگانی گنو» (GNU General Public License) که توسط بنیاد نرم‌افزارهای آزاد منتشر شده است؛ چه نسخه ۳ اجازه‌نامه و چه (به انتخاب خودتان) هر نسخه بعدی آن، به بازتوزیع یا تغییر آن بپردازید..SH "همچنین ببینید (SEE ALSO)" dchroot(1), sbuild(1), chroot(2), schroot.conf(5). schroot-setup(5), schroot-faq(7), run-parts(8),

14 Aug 2022 Version 1.6.13