3 de agosto de 2016

Gentoo Linux, una metadistribución de Linux tuneada . #LPIC-extra-resource


Para que nos entendamos, Gentoo Linux es una metadistribución que se caracteriza por ser altamente configurable y personalizable de todas las existentes en el mundo de Linux.

El usuario que utilice Gentoo Linux, no sólo puede compilar el software a su medida, escogiendo las características que quiere que tome; si no también, puede compilar ese software para su propio soporte de CPU acelerando aún más la fluidez y el consumo del mismo.

Gentoo Linux promete desde su instalación, un comienzo personalizable al gusto del usuario. Ya que este proceso se realiza a través de comandos y no existe interfaz gráfica de instalación que lo oriente. 
Para llevar a cabo su instalación se distribuye a través de sus mirrors y cada cierto tiempo, una serie de archivos comprimidos bajo extensión .tar.gz o .tar.xz llamados stage3. Estos contienen las herramientas y ficheros necesarios para comenzar la instalación.


En suma, hay una gran cantidad y magnífica documentación que te guía por este proceso sin perderte y sin poner en peligro el sistema, a menos que, hagas cosas que se salgan de la guía claro.

Antes de entrar en detalles, me gustaría dejar claro una serie de términos, para aquell@s que no lo sepan para no pasarlos por alto:
  • Lenguaje de programación: Permite interactuar con el equipo en un lenguaje que nosotros podemos entender como si fuera hablar en inglés u otro idioma extranjero. Los más típicos son C, C++...
  • Código fuente: Es el ADN del programa y/o software, contiene todo para que funcione. Sin él, no hay programa directamente. Y se escribe en un lenguaje de programación.
  • Compilador: Programa que traduce el lenguaje de programación en lenguaje de máquina, que serían los famosos 0 y 1.
  • Binario: Es el archivo que genera el compilador tras haber traducido el código fuente.
  • Tarball: Comprimido que almacena código fuente.
  • Y por último, aclarar un poco el proceso de compilación. Imagínate que quieres publicar un libro, el cuál va a ser leído por multitud de personas. Entonces, te apresuras a empezar, redactando un borrador del libro. El cuál lo harás en un determinado lenguaje como puede ser el español o el inglés. Todos los días vas añadiendo líneas y/o borrando cosas que no encajen y añadiendo comentarios sobre el por qué lo hiciste. 
Finalmente, terminas el borrador y lo llevas a la imprenta. Allí sale el libro terminado, listo para ponerlo a venta al público. 
El proceso es el mismo entre Código fuente (borrador) > Compilador (Imprenta) > Binario (Libro).

Para entrar un poco en situación, antes de liberarse Gentoo Linux en marzo de 2002. El fundador, Daniel Robbins mantenía una distribución llamada Enoch Linux cuyo objetivo consistía en no facilitar paquetes binarios pre-compilados como hacen la mayoría de distribuciones actuales. Consiguiendo así agilizar y afinar el software en términos de rendimiento.

Daniel Robbins, probó un fork (bifurcación) de GCC conocido como EGCS desarrollado por Cygnus Solutions y renombró el nombre de Enoch Linux a Gentoo Linux. Sin embargo, más tarde decidió detener el desarrollo de Gentoo Linux y se fue a explorar el mundo de FreeBSD (un SO basado en BSD y actualmente en desarrollo) para obtener más conocimientos sobre el sistema de ports, así, posteriormente, trasladarlo a Gentoo Linux y tener una bella obra de arte como es actualmente Portage. Finalmente, Gentoo Linux vio de nuevo la luz en marzo del 2002 con su versión 1.0.
Beastie, la mascota de BSD.

Portage, es un gestor de paquetes que está inspirado en el árbol de ports de FreeBSD. Para que nos entendamos, los ports en FreeBSD son un conjunto de directorios con scripts a menudo, elaborados en lenguaje script que permiten y facilitan la instalación de software desde los tarballs (códifo fuente). 

FreeBSD no tiene un gestor de paquetes de alto nivel que simplifique la tarea como tiene Gentoo Linux con emerge. En este SO, tienes que ir directorio tras directorio efectuando un make install clean. Eso sí, si el software que pretendes instalar tiene dependencias, las compila también, esto suprime la necesidad de ir directorio tras directorio.

