Gentoo Linux e Distcc
1.Introduzione
Cos'è distcc?
Distcc è un programma ideato per distribuire i task di compilazione in una
rete di host partecipanti. È composto da un server, distccd e da un
programma client, distcc. Distcc può funzionare in modo trasparente con
ccache, Portage e Automake previa
opportuna configurazione.
Bootstrap con distcc
Se si prevede di utilizzare distcc per il bootstrap di una installazione
Gentoo, si veda la relativa sezione all'Usare
Distcc per il Bootstrap di questo documento.
2.Configurazione
Dipendenze
Per utilizzare distcc è necessario che tutti i computer collegati in rete
abbiano la stessa versione di GCC. È possibile mescolare, ad esempio, versioni
3.3.x (dove x varia), ma non 3.3.x e 3.2.x altrimenti i programmi
potrebbero contenere errori.
Installare distcc
Esistono alcune opzioni di cui è bene parlare prima di cominciare
l'installazione di distcc.
Distcc contiene un monitor grafico per tenere sotto controllo i task che il
tuo computer sta distribuendo per la compilazione. Se usi Gnome, metti 'gnome'
nelle tue USE flags. Se non usi Gnome e vuoi comunque utilizzare il monitor,
metti 'gtk' nelle tue USE flags.
Esempio 1: Installare distcc |
# emerge distcc
|
Configurare Portage per l'utilizzo di distcc
Configurare Portage per usare distcc è molto facile. È necessario seguire
questi semplici passi per ogni computer sul quale desideri utilizzare
distcc:
Esempio 2: Integrare distcc e Portage |
# emerge distcc
# nano -w /etc/make.conf
MAKEOPTS="-jN"
FEATURES="distcc"
|
Specificare gli host da utilizzare
Per impostare la lista degli host puoi usare distcc-config.
Ecco un esempio di alcuni host che potrebbero essere nella tua lista:
Esempio 3: Esempio di definizione degli host |
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
|
Potrebbe sembrare complicato, ma nella maggior parte dei casi una variante
della riga 1 o 2 sarà sufficiente.
Dato che la maggior parte degli utenti non userà le righe 3 o 4, rimando chi
fosse interessato alla
documentazione di
distcc.
Ad esempio, per impostare la riga 1 del listato precedente:
Esempio 4: Comando di esempio per impostare gli host |
# /usr/bin/distcc-config --set-hosts "192.168.0.1 192.168.0.2
192.168.0.3"
|
Modifica /etc/conf.d/distccd secondo le tue esigenze e assicurati
di impostare la direttiva --allow per usare soltanto gli host stabiliti.
Per maggiore sicurezza dovresti usare anche la direttiva --listen per
passare a distcc gli indirizzi IP da ascoltare (per sistemi multi-homed -
connessi a diverse reti). Per ulteriori informazioni sulla sicurezza in distcc
puoi consultare Distcc
Security Design.
Importante:
È importante usare --allow e --listen. Si consiglia quindi di leggere le
pagine man di distcc o il documento sulla sicurezza appena citato.
|
A questo punto devi avviare il demone distcc su tutti i computer della rete:
Esempio 5: Avvio del demone distcc |
# rc-update add distccd default
# /etc/init.d/distccd start
|
Configurare distcc per lavorare con automake
È generalmente più semplice rispetto alla configurazione di Portage. È
necessario
aggiornare la variabile d'ambiente PATH in modo che includa
/usr/lib/distcc/bin prima della locazione di gcc
(/usr/bin). Un avvertimento: se usi ccache devi mettere distcc
dopo ccache:
Esempio 6: Configurazione del path |
# export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"
|
A questo punto, invece di usare make, dovrai utilizzare
make -jN (dove N è un intero). Il valore di N dipende dalla
rete e dal tipo di computer che stai usando per compilare. Si consiglia di
effettuare dei test sulla configurazione per trovare il numero che
garantisce le prestazioni migliori.
3.Cross-Compiling
Una nota sul cross-compiling
Il cross-compiling è l'utilizzo di un'architettura per compilare programmi
per un'altra architettura. Questo potrebbe voler dire semplicemente
utilizzare un Athlon (i686) per compilare un programma per un K6-2 (i585)
oppure utilizzare una Sparc per compilare un programma per ppc.
Introduzione al cross-compiling
Se vuoi provare il cross-compiling puoi riferirti a The Cross Compile
HOWTO; Crossdev è deprecato.
4.Usare Distcc per il Bootstrap
1: Configurare Portage
È necessario effettuare il boot della nuova macchina con un LiveCD di Gentoo
Linux
e seguire la guida
all'installazione fino al bootstrap. Dopodichè si può continuare a
configurare Portage per usare distcc.
Esempio 7: Configurazione preliminare |
# nano -w /etc/make.conf
FEATURES="distcc"
MAKEOPTS="-jN"
|
Esempio 8: Impostare il path |
# export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"
|
2: Installare distcc
Prima di configurare distcc è necessario aggiungere l'utente 'distcc' a
/etc/passwd:
Esempio 9: Creare l'utente distcc |
# echo "distcc:x:240:2:distccd:/dev/null:/bin/false" >>
/etc/passwd
|
Importante:
È importante notare che non è questo il metodo corretto per aggiungere
un utente. Abbiamo seguito quest'altra via per il semplice motivo che in
questa fase dell'installazione, useradd (da usare normalmente per lo
scopo) non è ancora disponibile.
|
È ora possibile installare distcc:
Esempio 10: Installare distcc |
# USE='-*' emerge --nodeps sys-devel/distcc
|
3: Configurare distcc
Per configurare distcc, esegui distcc-config --install.
Esempio 11: Configurazione finale di distcc |
# /usr/bin/distcc-config --set-hosts "localhost host1 host2 host3
..."
|
Adesso distcc è configurato per il bootstrap! Segui la guida
ufficiale all'installazione ricordando di ri-emergere distcc dopo
l'emerge system. Ciò serve per assicurarsi che vengano
installate tutte le dipendenze.
Nota:
Durante il bootstrap e l'emerge system distcc
potrebbe non essere utilizzato. È normale, poichè alcuni ebuilds o
pacchetti non funzionano bene con distcc, quindi lo disabilitano
intenzionalmente.
|
5.Risoluzione dei Problemi
Mozilla e Xfree
Emergendo alcuni pacchetti, noterai che non vengono distribuiti (e quindi non
vengono compilati in parallelo). Ciò è dovuto al fatto che gli sviluppatori
di Mozilla e Xfree hanno disabilitato la compilazione parallela perchè causa
di problemi.
La compilazione può fallire anche con altri pacchetti per lo stesso identico
motivo. Se ti dovesse capitare,
segnala un bug.
Usare contemporaneamente host con hardened-gcc e non-hardened-gcc causa problemi
Con un titolo così lungo, ogni ulteriore spiegazione è superflua. Comunque,
se prevedi di usare distcc in una rete in cui alcuni host usano PaX/hardened-gcc ed altri no, avrai problemi.
Per evitare rischi dovrai organizzare il lavoro in anticipo: dovrai
eseguire hardened-gcc -R sugli host che hanno PaX/hardened-gcc,
oppure dovrai abilitare le protezioni PaX nel tuo kernel e lanciare emerge
hardened-gcc. Sono entrambe soluzioni valide dato che offrono una buona
protezione e sono trasparenti all'utente.
Usare versioni differenti di GCC
Se utilizzi versioni diverse di GCC sui tuoi host, avrai sicuramente
strani problemi. Assicurati quindi che tutti gli host usino la stessa
versione di GCC.
Le versioni più recenti di Portage usano ${CHOST}-gcc invece di
gcc. Significa che potresti avere dei problemi usando macchine di tipo
i686 insieme a macchine di altro tipo (i386, i586). Per aggirare il problema
puoi eseguire export CC='gcc' CXX='c++' oppure puoi aggiungere il
comando a /etc/make.conf.
Importante:
Questa procedura ridefinisce il modo in cui agisce Portage e in futuro
potrebbe portare a strani risultati. Seguila soltanto se stai usando
CHOSTs differenti tra loro.
|
6.Gli Extra di Distcc
Monitorare distcc
Distcc contiene due monitor. Quello testuale, compilato di default,
si chiama distccmon-text. Usarlo per la prima volta potrebbe essere
un po' complicato, ma in realtà è molto semplice. Se viene lanciato senza
parametri verrà eseguito una sola volta. Altrimenti, se gli viene passato un
numero, verrà aggiornato ogni N secondi, dove N è l'argomento passato.
L'altro monitor viene abilitato se gtk o gnome sono presenti
tra le USE flags. Questo monitor, piuttosto gradevole, è basato su GTK+
e gira sotto X. Sotto Gentoo è identificato come distccmon-gui
per non generare confusione. Altrove potrebbe essere identificato come
distccmon-gnome.
Esempio 12: Avvio dei monitor |
# distccmon-text N
# distccmon-gui
# DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-text N
# DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-gui
|
Importante:
Se la tua directory di distcc è altrove, modifica la variabile DISTCC_DIR
in maniera opportuna.
|
|