FAKEROOT(1) دستورهای کاربری FAKEROOT(1)

fakeroot - اجرای دستورات در محیط با دسترسیهای ریشه جعلی (fake root)

fakeroot [ -l|--lib کتابخانه ] [ --faked دیمن_فیکد ] [ -s فایل_ذخیره ] [ -i فایل_بارگذاری ] [ -u|--unknown-is-real ] [ -b fd ] [ -h|--help ] [ -v|--version ] [ -- ] [ دستور [ آرگومانها... ] ]

ابزار fakeroot فرمانی را در محیطی اجرا میکند که به نظر میرسد کاربر دارای دسترسی ریشه (root) برای دستکاری فایلها و بستهبندی است. این قابلیت برای آن است که به کاربران اجازه دهد بایگانی‌هایی (tar، ar، .deb و غیره) شامل فایل‌هایی با مجوزها و مالکیت ریشه ایجاد کنند. بدون استفاده از fakeroot کاربر برای ساخت فایل‌های تشکیل‌دهنده بایگانی با مجوزها و مالکیت درست و سپس بسته‌بندی آن‌ها، باید دسترسی‌های کاربر ریشه را می‌داشت؛ یا اینکه بایگانی‌ها را مستقیماً بدون استفاده از ابزارهای بایگانی‌ساز ایجاد می‌کرد.

ابزار fakeroot با جایگزین کردن توابع کتابخانه‌ای دستکاری فایل (مانند chmod(2)، stat(2) و غیره) با توابعی که اثر توابع واقعی کتابخانه در صورت داشتن دسترسی ریشه توسط کاربر را شبیه‌سازی می‌کنند، کار می‌کند. این توابع پوشاننده (wrapper) در یک کتابخانه مشترک با نام /usr/lib/*/libfakeroot-*.so یا مکانی مشابه در سیستم شما قرار دارند. این شیء مشترک از طریق سازوکار LD_PRELOAD بارگذار پویا بارگذاری می‌شود (ببینید: ld.so(8)).

اگر قصد ساخت بسته‌ها با fakeroot را دارید، لطفاً ابتدا بسته fakeroot را بسازید: مرحله «debian/rules build» دارای چند آزمون است (که اکثراً باگ‌های نسخه‌های قدیمی fakeroot را می‌آزمایند). اگر این آزمون‌ها شکست بخورند (برای مثال به دلیل وجود برنامه‌های خاص libc5 روی سیستم شما)، بسته‌های دیگری که با fakeroot می‌سازید نیز به احتمال زیاد شکست خواهند خورد، اما احتمالاً به شیوه‌هایی بسیار نامحسوس‌تر.

همچنین توجه داشته باشید که بهتر است ساخت باینری‌ها به طور مستقیم زیر fakeroot انجام نشود. به ویژه اسکریپت configure و برنامه‌های مشابه دوست ندارند که سیستم ناگهان رفتاری متفاوت از آنچه انتظار دارند نشان دهد (یا به طور تصادفی برخی متغیرهای محیطی که fakeroot به آن‌ها نیاز دارد را لغو کنند).

تعیین یک کتابخانه پوشاننده (wrapper) جایگزین.
تعیین یک فایل اجرایی جایگزین برای استفاده به عنوان faked.
[--] دستور
هر دستوری که می‌خواهید زیر fakeroot اجرا شود. چنانچه در دستور گزینه‌های دیگری وجود دارد که ممکن است پردازش گزینه‌های fakeroot را دچار سردرگمی کند، از «--» استفاده کنید.
ذخیره محیط fakeroot در فایل_ذخیره هنگام خروج. از این فایل می‌توان بعداً برای بازیابی محیط با استفاده از گزینه -i استفاده کرد. با این حال، اگر به فایل‌های دستکاری‌شده در درون fakeroot خارج از محیط آن دست بزنید، این فایل دچار نشت اطلاعات شده و fakeroot رفتاری نامتعارف خواهد داشت. با این وجود، این گزینه می‌تواند بسیار سودمند باشد؛ برای نمونه می‌توان از آن همراه با rsync(1) برای پشتیبان‌گیری و بازیابی کل درخت‌های دایرکتوری به همراه اطلاعات کامل کاربر، گروه و دستگاه بدون نیاز به دسترسی ریشه استفاده کرد. برای جزئیات بیشتر به /usr/share/doc/fakeroot/README.saving مراجعه کنید.
بارگذاری محیط fakeroot ذخیره‌شده پیشین با استفاده از گزینه -s از فایل_بارگذاری. توجه داشته باشید که این گزینه فایل را به طور خودکار ذخیره نمی‌کند؛ برای ذخیره باید هم‌زمان از گزینه -s نیز استفاده کنید. استفاده از یک فایل مشترک برای هر دو گزینه -i و -s در یک بار فراخوانی fakeroot کاملاً ایمن است.
استفاده از مالکیت واقعی فایل‌هایی که پیش از این برای fakeroot ناشناخته بودند، به جای وانمود کردن به اینکه متعلق به root:root هستند.
تعیین پایه توصیف‌گر فایل (فقط در حالت TCP). متغیر fd کمترین شماره توصیف‌گر فایل برای استفاده در اتصالات TCP است؛ این موضوع ممکن است برای جلوگیری از تداخل با توصیف‌گرهای فایل برنامه‌های در حال اجرا زیر fakeroot مهم باشد.
نمایش پیام راهنما.
نمایش نسخه برنامه.

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

$  whoami
joost
$ fakeroot /bin/bash
#  whoami
root
# mknod hda3 b 3 1
# ls -ld hda3
brw-r--r--   1 root     root       3,   1 Jul  2 22:58 hda3
# chown joost:root hda3
# ls -ld hda3
brw-r--r--   1 joost    root       3,   1 Jul  2 22:58 hda3
# ls -ld /
drwxr-xr-x  20 root     root         1024 Jun 17 21:50 /
# chown joost:users /
# chmod a+w /
# ls -ld /
drwxrwxrwx  20 joost    users        1024 Jun 17 21:50 /
# exit
$ ls -ld /
drwxr-xr-x  20 root     root         1024 Jun 17 21:50 //
$ ls -ld hda3
-rw-r--r--   1 joost    users           0 Jul  2 22:58 hda3

تنها تغییراتی که کاربر joost در هر صورت می‌توانست انجام دهد، در واقعیت اعمال می‌شوند.

ابزار fakeroot به طور ویژه نوشته شد تا به کاربران امکان دهد بسته‌های دبیان گنو/لینوکس (در قالب deb(5)) را بدون اعطای دسترسی‌های ریشه به آن‌ها بسازند. این کار را می‌توان با دستوراتی مانند dpkg-buildpackage -rfakeroot یا debuild -rfakeroot انجام داد (در واقع، امروزه -rfakeroot به صورت پیش‌فرض در debuild فعال است، بنابراین نیازی به تعیین آن آرگومان ندارید).

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

/usr/lib/*/libfakeroot-*.so
کتابخانه مشترک حاوی توابع پوشاننده (wrapper).

