В ерсія 1 (альфа)

За мотивами:


Вступ

Distcc - програма спеціально розроблена для розподілу задач компіляції через мережу серед вузлів учасників. Вона складається з серверної ?distccd та клієнтської distcc частини. Distcc може працювати, з незначними налаштуваннями, абсолютно прозоро для ccache, Portage, та Automake.

Встановлення

Зауваження:

Коли Ви збираєтесь використовувати Distcc, всі вузли у мережі повинні мати однакову версію GCC. Наприклад, змішування 3.3.x (де x змінюється) ще допустимо, але змішування 3.3.x з 3.2.x приведе до помилки компіляції чи помилки при роботі програми.

Встановлення distcc у Gentoo

Distcc поставляється з графічним монітором для наочного спостерігання за завданнями компіляції, що посилаються з Вашого комп'ютера на інші. Цей монітор використовує бібліотеку gtk тому для його встановлення коли використовуєте Gnome додайте 'gnome' в USE для програми, коли ні додайте gtk в USE для цієї програми.

# emerge distcc

Налаштування Portage для роботи з distcc

Щоб налаштувати Portage використовувати distcc потрібно у файлі /etc/make.conf встановити директиву MAKEOPTS="-jN" де N подвоєне число доступних вузлів + 1, та до властивостей описаних у директиві FEATURES дописати: FEATURES="distcc"

Визначення вузлів, що прийматимуть участь у розподіленій компіляції.

Щоб встановити список вузлів використовуйте команду distcc-config. Ось приклади можливих команд:

# /usr/bin/distcc-config --set-hosts "192.168.0.1 192.168.0.2 192.168.0.3"
# /usr/bin/distcc-config --set-hosts "192.168.0.1/2 192.168.0.2 192.168.0.3/10"
# /usr/bin/distcc-config --set-hosts "192.168.0.1:4000/2 192.168.0.2/1 192.168.0.3:3632/4"
# /usr/bin/distcc-config --set-hosts "@192.168.0.1 @192.168.0.2:/usr/bin/distccd 192.168.0.3"

Також існує декілька інших методів встановлення distcc на вузлах, докладніше у distcc(1) Якщо Ви бажаєте компілювати на локальному комп'ютері додайте localhost у список вузлів, якщо ні то не додавайте. На повільних машинах краще локальний вузол не включати. Перевіряйте продуктивність!

У більшості випадків приклади 1 і 2 працюватимуть, для використання прикладів 3, 4 потрібно перечитати distcc(1).

Будьте впевнені, що вірно встановили директиви --allow для обмеження доступу небажаних вузлів, та --listen для вказання сервісу distccd котрий ІР прослуховувати у файлі: etc/conf.d/distccd. Більше інформації про безпеку в distcc можна знайти у ?distccd(1) та Distcc Security Design.

Всі вище вказані пункти потрібно виконати на всіх вузлах учасниках розподіленої компіляції враховуючи їх специфічні ролі.

Запуск distcc

Запуск сервісу distcc здійснюється також на всіх комп'ютерах учасниках розподіленої компіляції. Запускаємо сервіс командою:

# /etc/init.d/distccd start

Для автоматичного старту сервісу при завантажені комп'ютера виконуємо:

# rc-update add distccd default

