distccd(1) General Commands Manual distccd(1)

distccd - سرور توزیع‌شده کامپایلر C/C++

distccd --daemon [OPTIONS]

برنامه distccd سرور کامپایلر توزیع‌شده distcc(1) است. این سرور کارهای کامپایل را برای کلاینت‌های شبکه پذیرفته و اجرا می‌کند.

برنامه distcc می‌تواند روی TCP یا یک دستور اتصال مانند ssh(1) اجرا شود. اتصال‌های TCP سریع اما از نظر امنیتی نسبتاً ضعیف هستند. اتصال‌های SSH امن اما کندترند.

برای اتصال‌های SSH، برنامه distccd باید روی ماشین داوطلب (میزبان کمکی) نصب شده باشد اما نباید به عنوان یک دیمن در حال اجرا باشد؛ بلکه در صورت نیاز از طریق SSH راه‌اندازی خواهد شد. اتصالات SSH چندین مزیت دارند: هیچ درگاه (پورت) جدیدی توسط کلاینت یا سرور شنود نمی‌شود؛ کامپایل‌ها با دسترسی‌های کاربری که آنها را درخواست کرده اجرا می‌شوند؛ کاربران غیرمجاز نمی‌توانند به سرور دسترسی پیدا کنند؛ و کدهای منبع و خروجی در حین انتقال محافظت می‌شوند.

برای اتصالات TCP، برنامه distccd می‌تواند از طریق برنامه‌های شبیه inetd یا به عنوان یک سرور مستقل (standalone) اجرا شود. حالت مستقل پیشنهاد می‌شود زیرا کمی کارآمدتر بوده و به distccd اجازه می‌دهد تعداد کارهای ورودی را کنترل و تنظیم کند. از گزینه‌های --listen و --allow می‌توان برای کنترل دسترسی ساده مبتنی بر IP استفاده کرد.

برنامه distcc را می‌توان توسط کاربر root یا هر کاربر دیگری اجرا کرد. در صورت اجرا توسط کاربر root، این برنامه دسترسی‌های ممتاز خود را واگذار کرده و هویت خود را به کاربر مشخص‌شده با گزینه --user یا کاربری به نام "distcc" و یا کاربری به نام "nobody" تغییر می‌دهد.

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

روش پیشنهادی برای اجرای distccd به صورت یک سرور مستقل است. در این حالت distccd به اتصالات شبکه گوش فرا داده و چندین فرآیند فرزند را برای پاسخ‌گویی به آنها منشعب (fork) می‌کند.

اگر distcc را با استفاده از یک بسته توزیع نصب کرده‌اید، ممکن است بتوانید سرور را با سازوکار استاندارد سیستم‌عامل خود راه‌اندازی کنید، مانند:

# service distcc start

برای راه‌اندازی distccd به عنوان یک سرویس مستقل، دستوری شبیه به این را توسط کاربر root یا یک کاربر عادی اجرا کنید:

# distccd --daemon

برنامه distccd ممکن است به صورت یک دیمن مستقل تحت کنترل برنامه دیگری مانند init(8) یا daemontools اجرا شود. سوپرسرور، هنگام راه‌اندازی سیستم و همچنین هر زمان که distccd خارج شود، آن را اجرا می‌کند.

برنامه distccd باید دقیقاً مانند یک سرور مستقل اجرا شود، با این تفاوت که باید از گزینه --no-detach استفاده شود تا سوپرسرور بتواند بر آن نظارت کند.

برای مثال، جهت افزودن distccd به عنوان یک فرآیند به sysvinit لینوکس، این خط را به /etc/inittab اضافه کنید:

dscc:2345:respawn:/usr/local/bin/distccd --verbose --no-detach --daemon

برنامه distccd می‌تواند از طریق یک سوپرسرور شبکه مانند inetd یا xinetd اجرا شود. در این حالت inetd به اتصالات شبکه گوش می‌دهد و به محض رسیدن یک اتصال، distccd را فراخوانی می‌کند.

این حالت کمی کارایی کمتری نسبت به اجرای یک دیمن مستقل distccd دارد. برنامه distccd در این حالت قادر به کنترل تعداد کارهای هم‌روندِ پذیرفته‌شده نیست، اما ممکن است در تنظیمات inetd گزینه‌ای برای انجام این کار وجود داشته باشد.

برای inetd سنتی یونیکس، می‌توان خطی شبیه به این را به /etc/inetd.conf اضافه کرد:

distcc stream tcp nowait.6000 root /usr/local/bin/distccd distccd --inetd

