# [RISOLTO] Compilazione distribuita con distcc impossibile

## UnoSD

Salve a tutti,

sto impazzendo da giorni ormai, cercando di far funzionare questo maledetto distcc per far compilare i sorgenti del mio portatile (un Pentium 4 (Nqualcosa, comunque vecchio) 1.6) al Athlon X4 e il Core 2 due che ho a casa) ma la cosa sembra essere irraggiungibile...

Oltre alle influenze astrali che vogliono a tutti i costi che non ci riesca, cosa può esserci che non va? Ho seguito pedissequamente la guida di Gentoo, ho fatto una macchina virtuale con Gentoo apposta per avere sistemi omogenei ma niente...

Qualcuno può aiutarmi in quest'impresa?

Grazie.Last edited by UnoSD on Tue Jan 10, 2012 10:44 am; edited 1 time in total

----------

## fbcyborg

Ciao!

Guarda ti capisco benissimo! Anche io ho sudato molto per capire il funzionamento e riuscire a farlo funzionare.

Prova a leggere questa discussione che aprii qualche anno fa.

Ti assicuro che è più facile di quello che tu possa pensare.

----------

## UnoSD

Grazie mille, ora leggo la discussione e poi ti faccio sapere se ci sono riuscito!

----------

## ago

non ho letto la discussione ma fai prima a compilare altrove ed emergere i binari  :Wink: 

----------

## fbcyborg

Ma dai, non diciamo fesserie! Non è così impossibile far funzionare distcc, inoltre è talmente bello vederlo in funzione!  :Very Happy: 

----------

## canduc17

Concordo con ago.

Anche io a suo tempo mi ci scornai: https://forums.gentoo.org/viewtopic-t-790570.html.

----------

## fbcyborg

Fate un po' voi...

----------

## djinnZ

Prima cosa distcc se non ricordo male non si comporta molto bene su un parco macchine eterogeneo in termini di prestazioni.

Usare un chroot e trasportare i binari è facile ma la compilazione non è così performante come si crede (e non  sempre funziona) tra processori diversi. In particolare ho compilato in chroot da athlon x4 per amd64 e per p4 (a 32bit) lo stesso identico sistema, nel secondo caso credo si sia preso un'oretta in più.

Pari prestazioni rispetto alla macchina più potente le otterresti solo con il crossbuild in chroot, ma quanto sia rognoso e quanti espedienti si debbano attuare credo sia ovvio.

Visti i pro ed i contro decidi cosa ti conviene fare.

Il pro fondamentale del chroot è che hai un backup su cui poter completare l'aggiornamento, il contro è che gli aggiornamenti dei pacchetti binari funzioano uno schifo e finisce sempre che devi fare a mano con emerge -1OK

[ot]Un poco perchè è estate, un poco perchè certe sparate degli ultimi tempi mi hanno irritato ed inizio a chiedermi chi me lo fa fare , è tempo di prendermi seriamente una vacanza.[/ot]

----------

## ago

Io in tutto ciò lascio a compilare la notte anche su macchine datate  :Wink:  inutile complicarsi la vita con distcc chroot e altro  :Very Happy: 

----------

## UnoSD

Appena ho un po' di tempo provo a seguire la discussione di fbcyborg e vi faccio sapere!

----------

## UnoSD

Ripropongo la stessa richiesta di allora...

È ancora pressoché impossibile far funzionare distcc! Vi prego aiutatemi, il portatile ci mette 2 giorni a compilare chromium! Non lo aggiornerò mai così!

(o magari qualcuno mi spiega come compilare i pacchetti da un pc ed emergerli da un altro? (precisazione: sono di due architetture diverse: i686 - x86_64))

Ho persino provato il chroot da ssh ma non funziona... L'hd del portatile è ide pata ma ha un attacco strano di cui non ho l'adattatore e quindi niente chroot normale...

Sono disperato!

----------

## djinnZ

Da x86 ad amd64 è teoricamente possibile ma ti dico già di lasciar perdere, l'inverso è molto semplice.

Se il portatile è un compaq od un hp (mi ricordo di quelli) non è che ha un attacco strano, solo è stato applicato un ulteriore connettore sul 50 pin pata standard (nel caso che ricordo io il disco si estrae ruotandolo come se fosse uno sportello). Basta sfilarlo (con la dovuta cautela) per collegarlo ad un nomale cavetto adattatore usb.

Il metodo che uso io è abbastanza brutale (e poco consono alla mia scarsa propensione alle soluzioni approssimative) ma, tutto sommato, non ho un parco macchine molto eterogeneo.

Compilare direttamente -march=athlon a 32 bit in chroot invece che usare il crossbuild (sempre in chroot) dal sistema 64 bit -march=amdfam10 è più lento ma non tanto da spingermi a completare.

