Distcc v Gentoo Lisa Seelye Mike Frysinger Erwin Sven Vermeulen Lars Weiler Tiemo Kieft Mirek Dvořák Jan Kundrát Tento dokument má být návodem, jak použít distcc v Gentoo. 1.11 2005-03-25 Úvod
Co je distcc?

Distcc je program, který rozloží kompilaci mezi několik strojů v síti. Skládá se ze serveru, distccd, a klientské části, programu distcc. Distcc umí transparentně pracovat s ccache i Portage, jen s minimem úsilí.

Použití distcc při instalaci systému

Pokud plánujete použít distcc při instalaci Gentoo, přečtěte si prosím sekci použití distcc pro bootstrap systému.

Nastavení
Závislosti

Abyste mohli používat distcc, musí mít všechny stroje v síti stejnou verzi GCC. Můžete míchat 3.3.x (kde je x rozdílné), ale nelze směšovat 3.3.x a 3.2.x, protože ve výsledných programech by byly chyby.

Instalace distcc

Je tu několik věcí, na které byste si před instalací distcc měli dát pozor.

Distcc je dodáváno s grafickou nadstavbou, která monitoruje, jaké části kódu, váš stroj posílá ke kompilaci ven. Pokud používáte GNOME, tak přidejte "gnome" do proměnné USE (v make.conf). Nepoužíváte-li jej a přesto chcete monitor používat, nastavte USE proměnnou "gtk".

# emerge distcc
Nastavení Portage

Nastavení Portage je jednoduché. Stačí udělat následující kroky na každém systému, který se zúčastní distribuované kompilace:

# emerge distcc
# nano -w /etc/make.conf
(Zadej N podle své situace)
(Obvykle počet všech  CPU + 1)
MAKEOPTS="-jN"
(Přidejte distcc do proměnné FEATURES)
FEATURES="distcc" (pozn. překladatele (distcc ccache …))
Zadání zúčastňujících se strojů

Použijte příkaz distcc-config k vytvoření seznamu účastnících se strojů. Příklad konfigurace:

192.168.0.1          192.168.0.2                       192.168.0.3
192.168.0.1/2        192.168.0.2                       192.168.0.3/10
192.168.0.1:4000/2   192.168.0.2/1                     192.168.0.3:3632/4
@192.168.0.1         @192.168.0.2:/usr/bin/distccd     192.168.0.3
(Existuje ještě několik dalších metod, jak definovat seznam strojů;
detaily viz manuálová stránka distcc.)

Zdá se to komplikované, ale ve většině případů budou fungovat varianty příkladů z první nebo druhé řádky.

  • 1. řádka jsou jen stroje oddělené mezerou
  • 2. řádka udává maximální množství úkolů, které lze (v jednom okamžiku) jednomu stroji poslat, pomocí definování čísla /N

I když většina lidí 3. a 4. řádku nepoužije, dovolujeme si Vás tímto nasměrovat na dokumentaci distcc, kde je možnost získat další informace.

Např. použití první řádky z předchozího příkladu:

# /usr/bin/distcc-config --set-hosts "192.168.0.1 192.168.0.2
192.168.0.3"

Editujte podle potřeby /etc/conf.d/distccd a ujistěte se, že používáte --allow k umožnění přístupu jen povoleným strojům. K dalšímu zvýšení bezpečnosti můžete použít direktivu --listen, která distcc démonu říká, na kterých IP adresách má naslouchat (užitečné pro systémy s více IP adresami). Další informace o zabezpečení distcc najdete na stránce Distcc Security Design.

Nyní spusťte distcc démona na všech účastnících se strojích:

(Přidání distccd do runlevelu default)
# rc-update add distccd default
(Spuštění distcc démona)
# /etc/init.d/distccd start
Nastavení spolupráce distcc s Automake

V některých případech je to jednodušší než nastavení Portage. Musíte jen změnit proměnnou PATH tak, aby obsahovala /usr/lib/distcc/bin před adresářem obsahujícím gcc (/usr/bin).Má to však háček - používáte-li ccache, musíte distcc dát do proměnné path až za ccache:

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

Nyní již jen místo make volejte make -jN (kde N je celé číslo). Hodnota N záleží na Vaší síti a strojích, které ke kompilaci používáte. Já používám duální P3 K6-2/400, který kompiluje všechno pro můj desktop ( 1200MHz Athlon Thunderbird) a používám -j5. Vyzkoušejte si vlastní nastavení, při kterém bude výkon nejvyšší.

Cross-kompilace
Poznámky k meziplatformové kompilaci

Cross-kompilace znamená vytváření programů pro jednu architekturu pomocí stroje jiné architektury. Jednoduše můžete použít Athlon (i686) k výrobě programu pro K6-2 (i586) nebo použít SPARC k výrobě programu pro PPC.