Para que nos entendamos si cogemos un listín telefónico ordenado por categorías, dentro de esas categorías hay subcategorías y finalmente los negocios, locales, y personas con su nombre, descripción, y teléfono de contacto. Al que si llamas te ofrece un servicio.

Este es un ejemplo del árbol de Portage:

├── app-accessibility
│   ├── accerciser
│   │   ├── accerciser-3.14.0.ebuild
│   │   ├── ChangeLog
│   │   ├── ChangeLog-2015
│   │   ├── Manifest
│   │   └── metadata.xml
│   ├── at-spi2-atk
│   │   ├── at-spi2-atk-2.16.0-r1.ebuild
│   │   ├── at-spi2-atk-2.18.1.ebuild
│   │   ├── at-spi2-atk-2.20.1.ebuild
│   │   ├── ChangeLog
│   │   ├── ChangeLog-2015
│   │   ├── files
│   │   │   ├── at-spi2-atk-2.16.0-atk_suite.h
│   │   │   ├── at-spi2-atk-2.16.0-null-gobject.patch
│   │   │   ├── at-spi2-atk-2.16.0-out-of-source.patch
│   │   │   └── at-spi2-atk-2.16.0-tests-data
│   │   │       ├── test-accessible.xml
│   │   │       ├── test-action.xml
│   │   │       ├── test-component.xml
│   │   │       └── test.xml
Como podemos ver, un paquete está constituido por varios archivos. Especialmente los que más se repiten como patrón son:

  • Metadata.xml: Archivo que contiene código XML y que se utiliza para saber quién es el matenedor de ese paquete entre otras cosas.
  • Manifest: Contiene la suma de comprobación para verificar si el paquete que se ha descargado de los repositorios coincide con la suma que contiene el fichero en un hash determinado como puede ser SHA1, SHA256...
  • *.ebuild es un fichero que contiene todo lo necesario para instalar un software determinado. En él se incluye información como:
    • Nombre
    • Descripción
    • Licencia
    • Palabras clave (arquitecturas)
    • Dependencias
    • Si incluye o no parches
    • Si necesita configuración adicional para soporte multilib
    • ....etc
  • ChangeLog: Permite visualizar los cambios que ha sufrido este paquete a lo largo del tiempo.
Por otro lado, FreeBSD tiene la siguiente estructura, similar como no:
  • Makefile: Fichero que incluye información como:
    • Nombre del port
    • Versión
    • Revisión
    • Categoría
    • Web oficial
    • Mantenedor
    • Comentario
    • Dependencias...
  • distinfo: Contiene un tipo de hash para comprobar si cumple con la suma de verificación y el nombre del archivo a descargar junto con su versión, revisión y extensión.
  • pkg-descr: Descripción larga del port
  • pkg-plist: Lista de archivos que se van a instalar relativo al port en cuestión (no el resto de dependencias si las tuviera)
Portage tiene un comando (entre muchos otros como ebuild) que permite interactuar con este bello sistema llamado emerge, un gestor de paquetes de alto nivel. Con él podemos instalar, eliminar, reinstalar, depurar.... todo lo que tenga que ver con los paquetes del sistema. Está escrito en Python mayormente y se puede encontrar en el directorio /usr/lib/python-exec/version_python/emerge

En el siguiente vídeo de ejemplo podemos ver como interactuar con él:


Este sistema tira de un fichero general ubicado en /etc/portage/make.conf, en el que se establecen algunas características generales almacenadas en variables de Bash como puede ser CFLAGS, MAKEOPTS, USE...
  • CFLAGS se toman para saber qué FLAGS va a pasarle al compilador GCC cuando construya un paquete. Digamos, que si compras un traje en una tienda. Por lo general, están elaborados para que todos podamos utilizar dicho traje. Pero siempre quedarán costuras más ceñidas que otras, haciendo que el traje sea igual de válido para todos, pero no ceñido a nuestra silueta.
Sin embargo, si mandamos ha hacer un traje a nuestra medida, o a la medida que le digamos que queremos el traje, ya lo estamos haciendo único y exclusivo para nosotros, o para el acompañante. Esa es en parte la finalidad de las CFLAGS. Aprovechar todo el potencial de nuestro CPU para compilar los paquetes. La contrapartida es que si se le "dejamos" el traje a un amigo, este puede que no le valga.
  • MAKEOPTS es una variable en la que se indica, que queremos compilar con lo que se denomina compilación paralela o threading. Esto aprovecha todos los núcleos de nuestro procesador incluyendo los subprocesos para llevar a cabo la compilación del paquete.