کلید مورد استفاده برای برقراری ارتباط با دیمن fakeroot. هر برنامه‌ای که با LD_PRELOAD صحیح و یک FAKEROOTKEY مربوط به یک دیمن در حال اجرا آغاز شود، به طور خودکار به آن دیمن متصل می‌شود و همان نمای «جعلی» از مجوزها و مالکیت‌های سیستم فایل را خواهد داشت (با این فرض که دیمن و برنامه متصل‌شونده توسط یک کاربر اجرا شده باشند).
ابزار fakeroot با پوشش‌دهی فراخوان‌های سیستمی پیاده‌سازی شده است. این کار با تنظیم LD_LIBRARY_PATH=/usr/lib/fakeroot و LD_PRELOAD=libfakeroot.so.0 صورت می‌گیرد. این کتابخانه پیش از کتابخانه C سیستم بارگذاری می‌شود، بنابراین اکثر توابع کتابخانه‌ای توسط آن رهگیری می‌شوند. چنانچه لازم است هر یک از متغیرهای LD_LIBRARY_PATH یا LD_PRELOAD را از درون یک محیط fakeroot مقداردهی کنید، مقدار آن باید نسبت به مسیرهای داده‌شده تنظیم شود، مانند: LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/foo/bar/

نسخه‌های کتابخانه (Library versions)
هر دستوری که درون fakeroot اجرا می‌شود باید به همان نسخه کتابخانه C که خود fakeroot به آن متصل است، پیوند داده شده باشد.
ابزار fakeroot توابع open()، create() و غیره را پوشش نمی‌دهد. بنابراین اگر کاربر joost هر یک از کارهای زیر را انجام دهد:
touch foo
fakeroot
ls -al foo

