FAKECHROOT(1) FAKECHROOT(1)

fakechroot - ایجاد یک محیط chroot ساختگی

fakechroot [-s|--use-system-libs] [-l|--lib library] [-d|--elfloader ldso] [-e|--environment type] [-c|--config-dir directory] [-b|--bindir directory] [--] [command]

fakechroot -h|--help

fakechroot -v|--version

دستور fakechroot فرمانی را در محیطی اجرا می‌کند که در آن امکان استفاده از دستور chroot(8) بدون داشتن امتیازات ریشه (root) فراهم شده است. این ابزار برای این سودمند است که به کاربران اجازه دهد محیط chrooted اختصاصی خود را بسازند و بسته‌های دیگر را بدون نیاز به دسترسی‌های ریشه نصب کنند.

ابزار fakechroot برخی از توابع کتابخانه C (chroot(2)، open(2) و غیره) را با توابعی جایگزین می‌کند که اثر فراخوانی شدن با امتیازات ریشه را شبیه‌سازی می‌نمایند.

این توابع پوششی (wrapper) به عنوان یک کتابخانه مشترک libfakechroot.so ارائه می‌شوند که از طریق سازوکار "LD_PRELOAD" بارگذار پویای سیستم (dynamic loader) بارگذاری می‌گردد (به ld.so(8) نگاه کنید).

در یک chroot ساختگی، می‌توانید به عنوان مثال با دستور debootstrap(8) سیستم پایه دبیان را نصب کنید. در چنین محیطی می‌توانید دستورهایی مانند apt-get(8) را برای نصب بسته‌های دیگر اجرا کنید. شما نیازی به دسترسی‌های ویژه ندارید و می‌توانید آن را در حساب کاربری معمولی اجرا نمایید.

مشخص کردن دایرکتوری حاوی فایل‌های اجرایی جایگزین ارائه‌شده همراه با fakechroot. این پرونده‌ها اسکریپت‌هایی با پسوند ".fakechroot" هستند. به صورت پیش‌فرض آنها در دایرکتوری‌های "bin" و "sbin" در پیشوند نصب fakechroot توزیع می‌شوند، اما گاهی یک مکان ثابت در زمان ساخت امکان‌پذیر نیست.
مشخص کردن دایرکتوری حاوی پیکربندی‌های اضافی برای fakechroot. دایرکتوری‌های پیش‌فرض "$HOME/.fakechroot" و "/etc/fakechroot" هستند.
مشخص کردن پیونددهنده پویای (dynamic linker) جایگزین. این بارگذار پویا مستقیماً فراخوانی خواهد شد.
بارگذاری پیکربندی اضافی به همراه محیط. این فایل پیکربندی یک اسکریپت شل است که پیش از فراخوانی command اجرا می‌شود. این اسکریپت می‌تواند متغیرهای محیطی اضافی تنظیم کند؛ به عنوان مثال: "FAKECHROOT_EXCLUDE_PATH"، "FAKECHROOT_CMD_SUBST" یا "LD_LIBRARY_PATH".

نوع محیط بر اساس نام دستور پس از حذف پسوند اختیاری حدس زده می‌شود (برای نمونه اجرای gettext.sh فایل محیطی "gettext" را بارگذاری می‌کند). اگر آرگومان command برابر fakeroot(1) باشد، این آرگومان نادیده گرفته شده و آرگومان بعدی به عنوان نوع محیط در نظر گرفته می‌شود.

نام فایل پیکربندی type.env است و در دایرکتوری‌های $HOME/.fakechroot و /etc/fakechroot جستجو می‌شود.

نوع محیط پیش‌فرض default است و نام فایل پیکربندی آن "default.env" می‌باشد.

محیط ویژه none به این معنی است که اصلاً هیچ تنظیمات محیطی بارگذاری نمی‌شود.

