Paludis ist eine Alternative zu portage.
Distcc verteilt die Kompilierarbeit auf mehrere Rechner.
Mit "automatischem DISTCC-Setup" meine ich, dass der Rechner zuerst guckt, ob Rechner mit laufendem distccd im Netzwerk vorhanden sind, und dann dementsprechend paludis für distcc Benutzung einrichtet.
Dazu werden alle privaten Netzwerke die in der Routingtabelle stehen, nach aktiven Hosts gescannt, und die aktiven auf den offenen distcc-Port geprüft. Da diese Scannerei pro 24er-Netz mind. 15s dauert, wird das Ergebnis 10 Minuten gecached (konfigurierbar).
Sinn und Zweck ist mit meinem Laptop an verschiedenen Standorten die dort verfügbaren distccd-Server zu nutzen
Bugs/Warnungen
- Auf dem ausführenden Rechner darf der distccd selbst nicht laufen, sonst wird jede lokale Adresse auf der distccd lauscht den DISTCC_HOSTS zugefügt.
- in manchen Netzwerken gilt ein Portscan als böser Angriff
- in öffentlichen Netzen könnten manipulierte distccds laufen, die bösen Code einschleusen
- das Script dürfte nur mit Rootrechten laufen
- jedes Netz aus der Routingtabelle wird als /24er Netz betrachtet.
Momentan (paludis-0.16.2) stimmt das nicht ganz, die bashrc wird ausgeführt, sollte diese Datei in späteren Versionen wirklich nur "gesourced" werden, wird das Skript nicht mehr funktionieren.Paludis will source bashrc when doing ebuild work.
Voraussetzungen
Neben paludis und distcc wird net-analyzer/hping und net-analyzer/fping benötigt.
das Skript
/etc/paludis/bashrc wie folgt ergänzen (ergänzen, nicht ersetzen!):
Code: Select all
export MAKEOPTS="-j2"
# automatisches distcc-setup
TMPFILE=/var/tmp/distcchosts
CACHETIME=600 # 10 Minuten
DATE=`date +%s`
if [ ! -f ${TMPFILE} ]; then
touch ${TMPFILE}
FDATE=1
else
FDATE=`stat -c %Y ${TMPFILE}`
fi
if [ $((${DATE}-${FDATE})) -gt ${CACHETIME} ]; then
echo -n "Suche nach DISTCC Daemonen"
NETWORKS=`route -n | cut -d " " -f 1 | grep '^10\|^172.16\|^192.168' | sed s/$/'\/24'/`
for i in ${NETWORKS}; do
echo -n "."
HOSTS="${HOSTS} `fping -a -q -r 1 -i 1 -t 1 -g $i 2>/dev/null`"
done
DHOSTS="localhost"
for i in ${HOSTS}; do
hping -p 3632 -c 1 -S --tcpexitcode -q $i >/dev/null 2>&1
if [ $? -eq 18 ];then DHOSTS="${DHOSTS} $i"; fi
echo -n "."
done
echo $DHOSTS > ${TMPFILE}
else
echo -n "Benutze gecachte DISTCC-Daemonen"
DHOSTS=`cat ${TMPFILE}`
fi
NUM_DHOSTS=`echo ${DHOSTS} | wc -w`
if [ $NUM_DHOSTS -gt 1 ]; then
echo -e "\n\tAktiviere Distcc mit ${DHOSTS}"
export DISTCC_HOSTS="${DHOSTS}"
export DISTCC_DIR="/var/tmp/paludis/.distcc"
export PATH="/usr/lib/distcc/bin:${PATH}"
export CC="/usr/lib/distcc/bin/gcc"
export CXX="/usr/lib/distcc/bin/g++"
export MAKEOPTS="-j$((${NUM_DHOSTS}*2))"
fi
Code: Select all
DISTCC_DIR="/var/tmp/paludis/.distcc" distccmon-text 2Das Skript ist teilweise ein wenig dirty, Verbesserungen (insbes. die o.g. Bugs) sind willkommen!
HTH Maurice