یا برعکس:

fakeroot
touch foo
ls -al foo

ابزار fakeroot راهی برای دانستن این موضوع ندارد که در حالت اول مالک واقعی foo باید joost می‌بود، در حالی که در حالت دوم باید root می‌بود. برای بسته‌بندی در دبیان، رفتار پیش‌فرض اختصاص uid=gid=0 به تمامی فایل‌های «ناشناخته» همیشه بدون مشکل است. راهکار اساسی برای دور زدن این محدودیت، پوشش دادن open() و create() است، اما این کار مشکلات دیگری ایجاد می‌کند؛ چنان‌که در بسته libtricks مشاهده شد. آن بسته توابع بسیار بیشتری را پوشش می‌داد و تلاش می‌کرد کارهای بسیار بیشتری نسبت به fakeroot انجام دهد. مشخص شد که یک ارتقای جزئی libc (از نسخه‌ای که در آن تابع stat() از open() استفاده نمی‌کرد به نسخه‌ای با تابع stat() که در مواردی از open() استفاده می‌کرد) باعث خطاهای عدم تخصیص حافظه و segfaultهای غیرقابل توضیحی می‌شد (بدین صورت که تابع stat() در libc6 تابع پوشش‌یافته open() را فراخوانی می‌کرد، و آن تابع نیز مجدداً stat() در libc6 را صدا می‌زد و غیره). رفع این باگ‌ها اصلاً آسان نبود، اما پس از برطرف شدن نیز فقط مسئله زمان بود تا تابع دیگری شروع به استفاده از open() کند، بماند تلاش برای پورت کردن آن به یک سیستم‌عامل دیگر. بنابراین تصمیم گرفته شد تعداد توابع پوشش‌یافته توسط fakeroot تا جای ممکن کم نگه داشته شود تا احتمال «تداخل‌ها» کاهش یابد.

ابزار GNU configure (و برنامه‌های مشابه آن)
ابزار fakeroot در عمل شیوه رفتار سیستم را دگرگون می‌کند. برنامه‌هایی که سیستم را بررسی و کاوش می‌کنند مانند GNU configure ممکن است با این کار دچار سردرگمی شوند (یا اگر نشوند، ممکن است چنان فشاری بر fakeroot وارد آورند که خود fakeroot دچار اختلال شود). بنابراین توصیه می‌شود configure از درون fakeroot اجرا نشود. از آنجا که configure باید در هدف «debian/rules build» فراخوانی شود، اجرای «dpkg-buildpackage -rfakeroot» این موضوع را به شکل درست مدیریت می‌کند.

این ابزار تابع open() را پوشش نمی‌دهد. این به خودی خود ایرادی ندارد، اما اگر برنامه‌ای ()open را با فلگ‌های O_WRONLY و مود 000 فراخوانی کند، در فایل بنویسد، آن را ببندد و مجدداً تلاش کند فایل را برای خواندن باز کند، این بازگشایی شکست می‌خورد؛ زیرا حالت فایل 000 خواهد بود. اشکال کار اینجاست که اگر کاربر ریشه همین عملیات را انجام دهد ()open موفقیت‌آمیز خواهد بود، چرا که مجوزهای فایل برای کاربر ریشه اصلاً بررسی نمی‌شوند. تصمیم بر این شد که ()open پوشش داده نشود، زیرا ()open توسط توابع فراوان دیگری در libc (حتی آن‌هایی که هم‌اکنون نیز پوشش داده شده‌اند) استفاده می‌شود و در نتیجه باعث ایجاد حلقه‌ها (یا حلقه‌های احتمالی در آینده بر اثر تغییرات جزئی در پیاده‌سازی توابع مختلف libc) می‌گردد.

ابزار fakeroot تحت مجوز عمومی همگانی گنو (GNU General Public License، نسخه 2.0 یا بالاتر) توزیع می‌شود.

<joostje@debian.org>
<clint@debian.org>

عمدتاً توسط J.H.M. Dassen <jdassen@debian.org> همراه با تعداد زیادی تغییرات و اضافات توسط joost و Clint.

debuild(1), dpkg-buildpackage(1), faked(1), /usr/share/doc/fakeroot/DEBUG

مه ۲۰۲۵ fakeroot