Compilazione distrubuita con distcc howto

Chi ha la fortuna di avere in casa piu pc e si trova spesso nell'esigenza di dover compilare sorgenti che richiedono molto tempo per la compilazione, è possibile sfruttare il programma distcc. Distcc non è altro che un programma che serve per distribuire il lavoro richiesto per la compilazione di sorgenti scritti in C, C++ aumentando quindi la velocita. In realta il discorso è applicabile anche in uno scenario in cui le macchine non sono unicamente all'interno di una lan(10-100mbit), ma anche a macchine collegate tra loro attraverso internet o comunque attraverso un protocollo TCP. Ovviamente le prestazioni dipendono anche dalla velocita di trasmissione dei dati poiche le macchine si devono scambiare i sorgenti e le compilazioni parziali; piu veloce è il canale di trasmissione e maggiore sarà l'efficenza del sistema di compilazione.
La cosa interessante di questo programma è che sfruttando più macchine per  la compilazione, a lavoro finito, si ottiene esattamente lo stesso risultato che compilando con una sola macchina, in un tempo però molto inferiore.
La flessibilita del programma sta nel fatto che non richiede particolari distrubuzioni o librerie per le varie macchine, ma è sufficiente che su ogni macchina sia installato un cross-compiler (e distcc ovviamente): è comunque fortemente consigliato avere anche la stessa versione del compilatore su ogni macchina per evitare problemi o noie in fase di compilazione.

I suggerimenti che darò ora per la configurazione del programma si riferiscono alla distribuzione slackware, ma credo sia facilmente adattabile alle altre distribuzioni.

Se avete fatto una installazione completa di slackware vi troverete già tutti i programmi necessari sulla vostra macchina. Se non li avete, potete scaricare i pacchetti da un qualsiasi mirror di slackware, oppure se volete compilare i programmi è sufficiente seguire la solita procedura  ./configure && make && sudo make install. Se volete seguire le direttive ufficiali del pacchetto di slackware il configure è il seguente:

# ./configure --prefix=/usr --datadir=/usr/share/distcc --sysconfdir=/etc --with-gnome

Una volta installato il programma passiamo alla configurazione. Per prima cosa dobbiamo dire al programma quali nodi sono disponibili per la compilazione distribuita. Si puo fare in piu modi: usando le variabili d'ambiente $DISTCC_HOSTS, oppure $DISTCC_DIR/hosts, altrimenti editando i file ~/.distcc/hosts, oppure /etc/distcc/hosts.
Se usiamo il metodo delle variabili d'ambiente un esempio è quello si esportare la  variabile in questo modo:

# export DISTCC_HOSTS='localhost macchina1 macchina2'

dove macchina1 e macchina2 indicano 2 pc che saranno usati per la compilazione.

nel caso invece vogliate editare uno dei 2 file gia citati, è sufficiente inserire in una riga di testo, il nome delle macchine separate da uno spazio.

Vi ricordo che nel caso non disponiate di un dns interno alla rete, dovete editare il file /etc/hosts in modo da associare all'ip delle macchine il loro nome aggiungendo ad esempio:

192.168.0.3             macchina1
192.168.0.4             macchina2

Se volete potete usare anche direttamente l'indirizzo e non il nome della macchina, evitando di dover mettere mano al file /etc/hosts.
A questo punto distcc saprà con quali macchine potrà compilare nel momento opportuno.

Se usate una configurazione come quella appena presentata, sappiate che le comunicazioni tra le varie macchine avverranno sulla porta 3632. Nel caso vogliate cambiare la porta, lo potete fare usando una notazione del tipo macchina1:3633 macchina2:3634 per spostare la comunicazione della macchina1 sulla porta 3633 e della macchina2 sulla 3634.
Se invece volete usare una comunicazione ssh potete usare la notazione @macchina1 oppure utente@macchina1 per usare l'utente appropriato.
Usando ssh per il trasferimento dati comporta un perdita di velocita rispetto la comunicazione in chiaro ma è piu sicura e ha il vantaggio di non avere demoni in ascolto sulle varie macchine.
Nel caso vogliate settare invece un preciso numero di job massimi su ogni macchina, lo potete fare mettendo in coda ai nomi delle macchine un /n dove n è un numero intero che indica appunto il numero di job massimo.