مشخص کردن کتابخانه پوششی (wrapper) جایگزین. پیش‌فرض libfakechroot.so است.
نمایش راهنما.
استفاده از کتابخانه‌های سیستم قبل از کتابخانه‌های chroot. این گزینه می‌تواند راه‌حلی باشد اگر پیونددهنده پویای سیستم نتواند libc.so را از chroot ساختگی بارگذاری کند.

اگر خطاهای زیر را مشاهده کردید، این تنظیم را امتحان کنید:

$ fakechroot /usr/sbin/chroot /tmp/sarge /bin/true
/bin/true: relocation error: /srv/sarge/lib/tls/libc.so.6: symbol _dl
_starting_up, version GLIBC_PRIVATE not defined in file ld-linux.so.2
 with link time reference
$ fakechroot /usr/sbin/chroot /tmp/centos4 /bin/true
Segmentation fault
نمایش نگارش.
[--] command
هر دستوری که می‌خواهید به عنوان fakechroot اجرا شود. اگر دستور شامل گزینه‌های دیگری است که ممکن است با تجزیه گزینه‌های fakechroot تداخل داشته باشد، از '--' استفاده کنید.

یک نشست نمونه با fakechroot:

$ id
uid=1000(dexter) gid=1000(dexter) groups=1000(dexter)
$ fakechroot fakeroot debootstrap sid /tmp/sid
I: Retrieving Release 
I: Retrieving Release.gpg 
I: Checking Release signature
...
I: Base system installed successfully.
$ fakechroot fakeroot chroot /tmp/sid apt-get install -q hello
Reading package lists...
Building dependency tree...
Reading state information...
The following NEW packages will be installed:
  hello
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 57.4 kB of archives.
After this operation, 558 kB of additional disk space will be used.
Get:1 http://ftp.us.debian.org/debian/ sid/main hello amd64 2.8-4 [57.4 kB]
Fetched 57.4 kB in 0s (127 kB/s)
Selecting previously unselected package hello.
(Reading database ... 24594 files and directories currently installed.)
Unpacking hello (from .../archives/hello_2.8-4_amd64.deb) ...
Processing triggers for man-db ...
Processing triggers for install-info ...
Setting up hello (2.8-4) ...
$ fakechroot chroot /tmp/sid hello
Hello, world!

ابزار fakeroot(1) یک ابزار مکمل است که محیط root را شبیه‌سازی می‌کند. fakeroot و fakechroot ممکن است توابع کتابخانه C یکسانی را پوشش دهند، به عنوان مثال تابع mknod(2). بسیار مهم است که محیط ساختگی را با ترتیب مناسب آغاز کنید. fakeroot باید در داخل fakechroot اجرا شود:

$ fakechroot fakeroot chroot /tmp/sid /bin/mknod /tmp/device c 1 2

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

نباید از fakechroot به عنوان ابزاری برای ارتقای امنیت سیستم مانند جداسازی و قرنطینه‌سازی (sandboxing) برنامه‌ها استفاده شود. فرار از یک محیط chroot ساختگی بسیار آسان است.

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

کتابخانه مشترک حاوی توابع پوششی (wrapper).

مقدار آن برای محیط chroot ساختگی برابر true است.
دایرکتوری ریشه برای سوکت‌های یونیکس. مقدار پیش‌فرض آن مشابه "FAKECHROOT_BASE" است و در صورتی که "FAKECHROOT_BASE" خیلی طولانی باشد و مسیر سوکت یونیکس از محدودیت 108 بایت فراتر رود، می‌تواند جداگانه تنظیم شود.
دایرکتوری ریشه محیط chroot ساختگی.
فهرستی از جایگزینی‌های دستور. اگر برنامه‌ای تلاش کند یکی از دستورهای مشخص‌شده را اجرا کند (مسیر نسبت به chroot، نقطه پایانی حذف می‌شود)، دستور جایگزین به جای آن اجرا خواهد شد (مسیر دستور جایگزین chrooted نیست).