Úvod do cross-kompilace

Jestliže chcete cross-kompilaci vyzkoušet, měli byste se podívat na The Cross Compile HOWTO; crossdev je zastaralý.

Použití distcc během bootstrapu systému
Krok 1: konfigurace Portage

Nabootujte váš stroj pomocí LiveCD Gentoo Linuxu a postupujte podle instalačních instrukcí až k bootsrappingu. Pak nakonfigurujte Portage, aby používal distcc:

# nano -w /etc/make.conf
(Přidejte distcc do proměnné FEATURES)
FEATURES="distcc"
(Změňte MAKEOPTS tak, aby obsahovalo -jN, kde N nechť
odpovídá vaší síti a strojům (N je celé číslo))
MAKEOPTS="-jN"
# export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"
Krok 2: instalace distcc

Před instalací distcc musíte přidat uživatele distcc do /etc/passwd:

# echo "distcc:x:240:2:distccd:/dev/null:/bin/false" >> /etc/passwd
Je důležité poznamenat, že přidat uživatele tímto způsobem je velmi špatné. Ale jinak to v této fázi nejde, chybí totiž program useradd, který normálně pro přidávání uživatelů používáme.

Instalace distcc:

# USE='-*' emerge --nodeps sys-devel/distcc
Krok 3: nastavení distcc

K nastavení distcc spusťte distcc-config --install:

(Nahraďte host1, host2, ...  IP adresami účastnících se strojů)
# /usr/bin/distcc-config --set-hosts "localhost host1 host2 host3 ..."
Příklad: /usr/bin/distcc-config --set-hosts "localhost 192.168.0.4 192.168.0.6"

Distcc je teď připraven pro bootstrap! Můžete pokračovat v instalaci a řídit se normální instalační příručkou a nezapomeňte znovu nainstalovat distcc po emerge system. To zajistí konzistenci všech závislostí.

Během bootstrapu a emerge system se může stát, že distcc nebude použito. To je nutné, protože některé ebuildy s distcc neumí správně spolupracovat, takže jej schválně zakazují.
Problémy
Mozilla a Xfree

Během instalace některých balíčků si možná všimnete, že některé z nich distcc nepoužívají, nejsou kompilovány paralelně. Je to tím, že vývojáři ebuildů Mozilly a Xfree tuto funkci zakázali, neboť se o ní ví, že způsobuje problémy.

Občas distcc způsobí pád kompilace. Když se vám to stane, oznamte, prosím, chybu, uvítáme to.

Společné použití strojů s hardened-gcc a normálním hardened-gcc nebude fungovat

S takhle dlouhým titulkem je jakékoli vysvětlování skoro zbytečné. Zkrátka jestliže plánujete použití distcc zároveň na strojích, které mají PaX/hardened-gcc a dalších, které jej nemají, dočkáte se problémů.

Řešení vyžaduje jistý trik; na stroji s  PaX/hardened-gcc potřebujete spustit hardened-gcc -R nebo v jádře povolit ochrany PaX a spustit emerge hardened-gcc. Obojí není špatný nápad, protože většina ochran poskytovaných těmito balíčky je uživatelsky transparentní.

Společné použití různých verzí GCC

Pokud máte na svých strojích různé verze GCC, budete mít divné potíže. Řešením je použití stejných verzí GCC na všech strojích.

Poslední verze Portage používají při kompilaci ${CHOST}-gcc místo gcc. To znamená, že při kombinaci i686 s jinými stroji (i386, i586) budete mít problémy. Mohlo by pomoci export CC='gcc' CXX='c++' nebo toto zadat do /etc/make.conf, ale chce to otestovat. Když se vám to povede, pošlete mi, prosím zprávu (Lisa Seelye).

Něco navíc k distcc
Distcc monitory

Distcc je dodáván se dvěma monitory. První, textově orientovaný, se jmenuje distccmon-text. Jeho první spuštění může být trochu matoucí, ale ve skutečnosti je jeho používání jednoduché. Když jej spustíte bez parametrů, proběhne jen jedenkrát. Ale když mu dáte jako parametr číslo, bude zobrazovat informace každých N sekund kde N je parametr, který jste mu předali.

Druhý monitor je možné používat jen se zapnutou podporou gtk nebo gnome v USE proměnné, je totiž založen na podpoře GTK+, běží v prostředí X a je velmi roztomilý.

# distccmon-text N
(nebo)
# distccmon-gnome
Ke sledování využití distcc Portagem, můžete použít:
# DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-text N
(nebo)
# DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-gnome
Pokud je adresář distcc někde jinde, musíte odpovídajícím způsobem změnit proměnnou DISTCC_DIR.