Praca z distcc w Gentoo
1.
Wprowadzenie
Co to jest distcc?
Distcc to program przeznaczony do dystrybucji kompilacji przez sieć do innych
komputerów. Składa się z serwera distccd i programu klienta
distcc. Po odpowiednim skonfigurowaniu Distcc może pracować
transparentnie wraz z ccache, Portage
i Automake.
Używanie distcc do bootstrapu
Jeśli distcc ma pomóc podczas instalacji Gentoo na etapie bootstrapu, należy
najpierw przeczytać akapit Używanie distcc do
bootstrapu, który znajduje się w dalszej części tego dokumentu.
2.
Instalacja
Wymagania
Aby możliwe było skorzystanie z Distcc, wszystkie komputery w sieci muszą
posiadać tę samą wersję GCC. Mieszanie kompilatorów w wersjach 3.3.x (gdzie
zmienia się x) jest w porządku, jednak mieszanie 3.3.x z 3.2.x może
przynieść niepożądany rezultat w postaci błędów podczas kompilacji lub
uruchomienia.
Instalacja distcc
Jest kilka rzeczy z którymi należy się zapoznać przed rozpoczęciem instalacji
distcc.
Distcc dostarczane jest wraz z graficznym monitorem do nadzorowania zadań, które
komputer rozsyła do kompilacji. Jeśli używane jest środowisko Gnome, należy
dodać flagę 'gnome' do zmiennej USE. Jeśli Gnome nie jest używany, nadal można
używać graficznego monitora poprzez dodanie flagi 'gtk'.
Listing 2.1: Instalacja distcc |
# emerge distcc distcc-config
|
Ważne:
Distcc musi zostać zainstalowane na wszystkich komputerach biorących udział w
budowaniu programów.
|
Konfiguracja Portage do współpracy z distcc
Konfiguracja Portage tak, aby korzystał z distcc jest łatwa. Należy wykonać
następujące czynności na każdym systemie, który będzie brał udział w dystrybucji
kompilacji:
Listing 2.2: Integracja distcc z Portage |
# emerge distcc
# nano -w /etc/make.conf
MAKEOPTS="-jN"
FEATURES="distcc"
|
Wybieranie komputerów do pracy distcc
Należy użyć polecenia distcc-config, aby ustawić listę komputerów.
Poniżej przykład kilku wpisów które mogłyby się znaleźć na takiej liście:
Listing 2.3: Przykład definicji komputerów |
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
|
To może wyglądać skomplikowanie, ale w większości przypadków zadziała wariant
z linii 1 lub 2.
Jako że większość ludzi nie będzie używać linii 3 i 4, po więcej informacji
odwołamy się do dokumentacji distcc (man
distcc).
Ustawienie przykładu z pierwszej linii:
Listing 2.4: Przykładowe polecenie ustalające listę komputerów |
# /usr/bin/distcc-config --set-hosts "192.168.0.1 192.168.0.2 192.168.0.3"
|
Należy dostosować do konkretnych potrzeb plik /etc/conf.d/distccd
upewniając się, że użyta jest dyrektywa --allow, co umożliwi dostęp tylko
zaufanym komputerom. Dla zwiększenia bezpieczeństwa, należy także użyć
dyrektywy --listen, aby powiedzieć demonowi distcc na jakim adresie IP ma
nasłuchiwać (dla systemów z wieloma adresami IP). Więcej informacji o
bezpieczeństwie w distcc można znaleźć w zarysie bezpieczeństwa w
distcc.
Ważne:
Użycie --allow i --listen jest kluczowe. Aby uzyskać więcej
informacji, należy przeczytać dokumentację man programu distccd lub powyższy
dokument o bezpieczeństwie.
|
Teraz trzeba uruchomić demona distcc na wszystkich komputerach:
Listing 2.5: Uruchamianie demona distcc |
# rc-update add distccd default
# /etc/init.d/distccd start
|
Konfiguracja distcc do pracy z automake
W niektórych przypadkach jest to łatwiejsze niż konfiguracja z Portage. Jedyne
co trzeba zrobić to zmiana zmiennej PATH tak, aby zawierała ścieżkę
/usr/lib/distcc/bin przed katalogiem zawierającym gcc
(/usr/bin). Jednakże jest pewien wyjątek. Jeśli używane jest ccache
należy dodać distcc zaraz po ccache:
Listing 2.6: Ustawianie zmiennej path |
# export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"
|
Następnie zamiast normalnego wywołania make, należy wpisać make
-jN (gdzie N jest liczbą całkowitą). Wartość liczby N zależy od konfiguracji
sieci oraz rodzaju komputerów użytych do kompilacji. Trzeba przetestować różne
ustawienia by znaleźć te najbardziej optymalne pod względem wydajności.
3.
Kompilacja skrośna
Kompilacja skrośna to używanie jednej architektury do kompilacji programów dla
innej. Może być to np. użycie Athlona (i686) do kompilacji programu
na K6-2 (i586) albo użycie SPARC-a do kompilacji programu dla PPC (Power PC).
Na temat kompilacji skrośnej można poczytać w Przewodniku kompilacji skrośnej za
pomocą DistCC.
4.
Używanie distcc do bootstrapu
Krok 1: konfiguracja Portage
Należy uruchomić komputer z nowym Gentoo LiveCD i postępować zgodnie z Podręcznikiem instalacji
Gentoo aż do części dotyczącej bootstrapu (Więcej informacji na temat
bootstrapu można znaleźć w odpowiedziach na
najczęściej zadawane pytania). Następnie trzeba skonfigurować Portage do
pracy z distcc:
Listing 4.1: Wstępna konfiguracja |
# nano -w /etc/make.conf
FEATURES="distcc"
MAKEOPTS="-jN"
|
Listing 4.2: Ustawienie zmiennej path |
# export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"
|
Krok 2: instalacja distcc
Instalacja distcc:
Listing 4.3: Instalacja distcc w nowym systemie |
# USE='-*' emerge --nodeps sys-devel/distcc
|
Krok 3: Konfiguracja distcc
Trzeba uruchomić polecenie distcc-config --install:
Listing 4.4: Końcowa konfiguracja distcc |
# /usr/bin/distcc-config --set-hosts "localhost host1 host2 host3 ..."
|
Teraz distcc jest skonfigurowane do bootstrapu! Należy kontynuować oficjalną
instrukcję instalacji i nie zapomnieć ponownie zainstalować distcc zaraz
po emerge system. Zapewni to poprawną instalację wszystkich pakietów
wymaganych przez distcc.
Uwaga:
Podczas bootstrapu i emerge system może się wydawać że distcc nie jest
używane. Jest to pożądane zachowanie jako że niektóre ebuildy nie współpracują
z distcc, więc go wyłączają.
|
5.
Rozwiązywanie błędów
Nie wszystkie pakiety korzystają z distcc
Podczas instalacji różnych pakietów można zauważyć że niektóre nie są rozsyłane
(i nie są budowane współbieżnie). Dzieje się tak, ponieważ niektóre pliki
Makefile programów po prostu nie potrafią współpracować z równoległymi
kompilacjami i twórcy ebuildów do tych programów muszą wyłączać tę możliwość.
Czasem distcc może spowodować, że pakiet nie chce się skompilować. Jeśli tak się
zdarzy, należy to zgłosić.
Mieszanie wersji GCC
Jeśli na naszych komputerach zainstalowane są różne wersje GCC, prawdopodobnie
będzie wiele dziwnych problemów. Rozwiązaniem jest zapewnienie że wszystkie
systemy będą miały tą samą wersję GCC.
Ostatnie aktualizacje Portage sprawiły, że używa on ${CHOST}-gcc zamiast
gcc. Oznacza to że jeśli używamy maszyn i686 z innymi typami (i386, i586)
szybko wpadniemy w kłopoty. Rozwiązaniem tego może być wykonanie
poleceniaexport CC='gcc' CXX='c++' lub wpisanie go na stałe do
/etc/make.conf.
Ważne:
Wykonanie powyższego polecenia zmienia zachowanie Portage i może nieść za sobą
dziwne rezultaty w przyszłości. Należy robić to tylko wtedy, gdy miesza się
różne ustawienia CHOST.
|
-march=native
W wersji GCC 4.3.0 pojawiła się obsługa przełącznika -march=native, który
sam wykrywa typ procesora i włącza dla niego najlepsze ustawienia. Niestety
przełącznik ten może sprawiać problemy przy pracy z distcc, gdyż może
prowadzić do pomieszania kodu zbudowanego dla dwóch róznych procesorów (np. AMD
i Pentium). Dlatego nie należy używać -march=native lub
-mtune=native w CFLAGS i CXXFLAGS gdy buduje się za pomocą
distcc.
6.
Dodatki do distcc
Monitory distcc
Distcc dostarczane jest z dwoma monitorami. Pierwszy, działający w trybie
tekstowym jest instalowany zawsze i nazywa się distccmon-text. Pierwsze
jego uruchomienie może wprowadzić w zakłopotanie, ale jest on naprawdę całkiem
łatwy w użyciu. Jeśli zostanie uruchomiony bez żadnych parametrów uruchomi się
raz. Jednakże jeśli poda mu się jako argument liczbę, będzie odświeżał ekran co
określoną liczbę sekund.
Kolejny program monitorujący jest instalowany tylko wtedy gdy mamy ustawioną w
zmiennej USE którąkolwiek z flag gtk lub gnome. Oparty jest on na
GTK+, działa w środowisku X i ma bardzo ładny wygląd. W Gentoo ten monitor
nazwany został distccmon-gui. W innych źródłąch może być nazywany
distccmon-gnome.
Listing 6.1: Uruchamianie monitorów |
# distccmon-text N
# distccmon-gui
# DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-text N
# DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-gui
|
Ważne:
Jeśli katalog distcc ma inną lokalizacje, należy odpowiednio ustawić
zmienną DISTCC_DIR.
|
Materiał udostępniany na podstawie licencji Creative Commons -
Attribution / Share Alike.
|