P.S. Перед запуском distccd вам може знадобитись підредагувати в файлі /etc/conf.d/distccd в опції DISTCCD_OPTS параметр --allow 192.168.0.0/24 таким чином, щоб він відповідав вашій мережі і масці (наприклад, в мене мережна маска 22, тому в мене це все виглядає так:

DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.0.0/22")

Налаштування Distcc для роботи з Automake та Ccache

Все що потрібно зробити це змінити Вашу змінну середовища PATH, щоб вона включала /usr/lib/distcc/bin перед директорією що містить gcc (/usr/bin). Однак, якщо використовуєте ccache потрібно прописати distcc після ccache:

# export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"

Ці зміни потрібно провести у Вашому .bashrc чи еквівалентному файлі, щоб шляхи вірно встановлювалась при кожному входження в систему.

Тепер замість нормальної команди make, можна виконувати make -jN (де N натуральне). Значення N залежить від мережі та типу комп'ютерів, що використовуються для компіляції. Підберіть собі значення при якому продуктивність максимальна.

Кросплатформенна компіляція

Кросплатформенна компіляція використовує одну архітектуру, щоб побудувати програму для іншої архітектури. Це так само просто як використання Athlon (i686) для збирання програм під K6-2 (i586), чи використання Sparc для збирання програм під ppc. Для детальнішого ознайомлення прочитайте The Cross Compile HOWTO; Crossdev вже не підтримується.

Використання Distcc для Bootstrap

Нормально завантажуємось з Gentoo Linux LiveCD і слідуємо інструкціям по встановленню до пункту bootstrapping. Тоді, як було описано вище налаштовуємо Portage для використання distcc:

# cat /etc/make.conf
...
FEATURES="distcc"
...
MAKEOPTS="-jN"

Встановлення шляхів

# export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"

Перед самим встановленням distcc, потрібно додати користувача distcc до файлу /etc/passwd:

# echo "distcc:x:240:2:distccd:/dev/null:/bin/false" >>/etc/passwd

Це дуже поганий метод додавання користувачів, але у зв'язку з відсутністю програми useradd на даному етапі встановлення системи, можна ним скористатись. Встановлюємо distcc командою:

# USE='-*' emerge --nodeps sys-devel/distcc

Тепер здійснюємо налаштування Distcc, запускаємо distcc-config --install для встановлення distcc:

# /usr/bin/distcc-config --set-hosts "localhost 192.168.0.4 192.168.0.6"

Тепер маємо Distcc при bootstrap! Можна продовжувати слідувати інструкціям по встановленню системи, але не забудьте перевстановити distcc після встановлення системи, просто для гарантії встановлення всіх залежностей.

Чесно кажучи при bootstrap та emerge system не варто використовувати distcc, бо з-за глючності та кривизни деяких ebuild-ів можуть бути проблеми...

Додатки Distcc

Distcc поставляється з двома моніторинговими програмами. Текстова утилітка будується завжди і зветься distccmon-text. При першому запуску вона може здатись трохи незрозумілою, але насправді вона дуже проста у використанні. Коли запустити програму без аргументів вона запуститься раз. Однак надавши в аргумент натуральне число вона буде автоматично запускатись через вказане у параметрі число секунд.

# distccmon-text N
# DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-text N

Інший монітор встановлюється тільки при включеному gtk чи gnome в USE. Цей монітор графічний й досить привабливий. У Gentoo графічний монітор зветься distccmon-gui. По іншому його називають distccmon-gnome.

# distccmon-gui
# DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-gui

Якщо у вас директорія distcc є в іншому місці змініть відповідно змінну DISTCC_DIR.

Проблеми та шляхи їх вирішення

При встановленні пакетів Ви помітите, що деякі з них не компілюватимуться розподілено (не збираються паралельно), це тому що розробники ebuild-ів для Mozilla та Xfree насильно відключили паралелізм з-за відомих проблем.

Деколи distcc приводить до помилок компіляції. Коли Ви це помітили відішліть рапорт розробникам.

Попередження: Суміш hardened-gcc та non-hardened-gcc однозначно приводить до ВЕЛИКИХ проблем.

Бажано ?включити підтримку PaX в ядро Лінукса та встановити hardened-gcc, або запускати hardened-gcc -R, на всіх вузлах що мають PaX/hardened-gcc. Це дозволить отримати надзвичайно стабільну систему, стійку до переповнення буферів і зовсім непомітно для користувачів.

Змішування версій gcc НЕ ДОПУСКАЄТЬСЯ, всі вузли повинні мати одну версію gcc.

Останні зміни в Portage вказують Portage використовувати ${CHOST}-gcc замість просто gcc. Це означає можливість змішування архітектури i686 машини з іншими типами (i386, i586) і як наслідок ВЕЛИКІ проблеми. Щоб виправити потрібно export CC='gcc' CXX='c++' чи прописати їх "по старому" в /etc/make.conf. Увага це змінить звичну поведінку Portage і може завдати неприємностей в майбутньому. Тому бажано робити це тимчасово і тільки у випадку "звіринцю" з CHOST.

Література

--Svyat 17:25, 2 лист 2005 (EET)