Distcc
Distcc es un programa diseñado para distribuir tareas de compilación a través de la red hacia máquinas participantes.
Consiste en un servidor, distccd y un programa cliente, distcc. Distcc puede trabajar de forma transparente con ccache, Portage y Automake realizando una sencilla configuración.
Cuando planee utilizar distcc para ayudarle a realizar el bootstrap en una instalación Gentoo, asegúrese de leer el apartado para realizar la inicialización.
Si está usando un servidor para correr distcc que tiene una arquitectura diferente, o sigue una cadena de herramientas distintas vea Distcc/Cross-Compiling/es.
Distcc puede dar problemas en tiempos de compilación, como el bug reportado bug #691544, el primer paso para solucionar dichos problemas debería ser desactivar distcc para ver si lo soluciona.
Usar una segunda maquina más rápida para hacer los paquetes binarios y configurar un servidor de paquetes binarios puede reemplazar efectivamente algunos de los usos de distcc, resulta más fácil de instalar y cubrirá todos los compiladores y sistemas de constucción.
Instalación
Antes de configurar distcc, miremos a la instalación del paquete sys-devel/distcc en todos los equipos.
Requisitos para todos los equipos
Para utilizar distcc, todas las máquinas en la red deben tener la misma versión de GCC. Mezclar 3.3.x (variando la x) es correcto, pero mezclar 3.3.x y 3.2.x "puede" resultar en errores en tiempo de compilación o ejecución.
Verifique que todos lo sistemas usan la misma versión de Binutils (eselect binutils list) o muchos paquetes fallarán en su enlazado con varios errores como la relocalización de texto.
Ajustes USE
USE flags for sys-devel/distcc Distribute compilation of C code across several machines on a network
gssapi
|
Enable support for net-libs/libgssglue |
gtk
|
Add support for x11-libs/gtk+ (The GIMP Toolkit) |
hardened
|
Activate default security enhancements for toolchain (gcc, glibc, binutils) |
ipv6
|
Add support for IP version 6 |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
xinetd
|
Add support for the xinetd super-server |
zeroconf
|
Support for DNS Service Discovery (DNS-SD) |
Distcc incluye un monitor gráfico para monitorizar las tareas que un computador está enviando para compilación. Este monitor se habilita cuando el ajuste USE gtk
está activado.
Emerge
Después de configurar el ajuste USE, instale el paquete sys-devel/distcc:
root #
emerge --ask sys-devel/distcc
Recuerde instalar sys-devel/distcc en todas las máquinas que vayan a participar en la construcción.
Configuración
Servicio
Para que distccd arranque de forma automática se debe seguir las siguientes instrucciones.
OpenRC
Modifique /etc/conf.d/distccd y asegúrarse de usar la directiva --allow
para permitir únicamente máquinas cliente de confianza. Para mayor seguridad debería utilizar también la directiva --listen
para indicarle al demonio distcc en qué dirección IP debe escuchar (en sistemas con más de una dirección IP). Se puede encontrar más información acerca de seguridad en distcc en las notas sobre seguridad de distcc.
Cualquiera que quiera conectar al puerto del servidor distcc puede lanzar órdenes arbitrarias en esa máquina como el usuario distccd.
En el siguiente ejemplo se permite a los clientes distcc correr en 192.168.0.4
y 192.168.0.5
para conectarse al servidor distccd que corre en la máquina local:
DISTCCD_OPTS="--port 3632 --log-level notice --log-file /var/log/distccd.log -N 15 --allow 192.168.0.4 --allow 192.168.0.5"
Cuando se registra en un fichero dentro de /var/log, cree el registro y asigne los permisos apropiados:
root #
touch /var/log/distccd.log
root #
chown distcc:root /var/log/distccd.log
Es importante utilizar
--allow
y --listen
. Por favor, lea la página del manual de distccd o el documento sobre seguridad indicado arriba para obtener más información.Ahora inicie el demonio distcc en todas las máquinas participantes:
root #
rc-update add distccd default
root #
rc-service distccd start
systemd
Edite el fichero /etc/systemd/system/distccd.service.d/00gentoo.conf para añadir los clientes permitidos en formato CIDR. El ejemplo añade todas las direcciones IP en el rango 192.168.1.xxx:
Environment="ALLOWED_SERVERS=192.168.1.0/24"
Otro ejemplo con clientes múltiples y bitácora (log-level) ajustada manualmente:
Environment="ALLOWED_SERVERS=127.0.0.1 --allow 192.168.1.0/24 --allow 10.1.1.1/24 --log-level error"
El nombre de variable ALLOWED_SERVERS aquí, puede llevar a confusiones ya que se refiere a los clientes a los que se le permite conectar al servidor distccd local. Independientemente de esto, el valor de esta variable se utiliza en el servicio distccd para asignarle un valor a la opción -
-allow
. Eche un vistazo al fichero /usr/lib/systemd/system/distccd.service. para obtener información adicional.In contrast to OpenRC, environment variables put in /etc/env.d/* will not take effect for systemd users even after running env-update and restarting the distccd service. This is because /etc/environment.d generated by env-update is only sourced by systemd user instance. Whereas, distccd is spawned by systemd system instance.
To set the proper environment variables for distccd, place them into /etc/systemd/system/distccd.service.d/00gentoo.conf, for example:
[Service]
Environment="ALLOWED_SERVERS=192.168.121.0/24"
Environment="DISTCC_VERBOSE=1"
Environment="DISTCC_SAVE_TEMPS=1"
Environment="CCACHE_DIR=/var/cache/ccache"
The
Environment=
directive in /etc/systemd/system/distccd.service.d/00gentoo.conf file does not support variable expansion. Environment="PATH=/usr/lib/ccache/bin:$PATH"
will be treated as is, therefore will not work as intended.Para una solución alternativa, edite distccd.service lanzando la siguiente orden:
root #
systemctl edit --full distccd.service
Esto abrirá un editor. Cambie la línea con la directiva ExecStart=
a:
ExecStart=/bin/bash -c "PATH=/usr/lib/ccache/bin:$PATH exec /usr/bin/distccd --no-detach --daemon --port 3632 -N 15 --allow $ALLOWED_SERVERS --log-level debug"
Alternatively, it is possible to write a shell script wrapper for /usr/bin/distccd.
Recargar los fichero de unidad después de realizar estos cambios:
root #
systemctl daemon-reload
Habilitar el auto arranque de distcc y a continuación arrancar el servicio:
root #
systemctl enable distccd
root #
systemctl start distccd
Especificar las máquinas participantes
Utilice la orden distcc-config en los clientes locales para definir la lista de anfitriones (sistemas que están corriendo distccd como un servicio).
A continuación se muestra una lista ejemplo de definiciones de equipos. En la mayoría de los casos, serán suficientes variaciones de las líneas 1 y 2. La última utiliza la sintaxis /limit
para informar a distcc sobre el máximo número de trabajos que se deben lanzar en este nodo. Se puede encontrar más información sobre la sintaxis de las líneas 3 y 4 en la página del manual de distcc.
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
Hay otras formas de configurar máquinas. Eche un vistazo a la página del manual (man distcc) para obtener más información.
Si se van a realizar compilaciones en la máquina local, añada localhost
en la lista de máquinas. Contrariamente, si no se va a utilizar la máquina local para compilar, omítala de la lista de máquinas. En una máquina lenta usar localhost puede de hecho hacer las cosas más lentas. Asegúrese de comprobar los ajustes para obtener un mejor rendimiento.
Configure distcc para usar los equipos mencionados en la primera línea del ejemplo:
root #
/usr/bin/distcc-config --set-hosts "localhost 192.168.0.1 192.168.0.2 192.168.0.3"
Distcc también ofrece soporte a un modo bombeo (pump) cuando se invoca la orden pump. Esto puede reducir de forma significativa el tiempo de construcción cuando se compilan muchos ficheros en paralelo. Se cachean las cabeceras preprocesadas en el lado servidor y, como resultado, desaparece la continua carga y preprocesado de estos ficheros cabecera.
Para configurar un equipo en modo bombeo, se debe añadir el sufijo ,cpp,lzo
a las definiciones de los equipos. El modo bombero requiere de los ajustes cpp
y lzo
(independientemente de si los archivos son C o C++).
root #
/usr/bin/distcc-config --set-hosts "192.168.0.1,cpp,lzo 192.168.0.2,cpp,lzo 192.168.0.3,cpp,lzo"
Los anfitriones también necesitan estar en:
192.168.0.1
192.168.0.2
192.168.0.3
Opcionalmente, para definir el máximo número de hilos que utiliza un anfitrión, añada una barra a izquierdas "/" después de cada anfitrión:
192.168.0.1/8
192.168.0.2/4
192.168.0.3/16
The same applies to the distcc-config command. If the maximum threads number is not specified, it will default to 4.
Utilización
Con Portage
Configurar Portage para usar distcc es fácil. Es cuestión de habilitar la característica distcc y definir un valor correcto para el número de trabajos simultáneos (ya que así distcc incrementará la cantidad de recursos disponibles para la construcción)
Ajuste la variable MAKEOPTS y la variable FEATURES tal y como se describe abajo.
Una estrategia común es
- Definir el valor de
N
al doble del número total (local + remotas) de núcleos de CPU + 1, y - Definir el valor de
M
al número de núcleos de CPU locales
El uso de -lM
en la varialble MAKEOPTS evitará lanzar demasiadas tareas cuando alguno de los equipos del cluster de distcc no estén disponibles (incrementando la cantidad de trabajos simultáneos en el resto de los sistemas) o cuando se configure un ebuild para no permitir construcciones en remoto (como con gcc). Esto se logra rechazando el inicio de trabajos adicionales cuando la carga del sistema están en el valor de M
o por encima de éste.
# Reemplace N y M por los valores correctos calculados previamente
MAKEOPTS="-jN -lM"
FEATURES="distcc"
Por ejemplo, cuando hay dos equipos PC anfitriones con cuatro núcleos que corren distcc y el equipo PC local tiene una CPU con doble núcleo entonces la variable MAKEOPTS podría ser:
# Dos equipos remotos con cuatro núcleos cada uno = 8 núcleos remotos
# Un equipo local con dos núcleos = 2 núcleos en local
# El número total de núcleos es 10, de modo que:N = 2*10+1 and M=2
MAKEOPTS="-j21 -l2"
CFLAGS y CXXFLAGS
Cuando edite el fichero make.conf, asegúrese de que no se ha definido -march=native
en las variables CFLAGS o CXXFLAGS. distcc no distribuirá trabajos a otras máquinas si march
está definido a native
. En lugar de esto, deberís listar la plataforma exacta y algunos ajustes extra que son necesarios para la CPU. Algo como:
# La lista mínima de ajustes se genera con:
# $ diff -U0 <(LANG=C gcc -Q -O2 -march=sandybridge --help=target) <(LANG=C gcc -Q -O2 -march=native --help=target)
COMMON_FLAGS="-march=sandybridge -mtune=sandybridge -maes" # ¡No use -march=native!
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
Lea -march=native
en línea para distcc para ampliar la información.
As an alternative, install app-misc/resolve-march-native to determine what -march=native
would resolve into.
Con automake
Esto es más fácil de configurar en algunos casos que con Portage. Todo lo que se necesita hacer es actualizar la variable de entorno PATH para incluir /usr/lib/distcc/bin delante del directorio que contiene gcc (/usr/bin/). No obstante, hay un problema. Si se utiliza ccache, entonces deberá poner la localización de distcc después de la de ccache:
root #
export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"
Coloque esto en el archivo ~/.bashrc del usuario o fichero equivalente para tener configurada la variable PATH cada vez que que el usuario entre en el sistema o defínala globlamente en un fichero en /etc/env.d/
En lugar de llamar únicamente a make, agregue -jN
(donde N
es un número entero). El valor de N
depende de la red y de la tipología de los computadores que se utilizan para compilar. Una aproximación heurística a los valores correctos se ha dado anteriormente en este artículo.
Con ccache
Para hacer que Ccache trabaje con distcc, algunos requisitos deben cumplirse:
- Ccache este definido exitosamente como local
- Distcc este definido exitosamente como el servidor deseado
La siguiente configuración funcionará de la siguiente forma:
[client] [remote]
'''ccache''' <miss?> → compile it and save cache files,
<hit?> also distribute other source code → '''distcc''' → '''ccache''' <miss?> → compile it, save cache files, return cache file to client
↓ <hit?>
use the local cache file ↓
return local cache file to client
¡La siguiente configuración se debe realizar en todos los servidores deseados!
Configurar distccd
Para permitirle al servicio distccd usar ccache, debe enmascarar la ruta /usr/bin con /usr/lib/ccache/bin. Más aún, cuando use ccache, ccache deberá usar el prefijo distcc
:
PATH="/usr/lib/ccache/bin:${PATH}"
CCACHE_PREFIX="distcc"
Additionally distccd must be aware of the environment variables DISTCC_DIR and CCACHE_DIR:
These variables must be set somewhere in /etc/env.d/, otherwise ccache tries to put cache files in ${HOME}/.ccache/, which might result in a COMPILE_ERROR, due to insufficient permissions. To pinpoint this, use the testing example mentioned below and export DISTCC_SAVE_TEMPS="1" as mentioned here. This will provide error logs from the remote site in /tmp/ by default. The logs will look like this: distcc_server_stderr_*.txt. Be aware, that these environment variables cannot be set in /etc/conf.d/distccd, since they will not be read from distccd for some reason.
CCACHE_DIR="/var/cache/ccache"
DISTCC_DIR="/var/tmp/portage/.distcc"
A continuación, actualice las variables de entorno:
root #
env-update
>>> Regenerating /etc/ld.so.cache...
Para terminar, reinicie el demonio distccd para adaptar todos los cambios:
root #
rc-service distccd restart
Configurar ccache
Cuando use distcc con ccache, es necesario preparar los directorios manualmente, debido a que el controlador (daemon) distccd por alguna razón solo trabaja con el usuario
distcc
y no puede crear directorios dentro de /var/cache/ccache/. NO es suficiente agregar este usuario al grupo portage
. También tenga cuidado que la variable cache_dir_levels
, definida en ccache.conf, especifica cuantos subdirectorios deben ser creados. En el siguiente ejemplo se usa por defecto, el cual es 2
.En primer lugar, prepare los directorios caché:
root #
cd "/var/cache/ccache/"
root #
mkdir {a..z} {0..9} tmp
root #
for first_level_directory in $(find . -maxdepth 1 -type d -not -name "." -and -not -name "tmp"); do pushd "${first_level_directory}" >/dev/null; mkdir {a..z} {0..9}; popd >/dev/null; done
The second command (mkdir) will create the first level directories from a to z, 0 to 9 and tmp. The following for loop will then look for the first level directories (find . -maxdepth 1 -type d), excluding the current directory . and tmp (-not -name "." -and -not -name "tmp"
). It then descends into each of them (pushd), creates the second level directories from a to z and 0 to 9 (mkdir) and goes back to the previous directory (popd), which is /var/cache/ccache/.
The current directory . must be excluded with
-not -name "."
, otherwise the first pushd command will go to the current directory . and then goes back to whatever directory is currently on the stack via popd. It will navigate through the entire stack until it is empty, creating directories, where each pushd command fails. If this happens, one can search for them using find / -type d -name "0" and remove them with rm --recursive [a-z] [0-9]. It is advised to this manually!When the preparation is done, every directory - including the directory ccache itself - must be owned by the user distcc
:
root #
find /var/cache/ccache -type d -exec chown distcc:portage "{}" +
Configurar portage
To use emerge with distcc and ccache, make sure, that both features are enabled and that CCACHE_DIR is set in /etc/portage/make.conf:
[...]
FEATURES="distcc ccache"
CCACHE_DIR="/var/cache/ccache"
It might be redundant to set CCACHE_DIR here, since it is already defined in /etc/env.d/03distcc_ccache, mentioned here. But to make absolutely sure, configure it like that.
Probar distcc con ccache manualmente
Remoto
First enable verbose logging by setting --log-level
to debug
in /etc/conf.d/distccd:
[...]
DISTCCD_OPTS="${DISTCCD_OPTS} --log-level debug"
[...]
Una vez hecho esto, reinicie el demonio para adaptar los cambios:
root #
rc-service distccd restart
Also check, if there are directories in /var/cache/ccache - including the directory ccache itself - which are not owned by the user distcc
and correct their owner permissions:
root #
chown -R distcc:portage /var/cache/ccache
Cliente
Make sure, that the following environment variables are present in the current shell:
root #
export PATH="/usr/lib/ccache/bin:${PATH}"
root #
export CCACHE_DIR="/var/cache/ccache"
root #
export DISTCC_DIR="/var/tmp/portage/.distcc"
root #
export DISTCC_SAVE_TEMPS="1"
root #
export DISTCC_VERBOSE="1"
After that, navigate to a temporary directory within /tmp/ and compile the example mentioned below:
root #
cd $(mktemp --directory)
root #
distcc gcc -c main.c -o main.o
This will provide a verbose output, while also keeping temporary files receiving from the remote site in /tmp/ by default:
[...]
distcc[29466] (dcc_cleanup_tempfiles_inner) skip cleanup of /tmp/distcc_9c42f0a6.i
distcc[29466] (dcc_cleanup_tempfiles_inner) skip cleanup of /tmp/distcc_server_stderr_9cc0f0a6.txt
[...]
Any occuring error from the remote site are saved in /tmp/distcc_server_stderr_*.txt.
If the compilation was successful, the following line will be shown:
[...]
distcc[29466] compile main.c on 192.168.0.4 completed ok
[...]
En el sitio remoto, se mostrará de la siguiente forma:
[...]
distccd[13296] (dcc_check_compiler_masq) /usr/lib/ccache/bin/gcc is a safe symlink to /usr/bin/ccache
[...]
distccd[13296] (dcc_job_summary) client: 192.168.0.4:33880 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:20ms gcc main.c
The important part here, is, that any symlink of /usr/lib/ccache/bin/ is a save symlink to /usr/bin/ccache.
Also, on the remote site, there should be the cached file 2beaa22dc2a2873d6869d69411840c-17229.o in /var/cache/ccache/c/0/, assuming, the example with its filename was copied from this wiki article. Generally, one can monitor the ccache size using watch "ccache --show-stats", while compiling.
Probar distcc con ccache usando emerge
Check, if necessary environment variables are present for the current shell, see here and that /etc/portage/make.conf was configured properly, see here.
To produce some cached files on the remote site, one can compile small packages like htop
and bzip2
on the client:
root #
emerge --ask htop bzip2
Utilización futura
Make sure, that the following environment variables are always set in the desired shell:
PATH="/usr/lib/ccache/bin:${PATH}"
CCACHE_DIR="/var/cache/ccache"
DISTCC_DIR="/var/tmp/portage/.distcc"
Para realizar la inicialización
TODO: Todo:
- Check this section for outdated information. Notably "USE='-*'" and "--nodeps" may no longer be advised. See Discussion page for more informaiton.
El uso de distcc para el inicio (esto es, construir una cadena de herramientas antes de instalar el resto del sistema) requiere realizar algunas acciones adicionales.
Paso 1: Configurar Portage
Inicie la nueva máquina con un LiveCD de Gentoo Linux y siga las instrucciones de instalación mientras se siguen las instrucciones en las FAQ de Gentoo para obtener más información sobre el bootstrap. A continuación configure Portage para que utilice distcc:
FEATURES="distcc"
MAKEOPTS="-jN"
Actualice también la variable PATH en la sesión de instalación:
root #
export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"
Paso 2: Obtener distcc
Instale sys-devel/distcc:
root #
USE='-*' emerge --nodeps sys-devel/distcc
Paso 3: Configurar distcc
Lance distcc-config para configurar distcc. Sustituya la cadena máquina#
del ejemplo por las direcciones IP o nombres de los nodos participantes.
root #
/usr/bin/distcc-config --set-hosts "localhost máquina1 máquina2 máquina3 ..."
¡Distcc ya está configurado para hacer bootstrap! Continúe con las instrucciones de instalación adecuadas y no olvide lanzar emerge distcc después de lanzar emerge @system. Esto asegurará que las dependencias necesarias también se instalarán.
Durante el arranque y emerge system puede que parezca que distcc no se está utilizando. Esto es normal ya que algunos ebuilds no funcionan bien con distcc por lo que se deshabilita intencionadamente.
Extras
La aplicación distcc tiene características adicionales y aplicaciones para dar soporte al trabajo en un entorno distcc.
Utilidades de monitorización
Distcc se distribuye con dos herramientas de monitorización. La basada en texto se construye siempre y se llama distccmon-text. Al lanzarlo la primera puede resultar confuso, pero es muy fácil de utilizar. Si el programa se lanza sin parámetros, correrá solo una vez. Sin embargo si se le pasa un número, actualizará la información cada N
segundos, donde N
es el argumento indicado.
user $
distccmon-text 10
La otra utilidad de monitorización solo se habilita cuando se habilita el ajuste USE gtk
. Esta herramienta está basada en GTK, corre en un entorno X y es bastante encantador. En Gentoo, se ha cambiado el nombre a distccmon-gui para evitar confusiones (originalmente se llamaba distccmon-gnome).
user $
distccmon-gui
Para monitorizar el uso de distcc por parte de Portage:
root #
DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-text 10
root #
DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-gui
Si el directorio distcc está en otro lugar, cambie la variable DISTCC_DIR adecuadamente.
Un truco consisten en definir DISTCC_DIR en variables de entorno:
root #
echo 'DISTCC_DIR="/var/tmp/portage/.distcc/"' >> /etc/env.d/03distcc_custom
Be aware that DISTCC_DIR must be set somewhere else than /etc/env.d/02distcc, as it gets overwritten everytime, when using distcc-config!. distcc-config --set-env DISTCC_DIR <some_path> does not work.
Ahora actualice el entorno:
root #
env-update
root #
source /etc/profile
Para terminar, arranque la aplicación GUI:
root #
distccmon-gui
SSH para comunicaciones
La configuración de distcc a través de SSH incluye algunos detalles. En primer lugar, genere un par de claves SSH sin contraseña. Observe que portage compila los programas con el usuario Portage (o como root si no se ha definido FEATURES="userpriv"
). La carpeta de inicio del usuario Portage es /var/tmp/portage/ lo que implica que las claves se deben almacenar en /var/tmp/portage/.ssh/.
{{{1}}}
root #
ssh-keygen -b 2048 -t rsa -f /var/tmp/portage/.ssh/id_rsa
A continuación cree una sección para cada máquina en el fichero de configuración de SSH:
Host test1
HostName 123.456.789.1
Port 1234
User UserName
Host test2
HostName 123.456.789.2
Port 1234
User UserName
Envíe la clave pública a cada nodo de compilación:
root #
ssh-copy-id -i /var/tmp/portage/.ssh/id_rsa.pub NombreDeUsuario@NodoDeCompilación
También asegúrese de que todas las máquinas están listadas en el fichero known_hosts:
root #
ssh-keyscan -t rsa <nodo-de-compilación-1> <nodo-de-compilación-2> [...] > /var/tmp/portage/.ssh/known_hosts
Corrija el propietario del fichero como se muestra a continuación:
root #
chown -R portage:portage /var/tmp/portage/.ssh/
Para configurar los equipos test1
y test2
, lance:
root #
/usr/bin/distcc-config --set-hosts "@test1 @test2"
Por favor, observe que el símbolo '@'
, especifica las máquinas ssh para distcc.
Para terminar, indíquele a distcc qué binario SSH debe utilizar:
DISTCC_SSH="ssh"
No es necesario lanzar el guión de inicio distccd en los equipos cuando distcc se comunica a través de SSH.
SSH inverso
As an alternative to distcc's built-in SSH solution, a compiling server can connect to the distcc client via SSH, redirecting the client's distcc TCP port to the compiling server. There is no need for password-less SSH keys on the client:
user $
ssh -R3632:127.0.0.1:3632 root@distcc-client
Note that distcc uses localhost as a literal keyword for special purpose so that 127.0.0.1 has to be used instead. For multiple compiling servers each needs its own port redirection on the client (e.g. 127.0.0.1:4000, 127.0.0.1:4001 etc). Assert that IP addresses and ports are listed in /etc/distcc/hosts on the client.
Pruebas
Para probar distcc, escribir un simple programa Hola distcc y lanzar distcc en modo hablador para comprobar si se está comunicando correctamente.
#include <stdio.h>
int main() {
printf("¡Hola distcc!\n");
return 0;
}
A continuación, en el modo hablador, compilar el programa utilizando distcc y enlazar el fichero objeto generado en un ejecutable:
user $
export DISTCC_VERBOSE=1
user $
distcc gcc -c main.c -o main.o # or 'pump distcc <...>'
user $
gcc main.o -o main
Reemplazar la orden distcc por pump distcc si se desea utilizar el modo bombeo.
Debería haber un montón de información acerca de distcc con su configuración, selección de la máquina con la que conectar, conexión a la misma y por último la compilación de main.c. Se la salida no muestra las máquinas distcc esperadas, se debe comprobar la configuración.
Por último, asegurarse de que el programa compilado funciona correctamente. Para probar cada máquina, enumerar las máquinas de compilación en el fichero de máquinas.
user $
./main
¡Hola distcc!
Solución a problemas
Si se produce cualquier problema mientras se utiliza distcc, entonces esta sección puede ser de ayuda.
ERROR: failed to open /var/log/distccd.log
A partir del 22 de enero de 2015 la instalación no crea el fichero distccd.log apropiado en /var/log/. Esto afecta aparentemente solo a la versión 3.1-r8 de distcc. Esta incidencia está en proceso de solución (ver bug #477630). Es posible evitar este problema creando manualmente el fichero de registro, asignarle el propietario adecuado y reiniciando el demonio distccd:
root #
mkdir -p /var/log/distcc
root #
touch /var/log/distcc/distccd.log
root #
chown distcc:daemon /var/log/distcc/distccd.log
A continuación actualice la ruta /var/log del fichero de configuración de distccd en /etc/conf.d/distccd para definirla al directorio de distcc creado en el paso anterior:
DISTCCD_OPTS="--port 3632 --log-level notice --log-file /var/log/distcc/distccd.log -N 15
Para terminar, reinicie el servicio distccd:
root #
/etc/init.d/distccd restart
Algunos paquetes no utilizan distcc
A medida que se instalan algunos paquetes, los usuarios observarán que la construcción de algunos de ellos no se está realizando (y por tanto no se están construyendo en paralelo). Esto puede ocurrir porque el fichero Makefile del paquete no soporta operaciones en paralelo o el mantenedor del ebuild ha deshabilitado explícitamente dichas operaciones en paralelo debido un problema conocido.
En algunas ocasiones, distcc puede causar que un paquete falle en su compilación. Si sucede esto, por favor informe de ello.
Rust package is known to cause excessive IO utilization as --local-load is ignored and --jobs is usually too high for local build resources. A package.env needs to be provisioned with non-distcc MAKEOPTS values to workaround this behavior.
MAKEOPTS="-jN"
FEATURES="-distcc"
dev-lang/rust nodistcc.conf
mail-client/thunderbird nodistcc.conf
sys-libs/libcxx nodistcc.conf
www-client/firefox nodistcc.conf
Versiones mezcladas de GCC
Si el entorno aloja versiones diferentes de GCC, probablemente tenga problemas extraños. La solución es asegurarse de que todas las máquinas tengan la misma versión.
Las actualizaciones de Portage más recientes utilizan ${CHOST}-gcc
(menos gcc) en lugar de gcc
. Esto significa que si se mezclan máquinas i686 con otros tipos de máquina (i386, i586) entonces las construcciones darán problemas. Una solución temporal a esto es lanzar:
root #
export CC='gcc' CXX='c++'
También es posible definir las variables CC y CXX en /etc/portage/make.conf a los valores listados en la orden de arriba.
Hacer esto explícitamente redefine algún comportamiento de Portage y puede que tenga resultados un tanto extraños en el futuro. Haga esto solo si no puede evitar el mezclar CHOSTs.
No es suficiente tener la versión adecuada de gcc como ranura (slot) en el servidor. Portage utiliza distcc como reemplazo del compilador referenciado por la variable CHOST (esto es,
x86_64-pc-linux-gnu
) y distccd lo invoca utilizando exactamente el mismo nombre. El compilador del sistema por defecto debe ser la versión adecuada de gcc en todos los equipos que participen en la compilación.-march=native
A partir de la versión 4.3.0 de GCC, el compilador ofrece soporta para la opción -march=native
que habilita la detección automática de la CPU y de las optimizaciones que merece la pena activar en el procesador sobre el que está corriendo GCC. Esto es un problema cuando se utiliza distcc, ya que permite mezclar código optimizado para diferentes procesadores. Por ejemplo, al correr distcc con -march=native
en un sistema que tiene un procesador AMD Athlon y haciendo lo mismo en otro sistema que tiene un procesador Intel Pentium processor se mezclará el código compilado en ambos procesadores.
Preste atención a la siguiente advertencia:
No utilice
-march=native
o -mtune=native
en las varibales CFLAGS o CXXFLAGS de make.conf cuando compile con distcc.Leer la sección CFLAGS y CXXFLAGS y Inlining -march=native
for distcc para obtener más información.
No se puede alcanzar la red
Cuando se utiliza una conexión SSH, puede que se encuentre con el error: ssh: Could not resolve hostname: Temporary failure in name resolution.
Due to network restrictions introduced by the feature network-sandbox
, this issue may be encountered. Since distcc contradicts with this security feature, it must be disabled:
FEATURES="${FEATURES} -network-sandbox"
Obtener más información de los registros de emerge
Es posible obtener más información de registro si se habilita el modo hablador. Esto se consigue añadiendo DISTCC_VERBOSE al archivo /etc/portage/bashrc:
export DISTCC_VERBOSE=1
Se puede encontrar el registro detallado en /var/tmp/portage/$CATEGORÍA/$PF/temp/build.log.
Se debe recordar que la primera invocación de distcc visible en build.log no es necesariamente la primera llamada a distcc durante el proceso de construcción. Por ejemplo un equipo de construcción puede ausentarse por un periodo de un minuto durante la fase de configuración cuando se realizan algunas comprobaciones utilizando un compilador (distcc define un periodo de ausencia cuando falla la compilación de un servidor remoto, no importa si falló en la máquina local o no).
Consultar el directorio /var/tmp/portage/$CATEGORÍA/$PF/work/ para investigar este tipo de situaciones. Buscar en otros registros o llamar a make de forma explícita desde el propio directorio de trabajo.
Otra variable interesante que se puede utilizar es DISTCC_SAVE_TEMPS. Cuando se define, guarda la salida estándar y la de error de un compilador remoto que, para las construcciones de Portage, se generan en ficheros dentro del directorio /var/tmp/portage/$CATEGORÍA/$PF/temp/.
export DISTCC_SAVE_TEMPS=1
No se puede crear el directorio /dev/null/.cache/ccache/tmp: Not a directory
This error can be discovered from the standard error output file in the server if DISTCC_SAVE_TEMPS is set. It only occurs when using distccd with ccache.
Likely, it is because CCACHE_DIR is not properly set, or not passed correctly to distccd. ccache will then default to $HOME/.cache/ccache as its cache folder. However, ccache is run by distccd under user distcc, which is a non-login account. See systemd section and With ccache section for setting CCACHE_DIR.
La construcción de Portage ha fallado con errores que, aparentemente no se pueden asociar de ningún modo con distcc
When builds are failing with errors that do not seem to be connected to distcc, but the build works with FEATURES="-distcc", it has been reported that builds sometimes fail because of DISTCC_VERBOSE=1. Try the build with DISTCC_VERBOSE=0.
Ver también
- Distcc/Cross-Compiling — le muestra al lector cómo configurar distcc para realizar compilación cruzada entre diferentes arquitecturas de procesador.
Recursos externos
This page is based on a document formerly found on our main website gentoo.org.
The following people contributed to the original document: Lisa Seelye, Mike Gilbert (floppym) , Erwin, Sven Vermeulen (SwifT) , Lars Weiler, Tiemo Kieft, and
They are listed here because wiki history does not allow for any external attribution. If you edit the wiki article, please do not add yourself here; your contributions are recorded on each article's associated history page.