Gentoo es una distribución de Linux potente y flexible. Con su innovador administrador de paquetes, Portage, le permite esculpir su sistema informático hasta sus partes más básicas.
Esto se debe a que Gentoo, por defecto, requiere que compile todos los paquetes que desea instalar. Ese enfoque le permite cambiar la configuración de tiempo de compilación. Esto incluye configuraciones para varias tecnologías que no habrían sido posibles en una distribución basada en binario.
¿Qué es la gestión de paquetes de origen?
La gestión de paquetes basada en código fuente es la forma original de distribuir programas de terceros en Linux. Este es un sistema donde un mantenedor tiene una lista de recetas en la obtención y creación de programas.
Estas recetas pueden contener tanto el código fuente de un programa como las instrucciones sobre cómo obtenerlo. Como usuario, puede descargar estas recetas de su distribuidor a través de su administrador de paquetes. Una vez hecho esto, su máquina descargará el código fuente del programa y lo creará en tiempo real para usted.
Si bien esto puede parecer anticuado, hacerlo de esta manera tiene una serie de beneficios:
- Distribuir solo la receta de un paquete requiere menos datos que distribuir copias binarias. Esto, a su vez, reduce la cantidad de recursos necesarios para alojar un espejo de un repositorio.
- Compilar un paquete a partir de su código fuente lo expone a los programas que hacen que su sistema operativo funcione. Esto puede ser especialmente útil si desea aprender cómo funciona su computadora y cómo puede ampliar sus funciones.
- Por último, compilar un paquete a partir de su código fuente le brinda la posibilidad de personalizar y cambiar el comportamiento de sus programas. Puede incluir o eliminar fácilmente funciones que no necesita.
A pesar de eso, este enfoque también viene con una serie de desventajas. Por ejemplo, paquetes como Firefox y Chromium tardan horas en compilarse e instalarse. Esto se debe a que se trata de programas con millones de líneas de código y cientos de dependencias.
Sabiendo eso, este artículo tiene como objetivo presentar cinco trucos que puede usar para mejorar sus tiempos de compilación cuando usa Gentoo.
1. Optimiza MAKEOPTS
Una de las formas más sencillas de acelerar los tiempos de compilación en Gentoo es optimizar su make.conf. Este es el archivo de configuración principal que utiliza Portage para determinar la configuración de compilación de su máquina. Como tal, contiene una variedad de variables que determinan la configuración y la arquitectura de su sistema.
Puede encontrar el archivo make.conf en “/etc/portag”. También puede imprimir el contenido del archivo con el siguiente comando:
cat /etc/portage/make.conf
Lo único que necesita cambiar para optimizar Portage es MAKEOPTS. Esta es la configuración que se ocupa de las banderas de optimización para su sistema. Considere el siguiente ejemplo:
[...] MAKEOPTS="-j1 -l1" [...]
En este caso, hay dos banderas que puede usar con MAKEOPTS:
- los
-j
indica la cantidad de trabajos de compilación que desea asignar a su CPU. Una buena regla general al establecer este valor es darle la mitad de la cantidad de núcleos que tiene su CPU. Por ejemplo, si está ejecutando una CPU de cuatro núcleos, puede establecer este valor en-j2
. - los
-l
flag, por otro lado, establece el promedio de carga que desea para su sistema. El promedio de carga es la cantidad combinada de tareas que la CPU realiza durante un período de tiempo. Por ejemplo, si desea acelerar los tiempos de compilación de su sistema, puede establecer este valor en-l2
.
2. Aproveche CCache
Otra forma de acelerar los tiempos de compilación es usando CCache. Este es un programa de terceros que le permite guardar archivos compilados comunes en un espacio temporal en su computadora.
A partir de ahí, su compilador puede usar estos archivos guardados en lugar de volver a compilarlos. Esto puede ser especialmente útil si está constantemente reconstruyendo programas o compilando un paquete grande.
Puede instalar CCache a través de Portage:
sudo emerge --ask dev-util/ccache
Lo siguiente que debe hacer es configurar la configuración de CCache. Para ello, debe crear el archivo ccache.conf:
sudo mkdir /var/cache/ccache/ && touch /var/cache/ccache/ccache.conf
Desde aquí, puede usar los ajustes de configuración predeterminados de CCache para comenzar:
max_size = 20.0G umask = 002 hash_dir = false compiler_check = %compiler% -v cache_dir_levels = 3
Lo último que debe hacer es decirle a Portage que use CCache al compilar paquetes. Para hacerlo, puede incluir las siguientes líneas en su make.conf:
FEATURES="ccache" CCACHE_DIR="/var/cache/ccache"
3. Pruebe DistCC
Similar a CCache, DistCC también es un programa de terceros que puede ayudar a acelerar los tiempos de compilación. A diferencia de CCache, DistCC hace esto al distribuir las tareas de compilación a otras computadoras en su red. Esto puede ser especialmente útil si tiene varias computadoras sin usar en su hogar.
La forma en que funciona es que DistCC se divide en dos programas: distccd y distcc.
- distccd es la utilidad que se ejecuta en el servidor de cómputo. Este es un programa simple que escucha las solicitudes DistCC entrantes de los clientes y toma tareas de ellos. Una vez que se completa la compilación, el objeto compilado se envía de vuelta al cliente para que se empaquete.
- distcc, por otro lado, es el programa cliente que se conecta a distccd. Este es el programa que funciona con Portage para programar y distribuir sin problemas tareas de compilación en una red.
Crear un pequeño clúster de DistCC es relativamente simple. Para hacer eso, necesita instalar el programa distcc tanto en su servidor como en su PC cliente:
sudo emerge --ask sys-devel/distcc
Configuración de un servidor DistCC
A continuación, debe configurar su servidor para aceptar conexiones DistCC. Puede hacerlo creando un archivo de configuración de distcc en “/etc/conf.d/”:
sudo touch /etc/conf.d/distccd
Una vez hecho esto, puede incluir la siguiente línea de código en su archivo distccd:
DISTCCD_OPTS="--port 3632 --log-level notice --log-file /var/log/distccd.log -N 10 --allow 192.168.254.101"
- los
port
La bandera indica el puerto donde distccd escuchará las conexiones entrantes. 3632 es el puerto predeterminado para DistCC. - los
log-level
ylog-file
le dice a DistCC que mantenga un archivo de registro para las tareas que está tomando. - los
N
bandera indica la «amabilidad» de distccd. Esta es una variable que le dice a DistCC cuánto puede usar la CPU del servidor para tareas de compilación. Este es un valor que va de 0 a 20, donde 0 es lo menos agradable y 20 lo más. - Por último, el
allow
flag le dice a DistCC que solo escuche las conexiones entrantes de direcciones específicas. Por ejemplo, la línea anterior le dice a DistCC que solo escuche las conexiones entrantes de un solo cliente.
Lo siguiente que debe hacer es crear el archivo de registro distccd:
sudo touch /var/log/distccd.log sudo chown distcc:root /var/log/distccd.log
Una vez hecho esto, ahora puede habilitar su servidor distccd para aceptar conexiones DistCC entrantes:
sudo rc-update add distccd default sudo rc-service distccd start
Configurando su Cliente DistCC
A diferencia de distccd, configurar su cliente DistCC es increíblemente simple. Primero debe decirle a su cliente dónde buscar el servidor distccd:
sudo /usr/bin/distcc-config --set-hosts "localhost 192.168.254.102"
Esto le indicará a DistCC que use tanto la máquina local como el servidor para compilar programas. A partir de ahí, lo único que queda por hacer es configurar su make.conf para usar DistCC.
Similar a CCache, necesita usar la variable FEATURES para decirle a Portage que está ejecutando DistCC en su red. Por ejemplo, este es un make.conf de una máquina cliente:
MAKEOPTS="-j4 -l4" FEATURES="distcc"
4. Usa BuildPKG
Otra forma de acelerar los tiempos de compilación en Gentoo es creando un servidor de distribución binaria. En esto, está utilizando una máquina separada donde los paquetes se construyen y distribuyen en forma binaria.
A diferencia de DistCC, la distribución de binarios solo requiere una sola máquina para realizar la compilación. El programa resultante luego se comparte entre varias máquinas donde pueden instalarlo normalmente.
Hacerlo de esta manera puede ser útil si ya está utilizando Gentoo en varias máquinas similares. Esto se debe a que los archivos binarios reducen el tiempo que lleva crear y mantener un solo cliente.
Para comenzar, solo necesita agregar la siguiente línea al make.conf de su servidor de compilación:
Esto, a su vez, le indicará a Portage que cree automáticamente un paquete binario para cada programa que instale en su servidor.
A partir de ahí, debe crear una forma de compartir esos archivos binarios con las máquinas de su red. Para hacer eso, puede instalar un servidor web HTTP simple:
sudo emerge --ask www-servers/lighttpd
Luego, dígale a lighttpd que sirva los paquetes de su servidor agregando la siguiente línea a su «/etc/lighttpd/lighttpd.conf»:
server.modules += ( "mod_alias" ) alias.url = ( "/packages" => "/var/cache/binpkgs" )
Instalando Paquetes Binarios en Gentoo
Una vez hecho esto, la instalación de paquetes binarios desde su servidor de distribución es un proceso simple de dos pasos. Primero, necesita decirle a Portage la dirección de su servidor de distribución:
PORTAGE_BINHOST="https://192.168.254.110/packages"
A partir de ahí, usé Portage para instalar paquetes binarios:
sudo emerge --ask -K www-client/firefox
Aquí el -K
obligará a Portage a buscar únicamente los archivos binarios del paquete que desea instalar.
Al hacer esto, buscará en el servidor si tiene alguna copia del programa Firefox. Si Portage no puede encontrar ninguno, la instalación fallará. En última instancia, esto significa que el servidor ya debe tener el binario de un programa antes de que los clientes lo soliciten.
5. Optimice su compilador en Gentoo
Por último, también puede configurar el Compilador GNU C (GCC) para permitirle optimizar la velocidad.
Sin embargo, a diferencia de MAKEOPTS, estas opciones dependerán de la máquina que tenga. Esto incluye la CPU, así como el disco duro y la memoria que tiene.
Además, debe colocar estas opciones en el COMMON_FLAGS
variable. Por ejemplo:
COMMON_FLAGS="-march=native -O1 -pipe"
En esto, hay tres opciones que puede configurar para optimizar GCC:
- los
march
La opción le dice a GCC que compile el programa en la CPU que desee. En la mayoría de los casos, le dice a GCC que cree el programa para su CPU local. Para hacer eso, puede dar el valor «nativo» y GCC se compilará para la CPU en la que se está ejecutando actualmente. - los
O
La opción indica el nivel de optimización que desea para sus programas. Este es un rango entre 0 y 3 y cuanto mayor sea el valor que establezca, más rápido se ejecutará el programa. Sin embargo, hacer eso aumentará el tiempo que lleva compilarlo. - los
pipe
La opción es un conmutador que puede configurar para acelerar el proceso de compilación. Lo hace manteniendo objetos en la RAM en lugar de guardarlos en archivos temporales. Como tal, esto consumirá mucha memoria y usar esto con RAM limitada bloqueará GCC.
Preguntas frecuentes
1. No tengo una variable MAKEOPTS o FEATURES en mi make.conf. ¿Está rota mi instalación de Gentoo?
¡No! Es normal que el archivo make.conf predeterminado no tenga las variables MAKEOPTS y FEATURES. Simplemente puede agregar las variables y sus valores a su make.conf y Portage lo reconocerá y lo aplicará de inmediato.
2. ¿Es posible habilitar CCache solo para los paquetes que quiero?
¡Sí! Habilite fácilmente CCache solo para paquetes específicos. Para hacer eso, primero debe eliminar el valor «ccache» en su variable FEATURES.
A partir de ahí, debe editar el archivo «/etc/portage/package.env». Este es el archivo donde puede habilitar las características de Portage por paquete. Sabiendo eso, este es un archivo package.env que usa CCache para algunos programas:
www-client/firefox ccache.conf sys-devel/gcc ccache.conf sys-devel/clang ccache.conf
Al hacerlo, habilité CCache para Firefox, GCC y Clang. Esto significa que Portage solo guardará los archivos objeto de estos programas y sus dependencias asociadas.
3. ¿Hay algún problema con la ejecución de un servidor de distribución de Gentoo?
Uno de los principales problemas del mantenimiento de un servidor de distribución es que usted es responsable de mantener actualizados los paquetes binarios. Esto significa que antes de que pueda actualizar cualquier cliente, primero deberá actualizar el servidor de distribución y luego eliminar los archivos binarios antiguos en sus clientes.
Otro problema con la ejecución de un servidor de distribución es que pierde la flexibilidad de los indicadores USE para sus máquinas cliente. Esto significa que debe habilitar las banderas que no necesita en todas sus máquinas.
Credito de imagen: Unsplash