Important: You are required to change your passwords used for Gentoo services and set an email address for your Wiki account if you haven't done so. See the full announcement and Wiki email policy change for more information.

Distcc

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of a page Distcc and the translation is 87% complete.

Other languages:English 100% • ‎español 100% • ‎français 87% • ‎italiano 86% • ‎한국어 98% • ‎русский 100% • ‎Türkçe 86%

Distcc est un programme conçu pour répartir les tâches de compilation à travers un réseau à des hôtes participants. Il comprend un serveur, distccd et un client, distcc. Distcc peut travailler en toute transparence avec ccache, Portage et Automake moyennant un minimum de configuration.

Si vous envisagez d'utiliser distcc pour vous aider à préparer la chaîne des outils de compilation pour une installation de Gentoo, lisez d'abord la section Utiliser Distcc pour compiler les outils de compilation.

Configuration

Dépendances

Afin d'utiliser Distcc, tous les ordinateurs sur votre réseau doivent posséder la même version de GCC. Pour être plus précis, mélanger 3.3.x (avec x variable) est accepté, mais mélanger 3.3.x avec 3.2.x peut conduire à des erreurs de compilation ou des erreurs en exécution.

Installer Distcc

Il y a quelques options dont vous devriez être conscient avec d'installer distcc.

Distcc ships with a graphical monitor to monitor tasks that a computer is sending away for compilation, enabled with the gtk USE flag.

root # emerge --ask distcc
Important
Rappelez-vous que vous devez installer distcc sur tous les ordinateurs participants.

Configurer Portage pour l'utilisation de Distcc

Configurer Portage pour l'utilisation de distcc est simple. Exécutez les étapes suivantes sur chacun des systèmes qui devraient participer à la compilation distribuée :

root # emerge --ask distcc

Maintenant, définissez les variables MAKEOPTS et FEATURES comme indiqué ci-dessous. Une stratégie courante consiste à définir N à la valeur double du nombre de CPU (locaux + distants) + 1 et M comme le nombre de CPU locaux. Au cas où des hôtes distcc hosts ne seraient pas disponibles, ou au cas où les ebuild exigent des compilation uniquement locales (par exemple gcc), l'option -lM empêche de créer trop de tâches.

root # nano -w /etc/portage/make.conf
MAKEOPTS="-jN -lM"
FEATURES="distcc"

Spécifier les hôtes participants

Utilisez la commande distcc-config pour définir la liste des participants. Voici un exemple de quelques hôtes qui pourraient se trouver dans votre liste :

CodeExemples de définition d'hôtes participant

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

Il y a aussi plusieurs autres méthodes pour définir les hôtes. Reportez-vous à la page de manuel pour plus de détail.

Si vous désirez compiler sur la machine locale, vous devriez mettre 'localhost' dans la liste des participants. Inversement, si vous ne voulez pas que la machine locale participe (ce qui est souvent le cas) omettez la de la liste. Sur une machine lente, utiliser localhost peut ralentir les choses. Vérifiez la performance de votre configuration.

Cela peut paraître compliqué, mais dans la plupart des cas, une variante des lignes 1 ou 2 fonctionne.

Comme la plupart des gens n'utilisent pas les lignes 3 ou 4, reportez-vous à à la documentation de distcc (man distcc) pour une information plus complète qui inclut comment exécuter distcc à travers une connexion SSH.

Par exemple, pour définir la première ligne de l'exemple précédent :

root # /usr/bin/distcc-config --set-hosts "192.168.0.1 192.168.0.2 192.168.0.3"

Éditez le fichier /etc/conf.d/distccd en fonction de vos besoins et assurez-vous de définir la directive --allow pour seulement les hôtes auxquels vous accordez votre confiance. Pour une sécurité renforcée, vous devriez utiliser aussi la directive --listen afin de dire au démon distcc quelles adresses IP écouter (pour des systèmes multi-adresses). Une information complémentaire sur la sécurité avec distcc est disponible à l'adresse Distcc Security Design .

Important
Il est important d'utiliser --allow et --listen. Lisez la page de manuel de distcc (distccd manpage) ou le document cité précédemment sur la sécurité pour en savoir plus.

Maintenant démarrez votre démon distcc sur tous les ordinateurs participants :

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

Configurer Distcc pour qu'il fonctionne avec Automake

Ceci est, dans certains cas, plus facile que de configurer Portage. Ce que vous avez à faire, c'est mettre votre variable PATH à jour pour qu'elle inclut /usr/lib/distcc/bin en face du répertoire qui contient gcc ( /usr/bin ). Cependant, il faut savoir que si vous utilisez ccache, vous devez placer distcc après la partie ccache :

root # export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"

Vous pouvez placer ceci dans votre fichier ~/.bashrc, ou son équivalent, pour avoir une variable PATH définie à chaque entrée dans la session.

Ensuite, là où vous taperiez normalement make , vous devriez taper make -jN (où N est un entier).

Setting up Distcc to Work With ssh

Setting up distcc via ssh includes some pitfalls. First, generate a ssh key pair without password setup. Be aware that portage compiles programs as user portage. The home folder of the user portage is /var/tmp/portage, which means the keys need to be stored in /var/tmp/portage/.ssh.