Imagínate, que para hacer un traje solo tenemos una empresa con 20 costurer@s, pero mandamos a trabajar a 1 sola persona. El traje acaba terminado a los 3 días. Pero, ¿y si ponemos a esos 20 costurer@s a trabajar para hacerlo? En menos de un día lo tenemos hecho. Esto es lo mismo al usar esta variable.
Su uso implica siempre sumar +1 al número actual de núcleos de procesamiento y subprocesos. Por ejemplo, si tenemos un i5 con 2 núcleos y 2 subprocesos. El valor debería ser MAKEOPTS="-j5" y no "-j4".
  • USE son las características con la que queremos que se compilen los paquetes del sistema. Si queremos que se utilice KDE, GNOME, Qt4, Qt5... se habilitan haciendo uso del signo '+' y si queremos dejar clara que no lo queremos con el signo '-'. Extrapolándolo al ejemplo del traje, aquí logramos personalizarlo añadiendo el color que queramos, la tela...
Nota personal: Prefiero dejar las pocas USE posibles en /etc/portage/make.conf y utilizar un fichero separado en /etc/portage/packages.use/nombre_fichero y añadir las USE de cada paquete allí para evitar problemas posteriormente.
  • FEATURES, esta variable permite añadirle algunas características a Portage como:
    • (parallel-fetch): Utilizar descarga paralela, imagínate que la empresa de confección de trajes o ropa, le compra la tela, botones... a una distribuidora la cuál solo usa un furgón de reparto para todo. Puede que pinche los neumáticos y no llegue a tiempo. No obstante, puede mandar todo repartido en varios furgones, esto permite mayor carga y además más rapidez, si pincha uno las gomas, no pasa nada.
    • (user-fetch): La descarga se hace mediante usuario sin privilegios.
    • Más info, aquí.
  • GENTOO_MIRROR, permite añadir multitud de mirrors para evitar que sí cae uno por el motivo que sea, salte al otro sin problema. Imagínate que tienes 1 distribuidora de material textil para confeccionar la ropa, y casualmente un día te falla por el motivo que sea. ¿Qué haces? ¿Dejas tirado a tus clientes porque esa empresa te ha fallado? ¿No, verdad? Se concierta otras para evitar que sucedan este tipo de cosas y no dejes a tus clientes plantados.
  • L10N (como reemplazo a LINGUAS), especifica el idioma y/o los idiomas que quieras mantener instalado en tu sistema. Puedes tener más de 1 sin ningún problema.
  • PORTDIR, es el directorio dónde se encuentra el árbol de paquetes, generalmente se suele dejar por defecto.
  • PKGDIR, es dónde se encuentran los tarballs o paquetes que contienen el código fuente. Suele dejarse por defecto.
  • CPU_FLAGS_X86, es una variable nueva que pretende sustituir los registros de estado comúnmente denominado en inglés FLAGS del procesor que suelen añadirse también como registros USE, y así los mantienen más ordenados.
  • VIDEO_CARDS, se definen que drivers vamos a utilizar según la tarjeta gráfica que tengamos, siempre y cuando utilicemos servidor gráfico.
  • INPUT_DEVICES, se añaden los controladores que utilizaremos para los periféricos en el caso de utilizar servidor gráfico.
  • CHOST, se suele dejar por defecto. Si nosotros queremos utilizar otra versión de GCC, en ese caso, se debería seguir cuidadosamente las siguientes instrucciones 1 y 2.

Hay más variables que pueden utilizarse para definir más características como por ejemplo APACHE2_MODULES que asigna los módulos que se quieren utilizar para Apache; PORTDIR_OVERLAY para definir en qué directorio alojar los overlays...et

Existen varias cosas que debemos aprender con respecto a Portage a parte de las ya mencionadas. Y es la gestión de licencias de software, paquetes bloqueados y el uso de paquetes inestables.

Hay software en Gentoo Linux que aunque en su mayor parte es software libre y/u Open Source. También nos encontraremos con la posibilidad de instalar software privativo como es el caso de los drivers de NVIDIA, TeamViewer, VirtualBox... y conllevará a que aceptemos una serie de licencias como la PUEL, NVIDIA...etc para ello, tenemos un fichero ubicado en /etc/portage/package.license.