Compilo sul chroot, lancio etc-update, lancio quickpkg e reinstallo via nfs (alle volte con --root altre volte direttamente dal sistema in uso, secondo quel che mi gira) ma è banale usare apache (che sono troppo pigro per configurare, questo è tutto).

Dato che sono sempre adirato per i trascorsi e che comunque lo ho già ripetuto più di una volta non aggiungo altro. Al massimo se riporti l'errore specifico posso dirti dove sbagli.

In linea di massima con 

```
PKGDIR=${BASE_PORTDIR}/pkg/packages/${HOSTNAME}
```

 su entrambe le macchine (nella conf del chroot non in quella del sistema host) e detta directory condivisa via nfs (ma samba non comporta particolari problemi) mi basta  *su macchina di compilazione (nel chroot) wrote:*   

> emerge qualcosa
> 
> etc-update
> 
> vi UnQualcheFileDiConfigurazione
> ...

  *su macchina di destinazione wrote:*   

> emerge [-1] -K qualcosa

  tutto qui.

----------

## UnoSD

 *Quote:*   

> Da x86 ad amd64 è teoricamente possibile ma ti dico già di lasciar perdere, l'inverso è molto semplice.

 

Si, io devo compilare da un Athlon 640 X4 con Gentoo 64bit per il portatilino con P4 single core 1.6 con 512 di ram ddr!

 *Quote:*   

> Se il portatile è un compaq od un hp (mi ricordo di quelli) non è che ha un attacco strano, solo è stato applicato un ulteriore connettore sul 50 pin pata standard (nel caso che ricordo io il disco si estrae ruotandolo come se fosse uno sportello). Basta sfilarlo (con la dovuta cautela) per collegarlo ad un nomale cavetto adattatore usb.

 

L'avevo immaginato! Però mi scocciavo di smontare l'hd dal subchassis solo per scoprire che era inutile! Ora so che sarebbe stato utile!

 *Quote:*   

> Il metodo che uso io è abbastanza brutale (e poco consono alla mia scarsa propensione alle soluzioni approssimative) ma, tutto sommato, non ho un parco macchine molto eterogeneo.
> 
> Compilare direttamente -march=athlon a 32 bit in chroot invece che usare il crossbuild (sempre in chroot) dal sistema 64 bit -march=amdfam10 è più lento ma non tanto da spingermi a completare.
> 
> Compilo sul chroot, lancio etc-update, lancio quickpkg e reinstallo via nfs (alle volte con --root altre volte direttamente dal sistema in uso, secondo quel che mi gira) ma è banale usare apache (che sono troppo pigro per configurare, questo è tutto).

 

Condivido con te la scarsa propensione alle soluzioni approssimative! Poi è un portatile talmente vecchio e lento che quanto più ottimizzo, tanto meglio è...

 *Quote:*   

> Dato che sono sempre adirato per i trascorsi e che comunque lo ho già ripetuto più di una volta non aggiungo altro. Al massimo se riporti l'errore specifico posso dirti dove sbagli.

 