برنامه inetd برای محافظت در برابر استفاده بیش‌ازحدِ تصادفی یا عمدی، محدودیتی بر روی نرخ اتصالات به یک سرویس اعمال می‌کند. مقدار پیش‌فرض در NetKit inetd لینوکس برابر ۴۰ اتصال در دقیقه است که برای distccd بسیار کم است. گزینه .6000 این محدودیت را به ۶۰۰۰ در دقیقه افزایش می‌دهد.

برای خاموش کردن یک سرور مستقل، یک سیگنال SIGTERM به فرآیند والد ارسال کنید. مطمئن‌ترین روش برای انجام این کار در یک اسکریپت، استفاده از گزینه --pid-file برای ثبت شناسه فرآیند (PID) آن است. متوقف کردن سرور به این شیوه به تمام کارهایی که در حال حاضر در دست انجام هستند اجازه می‌دهد تا به پایان برسند.

نمایش خلاصه اطلاعات نحوه استفاده.
نمایش نسخه دیمن و خروج.
محدودیتی برای تعداد کارهایی که در هر لحظه می‌توانند پذیرفته شوند تعیین می‌کند. به طور پیش‌فرض این مقدار برابر با تعداد CPUهای سیستم به علاوه ۲ تنظیم شده است تا امکان مسدود شدن برخی فرآیندها در ورودی/خروجی شبکه (network IO) وجود داشته باشد. (فقط در حالت دیمن.)
دیمن را در واگذاری CPU به سایر وظایف ماشین ملایم‌تر (با اولویت کمتر یا niceتر) می‌کند. مقدار NICENESS افزایشی بر اولویت کنونی فرآیند است. محدوده اولویت‌ها به سیستم‌عامل بستگی دارد اما معمولاً از 0 تا 20 است. به طور پیش‌فرض niceness به میزان 5 افزایش می‌یابد.
تنظیم پورت TCP برای شنود، به جای مقدار پیش‌فرض 3632. (فقط در حالت دیمن.)
به دیمن distccd دستور می‌دهد که روی آدرس IP تعیین‌شده با ADDRESS گوش فرا دهد. این گزینه می‌تواند برای کنترل دسترسی روی میزبان‌های متصل به چند شبکه (dual-homed) مفید باشد. (فقط در حالت دیمن.)
ذخیره شناسه فرآیند دیمن در فایل FILE. (فقط در حالت دیمن.)
اگر distccd با دسترسی root اجرا شود، هویت خود را به کاربر USER تغییر می‌دهد.
به distccd دستور می‌دهد تا اتصالات را از آدرس IP مشخص‌شده در IPADDR بپذیرد. طول ماسک CIDR را می‌توان به صورت اختیاری پس از یک اسلش وارد کرد، مانند 192.168.0.0/24، که در این حالت آدرس‌هایی که در پرارزش‌ترین بیت‌های MASK تطابق داشته باشند مجاز خواهند بود. اگر هیچ گزینه --allow مشخص نشده باشد، distccd بلافاصله خارج خواهد شد! اتصالات غیرمجاز با بستن فوری اتصال TCP رد می‌شوند. یک هشدار روی سرور ثبت می‌شود اما هیچ پیامی برای کلاینت ارسال نمی‌گردد.
اجازه دادن به شبکه‌های خصوصی (10.0.0.0/8، 192.168.0.0/16، 172.16.0.0/12 و 127.0.0.0/8).
اگر یک کار distccd بیش از SECONDS ثانیه طول بکشد، آن را متوقف می‌کند (kill می‌کند). این کار از بروز منع سرویس (DoS) ناشی از کلاینت‌هایی که به درستی ارتباط را قطع نمی‌کنند و کامپایلرهایی که پایان نمی‌یابند جلوگیری می‌کند. به طور پیش‌فرض این ویژگی غیرفعال است.
جدا نشدن از شلی که دیمن را راه‌اندازی کرده است.
برای هر اتصال فرآیند فرزند منشعب نکند، تا امکان اتصال gdb فراهم شود. اگر کارکرد آن را نمی‌دانید از آن استفاده نکنید!
ارسال پیام‌ها به فایل FILE به جای syslog. ثبت گزارش مستقیماً در یک فایل به طور قابل توجهی سریع‌تر از ارسال از طریق syslog بوده و توصیه می‌شود.
تعیین حداقل سطح اهمیت خطاهایی که در فایل گزارش گنجانده می‌شوند. زمانی مفید است که فقط می‌خواهید پیام‌های خطا را ببینید، نه ورودی مربوط به هر اتصال را. مقدار LEVEL می‌تواند هر یک از سطوح استاندارد syslog باشد، به ویژه critical, error, warning, notice, info, یا debug.
ارسال پیام‌های گزارش به stderr، به جای یک فایل یا syslog. این گزینه عمدتاً برای استفاده در اشکال‌زدایی در نظر گرفته شده است. در حالت inetd استفاده نکنید.
گنجاندن پیام‌های اشکال‌زدایی در گزارش. معادل با --log-level=debug
فعال کردن تمامی گزینه‌های مناسب برای اجرای distccd تحت gdb: اجرا به عنوان دیمن، ثبت مفصل گزارش در stderr، و جدا نشدن یا منشعب نکردن فرآیند. فقط برای کاربران بسیار ماهر (wizards).
فعال کردن سرور آمار HTTP. به طور پیش‌فرض غیرفعال است. (فقط در حالت دیمن.)
تنظیم پورت TCP برای شنود درخواست‌های HTTP، به جای مقدار پیش‌فرض 3633. (فقط در حالت دیمن.)
پاسخ‌گویی به کلاینتی که به stdin/stdout متصل است. همان‌طور که از نام آن مشخص است، این گزینه زمانی استفاده می‌شود که distccd از داخل یک سوپرسرور مانند inetd اجرا شود. در صورتی که stdin یک سوکت باشد، distccd حالت inetd را فرض می‌کند.
اتصال (bind) و شنود روی یک سوکت، به جای اجرا از طریق inetd. این گزینه برای حالت مستقل استفاده می‌شود. برنامه distccd هنگام شروع به کار در صورتی که stdin یک tty باشد حالت دیمن را فرض می‌کند، بنابراین هنگام راه‌اندازی distccd از طریق یک اسکریپت یا در یک اتصال غیرتعاملی ssh، گزینه --daemon باید به طور صریح مشخص شود.
به طور پیش‌فرض (از نسخه Distcc 3.3 به بعد) distcc فقط باینری‌هایی را اجرا می‌کند که به صورت نقاب‌گذاری‌شده (masqueraded) برای distcc در مسیر /usr/lib/distcc قرار دارند. این گزینه آن محدودیت را غیرفعال کرده و distcc را برای اجرای کدهای دلخواه باز می‌گذارد. این ویژگی عمدتاً برای مجموعه آزمون‌های distcc است. بخش MASQUERADING در distcc(1) را ببینید.
ثبت دردسترس بودن این سرور distccd با استفاده از کشف سرویس DNS مربوط به Avahi Zeroconf به نام (DNS-SD). این قابلیت به کلاینت‌های distcc در شبکه محلی اجازه می‌دهد بدون نیاز به فهرست کردن صریح نام میزبان یا آدرس IP این سرور در فهرست میزبان‌های distcc خود، به این سرور دسترسی پیدا کنند: کلاینت‌های distcc می‌توانند به سادگی از "+zeroconf" در فهرست میزبان‌های distcc خود استفاده کنند. به صورت اختیاری می‌توان از پارامتر -j برای تعیین حداکثر تعداد کارهایی که این سرور می‌تواند به طور هم‌زمان پردازش کند استفاده کرد. این گزینه تنها در صورتی در دسترس است که distccd با پشتیبانی از Avahi کامپایل شده باشد.
انجام احراز هویت متقابل بر پایه GSS-API. این گزینه تنها در صورتی در دسترس است که distccd با گزینه پیکربندی --with-auth کامپایل شده باشد.
نام principal امنیتی distccd که از محیط استخراج شده است را نمایش می‌دهد. این گزینه تنها در صورتی در دسترس است که distccd با گزینه پیکربندی --with-auth کامپایل شده باشد.
به distccd دستور می‌دهد اتصالات کاربرانی را که نام principal آنها در فایل FILE فهرست شده است رد کند. این گزینه تنها در صورتی در دسترس است که distccd با گزینه پیکربندی --with-auth کامپایل شده باشد و distccd با گزینه --auth اجرا شود.
به distccd دستور می‌دهد اتصالات را تنها از کاربرانی بپذیرد که نام principal آنها در فایل FILE فهرست شده است. این گزینه تنها در صورتی در دسترس است که distccd با گزینه پیکربندی --with-auth کامپایل شده باشد و distccd با گزینه --auth اجرا شود.