دستور جایگزین متغیرهای "FAKECHROOT_*" را به ارث می‌برد، به جز متغیر اصلی "FAKECHROOT_BASE" که به عنوان "FAKECHROOT_BASE_ORIG" ذخیره می‌شود. این بدان معناست که دستور جایگزین‌شده در خارج از محیط fakechroot اجرا می‌شود. همچنین نام دستور اصلی به عنوان "FAKECHROOT_CMD_ORIG" ذخیره می‌گردد.

به عنوان مثال:

export FAKECHROOT_CMD_SUBST=/usr/bin/mkfifo=/bin/true

دستور "/bin/true" را به جای "/usr/bin/mkfifo" قرار می‌دهد و نصب بسته دودویی sysvinit را ممکن می‌سازد.

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

پیشنهاد می‌شود حداقل موارد زیر جایگزین شوند:

  • "/bin/mount=/bin/true"
  • "/sbin/insserv=/bin/true"
  • "/sbin/ldconfig=/bin/true"
  • "/usr/bin/env=/usr/bin/env.fakechroot"
  • "/usr/bin/ischroot=/bin/true"
  • "/usr/bin/ldd=/usr/bin/ldd.fakechroot"
  • "/usr/bin/mkfifo=/bin/true"

تا ابزار debootstrap(8) به درستی کار کند.

برای جلوگیری از بروز حلقه‌های تکرار، جایگزینی دستور فقط در صورتی انجام می‌شود که متغیر "FAKECHROOT_CMD_ORIG" در حال حاضر تنظیم نشده باشد.

در صورت تنظیم بودن این متغیر، کتابخانه fakechroot اطلاعات اشکال‌زدایی را تخلیه می‌کند.
اگر این متغیر تنظیم شده باشد، رشته "fakechroot version" در خروجی استاندارد چاپ شده و فرآیند جاری با وضعیت دریافت شده از این متغیر خاتمه می‌یابد. این می‌تواند روشی برای بررسی بارگذاری صحیح fakechroot باشد.
$ case "`FAKECHROOT_DETECT=1 /bin/echo`" in fakechroot*) echo LOADED;; esac
مسیری به یک پیونددهنده پویای دیگر (مثلاً /lib/ld-linux.so.2 برای معماری i386، یا /lib64/ld-linux-x86-64.so.2 برای معماری x86_64).

این پیونددهنده پویا مستقیماً فراخوانی خواهد شد. پیونددهنده پویا اجازه تغییر "argv[0]" به جز نام فایل اجرایی را نمی‌دهد، بنابراین برخی برنامه‌ها به درستی کار نخواهند کرد، مانند busybox(1).

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

دایرکتوری‌های /dev، /proc و /sys در صورتی که این متغیر محیطی تنظیم نشده باشد، به صورت پیش‌فرض مستثنی هستند.

این فهرست باید حداکثر شامل ۱۰۰ عنصر باشد.

فهرستی از دایرکتوری‌های اضافی در محیط chroot ساختگی که به متغیر "LD_LIBRARY_PATH" افزوده می‌شوند. این دایرکتوری‌ها ممکن است توسط برخی دستورهای مهم که از کتابخانه‌های واقع در runpath استفاده می‌کنند به کار روند. در این حالت پیونددهنده پویا نمی‌تواند بدون این مسیرهای اضافی کتابخانه، دایرکتوری درست را در محیط chroot ساختگی پیدا کند.

مقدار پیش‌فرض "/lib/systemd:/usr/lib/man-db" برای دستورهای systemctl(1) و man(1) است.