root # ssh-keygen -b 2048 -t rsa -f /var/tmp/portage/.ssh/id_rsa

Second, generate a section for each host in the ssh config file:

root # nano -w /var/tmp/portage/.ssh/config
Host test1
    HostName 123.456.789.1
    Port 1234
    User UserName

Host test2
    HostName 123.456.789.2
    Port 1234
    User UserName

Also make sure that each host is available in the known_hosts file and append your public key to the authorized_keys file of the hosts. To set up the hosts test1 and test2 run

root # /usr/bin/distcc-config --set-hosts "@test1 @test2"

Please note the '@'-sign, which specifies ssh hosts for distcc.

Cross-Compiling

Cross-compiling is using one architecture to build programs for another architecture. This can be as simple as using an Athlon (i686) to build a program for a K6-2 (i586), or using a Sparc to build a program for a ppc. This is documented in our DistCC Cross-compiling Guide .

Using Distcc to Bootstrap

Step 1: Configure Portage

Boot your new box with a Gentoo Linux LiveCD and follow the installation instructions up until the bootstrapping part. (See the Gentoo FAQ for more information about bootstrapping.) Then configure Portage to use distcc:

root # nano -w /etc/portage/make.conf
FEATURES="distcc"
MAKEOPTS="-jN"
root # export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"

Step 2: Getting Distcc

Install distcc:

root # USE='-*' emerge --nodeps sys-devel/distcc

Step 3: Setting Up Distcc

Run distcc-config --install to setup distcc; substitute host* with the IP addresses or hostnames of the participating DistCC nodes.

root # /usr/bin/distcc-config --set-hosts "localhost host1 host2 host3 ..."

Distcc is now set up to bootstrap! Continue with the official installation instructions and do not forget to re-emerge distcc after emerge system. This is to make sure that all of the dependencies you want are installed as well.

Note
During bootstrap and emerge system distcc may not appear to be used. This is expected as some ebuilds do not work well with distcc, so they intentionally disable it.

Troubleshooting

Some Packages Don't Use Distcc

As you emerge various packages, you'll notice that some of them aren't being distributed (and aren't being built in parallel). This may happen because the package's Makefile doesn't support parallel operations or the maintainer of the ebuild has explicitly disabled parallel operations due to a known problem.

Sometimes distcc might cause a package to fail to compile. If this happens for you, please report it to us.

Mixed GCC Versions

If you have different GCC versions on your hosts, there will likely be very weird problems. The solution is to make certain all hosts have the same GCC version.

Recent Portage updates have made Portage use ${CHOST}-gcc instead of gcc . This means that if you're mixing i686 machines with other types (i386, i586) you will run into problems. A workaround for this may be to export CC='gcc' CXX='c++' or to put it in /etc/portage/make.conf .

Important
Doing this explicitly redefines some behavior of Portage and may have some weird results in the future. Only do this if you're mixing CHOSTs.

-march=native

Starting with GCC 4.3.0, the compiler supports the -march=native switch which turns on CPU autodetection and optimizations that are worth being enabled on the processor the GCC is running at. This is a problem with distcc as it allows mixing of code optimized for different processors (like AMD Athlon and Intel Pentium). Don't use -march=native or -mtune=native in your CFLAGS or CXXFLAGS when compiling with distcc .

To know the flags that GCC would enable when called with -march=native, execute the following:

user $ gcc -march=native -E -v - </dev/null 2>&1 | grep cc1
/usr/libexec/gcc/x86_64-pc-linux-gnu/4.7.3/cc1 -E -quiet -v - -march=corei7-avx \
  -mcx16 -msahf -mno-movbe -mno-aes -mpclmul -mpopcnt -mno-abm -mno-lwp -mno-fma \
  -mno-fma4 -mno-xop -mno-bmi -mno-bmi2 -mno-tbm -mavx -mno-avx2 -msse4.2 -msse4.1 \
  -mno-lzcnt -mno-rdrnd -mno-f16c -mno-fsgsbase --param l1-cache-size=32 \
  --param l1-cache-line-size=64 --param l2-cache-size=6144 -mtune=corei7-avx

Distcc Extras

Distcc Monitors

Distcc ships with two monitors. The text-based one is always built and is called distccmon-text. Running it for the first time can be a bit confusing, but it is really quite easy to use. If you run the program with no parameter it will run once. However, if you pass it a number it will update every N seconds, where N is the argument you passed.

The other monitor is only enabled through the gtk USE flag. This one is GTK+ based, runs in an X environment and it is quite lovely. For Gentoo, the GUI monitor has been called distccmon-gui for less confusion. Elsewhere it may be referred to as distccmon-gnome.

root # distccmon-text N

or run distccmon-gui:

root # distccmon-gui

To monitor Portage's distcc usage you can use:

root # DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-text N
root #
DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-gui
Important
If your distcc directory is elsewhere, change the DISTCC_DIR variable accordingly.

Remerciements

Nous tenons à remercier les auteurs, éditeurs et traducteurs suivants pour leur contribution à ce guide :

  • Lisa Seelye
  • Mike Frysinger
  • Erwin
  • Sven Vermeulen
  • Lars Weiler
  • Tiemo Kieft
  • nightmorph
  • jaaf