SyntaxHighlighter

Mittwoch, 13. Februar 2013

distcc - Endlich schneller kompilieren

Da ich selber ab und zu mit der Konfiguration von distcc auf die Nase fliege, schreib ich heute mal nen kurzen Leitfaden für distcc (hier nur aufs Raspberry Pi bezogen).

Vorab, was ist distcc?
Distcc ist eine Server/Client Anwendung mit der sich der Kompilierprozess auf mehrere Maschinen(Knoten) verteilen lässt. Hierbei wird das Sourcefile (C/C++/Objective C/Objective C++) an den jeweiligen Knoten gesendet, kompiliert und als Objekt zurückgegeben. Dies beschleunigt, je nachdem wie viele "Jobs" auf den einzelnen Knoten zugelassen sind, die Zeit die der eigentliche Kompillierprozess benötigt erheblich.

Konfiguration eines Kontens(nicht das Raspberry PI)


Da wir distcc ja zum beschleunigen des Kompilierens auf dem Raspberry Pi verwenden wollen, bietet es sich an als erstes den cross-compiler einzurichten, siehe dazu "Crossdev für den Host".

Installtion von distcc:
# emerge distcc

Konfiguration von distcc:
Die Konfiguration von distcc ist recht einfach, hier ein Beispiel, wichtig ist das "--allow" alle zu erlaubenden Client(Raspberry Pi) IPs oder eben deren IP-Adressraum wie im unten aufgeführten beispiel enthält. Die zweite wichtige Einstellung ist --listen, sie enthält die Adresse der Netzwerkschnittstelle auf der gelauscht werden soll, 0.0.0.0 bedeutet, das auf allen Netzwerkschnittstellen gelauscht wird.
# /etc/conf.d/distccd: config file for /etc/init.d/distccd
DISTCCD_OPTS="-j8"
DISTCCD_EXEC="/usr/bin/distccd" 
DISTCCD_PIDFILE="/var/run/distccd/distccd.pid" 
DISTCCD_OPTS="${DISTCCD_OPTS} --port 3632"
DISTCCD_OPTS="${DISTCCD_OPTS} --log-level error --log-file /var/log/distcc.log"
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.0.0/24"
DISTCCD_OPTS="${DISTCCD_OPTS} --listen 0.0.0.0"
DISTCCD_OPTS="${DISTCCD_OPTS} -N 15"
DISTCCD_OPTS="${DISTCCD_OPTS} --zeroconf"
Danach muss der distcc Daemon nur noch gestartet werden via:
# /etc/init.d/distccd start
Alternativ (automatischer Start des Daemons)
# rc-update add distccd default

Konfiguration des Clients (Raspberry Pi)

Auf dem Raspberry Pi muss als Erstes natürlich auch distcc installiert werden:
# emerge distcc
Als nächstes müssen wir der Portage mitteilen in Zukunft per distcc zu kompilieren, dazu fügen wir "distcc" den FEATURES hinzu. z.B. FEATURES="distcc fixlafiles". Danach sollten wir auch unsere MAKEOPTS="-j2" anheben, (bei einem Knoten mit 4 jobs wäre es dann -j6)

Jetzt muss distcc noch wissen welche Knoten es verwenden darf. Die einzelnen Knoten werden in /etc/distcc/hosts gespeichert. Um einen neuen Knoten hinzuzufügen reicht ein simpeles:
# echo "192.168.0.1/4,cpp,lzo" >> /etc/distcc/hosts
/4 bedeutet das der Knoten(192.168.0.1) maximal 4 parallele Jobs akzeptiert.

Ale letztes muss das Masquerading erstellt werden, so das auch ein händisches "make" oder "g++" distcc verwendet. Dazu sind folgende Befehle nötig:
mkdir -p /var/tmp/.distcc
chown users.portage /var/tmp/.distcc
chmod 775 /var/tmp/.distcc
cd /usr/lib/bin/distccd/bin
rm armv6j-hardfloat-linux-gnueabi-wrapper
echo -e "#!/bin/bash\nexec /usr/lib/distcc/bin/armv6j-hardfloat-linux-gnueabi-g\${0:\$[-2]} \"\$@\"" >> armv6j-hardfloat-linux-gnueabi-wrapper
chmod +x armv6j-hardfloat-linux-gnueabi-wrapper
ln -s /usr/bin/distcc armv6j-hardfloat-linux-gnueabi-c++
ln -s /usr/bin/distcc armv6j-hardfloat-linux-gnueabi-g++
ln -s /usr/bin/distcc armv6j-hardfloat-linux-gnueabi-gcc
ln -s armv6j-hardfloat-linux-gnueabi-wrapper c++
ln -s armv6j-hardfloat-linux-gnueabi-wrapper g++
ln -s armv6j-hardfloat-linux-gnueabi-wrapper gcc
sed -i '1 s/^/#/' /etc/env.d/04gcc-armv6j-hardfloat-linux-gnueabi
echo -e "PATH=\"/usr/lib/distcc/bin:\${PATH}\"\nDISTCC_DIR=\"/var/tmp/.distcc\"" > /etc/profile.d/99distcc.sh
source /etc/profile


Wenn alles geklappt hat sollte das Raspberry Pi nun erheblich schneller kompilieren.

Keine Kommentare:

Kommentar veröffentlichen