شماره نگارش کتابخانه جاری fakechroot.
ابزار fakechroot با پوشش‌دهی فراخوانی‌های سیستمی پیاده‌سازی شده است. این کار با تنظیم "LD_PRELOAD=libfakechroot.so" انجام می‌شود. اگر پیونددهنده پویا نتواند این کتابخانه را پیدا کند، فایل /etc/ld.so.conf یا متغیر "LD_LIBRARY_PATH" باید اصلاح شوند.

  • پرونده‌های /lib/ld-linux.so.2 و /lib64/ld-linux-x86-64.so.2 همیشه از محیط واقعی بارگذاری می‌شوند. این مسیر توسط پیونددهنده برای تمامی فایل‌های باینری هاردکد شده است. می‌توانید متغیر محیطی "FAKECHROOT_ELFLOADER" را تنظیم کرده یا از گزینه "--elfloader" استفاده کنید.
  • هر دستوری که در fakechroot اجرا می‌شود باید به همان نسخه از پیونددهنده پویای محیط واقعی لینک شده باشد. اگر کتابخانه‌های درون chroot سازگار نیستند، سعی کنید از گزینه "--use-system-libs" استفاده نمایید.
  • می‌توانید پیوندهای نمادین (symlinks) به بیرون ایجاد کنید. پیوند نمادین باید قبل از فراخوانی chroot ایجاد شده باشد. این می‌تواند برای دسترسی به دایرکتوری‌های واقعی /proc و /dev مفید باشد. همچنین می‌توانید متغیر محیطی "FAKECHROOT_EXCLUDE_PATH" را تنظیم کنید:
    $ export FAKECHROOT_EXCLUDE_PATH=/tmp:/proc:/dev:/sys:/var/run:/home
  • برنامه‌های با پیوند ایستا (statically linked) کار نمی‌کنند، به ویژه ldconfig(8)، بنابراین باید این دستور را با نسخه‌ای ساختگی بپوشانید و متغیر محیطی مناسب "FAKECHROOT_CMD_SUBST" را تنظیم نمایید.
  • دستور ldd(1) نیز کار نمی‌کند. باید از "alias ldd='LD_TRACE_LOADED_OBJECTS=1'" استفاده کنید یا به جای آن از یک پوشش (wrapper) بهره ببرید. این پوشش به صورت ldd.fakechroot نصب می‌شود و می‌تواند با متغیر محیطی "FAKECHROOT_CMD_SUBST" به کار رود.
  • برنامه‌های تمام‌صفحه در صورتی که فایل /dev/tty یک دستگاه واقعی نباشد قفل می‌کنند. فایل /dev/tty یا کل دایرکتوری /dev را به نمونه واقعی پیوند دهید یا آن را با متغیر "FAKECHROOT_EXCLUDE_PATH" از محیط chroot ساختگی خارج کنید.
  • توابع lckpwdf(3) و ulckpwdf(3) نادیده گرفته می‌شوند، بنابراین دستور passwd(1) باید کار کند.
  • شناسه کاربر (uid) واقعی شما باید در /etc/passwd وجود داشته باشد. آن را با دستور adduser --uid realuid realuser در داخل محیط chroot ساختگی ایجاد کنید.
  • دستور debuild(1) متغیرهای محیط را پاک می‌کند. از گزینه --preserve-env برای جلوگیری از این رفتار استفاده کنید.
  • دستور rpmbuild(8) از پیاده‌سازی glob(3) اختصاصی خود استفاده می‌کند که عملکرد fakechroot را مختل می‌سازد، بنابراین دایرکتوری buildroot باید در داخل و خارج fakechroot یکسان باشد.

fakeroot(1), debuild(1), debootstrap(8), rinse(8), http://fakechroot.alioth.debian.org

اگر با اشکالی مواجه شدید یا تمایل به پیاده‌سازی قابلیت‌های جدید دارید، لطفاً آن را در نشانی زیر گزارش کنید: https://github.com/fakechroot/fakechroot/issues

حق نشر (c) 2003-2017, 2019 Piotr Roszatycki <dexter@debian.org>

حق نشر (c) 2007 Mark Eichin <eichin@metacarta.com>

حق نشر (c) 2006, 2007 Alexander Shishkin <virtuoso@slind.org>

حق نشر (c) 2006, 2007 Lionel Tricon <lionel.tricon@free.fr>

ابزار fakechroot تحت مجوز گنو لسر جی‌پی‌ال (LGPL 2.1 یا بالاتر) توزیع می‌شود.

16 Mar 2019 fakechroot