برنامه distcc می‌تواند یک نام نسبی یا مطلق از کامپایلر را به distccd ارسال کند. اگر به distcc یک نام فایل صریح و مطلق از کامپایلر داده شود، آن نام عیناً در هر دو سمت کلاینت و سرور استفاده می‌شود. اگر نام کامپایلر یک مسیر مطلق نباشد، یا اگر کلاینت در حالت نقاب‌گذاری (masquerade mode) استفاده شود، آن‌گاه متغیر PATH سرور جستجو می‌شود.

برنامه distccd مسیر جستجوی خود را از فرآیند والد خود به ارث می‌برد. به طور پیش‌فرض distccd تلاش می‌کند دایرکتوری‌هایی را که به نظر می‌رسد حاوی پیوندهای نقاب‌گذاری distccd هستند حذف کند تا در برابر بازگشت ناخواسته محافظت شود. متغیر محیطی DISTCCD_PATH می‌تواند برای تنظیم مسیر استفاده شود.

هنگامی که گزینه --verbose داده شده باشد، مسیر جستجو در گزارش ثبت می‌شود. در صورت بروز هرگونه ابهام، فایل‌های گزارش را بررسی کنید.

هنگامی که distccd از طریق ssh اجرا می‌شود، فایل $HOME/.ssh/environment ممکن است برای تنظیم مسیر مفید باشد. به ssh(1) مراجعه کنید.