Condivido anche la frustrazione per distcc... Sono secoli che cerco di farlo funzionare... Comunque ho seguito pedissequamente la documentazione ufficiale, ma alla fine mi sembra che non dia nemmeno errore e dica solo "running locally instead" (ora non posso vederlo perché sto usando una distribuzione live per fare il backup dell'intero sistema su usb e portarlo sul fisso per compilare in chroot, ma dopo sarò sicuramente più preciso....)

Ho provato anche con la guida nella wiki di distcc via SSH ma niente... Se provo a fare anche un semplice distcc g++ hello.cc e controllo tramite distccmon-text mi dice "localhost[0]"...

----------

## djinnZ

Mi ero perso un pezzo, rileggi.

Ripeto: la soluzione più rigorosa e performante è impostare sul "server" un chroot e compilare in crossbuild (ma la differenza la vedi solo quando compili l'intero gnome/kde o mattoni in stile mozilla & office), configurare un mirror rsync su detto server ed apache (od ftp) per esportare il contenuto di PKGDIR, imposte PORTAGE_BINHOST ed usare emerge con -G invece di -K.

Ma quella approssimativa non fa grande differenza.

Entrambe sono più veloci ed affidabili di distcc. (ed hai sempre una copia di riserva)

Attenzione -k e -K (come -g e -G) non sono la stessa cosa.

I trascorsi non sono riferiti a distcc   :Confused:  per quello ho visto che era complicato, ho visto che non mi risolveva il problema dell'aggiornamento e quindi ho optato per i chroot, anche per la stessa macchina che compila per le altre.

----------

## UnoSD

Mi sono un attimo perso...

Che intendi per impostare sul "server" un chroot?

Fare chroot tramite rete dal pc prestante dal pc lento? (Anche se poi non capirei perché compilare in crossbuild se usa direttamente il compilatore i686)

Credo più semplicemente di essere un po' ignorante in questo specifico ambito e di non aver capito niente!

----------

## djinnZ

Sul server crei una dir /mnt/qualcosa e ci installi una copia diversa di gentoo, con altra ottimizzazione ed architettura.

Lavoro sul server, direttamente (in realtà via ssh ma è la stessa cosa), chroot /mnt/qualcosa ed aggiorno/installo/pasticcio. Quando ho finito vado sul computer di destinazione e lancio emerge con -K.

Non è il massimo ma è pratica e semplice da attuare.

----------

## UnoSD

Ah, ok! Ora è tutto chiaro!

In effetti penso che sfrutterò il fatto che sto già copiando l'intero sistema del portatile sulla penna usb per fare questa cosa!

Quindi, riassumendo:

Finisco di comprimere e copiare sulla penna il sistema

Lo decomprimo sul computer principale e veloce e me lo tengo caro in una cartella

Tramite chroot nella suddetta cartella faccio emergere ciò che devo emergere

Completata la compilazione uso quickpkg per fare un pacchetto con i binari appena emersi (non so come si fa ma leggerò la graziosa man page)

Porto il pacchetto sul portatile e tramite emerge -K aggiorno anche il portatile

Giusto?

(Grazie mille per la pazienza comunque)

----------

## djinnZ

giusto.

Quickpkg lo devi usare come ho indicato (le opzioni servono per copiare nel pacchetto anche i file di configurazione, se modificati dopo aver compilato, e non sono nella pagina man), in alternativa puoi anche usare direttamente emerge -b sul chroot e poi rivedi la configurazione sul portatile.

Questione di gusti (ma sul fisso non dimenticare di aggiornare le conf, comunque).

Una ulteriore alternativa è montare via nfs l'intera root del portatile sul fisso su /mnt/gentoo, poi, dalla shell del fisso, monti tmpfs su /var/tmp/portage e lanci il chroot /mnt/gentoo. Senza pacchetti binari.

Usi la cpu e la ram del fisso ma lavori direttamente sul disco via nfs, decisamente più lento, comunque è un approccio valido (solo se compili in ram).

Basta non intestardirsi alla prima opzione.

Se decidi di fare la prova riporta i risultati, è da parecchio che non mi ci applico al chroot diretto quindi non so quale possa essere la differenza in termini di tempo macchina.

Inutile (si fa per dire) sottolineare che l'export nfs è meglio farlo da una live se vuoi usare il chroot "diretto". Non so se è elencatyo tra i metodi installazione alternativi o meno.

----------

## UnoSD

Non ho proprio il supporto per nfs (in quanto preferisco ssh) quindi l'altra opzione non la posso provare! Appena finisce di copiare il sistema sulla penna provo e scrivo com'è andata!

----------

## Onip

puoi vedere se questa guida è ancora attuabile e funzionale a quello che ti serve.

----------

## UnoSD

 *Onip wrote:*   

> puoi vedere se questa guida è ancora attuabile e funzionale a quello che ti serve.

 

Come ho già scritto, non uso nfs quindi non è applicabile.

----------

## UnoSD

Domanda: mi conviene mettere la USE flag "custom-cflags" globale? Dovrebbe compilarmi tutto con le ottimizzazioni (per il portatile lento), c'è qualche controindicazione?

----------

## Onip

mettere una use come globale non significa che verrà applicata indistintamente ad ogni pacchetto. Solamente i pacchetti che la utilizzano avranno qualche cambiamento.

Inoltre questa USE in particolare è spesso fornita dagli sviluppatori gentoo ma non supportata, quindi potresti trovarti di fronte a più grane che benefici.

----------

## UnoSD

```
mettere una use come globale non significa che verrà applicata indistintamente ad ogni pacchetto. Solamente i pacchetti che la utilizzano avranno qualche cambiamento.
```

Lo so bene questo, mi domandavo solo se, secondo voi, ne valesse la pena per velocizzare questo mio vecchio computer. (Considerando che Firefox e Chromium e Libreoffice la hanno e sono i programmi che utilizzano più risorse)

----------

## UnoSD

Compilati in chroot, pacchettizzati con quickpkg, copiati tramite ssh e installati con emerge -K!

Grazie mille djinnZ!

Se qualcuno comunque fosse in grado di aiutarmi con distcc, la discussione resta aperta! Resta comunque una curiosità e una questione di principio tra me e quel maledetto software!

----------

## k01

sul portatile: 

in /etc/make.conf: FEATURES="distcc"

in /etc/distcc/hosts: indirizzo IP del fisso

in /usr/lib/distcc/bin/i686-pc-linux-gnu-wrapper (da creare):

```
#!/bin/bash

exec /usr/lib/distcc/bin/i686-pc-linux-gnu-g${0:$[-2]} "$@"
```

/usr/lib/distcc/bin/c++, /usr/lib/distcc/bin/cc, /usr/lib/distcc/bin/g++, /usr/lib/distcc/bin/gcc devono essere tutti link simbolici al wrapper appena creato

in /etc/make.conf: nelle CFLAGS NON bisogna usare -march=native, specifica l'architettura

sul fisso:

crossdev -t i686

rc-update add distccd default && /etc/init.d/distccd start

FINE

per controllare che funzioni vai in /usr/src/linux e dai

make CC="distcc i686-pc-linux-gnu-gcc" -j4

----------

## UnoSD

Già fatto tutto questo, passo passo leggendo la guida ufficiale e non funziona lo stesso!

----------

## k01

se fai esattamente ciò che ti ho scritto e la tua rete non ha problemi, tipo firewall o robe varie, sono sicuro al 100% che funziona. uso il cross-compiling con distcc su powerpc, i686 e x86_64, via ethernet e via wireless e mi funziona tutto senza problemi

----------

## UnoSD

 *The Extremer wrote:*   

> se fai esattamente ciò che ti ho scritto e la tua rete non ha problemi, tipo firewall o robe varie, sono sicuro al 100% che funziona. uso il cross-compiling con distcc su powerpc, i686 e x86_64, via ethernet e via wireless e mi funziona tutto senza problemi

 

Io sono sicuro al 100% che a te funziona, ma della stessa percentuale sono sicuro che non va a me con quell'esatta procedura e la rete funzionante.

----------

## k01

scusa ma dando make CC="distcc i686-pc-linux-gnu-gcc" -j4 cosa succede?

----------

## UnoSD

Domani ti mando l'output appena posso, ora ho già rimosso distcc da entrambi i computer e pulito tutti i file di configurazione!

----------

## UnoSD

All'inizio nessun output particolare ma allo stesso tempo nessuna distribuzione di calcolo.

Compila normalmente:

```
CC             arch/x86/kernel/cpu/mshyperv.o

CC             arch/x86/kernel/cpu/bugs.o

....
```

Ma non c'è traccia di distribuzione su nessuno dei monitor (distccmon-gnome / distccmon-text eseguiti su entrambe le macchine).

Poi più avanti ha cominciato a dare errori...

Posto il log completo (fino alla mia interruzione con ctrl-c):

http://pastebin.com/15kHhDpC

----------

## k01

beh per lo meno sul client qualcosa funziona perchè prova a inviare al server che però non risponde. mi sorge il dubbio che la tua rete abbia una configurazione diversa dalla classica 192.168.0.0, se è così sul fisso modifica in /etc/conf.d/distccd la riga:

 *Quote:*   

> 
> 
> DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.0.0/24"

 

presumendo che la cross-toolchain sia correttamente installata e funzionante

io personalmente guardo semplicemente il traffico tra i due client per capire se sta lavorando, ad esempio con ethstatus

----------

## UnoSD

[quote="The Extremer"]beh per lo meno sul client qualcosa funziona perchè prova a inviare al server che però non risponde. mi sorge il dubbio che la tua rete abbia una configurazione diversa dalla classica 192.168.0.0, se è così sul fisso modifica in /etc/conf.d/distccd la riga: *Quote:*   

> 
> 
> DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.0.0/24"

 

L'avevo ovviamente già modificata in:

```
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.1.0/24"
```

Non è questo il problema

 *Quote:*   

> presumendo che la cross-toolchain sia correttamente installata e funzionante

 

Non mi ha dato errori durante l'installazione, ora per scrupolo ho anche provato:

```
i686-pc-linux-gnu-g++ ciao.cc
```

E funziona perfettamente.

 *Quote:*   

> io personalmente guardo semplicemente il traffico tra i due client per capire se sta lavorando, ad esempio con ethstatus

 

Perché non usare gli strumenti di distcc?

----------

## UnoSD

Il problema di lentezza dipendeva dal fatto che fosse tutto tramite rete wireless 54.

Il problema dei monitor che non mostravano il funzionamento di distcc dipendeva dal fatto che distccmon-gnome e distccmon-text cercano i dati di distcc nella cartella (home utente)/.distcc; per far leggere le informazioni di uso di distcc da parte di portage bisogna usarli in questo modo:

```
DISTCC_DIR="/var/tmp/portage/.distcc" distccmon-xxxx
```

"pump emerge" è ancora un po' problematico...

P.s. Scusate la piccola svista! Grazie a k01 e fbcyborg che mi hanno aiutato in irc!

----------