En él, tendremos que añadir el paquete que queramos instalar más el nombre de la licencia que nos pide.
Se pueden añadir de 2 formas:
  • >=dev-util/nvidia-cuda-toolkit-6.5.14 NVIDIA-CUDA
  • dev-util/nvidia-cuda-toolkit NVIDIA-CUDA

¿Cuál es la diferencia? No tan sustancial. Podemos indicar que las versiones que sean superiores a la 6.5.14 nos pida de nuevo volver modificar package.license. Mientras que la segunda, sea cual sea la versión aceptará las condiciones.

En cuánto a los paquetes bloqueados, son paquetes no testados y considerados de índole "inestable". Es decir, no han sido aprobados como estables dentro del árbol de Portage. Y hay que añadir el paquete a instalar más la arquitectura que estemos utilizando en cuestión en el fichero /usr/portage/package.accept_keywords

Como hemos dicho anteriormente, podemos utilizar el siguiente patrón para añadir el soporte:
  • >=dev-db/sqlmap-1.0.6 ~amd64
  • dev-db/sqlmap ~amd64

Y por último, podemos bloquear paquetes, es decir, si a lo mejor emerge se pone un pelín caprichoso y no nos deja compilar un paquete el cuál nos avisa que bloqueemos un determinado paquete. Se puede hacer. Solo hay que añadir solo el nombre del paquete en cuestión en el fichero /etc/portage/packages.mask/nombre_fichero
  • >=dev-db/sqlmap-1.0.6
  • dev-db/sqlmap
Podemos obtener más información sobre Portage a través de su documentación.

Dejando un lado a Portage, ese bello sistema increíblemente adorable. También podemos destacar del gestor de servicios de OpenRC.

OpenRC es un gestor de daemons muy bueno y se encuentra disponible tanto para Gentoo Linux como para sistemas BSD como FreeBSD. Manjaro y/o Archlinux lo mantienen en sus repositorios. OpenRC se caracteriza por respetar la filosofía KISS (Keep It Simple, Stupid!) en español ¡Hazlo sencillo, estúpido! 

OpenRC se caracteriza entre otras cosas:
  • BusyBox; como reemplazo de init
  • Añadir ficheros init.d específicos para un entorno BusyBox
  • Reemplazar udev con mdev y/o eudev
  • Puede utilizar diversos gestores de redes como Wicd, NM sin problemas
  • Seleccionar runlevels específicos durante el arranque
  • Uso de CGroups
  • Prefix 
  • Soporte chroot
Los comandos que suelen utilizarse para interactuar con él son:
  • rc-status: Muestra información sobre los daemons de todos los runlevels o uno específico
  • rc-config: Configura un runlevel añade o elimina un daemon que esté en él; ó bien para, inicia un daemon...
El fichero de configuración de OpenRC se llama rc.conf y está ubicado en el directorio /etc

Y por último, comentaremos que Gentoo no sólo se puede utilizar conjuntamente con Linux. Nos lo encontramos en sistemas BSD como FreeBSD, OpenBSD, NetBSD. Pudiendo combinar el potencial de Gentoo con el resto de sistemas operativos. No me podría imaginar un OpenBSD y su firewall y seguridad con las herramientas que tiene Gentoo. Y no solo eso, existen multitud de proyectos como Gentoo Hardened que pretende hacer de Gentoo Linux algo tan blindado como OpenBSD.

Referencias
  • Gentoo Wiki
  • Wikipedia
  • Man-pages
Errata:

  • @SagMan Telegram user:  Distribución > Metadistribución: https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/About/es

2 comentarios:

Gracias por visitar mi blog y animarte a comentar. Por favor se respetuoso con sus comentarios. Cualquier error es preferible reportárlo que criticarlo por el bien de todos.



Licencia y responsabilidades

Licencia Creative Commons
netSys blog por Álvaro Castillo se encuentra bajo una Licencia Creative Commons Atribución-CompartirIgual 3.0 Unported.

El propietario de este blog no se responsabiliza de los daños que puedan generarse u ocurrir por la información expuesta aquí, en caso de ser utilizada la responsabilidad recae bajo quién la use.

Se les informa de posibles publicaciones donde queden expuestas imágenes a terceros o marcas comerciales que siempre tendrán sus fuentes, y sus atribuciones.

Por último, en caso de confusión por la temática que se trate de los artículos, tutoriales...etc dejaremos claro que este sitio Web no colabora directamente con ningún proyecto de forma oficial.