برنامه distccd پیام‌ها را به طور پیش‌فرض در بخش daemon سیس‌لاگ (syslog) ثبت می‌کند، که معمولاً در /var/log/daemon یا /var/log/messages نوشته می‌شود. پیام‌های گزارش را می‌توان با استفاده از گزینه --log-file به فایل دیگری ارسال کرد.

اگر متغیر محیطی DISTCC_CMDLIST تنظیم شده باشد، فهرستی از دستورات پشتیبانی‌شده را از فایلی که نام آن در DISTCC_CMDLIST آمده است بارگذاری می‌کند و از پاسخ‌گویی به هر دستوری که کلمات پایانی آن به تعداد DISTCC_CMDLIST_MATCHWORDS با کلمات دستوری در آن فهرست تطابق نداشته باشد، خودداری می‌نماید. توضیحات موجود در src/serve.c را ببینید.
تعداد کلمات از انتهای دستور که باید تطبیق داده شوند. مقدار پیش‌فرض 1 است.
هنگام شروع distccd، اگر این متغیر تنظیم شده باشد، مقدار آن بدون تغییر برای PATH اجرای دستورات استفاده خواهد شد. کدی که به طور معمول تلاش می‌کند دایرکتوری‌های masquerade را از مسیر حذف کند، نادیده گرفته می‌شود.
اگر روی 1 تنظیم شود، فایل‌های موقت پس از استفاده حذف نمی‌شوند.

توجه داشته باشید که DISTCC_LOG بر مقصد لاگ برای سرور تأثیری ندارد.

در لینوکس، گزینه سوکت TCP_DEFER_ACCEPT را فعال می‌کند. پیش‌فرض فعال است.
دایرکتوری برای فایل‌های موقت مانند خروجی پیش‌پردازنده. به طور پیش‌فرض از /tmp/ استفاده می‌شود.
در صورت تنظیم، نام principal را مشخص می‌کند که distccd تحت آن اجرا می‌شود، و برای احراز هویت با کلاینت استفاده می‌شود. این متغیر محیطی تنها در صورتی استفاده می‌شود که distccd با گزینه پیکربندی --with-auth کامپایل شده باشد و distccd با گزینه --auth اجرا شود.

distcc(1)، pump(1)، include_server(1)، gcc(1)، make(1) و ccache(1) http://code.google.com/p/distcc

کنترل دسترسی مبتنی بر IP در برابر مهاجمانی که قادر به جعل (spoof) اتصالات TCP باشند امن نیست، و نمی‌تواند بین کاربران مختلف در یک کلاینت تمایز قائل شود.

اتصالات TCP در برابر مهاجمانی که قادر به مشاهده یا دستکاری ترافیک شبکه باشند امن نیستند.

از آنجا که ccache کامپایل حاصل از فایل‌های .i را کش نمی‌کند، فراخوانی آن از طریق distccd سودمند نیست.

شما در استفاده از distcc آزاد هستید. نرم‌افزار distcc (شامل این راهنما) تنها تحت شرایط مجوز عمومی همگانی گنو (GNU GPL) نسخه ۲ یا بالاتر می‌تواند کپی، تغییر داده یا توزیع شود. نرم‌افزار distcc بدون هیچ‌گونه ضمانتی ارائه می‌شود. نسخه‌ای از GPL در فایل COPYING گنجانده شده است.

برنامه distcc توسط Martin Pool <mbp@sourcefrog.net> و با همکاری محققان متعددی از جمله Wayne Davison، Frerich Raabe، Dimitri Papadopoulos و افراد دیگری که در فایل NEWS ذکر شده‌اند نوشته شده است. برای نویسندگان حالت pump به pump(1) مراجعه کنید. لطفاً باگ‌ها را به <distcc@lists.samba.org> گزارش دهید.

9 June 2008