A questo punto passiamo alla creazione dell'utente distcc per compilare con l'utente distcc nel caso lanciate la compilazione da root:

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

Seguiamo ora la procedura di avvio del programma nel caso di utilizzo di comunicazioni in chiaro.
Possiamo lanciare distcc in piu modi.
In modalita standalone attraverso il comando

# distccd --daemon

oppure attraverso init aggiungendo a /etc/inittab la riga:

dscc:2345:respawn:/usr/bin/distccd --verbose --no-detach --daemon
(in questo modo il demone restera in ascolto in automatico,all'avvio del pc)

oppure attraverso inetd aggiungendo a /etc/inetd.conf la riga:

distcc stream tcp nowait.6000 root /usr/bin/distccd distccd --inetd
(in questo modo il demone restera in ascolto in automatico,all'avvio del servizio inetd)

Per un configurazione un po piu avanzata potete passare alcuni parametri all'avvio del progrmma:

-jN
dove N è un numero e indica il numero di lavori che possono essere accettati (per volta)

-p porta
per modificare la porta in ascolto del demone

--user USER
per modificare l'utente con viene lanciato distcc nel caso venga lanciato da root

--allow IPADDR[/MASK]
per fare in modo che vengano accettate connessioni da un ip specifico o una sottorete specifica

Una volta che avete tutte le macchine con il demone attivo e dopo aver configurato la macchina da cui parte la compilazione in modo che veda le altre macchine, è sufficiente che alla compilazione al momento del make scriviate:

# make -jN CC=distcc

mettendo al posto di N un numero intero: è consigliato scegliere un numero pari al numero di cpu complessive +1.

Ovviamente questo procedura comporta solo la distribuzione del codice che verrebbe compilato con CC.

Per rendere il sistema completamente flessibile per la compilazione è necessario allora fare in modo che distcc si occupi anche di GCC C++ e G++.
Per fare ciò possiamo seguire il consiglio del man distcc, andando a creare dei link simbolici di CC GCC C++ e G++ a distcc nel momento in cui lo desideriamo.
Faremo quindi:

# mkdir /usr/lib/distcc/bin
# cd /usr/lib/distcc/bin
# ln -s ../../../bin/distcc gcc
# ln -s ../../../bin/distcc cc
# ln -s ../../../bin/distcc g++
# ln -s ../../../bin/distcc c++

A questo punto però è necessario dire al sistema di seguire questi link  andando ad esportare il PATH in questo modo:

# export PATH=/usr/lib/distcc/bin/:$PATH

Andiamo cosi ad aggiungere la directory che contiene i link a distcc prima di quelli contenenti i veri gcc cc g++ e c++.
Cosi facendo distcc si occupera di gestire interamente la compilazione.

Per monitorare l'utilizzo di distcc sulle varie macchine potete usare il programma distccmon-gnome (modalita grafica) oppure distcc-text (modalita testo).


Nella compilazione di alcuni programmi puo accadere che la compilazione non venga distribuita: questo accade perche alcuni sviluppatori hanno disabilitato questa modalita di compilazione perche puo introdurre dei problemi nella creazione del programma.

Per ulteriori chiarimenti e per una documentazione piu dettagliata vi consiglo di consultare questa pagina e man distcc e man distccd.
Devo anche fare un ringraziamento a [slash] per i chiarimenti e le info.

Anche per questa volta è tutto! Spero di avervi aiutato a ridurre i tempi delle compilazione!
A presto!


Autore: scomodo
www.scomodo.com