Saltar a contenido

Linux

Distrochooser, descarga fácilmente distros de Linux desde CLI

Distrochooser es un pequeño script que he elaborado para descargar cualquier distribución popular pulsando un par de teclas evitando ir a los mirrors o páginas oficiales para descargarlos. Se puede obtener desde GitHub

git clone https://github.com/sincorchetes/distrochooser
chmod +x distrochooser/run.sh
./distrochooser/run.sh

Este script crea un directorio iso en la ruta de trabajo actual dónde descargar la imagen, para su descarga hace uso del comando wget utilizando el modificador -c que permite renaudar la descarga en caso de fallo, por lo que deberemos tenerlo instalado en nuestro sistema.

En la próxima versión soportará verificación de firma, más distribuciones. Espero que os guste.

Un saludo.

Entornos de escritorio y gestores de ventanas

Hoy en día es indispensable hacer uso de un servidor gráfico que nos permita visualizar páginas Web, escuchar música y ver películas o series entre otras cosas. Eso de estar con terminales y reproducción de contenido multimedia en formato ASCII como que no nos va mucho. Queremos visualizar el contenido cuánto más nítido y con calidad, se vive mejor.

Sin embargo, hasta hace relativamente poco, solo disponíamos de terminales de texto y programas elaborados en una interfaz MS-DOS como suelen comentar las personas más veteranas (ya que por mi edad, no pude vivirlo ni sentirlo). La historia fue que hasta que Xerox PARC (el centro de investigación del futuro para Xerox Corp.), no sacó su primer Xerox Alto en 1973, no se utilizaba ningún tipo de interfaz gráfica y mucho menos, existía el concepto del cursor del ratón. Posteriormente, hubo una guerra entre Apple y Microsoft que se disputaron a ver quién copiaba mejor la interfaz gráfica y el ratón inventado de Xerox.

Entornos de escritorio

Se denominan entornos de escritorio a un conjunto de software que contiene interfaz gráfica y que permita realizar múltiples tareas de una forma sencilla, fácil y productiva debido a su interacción amigable de cara al usuario.

Por ejemplo, ver los eventos de nuestro calendario sin tener que hacer uso de comandos o terminales de texto; visualizar el correo electrónico solo haciendo dos clics en el programa...

Haremos un breve repaso de los entornos de escritorio que existen en Linux y en BSD que podemos instalar, y en qué se diferencian principalmente.

CDE

Common Desktop Environment, fue un entorno gráfico para UNIX que fue desarrollado por empresas de gran hincampié tecnológico como HP, IBM, Novell y Sun (comprada por Oracle) viendo su primera versión en junio de 1993 de la mano de HP, IBM, SunSoft y USL(Unix System Laboratories). Estos elaboraron un proyecto en común repartiéndose las tareas para llevar a cabo diferentes objetivos hasta llegar a su primera versión del escritorio. Posteriormente, se fueron involucrando más empresas en su desarrollo. No obstante, estuvo unos años en el mercado hasta que GNOME y KDE les arrebató su posicionamiento.

GNOME

GNOME (GNU Network Object Model Environment) traducido al español como Entorno de Modelo de Objeto de Red GNU, un nombre no tan amigable como sus siglas fue desarrollado por Miguel de Icaza y Federico Mena el 15 de agosto de 1997 como alternativa a KDE (ahora Plasma) para sistemas operativos UNIX-like tipo BSD, Linux, o UNIX como esSolaris (antes SunOS).

Una de las características de GNOME es que hace uso de GTK+. Es un conjunto de bibliotecas multiplataforma para desarrollar interfaces gráficas para el usuario. Básicamente, define entre otras cosas el diseño de la ventana, los botones, introduce eventos, disparadores... como Qt en Plasma o Motif en CDE pero cada cual tiene sus diferencias.

Por otro lado, pretende ser un entorno de escritorio de fácil uso con poca personalización (sobre todo en la última versión 3.x) con el que se pueda trabajar desde el minuto 0.

Instalación

Desde los repositorios oficiales de cada distribución o sistema, hay distribuciones que requieren de pasos adicionales e incluso, configuraciones que no permitan la instalación de GNOME con el gestor de servicios systemd como es el caso de Gentoo, o también contemplan la instalación más básica de GNOME que sucede tanto en Gentoo como en Archlinux. Por ende, os recomendamos la documentación.: * Fedora: sudo dnf install @gnome-desktop * CentOS: sudo yum install @gnome-desktop * Archlinux: sudo pacman -S gnome gnome-extra * Gentoo (systemd): USE="-qt4 -qt5 -kde X gtk gnome systemd" sudo emerge --ask gnome-base/gnome" * Ubuntu: sudo apt-get install ubuntu-gnome-desktop * Debian: Se utiliza una herramienta llamada taskel(8) con interfaz ncurses que permite la instalación de un entorno. sudo apt-get install tasksel && sudo tasksel * openSUSE Leap 42.3: sudo zypper -n in patterns-openSUSE-gnome * FreeBSD: sudo pkg install gnome3

KDE (aka Plasma)

KDE fue el primer entorno de escritorio para sistemas UNIX-like que nació en octubre de 1996 de la mano de un programador alemán llamado Matthias Ettrich que buscaba básicamente una interfaz gráfica que unificáse todos los sistemas UNIX imitando el entorno de escritorio CDE.

Plasma se caracteriza a parte de hacer uso de la suite Qt de bibliotecas gráficas, de hacer un entorno muy completo y muy personalizado, en el se puede configurar todo lo que un usuario jamás pudo haber imaginado que podía llegar a configurar en un entorno, y sobre todo, haciendo uso de sus propias herramientas para hacerlo sin utilizar software a terceros tipo GNOME TweakTool, o teniendo conocimientos de JavaScript o CSS para modificar estilos y comportamientos como hacen las últimas versiones de GNOME.

Hoy en día, el software de Plasma es tan portable, que se puede hasta ejecutar en Windows y en dispositivos móviles.

Instalación

Desde los repositorios oficiales de cada distribución o sistema, hay distribuciones que requieren de pasos adicionales e incluso, configuraciones que no permitan la instalación de GNOME con el gestor de servicios systemd como es el caso de Gentoo, o también contemplan la instalación más básica de Plasma (KDE) que sucede tanto en Gentoo como en Archlinux. Por ende, os recomendamos la documentación: * Fedora: sudo dnf install @kde-desktop * CentOS: sudo yum install @kde-desktop * Archlinux: sudo pacman -S plasma * Gentoo (systemd): sudo emerge --ask kde-plasma/plasma-meta" * Ubuntu: sudo apt-get install kde-plasma-desktop * Debian: Se utiliza una herramienta llamada taskel(8) con interfaz ncurses que permite la instalación de un entorno. sudo apt-get install tasksel && sudo tasksel * openSUSE Leap 42.3: sudo zypper -n in patterns-openSUSE-kde * FreeBSD: sudo pkg install gnome3

MATE

MATE es un fork de GNOME que salió el 19 de agosto de 2011 como muestra del descontento de la nueva versión de GNOME 3 debido a que reducía muchísimo la personalización del entorno de escritorio, consumía mucho más, y tenía otro tipo de funcionalidades y características no muy transigentes. Este proyecto fue desarrollado por un desarrollador argenito de Archlinux llamado Germán Perugorría conocido en la comunidad del software libre como Perberos para continuar el desarrollo de este entorno de escritorio. Que por cierto, es el que nosotros utilizamos. El nombre proviene de la hierba Mate muy común en Argentina para tomar.

Este entorno liberó su última versión el 7 de febrero de 2018, con la satisfacción de haberse portado plenamente a la nueva suite de bibliotecas de GTK+ 3 y añadiendo más funcionalidades que no tenía sobre todo en Caja que en GNOME 3 se llama Nautilus.

Instalación

  • Fedora: sudo dnf install @mate-desktop
  • CentOS: sudo yum install epel-release && sudo yum install @mate-desktop
  • Archlinux: sudo pacman -S mate-desktop
  • Gentoo (systemd): sudo emerge --ask mate-base/mate"
  • Ubuntu: sudo apt-get install mate-desktop
  • Debian: Se utiliza una herramienta llamada taskel(8) con interfaz ncurses que permite la instalación de un entorno. sudo apt-get install tasksel && sudo tasksel
  • openSUSE Leap 42.3: sudo zypper -n in patterns-openSUSE-kde
  • FreeBSD: sudo pkg install gnome3

XFCE

XFCE se caracteriza por ser un entorno de escritorio muy liviano y ligero ya que ese eran sus dos objetivos cuando se desarrolló. La primera versión se liberó en 1996 de la mano de Olivier Fourdan. Este utiliza las bibliotecas de GTK+ para el desarrollo de sus programas gráficos.

Actualmente está comenzando a portar su software a GTK+ 3 llegando un poco tarde, ya que actualmente ya se está desarrollando GTK+ 4.

Instalación

Desde los repositorios oficiales de cada distribución o sistema, hay distribuciones que requieren de pasos adicionales e incluso, configuraciones que no permitan la instalación de XFCE con el gestor de servicios systemd como es el caso de Gentoo, o también contemplan la instalación más básica de XFCE que sucede tanto en Gentoo como en Archlinux. Por ende, os recomendamos la documentación: * Fedora: sudo dnf install @xfce-desktop * CentOS (require tener activado epel): sudo yum install epel-release && sudo yum install @xfce-desktop * Archlinux: sudo pacman -S plasma * Gentoo (systemd): sudo emerge --ask " * Ubuntu: sudo apt-get install xfce-desktop * Debian: Se utiliza una herramienta llamada taskel(8) con interfaz ncurses que permite la instalación de un entorno. sudo apt-get install tasksel && sudo tasksel * openSUSE: Hay que habilitarlo desde Factory * FreeBSD: sudo pkg install xfce

LXDE

Este fue un entorno de escritorio también como el anterior, cuyo objetivo era proveer a un PC de una suite de herramientas gráficas que permitieran trabajar consumiendo lo más mínimo de un ordenador. Su primera versión fue liberada en 2006 por Hong Jen Yee. Actualmente tiene su desarrollo parado, ya que se sustituyó por LXQt.

LXQt

Es la continuación del proyecto LXDE como entorno de escritorio. El anterior hacia uso de librerías GTK+, LXQT hace uso de Qt ya que al parecer al creador de LXDE no le terminó de convencer GTK+. Su objetivo y finalidad son el mismo que en LXDE.

Instalación

Desde los repositorios oficiales de cada distribución o sistema, hay distribuciones que requieren de pasos adicionales e incluso, configuraciones que no permitan la instalación de LXQt con el gestor de servicios systemd como es el caso de Gentoo, o también contemplan la instalación más básica de LXQt que sucede tanto en Gentoo como en Archlinux. Por ende, os recomendamos la documentación: * Fedora: sudo dnf install @lxqt-desktop * CentOS (require tener activado epel): sudo yum install epel-release && sudo yum install lxqt-* * Archlinux: sudo pacman -S lxqt * Gentoo (Requiere pasos adicionales): sudo emerge --ask lxqt-meta * Ubuntu: No disponible * Debian: Se utiliza una herramienta llamada taskel(8) con interfaz ncurses que permite la instalación de un entorno. sudo apt-get install tasksel && sudo tasksel * openSUSE Leap 42.3: sudo zypper in -y pattern lxqt * FreeBSD (Requiere pasos adicionales): sudo pkg install lxqt

Razor-Qt

Fue un entorno de escritorio desarrollado con las bibiliotecas Qt en 2010, no obstante, el equipo de Razor-Qt empezó a colaborar con el creador de LXDE originando el entorno anteriori dando origen a la primera versión en julio del 2014.

Sugar Desktop

Sugar es un entorno de escritorio que nació con el objetivo de crear una interfaz muy intuitiva para aquell@s niñ@s que no podían acceder a la tecnología puntera de países del primer mundo. Creada por Sugar Labs en mayo del 2016, como entorno para el proyecto OLPC (One Laptop Per Child) un proyecto en el que se le permite a los niños mediante un portátil de bajo costo enseñarles a incorporarse a la tecnología sin necesidad de tener grandes recursos pudo crecer y seguir manteníendose como una alternativa educativa también para l@s más peques de la casa.

Instalación

Desde los repositorios oficiales de cada distribución o sistema, hay distribuciones que requieren de pasos adicionales e incluso, configuraciones que no permitan la instalación de Sugar con el gestor de servicios systemd como es el caso de Gentoo, o también contemplan la instalación más básica de Sugar que sucede tanto en Gentoo como en Archlinux. Por ende, os recomendamos la documentación: * Fedora: sudo dnf install @sugar-desktop * CentOS: No disponible, al menos de manera oficial. * Archlinux: sudo pacman -S sugar * Gentoo: No disponible de manera oficial. * Ubuntu: sudo apt-get install sucrose * Debian: sudo apt-get install sucrose * openSUSE Leap 42.3: zypper ar http://download.opensuse.org/repositories/X11:/Sugar/openSUSE_13.1/ X11:Sugar && zypper refresh && zypper in sugar sugar-activities * FreeBSD: No disponible de forma oficial ni extra oficial.

Gestores de ventanas

Los gestores de ventanas es un conjunto mínimo de software que nos permite establecer una sesión gráfica con la que poder interactuar con elementos gráficos. Su consumo es muy pequeño al igual que sus prestaciones, pero, se puede llegar a ser muy productivo con ellos si se saben configurar y utilizar.

TWM

Tab Window Manager, es el gestor de ventanas más común en todo Linux. Fue desarrollado por Tom LaStrange desde 1987, el nombre original estaba basado en la siglas de su nombre Tom's Window Manager, pero el X Consortium lo adoptó y lo renombró en 1989. En TWM se pueden apilar las ventanas, las cuáles contienen título, e iconos para interactuar. Este gestor de ventana suele utilizarse con programas como un reloj analógico xclock(1), y también un emulador de terminal llamado xterm(1) entre otros.

Instalación

  • Fedora: sudo dnf install xorg-x11-twm
  • CentOS: No disponible, al menos de manera oficial.
  • Archlinux: sudo pacman -S xorg-twm
  • Gentoo: No disponible de manera oficial.
  • Ubuntu: sudo apt-get install twm
  • Debian: sudo apt-get install twm
  • openSUSE Leap 42.3:sudo zypper in twm
  • FreeBSD: pkg install twm

i3wm

i3wm o también conocido como i3, es un gestor de ventanas que no se superposiciona, simplemente se adapta una ventana con la otra sin superponerse. i3 nos permite gestionar ventanas en modo stack es decir, apiladas, o bien en modo de pestañas tab entre más características. En suma, soporta modo multi-pantalla, está reescrita desde 0 estando todo su código licenciado bajo términos BSD. Hay que destacar que tiene soporte UTF-8 y es muy fácil de configurar. Su primera versión fue escrita en C por Michael Stapelberg el 15 de marzo del 2009.

Instalación

  • Fedora: sudo dnf install i3
  • CentOS: sudo yum install epel-release && sudo yum install i3
  • Archlinux: sudo pacman -S i3-wm
  • Gentoo: sudo emerge --ask x11-wm/i3
  • Ubuntu: sudo apt-get install i3
  • Debian: sudo apt-get install i3
  • openSUSE Leap 42.3:sudo zypper in twm
  • FreeBSD: sudo pkg install x11-wm/i3

Fluxbox

Fluxbox es un gestor de ventanas creado por Henrik Kinnunen el 12 de septiembre de 2001. Es un wm muy sencillo y fácil de usar, bastante ligero en cuanto consumo y rendimiento. Está basado en un gestor de ventanas llamado Blackbox ya desmantenido. La última versión liberada es la 1.3.7 publicada el 8 de febrero de 2015.

Instalación

  • Fedora: sudo dnf install fluxbox
  • CentOS: sudo yum install epel-release && sudo yum install fluxbox
  • Archlinux: sudo pacman -S fluxbox
  • Gentoo: sudo emerge --ask x11-wm/fluxbox
  • Ubuntu: sudo apt-get install fluxbox
  • Debian: sudo apt-get install fluxbox
  • openSUSE Leap 42.3:sudo zypper in fluxbox
  • FreeBSD: sudo pkg install x11-wm/fluxbox

Openbox

Openbox es otro gestor de ventanas creado por Dana Jansens y Mikael Magnusson el 18 de septiembre de 2002. Este también derivó de sus inicios de Blackbox, sin embargo, ha sido reescrito totalmente desde la versión 3.0. Este gestor sacrifica entre otras cosas algunas funciones típicas como la barra de menú, lista de apps en ejecución o bordes redondeados en las ventanas. No obstante, posee herramientas de configuración del entorno bastane útiles para cambiar el fondo de pantalla, tema del gestor...etc, no obstante, el gestor de ventanas lleva sin desarrollarse desde el 1 de julio del 2015.

Instalación

  • Fedora: sudo dnf install openbox
  • CentOS: sudo yum install epel-release && sudo yum install openbox
  • Archlinux: sudo pacman -S openbox
  • Gentoo: sudo emerge --ask x11-wm/fluxbox
  • Ubuntu: sudo apt-get install openbox
  • Debian: sudo apt-get install openbox
  • openSUSE Leap 42.3:sudo zypper in openbox
  • FreeBSD: sudo pkg install x11-wm/openbox

Enlightenment

Es un gestor de ventanas con una gran cantidad de applets, módulos y aplicaciones que lo intentan convertir en un entorno de escritorio completo, la primera versión liberada fue en 1997 por Rasterman (Carsten Haitzler), mientras que la última versión liberada fue el 15 de marzo de 2018. Enlightenment lleva un desarrollo lento y denso que hace que el entorno sea un poco menos novedoso y no todos sus módulos y applets están bien recibidos según que distribuciones. Suelen faltar muchos de ellos, y algunas veces las compilaciones de los mismos no suelen llevar a resultados favorables. No obstante es una buena alternativa para aquellas personas que busquen un estado intermedio entre gestor y entorno, y resulta muy liviano y con una imagen un tanto futurista.

Instalación

  • Fedora: sudo dnf install enlightenment
  • CentOS: No disponible de forma oficial.
  • Archlinux: sudo pacman -S enlightenment
  • Gentoo: sudo emerge --ask enlightenment:0
  • Ubuntu: sudo apt-get install e17
  • Debian: sudo apt-get install e17
  • openSUSE Leap 42.3:sudo zypper in enlightenment
  • FreeBSD: sudo pkg install x11-wm/enlightenment

Awesome

Otro gestor de ventanas elaborado en C y en Lua, también es parecido a i3 en el que no es necesario hacer uso de ningún tipo de ratón y permite acoplar fácilmente las ventanas entre sí. La primera versión fue liberada el 18 de septiembre del 2007 por Julien Danjou, siendo un fork de dwm. En algunas distribuciones se encuentra disponible, pero desde el 25 de septiembre del 2016 se encuentra desmantenido.

wmii

Windows Manager Improved 2, es un gestor de ventanas que soporta el manejo de ventanas con ratón o teclado elaborado por Anselm R. Garbe y Kris Maglione y viendo la luz por primera vez el 1 de junio de 2005, tiene una filosofía minimalista de no ir más allá de 10,000 líneas de código. La última versión estable fue liberada el 1 de julio del 2017.

dwm

Es otro gestor de ventanas desarrollado por Anselm R. Garbe y liberándolo el 14 de julio de 2006. Es un wm muy minimalista pareciéndose a wmii, sin embargo, es mucho más simple que este último y está escrito en puro C para tener un rendimiento mucho más elevado además de añadir seguridad al código, pero este muy conocido gestor de ventanas se quedó en desarrollo al igual que wmii, el 1 de julio de 2017.

Fuentes

Escuchando música con MPD y ncmpcpp

¿Cuántos de nosotr@s nos hemos hecho esta pregunta? ¿Qué sería de la vida sin música? ¿Qué sería de la vida sin letras de canciones que denuncien, que estimen, que compartan dolor, amor, qué irradien ira o revolución? ¿Qué solo contenga ritmo para hacer ejercicio físico sin problemas? ¿Cuándo estamos solos y afligidos, cuándo queremos compartir momentos de celebración? Parece mentira pero la música nos despierta y nos anima. Pero más nos anima si la escuchamos haciendo uso del mínimo de recursos posibles sin perder calidad. Entonces, eso es amor.

Después de esta reflexión que parece sacada de un capítulo de Anatomía de Gray, vamos a proceder instalar el servidor de audio MPD, conocido como Music Player Daemon junto con el cliente ncmpcp(1) con el que interactuaremos cuando queramos escuchar música.

MPD es un servidor de audio que permite no solo escuchar música en local soportando multitud de códecs de audio como Ogg Vorbis, FLAC, Opus, WavPack, MP2, MP3, MP4/AAC, Mod..., si no que también puede transmitirla via streamming por el protocolo HTTP capaz de reproducir ficheros MP3 y OGG Vorbis. En suma, se puede gestionar el servidor a través de la red tanto por IPv4 como por redes IPv6, lee meta-información como las etiquetas ID3v1 y ID3v2, comentarios en Vorbis, MP4...; soporta reprodución contínua, una vez para de reproducirse una, se añaden unos segunos para "hacer creer" que sigue siendo un solo archivo (crossfading) y un millar de características más que si las seguimos mencionando no acabamos.

Instalación

Aquí añadimos varias formas de instalarlo en diferentes distribuciones, vamos a llevarlo a cabo en todas que utilicen systemd(1) junto con pulseaudio(1).

NOTA: Hay distribuciones que por licencias privativas, no se incluye software privativo de manera oficial como es el caso de Fedora, así que revisen que códecs son necesarios para nuestro sistema después de instalar el servidor y posteriormente el cliente con el que nos conectaremos.

Fedora

Para instalar en Fedora con ejecutar el siguiente comando se nos instalará pero no olvidemos instalar posteriormente los códecs para formatos MP3 desde los repositorios RPM Fusion:

sudo dnf install mpd

Ubuntu

En Ubuntu, vale tanto aptitude como la suite apt(1), hay que tener habilitado los repositorios Universe.

sudo apt-get install mpd

Debian

Como en Ubuntu, pero se encuentra en repositorio stable:

sudo apt-get install mpd

Archlinux

Tenemos que tener habilitado el repositorio extra:

sudo pacman -S mpd

Gentoo

No nos olvidemos de aplicar las USE que queramos para que se instale con los códecs y características que queramos. Puedes ver la lista pulsando aquí

sudo emerge -av media-sound/mpd

openSUSE Leap 42.3

La instalación en openSUSE requiere que se habilite el repositorio multimedia:apps porque no se encuentra soportado en los repositorios principales.

CentOS 7

Es necesario habilitar los repositorios nux

sudo yum install mpd

Configuración

La configuración como hemos dicho, haremos uso de pulseaudio(1) y lo ejecutaremos mediante nuestro usuario para evitar utilizar el usuario root que explicaremos en siguientes post que es este usuario y por qué se encuentra en el sistema.

  1. Creamos los directorios para albergar las configuraciones, playlists...etc mkdir ~/.mpd/{database,playlists,logs}
  2. Copiamos el fichero de configuración de ejemplo que nos proporciona mpd. cp /etc/mpd.conf ~/.mpd/
  3. Editamos el fichero de configuración y tienen que estar descomentadas y editadas las siguientes líneas: music_directory "~/Music" playlist_directory "~/.mpd/playlists" db_file "~/.mpd/database/mpd.db" log_file "~/.mpd/logs/mpd.log" user "sincorchetes" auto_update "yes" audio_output { type "pulse" name "My Pulse Output" } filesystem_charset "UTF-8"$

Explicaremos qué quiere decir cada línea: 1. Es el directorio dónde tengamos almacenada la música que queramos escuchar. 2. El directorio dónde se almacenarán las listas de reproducción personalizadas. 3. Fichero en el cuál se alojará los registros de cada archivo de reproducción. 4. Fichero de registro 5. Nuestro usuario 6. Se actualizará MPD de forma automática cuando MPD detecte cambios en el directorio 7. Habilitando PulseAudio en MPD (líneas 7,8 y 9) 8. Soporte UTF-8

Ahora para probar esta configuración, bastará con correr el servidor apuntando al fichero.

mpd ~/.mpd/mpd.conf

Puede que nos aparezca un mensaje como este:

exception: bind to '0.0.0.0:6600' failed (continuing anyway, because binding to '[::]:6600' succeeded): Failed to bind socket: Address already in use

Comunicándonos que se está utilizando el puerto que usa MPD, no pasa nada, lo omitimos y listo.

ncmpcpp

En este apartado, instalaremos y explicaremos como utilizar el cliente.

Instalando el cliente

Hay varios clientes para utilizar MPD, incluyendo clientes gráficos, pero a nosotros personalmente nos agrada utilizar ncmpcpp(1) más que nada por gustos.

Fedora

Para añadirlo a este SO:

sudo dnf install ncmpcpp
CentOS 7

Hay que tener habilitado el repositorio de nux como hemos mencionado anteriormente:

sudo yum install ncmpcpp
Ubuntu

Hay que tener habilitado el repositorio universe

sudo apt-get install ncmpcpp
Debian

Con un solo comando:

sudo apt-get install ncmpcpp
Archlinux

Tenemos que tener habilitado el repositorio Community

sudo pacman -S ncmpcpp
Gentoo

No nos olvidemos de que tenemos que declarar las variables USE para soportar determinadas características.

sudo emerge -av media-sound/ncmpcpp
openSUSE

Desafortunadamente no hay cliente para openSUSE, hay que compilarlo.

Probando

Para probarlo tan solo tenemos que ejecutar ncmpcpp(1)

¿Cómo manejarnos?

Bueno ncmpcpp(1) se utiliza mediante las flechas de dirección y algunas teclas preconfiguradas como las que recogemos en la siguiente tabla.

Combinación de teclas Descripción
a Añade un tema a una lista de reproducción, ya puede ser nueva o actual
Sube por los elementos
Desciende por los elementos
Shift + Selecciona elementos hacia arriba
Shift + Selecciona elementos hacia abajo
[ Desciende por el álbum
] Asciende por el álbum
{ Asciende según el artista
} Desciende según el artista
Page Up Asciende muchos ítems
Pade Down Desciende muchos ítems
Insert Selecciona ítem
Enter Según en la vista, puede reproduci, ingresar en un directorio...etc
Espacio Según la vista, puede añadir un elemento a la lista de reproducción, actualizar las letras según cambie la canción, cambiar el tipo de visualización...
Delete Borra ítems de la lista, del buscador...
Bajar el volumen, columna anterior, pantalla máster
Subir el volumen, siguiente columna...
TAB Siguiente vista
Shift + TAB Vista anterior
F1 Muestra la ayuda
1 Vista: Lista de reproducción
2 Vista: Buscador
3 Vista: Modo navegador de archivos
4 Vista: Interactuar con la biblioteca
5 Vista: Editor de listas de reproducción
6 Vista: Editor de etiquetas
7 Vista: Muestra los métodos de salida
8 Vista: Visualizador de música (no lo hemos incluído en este post)
= Vista: Muestra un reloj digital
@ Vista: Muestra la información del servidor
s Para la reproducción
p Pausa la reproducción
> Siguiente tema
< Tema anterior
Ctrl + h En el modo navegador de archivos, vuelve un directorio hacia atrás
Ctrl + h Repite la canción en modo reproducción
Backspace En modo navegador sube un directorio
Backspace En modo reproductor repite la canción
f Reproduce más rápido
b Rebovina
r Modo repetición
z Reproducción aleatoria
y Tiene múltiples funciones, buscador de canciones, detecto de cambios en etiquetas, comenzar a buscar...
Y Modo reproducción de una única canción
u Actualizar la DB

En fin hemos comentado medio archivo de atajos de teclado que viene por defecto. Puedes crearte uno propio creando el directorio ~/.ncmpcpp/bindings.

Fuentes

  • Archlinux ~ MPD
  • man packages
    • mpd.conf(5)
    • mpd(1)
    • ncmpcpp(1)

Fedora 28 liberada

Fedora como tal, vio la luz por primera vez el 6 de noviembre de 2003 por parte del Proyecto Fedora, ya que, al principio solo era un repositorio de software adicional retestado para el viejo sistema operativo de la multinacional líder en opensource y software libre Red Hat. Este repositorio fue creado por Warren Togami en el 2002 en la universidad de Hawaii como un proyecto universitario. Sin embargo, se hizo tan popular que lleguó a convertirse en un sistema operativo comunitario llamado Fedora Core y que, en 2007 pasó a llamarse Fedora.

Este utilizaba como logo un sombrero azul, ya que, la empresa Red Hat utiliza un sombrero de color rojo para su representación.

Características de Fedora

El Proyecto Fedora es una comunidad muy amplia que se encuentra alrededor de todo el mundo como muchas de las demás comunidades en el software libre. Esta difunde una serie de valores como colaborar activamente con los proyectos de software como por ejemplo GIMP, GNOME, Plasma (antes KDE) reportando errores via upstream facilitando sus correciones y adheriendo el código nuevo en los proyectos. De tal forma, que toda persona que utilice estos software que hemos mencionado acabe utilizando código de Fedora. También premia la introducción de las nuevas tecnologías tanto a nivel de desarrollo como el software GCC, Binutils, Go, Python... hasta pasar por Devops y administradores de sistemas incluyendo soporte para arquitecturas en auge como ARM64 (AArch64) para server, imágenes para s390x...etc. La tercera es tener una comunidad fuerte y amistosa en la que apoyarse, un buen compañerismo es clave no solo para el PF, si no para cualquier tipo de proyecto comunitario. Y por último, premian mucho la libertad y difunden software libre y de open source frente al software privativo ya que si se utiliza el privativo y no se da pie al conocimiento de las demás alternativas libres obligan al usuario al final a depender de software registrado en licencias restrictivas.

También es una de las comunidades que no suelen perderse eventos alrededor de todo el mundo sobre software libre como FOSDEM en Bélgica, LinuxCon en Barcelona (2012), DevCon... etc. Incluso, organizan macroeventos llamados Flock (antes FUDCon) dónde todos los colaboradores pueden tener un punto de encuentro y conocerse cara a cara.

Novedades

Fedora 28 contiene multitud de novedades que no nos podemos perder, ¡es un disparate! abarca todos los perfiles, usuarios finales, desarrolladores, DevOps, administradores de sistemas...

Arquitectura AArch64 para servidores

En esta nueva versión se facilitan imágenes de Fedora Server para esta arquitectura como DVDs para instalar, imágenes cloud en formato qcow2 (muy utilizado por el software emulador, Qemu) e imágenes Docker para gestionar contenedores.

Más info

Modularización de Anaconda

Anaconda es el instalador por excelencia de Fedora, hace unos pocos años que se reescribió completamente dando un aire de frescura haciéndolo más fácil e intuitivo que hace años atrás. Muchos de los módulos se dividirán en varias partes que se comunicarán con DBus mediante una API. El objetivo es proveer de un instalador que permita personalizarse, potenciarse añadiendo plugins, extensiones... y sobre todo más formas de probar que funciona.

Más info

Binarios anotados

Añade información extra a los binarios que hayan sido compilados con GCC. Esta información se puede utilizar por los scripts para comprobar varias características de ficheros como las opciones de refuerzo de seguridad (hardering) o posibles conflictos con ABI

Más info

Imágenes cloud y/o contenedores para s390x

Se facilitarán imágenes para esta arquitectura incluyendo las variantes de Fedora. Éstas estarán disponibles en formato qcow2 y raw.

Más info

Software modular

Fedora proveerá de una serie de repositorios de software y actualizaciones con versiones alternativas a las suministradas por los repositorios oficiales.

Más info

Ahorro de batería en portátiles

Se mejora la versión de Fedora Workstation para el consumo de la batería en ordenadores portátiles por defecto.

Más info

En cuánto a desarrollador

Tenemos una lista de software que se ha actualizado como:

  • Binutils 2.29.1
  • Boost 1.66
  • GCC 8.0.1
  • GHC 8.2.2
  • GNU C Lib 2.27
  • Ruby 2.5
  • Golang 1.10.1
  • Django 2.0.4
  • Java-openjdk-10.0.46
  • Erlang 20.3.2
  • PHP 7.2.4

Para usuarios finales

Fedora Mate personalizado{.size-full}

No nos olvidemos que tenemos una lista de novedades para aquellas personas que utilicen entornos de escritorio, entre ellas:

  • Sugar 0.112
  • GNOME 3.28.1
  • Plasma 5.12.4
  • MATE 1.20.0
  • Cinnamon 3.8.0
  • Enlightenment 0.22.3
  • XFCE 4.12.1
  • LXQt 3.1.0

Y un sin fin de más novedades que puedes revisar en el siguiente enlace

¿A qué esperas para probarlo?

Enlaces

Descarga Fedora de forma directa a través de los siguientes enlaces:

Accede a los enlaces de torrent desde aquí

¡A disfrutar!

Nota: La imagen de cabecera fue extraída del artículo "Announcing Fedora 28 en FedoraMagazine.org"

QEMUzier - Gestiona máquinas virtuales en QEMU/KVM fácilmente

QEMUzier es un pequeño script licenciado bajo GPL v2.0 que he laborado para gestionar de forma muy sencilla máquinas virtuales con el software de emulación QEMU modificado para utilizarlo con KVM para obtener virtualización completa en Linux.

Por el momento está adaptado para utilizarlo en distribuciones Fedora.

Para poder instalarlo:

GitLab

git clone https://gitlab.com/sincorchetes/qemuzier

GitHub

git clone https://github.com/sincorchetes/qemuzier

Cuando ejecutemos el script, hará una comprobación de dependencias para saber si tenemos qemu-img instalado y luego nos preguntará que queremos hacer.

Registrarlo en Bash

Si no queremos estar accediendo cada vez al directorio para ejecutarlo, podemos hacer que Bash lo reconozca siempre.

Añadimos la ruta a nuestra ruta de entorno personalizada ubicada en .bash_profile

Añadimos la ruta dónde se ubique el directorio, por ejemplo: PATH=$PATH:$HOME/.local/bin:$HOME/Documents/qemuzier

Para ver que se ejecuta, ejecutamos bash dentro de una terminal de comandos ya instanciada y veremos una salida como esta.

Welcome to QEMUzier. Script to create a new VM easy
List of currently created VMs

Debian
Choose an options:
1) Run VM
2) Create VM
3) List VMs
4) Destroy VM
Choose one: 

¿Qué nos ofrece este script?

Bueno básicamente es para un uso sencillo, crear una máquina virtual con disco duro en formato QCOW, red en modo NAT, y que arranque con una imagen .ISO.

Las imágenes .ISO se almacenan en la ruta que te crea el script al principio en $HOME/.qemuzier/.iso. Este script no utiliza ningún tipo de base de datos que verifique las máquinas virtuales. Simplemente o están creadas (con ello implica la creación de un directorio dentro de .qemuzier, o no).

¿De cara al futuro?

Se puede incluir un auto-checking de dependencias, y una adaptación a las distribuciones populares; la posibilidad de crear redes bridging, he incluso, dotarlo de una interfaz gráfica con Python y PyGTK.

¡Espero que le saquéis algún partido!

Gestionando aplicaciones por defecto en Linux

Una de las formas que tiene Linux es que es tan configurable y tan versátil que podemos hacer lo que queramos con él, en este artículo veremos cómo configurar las aplicaciones por defecto para abrir X tipos de archivos.

¿Aplicaciones por defecto?

Todos los archivos tienen un identificador que permiten saber que tipo de dato contienen como por ejemplo un archivo de audio, está compuesto por un tipo de fichero de audio ya sea MP3, OGG...

Cuando utilizamos un entorno de escritorio o un gestor de ventanas (ya que el sistema en "crudo" no utiliza los MIME types, hace uso de otros métodos), el servidor gráfico interactúa con una base de datos que contiene lo que se denominan MIME Types. Los MIME Types es un estándar que facilita la identificación de los tipos de archivos del sistema mediante una serie de atributos en la cabecera del archivo que permiten presentarlos correctamente.

Podemos ver esta lista en /usr/share/applications/mimeapps.list

[Default Applications]
application/x-dia-diagram=dia.desktop
text/x-vcard=evolution.desktop
text/directory=evolution.desktop
text/calendar=evolution.desktop
application/x-cd-image=gnome-disk-image-mounter.desktop
application/x-raw-disk-image=gnome-disk-image-writer.desktop
application/x-raw-disk-image-xz-compressed=gnome-disk-image-writer.desktop
image/x-compressed-xcf=gimp.desktop
image/x-xcf=gimp.desktop
image/x-psd=gimp.desktop
image/x-fits=gimp.desktop
[...]

Para crear nuestra propia lista de aplicaciones la podemos hacer mediante comando xdg-mime o creando el archivo directamente en ~/.config/mimeapps.list

Con xdg-mime

Esta herramienta la podemos encontrar dentro del paquete xdg-utils de nuestra distribución.

Añadir una aplicación por defecto:

xdg-mime default *.desktop mime_type

Por ejemplo, abrir ficheros PDF con el visor ligero de MuPDF.

xdg-mime default mupdf.desktop application/pdf 

Manualmente

Editamos o creamos el fichero ~/.config/mimeapps.list con nuestro editor favorito y a la par viendo la DB de mime ubicada en /usr/share/applications/mimeapps.list

Referencias

Gestores de paquetes RPM

Como ya hemos hablado anteriormente sobre qué es un gestor de paquetes comenzaremos a ver cómo trabajar con este gestor de paquetería.

Historia y antecedentes

Los orígenes del gestor de paquetes RPM (Red hat Package Manager) se remonta en el año 1997. Cuando Marc Ewing, Erik Troan y el resto de desarrolladores de Red Hat lo sacaron como mejora de los gestores de paquetes que existían en aquella época como es el caso de: PMS (Package Management System) desarrollado por Rik Faith, Doug Hoffman y Kevin Martin para su distribución llamada BOGUS en el año 1993; o RPP (Red Hat Software Program Packages) que vio la luz en 1994 en las primeras distribuciones beta de las versión Red Hat Commercial Linux (RCL) y por último, en 1994 también, Ian Murdock fundador de la distribución Debian GNU/Linux, saca a la luz DPKG.

Notas adicionales

La Linux Standard Base propuso RPM como un sistema de paquetes estándar que debería formar parte de toda distribución Linux. La LSB ha definido multitud de directorios para mantener un estándar en cuanto configuraciones entre otras muchas más cosas. Sin embargo, muchas distribuciones no respetaron esta proposición, y se dedicaron a mantener su propio sistema de paquetería. RPM es ampliamente utilizado sobre todo por las distribuciones openSUSE, Red Hat * como RHEL, Oracle Linux, CentOS, Fedora, Mageia, OpenMandriva, ROSA Linux, PCLinuxOS...

Los objetivos de su diseño era ser fácil de utilizar; tener un enfoque orientado solo a paquetes; actualización de versión superiores de paquetes; llevar un seguimiento de las dependencias internas de los paquetes; capacidad de llevar a cabo consultas; verficación; soporte para múltiples arquitecturas y utilizar fuentes originales.

Facilidad de uso

No es necesario efectuar una compilación de código fuente de un software como por ejemplo:

tar zxf software_package
cd software_package
./configure
make
su
make install

Este proceso conlleva a realizar 6 pasos, de los cuáles, 3 de ellos (pasos 3,4,6) pueden dar origen a fallos de compilación por no haber dependencias que se encuentren resultas; fallos en el Makefile (script de compilación); parámetros inestables....etc

A esto, que sería:

wget ftp://servidor.com/pub/RPM/software.rpm
rpm -ivh software.rpm

Sin duda alguna, reduce de forma notoria la complejidad, y el tiempo, ya que, cuando se compila de código fuente, suele consumir muchos recursos de la máquina, pero sobre todo tiempo de compilación.

Enfoque sobre un sistema que sea orientado a paquetes

Comentamos que pueden manipularse y/o gestionarse cientos y miles de paquetes de forma simultánea. Mientras que eliminar paquetes con el viejo proceso que se ha utilizado antaño make unistall clean (cuando existía), había que ir, de directorio en directorio efectuando dicha desinstalación. Por lo que se vuelve una ardúa y costosa tarea.

Actualización de paquetes

En la que se elimina el paquete que ha sido previamente instalado reemplazándolo por el nuevo sin afectar a la estabilidad del sistema. Y por si los administradores poseen ficheros de configuración generales, estos quedan como están, así se evitan perder esos ficheros. Para efectuar una migración completa de los ficheros nuevos de configuración a los nuevos, se crean los famosos .rpmnew. Estos son los ficheros que acompañan a la actualización y que se tratan utilizando rpmconf -a.

Interdependencia de paquetes.

Estos poseen una información de seguimiento para saber que otros paquetes son necesarios, en caso de actualización, instalación o eliminación de software. Ya que puede haber software que precise de otros programas y estos, si no contuvieran esta información de seguimiento. Puede que no se lleguen a instalar y no funcionaría correctamente el software.

Capacidad de realizar consultas

Característica que forma parte del sistema de paquetes RPM. Este trabaja en conjunto con una base de datos llamada Berkeley DB en la que se almacena toda la información que tenga que ver con los paquetes que se encuentren instalados en el sistema, incluyendo si, añaden documentación.

Verificación de paquetes

Característica que evita que se mantengan ficheros corruptos instalados en el sistema. RPM contiene un conjunto de información como el tamaño y los permisos sobre cada uno de los ficheros que se han instalado en el sistema. Esto evita que sucedan errores garrafales que puedan desembocar problemas de fallo de memoria en los programas que se han instalado. Como por ejemplo, un administrador modifica un fichero y este lo desborda con código erróneo, aumentando drásticamente su tamaño. Esto puede detectarlo RPM con su base de datos.

Disponibilidad múltiples arquitecturas

RPM en suma, está portado a múltiples arquitecturas, no solo está para x86, x86_64. Se puede encontrar para procesadores DEC, SPARC, Motorola 68000, ARM...

Fuentes originales

Nosotros con RPM podemos encontrarnos 2 tipos de paquetes. Un paquete contiene el código fuente que suelen contener las letras SRC en mayúsculas; y otro paquete que contienen los binarios pre-compilados.

Aquellos paquetes que contienen el SRC, facilitan la vida a los desarrolladores, porque contienen todo lo necesario para llevar a cabo el proceso de empaquetación binaria.

Terminología y/o nomenclatura

Ahora comentaremos un poco qué terminología utiliza RPM en sus paquetes. La terminología nos sirve para identificar determinadas características y funcionalidades que tiene un paquete. Ya que este puede contener multitud de parámetros que nos puede ayudar para saber la arquitectura que utiliza; la versión y sobre todo que tipo de versión ya que puede incluir alguna característica fuera de lo común; nombre del paquete...etc

En RPM, nos podemos encontrar 2 tipos de paquetes en el siguiente ejemplo extraído de Fedora 24:

phpMyAdmin-4.6.3-1.fc24.noarch
phpMyAdmin.src
  • Identifica el nombre del paquete
  • Identifica la versión e incluyendo revisión, en caso de que tuviese
  • Identifica la versión de Fedora que se está utilizando
  • Identifica la arquitectura, o, si el paquete es un paquete que contenga código fuente.
  • Sistemas 64 bits y soporte 32 bits (multilib)

En caso de que utilices arquitectura 64 bits, en las distribuciones RPM es fácilmente instaurable una capa de compatibilidad para software de 32 bits. No hace falta más que instalar el software que se encuentre en su terminología i686, poco más hay que hacer aparte de satisfacer las dependencias de dichos paquetes.

Contenido de los paquetes .RPM

Como hemos dicho anteriormente, existen 2 tipos de paquete, binario y source. Vamos a ver la diferencia que aguarda cada uno de ellos y que contienen de una forma más visual.

.

├── phpMyAdmin-4.6.1-all-languages.tar.xz

├── phpMyAdmin-4.6.1-all-languages.tar.xz.asc

├── phpMyAdmin-config.inc.php

├── phpMyAdmin.htaccess

├── phpMyAdmin.nginx

└── phpMyAdmin.spec

Este es el contenido de un SRC. Como se puede apreciar, no incluye nada más que:

  • Código fuente comprimido en .tar.xz
  • Suma de verificación del tarball
  • Ficheros específicos de configuración del software phpMyAdmin
  • Fichero .SPEC que hablaremos de ello más adelante.

Sin embargo, si nos fijamos en el contenido de un paquete binario obtendremos la siguiente salida:

.

├── etc

│   ├── httpd

│   │   └── conf.d

│   │       └── phpMyAdmin.conf

│   ├── nginx

│   │   └── default.d

│   │       └── phpMyAdmin.conf

│   └── phpMyAdmin

│       └── config.inc.php

├── usr

│   └── share

│       ├── doc

│       │   └── phpMyAdmin

│       │       ├── ChangeLog

│       │       ├── DCO

│       │       ├── examples

│       │       │   ├── config.manyhosts.inc.php

│       │       │   ├── config.sample.inc.php

Podemos observar, como ya incluye directorios del sistema con sus respectos ficheros necesarios para su funcionamiento. Y no incluye nada de código fuente que precise de su compilación.

Gestionando paquetes

Dentro de lo que cabe en nuestro sistema, podemos hacer las funciones básicas de gestión de paquetes como es el caso de eliminar, instalar o reinstalar entre otras más.

Instalar un paquete, bastará con efectuar el comando:

$ rpm -ivh nombre_paquete.rpm
-i: Instala el paquete
-v: Añade información extra sobre el proceso de instalación
-h: Muestra un porcentaje en # sobre su instalación.
[root@keys0 sincorchetes]# rpm -ivh tcsh-6.19.00-10.fc24.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:tcsh-6.19.00-10.fc24             ################################# [100%]

Reinstalar un paquete:

$ rpm -vh --reinstall nombre_paquete.rpm
--reinstall: Reinstala el paquete
-v: Añade información extra sobre el proceso de reinstalación
-h: Muestra un porcentaje en # sobre su reinstalación.

[root@keys0 sincorchetes]# rpm --reinstall -vh tcsh-6.19.00-10.fc24.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:tcsh-6.19.00-10.fc24             ################################# [ 50%]
Cleaning up / removing...
   2:tcsh-6.19.00-10.fc24             ################################# [100%]

Eliminar un paquete, ejecutaremos el comando:

$ rpm -evh nombre_paquete.rpm 
-e: Elimina un paquete.
-v: Añade información extra sobre el proceso de eliminación
-h: Muestra un porcentaje en # sobre su eliminación

[root@keys0 sincorchetes]# rpm -evh tcsh
Preparing...                          ################################# [100%]
Cleaning up / removing...
   1:tcsh-6.19.00-10.fc24             ################################# [100%]

Trabajar con la DB

Como hemos comentado, RPM utiliza un conjunto de base de datos, la cual utiliza Berkeley DB, que nos sirve para mantener toda la información de los paquetes que se encuentren instalado en nuestro sistema.

Los ficheros los podemos encontrar en /var/lib/rpm: * Basenames * Conflictname * __db.001 * __db.002 * __db.003 * Dirnames * Enhancename * Filetriggername * Group * Installtid * Name * Obsoletename * Packages * Providename * Recommendname * Requirename * Sha1header * Sigmd5 * Suggestname * Supplementname * Transfiletriggername * Triggername

Sin embargo, no nos vamos a parar en cada uno de ellos, nos podemos hacer una idea que contenido puede tener cada uno.

Vamos a llevar a cabo una serie de ejemplo para trabajar con esta base de datos para así, en algunos casos, no llevarnos un chasco * * * * * .

Consultar la información de un paquete, utilizamos:

$ rpm -q nombre_del_paquete
Salida de ejemplo: 
[sincorchetes@keys0 rpm]$ rpm -q libcaca## C99-0.28.beta19.fc24.x86_64

Como hemos visto, nos ha devuelto la información del paquete que se encuentra instalada en nuestro sistema, en este caso, Fedora 24.

sincorchetes@keys0 rpm]$ rpm -q openshot 
package openshot is not installed

Obtener el listado de todos los paquetes instalados en el sistema:

[sincorchetes@keys0 rpm]$ rpm -qa |less
pated-3.2-20.fc24.x86_p64
perl-XML-SAX-0.99-16.fc24.noarch
libuser-python-0.62-3.fc24.x86_64
dconf-editor-3.20.3-1.fc24.x86_64
teamviewer-11.0.57095-0.i686
libedit-3.1-14.20150325cvs.fc24.x86_64
mate-notification-daemon-1.14.1-1.fc24.x86_64
[...]

Utilizando el comando anterior, y una tubería, se pueden filtrar resultados. Muy válido cuando se quiere obtenr listado de muchos programas que contienen diferentes versiones instaladas como es el caso del kernel.

[sincorchetes@keys0 rpm]$ rpm -qa |grep kernel
kernel-debug-devel-4.6.4-301.fc24.x86_64
kernel-4.6.4-301.fc24.x86_64
kernel-debug-modules-extra-4.6.4-301.fc24.x86_64
kernel-devel-4.6.4-301.fc24.x86_64
[...]

Otra forma de filtrar, es utilizando rpm -qa --pipe "grep kernel"

Para saber en qué paquete se encuentra un determinado fichero incluido rutas simbólicas.

$ rpm -qf ruta_fichero
[sincorchetes@keys0 rpm]$ rpm -qf /bin/bash 
bash-4.3.42-5.fc24.x86_64

Si queremos saber la información de un paquete instalado:

$ rpm -qi nombre_paquete
[sincorchetes@keys0 sbin]$ rpm -qi bash
Name        : bash
Version     : 4.3.42
Release     : 5.fc24
Architecture: x86_64
Install Date: Sat 06 Aug 2016 09:51:46 AM WEST
Group       : System Environment/Shells
Size        : 6373152
License     : GPLv3+
Signature   : RSA/SHA256, Thu 19 May 2016 06:29:51 PM WEST, Key ID 73bde98381b46521
Source RPM  : bash-4.3.42-5.fc24.src.rpm
Build Date  : Tue 17 May 2016 03:25:18 PM WEST
Build Host  : buildvm-22.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager    : Fedora Project
Vendor      : Fedora Project
URL         : http://www.gnu.org/software/bash
Summary     : The GNU Bourne Again shell
Description : The GNU Bourne Again shell (Bash) is a shell or command language interpreter that is compatible with the Bourne shell (sh). Bash incorporates useful features from the Korn shell (ksh) and the C shell (csh). Most sh scripts can be run by bash without modification.

Obteniendo listado de grupos de paquete. RPM puede alojar un listado de grupos de paquetes para automatizar la instalación de los mismos.

$ rpm -qg nombre_grupo
[sincorchetes@keys0 sbin]$ rpm -qg Development/Debuggers
lsof-4.89-4.fc24.x86_64
libunwind-1.1-11.fc24.x86_64
gdb-7.11.1-75.fc24.x86_64

Listando los ficheros que incluye un paquete instalado:

$rpm -ql nombre_paquete
[sincorchetes@keys0 ~]$ rpm -ql bash
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc
/usr/bin/alias
/usr/bin/bash
/usr/bin/bashbug
/usr/bin/bashbug-64
/usr/bin/bg
/usr/bin/cd
/usr/bin/command
/usr/bin/fc
[...] 

Listando ficheros por paquete

$ rpm -q --filesbypkg bash
[sincorchetes@keys0 ~]$ rpm -q --filesbypkg bash 
bash                      /etc/skel/.bash_logout 
bash                      /etc/skel/.bash_profile 
bash                      /etc/skel/.bashrc 
bash                      /usr/bin/alias 
bash                      /usr/bin/bash
[...]

Obteniendo una lista con más información:

$ rpm -qlv bash
[sincorchetes@keys0 ~]$ rpm -qlv bash 
-rw-r--r--    1 root    root                       18 May 17 15:22 /etc/skel/.bash_logout 
-rw-r--r--    1 root    root                      193 May 17 15:22 /etc/skel/.bash_profile 
-rw-r--r--    1 root    root                      231 May 17 15:22 /etc/skel/.bashrc 
-rwxr-xr-x    1 root    root                       29 May 17 15:22 /usr/bin/alias 
-rwxr-xr-x    1 root    root                  1072056 May 17 15:22 /usr/bin/bash 
lrwxrwxrwx    1 root    root                       10 May 17 15:22 /usr/bin/bashbug -> bashbug-64
[...]

Listando ficheros de configuración de x paquete:

$ rpm -qc bash
[sincorchetes@keys0 ~]$ rpm -qc bash 
/etc/skel/.bash_logout 
/etc/skel/.bash_profile 
/etc/skel/.bashrc

Listando archivos de configuración con más información de salida:

 $ rpm -qcv bash
[sincorchetes@keys0 ~]$ rpm -qcv bash
-rw-r--r--    1 root    root                       18 May 17 15:22 /etc/skel/.bash_logout
-rw-r--r--    1 root    root                      193 May 17 15:22 /etc/skel/.bash_profile
-rw-r--r--    1 root    root                      231 May 17 15:22 /etc/skel/.bashrc 

Listando los scripts dentro de un paquete:

rpm -q --scripts bash
[sincorchetes@keys0 ~]$ rpm -q --scripts bash
postinstall scriptlet (using <lua>):
nl        = '\n'
sh        = '/bin/sh'..nl
bash      = '/bin/bash'..nl
f = io.open('/etc/shells', 'a+')
if f then
  local shells = nl..f:read('*all')..nl
  if not shells:find(nl..sh) then f:write(sh) end
  if not shells:find(nl..bash) then f:write(bash) end
  f:close()
end
[...] 

Obteniendo la hoja de cambios del paquete (Changelog):

$ rpm -q --changelog bash
[sincorchetes@keys0 ~]$ rpm -q --changelog bash
* Tue May 17 2016 Siteshwar Vashisht <svashisht@redhat.com> - 4.3.42-5
- Do not set terminate_immediately and interrupt_immediately while expanding tilda
  Resolves: #1336800
* Wed Feb 03 2016 Fedora Release Engineering <releng@fedoraproject.org> - 4.3.42-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
[... ]

Listar los paquetes que han sido instalados recientemente:

$ rpm -qa --last |head
[sincorchetes@keys0 ~]$ rpm -qa --last |head 
qemu-system-aarch64-2.6.0-5.fc24.x86_64       Sun 07 Aug 2016 12:09:07 AM WEST 
qemu-2.6.0-5.fc24.x86_64                      Sun 07 Aug 2016 12:09:07 AM WEST 
edk2-aarch64-20160418gita8c39ba-4.fc24.noarch Sun 07 Aug 2016 12:09:07 AM WEST 
qemu-system-ppc-2.6.0-5.fc24.x86_64           Sun 07 Aug 2016 12:09:05 AM WEST 
SLOF-0.1.git20160223-1.fc24.noarch            Sun 07 Aug 2016 12:09:04 AM WEST 
qemu-system-x86-2.6.0-5.fc24.x86_64           Sun 07 Aug 2016 12:09:04 AM WEST
[...]

Hay multitud de opciones y parámetros que se pueden combinar. Pero que los daremos más adelante.

Trabajando externamente con RPM y su base de datos.

Anteriormente, hemos mencionado que se puede realizar una base de datos de nuestras DB que mantiene RPM de una manera sencilla que no supone tanta complejidad. También podemos reconstruirla y restaurarla con tan solo varios comandos.

Para llevar a cabo una copia de seguridad, basta con efectuar los siguientes comandos:

# cd /var/lib
# tar cvf rpmdb.tar ./rpm
# gzip rpmdb.tar

Estos comandos crean un archivo tar de los ficheros que contienen el directorio rpm.

Reconstruir la DB

$ rpm --rebuilddb

Antes de ejecutarlo, siempre es bueno hacer una copia de seguridad. Ya que si, surgen problemas, y no se pueda regenerar la DB. Habrá que tirar de la copia de seguridad. Si el proceso va bien, el tamaño de la base de datos de "Packages" bajará un poco de peso al no contener entradas que antes si contenía pero por desinstalación de algún programa. Una vez se reconstruya "Packages" se comenzarán a actualizar el resto de bases de datos.

Crear una base de datos nueva

$ rpm --initdb

Trabajando con dependencias

Cada paquete .RPM suele contener una serie de dependencias que debe suplir, antes de efectuar una instalación correctamente. Para ello, podemos utilizar este potente gestor de paquetes y averiguar que .RPM necesitamos suplir.

[sincorchetes@keys0 ~]$ rpm -ivh openshot-2.0.7-3.fc24.noarch.rpm 
error: Failed dependencies:
    python3-httplib2 is needed by openshot-2.0.7-3.fc24.noarch
    python3-libopenshot is needed by openshot-2.0.7-3.fc24.noarch
    python3-qt5 is needed by openshot-2.0.7-3.fc24.noarch
    python3-qt5-webkit is needed by openshot-2.0.7-3.fc24.noarch

Tenemos que buscar las dependencias, bien en los repositorios oficiales e instalarlas manualmente RECOMENDADO SIEMPRE. O bien mediante portales como RPMForge o RPMpbone adecuada para tu distribución.

Ver dependencias de un paquete cuando lo queremos eliminar:

$ rpm -e nombre_paquete
[sincorchetes@keys0 ~]$ rpm -e bash
error: Failed dependencies: 
/bin/bash is needed by (installed) fedora-release-24-2.noarch 
/bin/bash is needed by (installed) nss-softokn-freebl-3.25.0-1.0.fc24.x86_64 
/bin/bash is needed by (installed) kmod-22-4.fc24.x86_64 
/bin/bash is needed by (installed) iproute-4.4.0-3.fc24.x86_64 
/bin/bash is needed by (installed) openssl-1:1.0.2h-1.fc24.x86_64

Si este paquete posee múltiples paquetes que dependen de él, no se efectuará el proceso de eliminación.

En definitiva, con RPM podemos hacer de todo, podemos llevar a cabo instalación de más de 100 paquetes simultáneamente, eliminarlos, reinstalarlos; hacer copias de seguridad de las bases de datos de este magnífico gestor, restaurarlas, exportarlas...; verificar la integridad de los archivos instalados en el sistema con un simple comando; listar todos aquellos que se encuentren instalados y como lidiar con sus dependencias. Las cosas básicas que uno debería saber cuando trabaja con este tipo de sistema de paquetes.

Referencias

  • Fedora Documentation
  • RPM5 doc
  • Red Hat Doc
  • Google
  • Wikipedia
  • Eni ediciones ~ LPIC

Instala otras versiones de software en CentOS

A veces se hace un poco complicado la opción de CentOS como servidor si no lo sabemos administrar. Ya que si nosotros queremos instalar nuevas versiones de PHP, MariaDB, MongoDB o que se yo, te resultará prácticamente imposible a menos que compiles el software directamente o bien hagas uso de repositorios externos tipo Remi, Webtatic en el que ya tienes que confiar que eso vaya bien.

Sin embargo, CentOS ha seguido la filosofía que tiene Redhat de tener un repositorio llamado "CentOS Software Collection" en el que nos permite tener varias versiones de lenguajes de programación como PHP, Ruby, Python...

Para que conozcamos un poco de donde puede venir el asunto, tenemos que explicar que Redhat posee su propio repositorio llamado "Redhat Software Collection". Es un repositorio de paquetes al que solo puede acceder personas con subscripción Redhat, lo bueno que tiene estos repositorios es que están incluidos en su soporte al cliente.

Instalando el repositorio

Necesitaremos tener el repositorio de CentOS habilitado llamado "extras" y posteriormente adherimos el nuevo repo con YUM:

sudo yum install centos-release-scl -y
sudo yum upgrade

Visualizando versiones

Si ejecutas el siguiente comando, podrás ver un listado con todos los paquetes que disponibles en el repositorio que acabas de añadir al sistema:

sudo yum list available |scl 

¿Cómo instalar los paquetes?

Para instalarlos basta con hacer un yum...

sudo yum install rh-php71

¿Cómo ejecutar un binario?

Una vez instalado el PHP de este repositorio, tenemos que tener en cuenta, que no se va a instalar en el directorio dónde se encuentran todos los ejecutables, documentación...etc del sistema. Si no que se creará un directorio en /opt/rh/NOMBRE_PAQUETE y no se modificará ningún .bashrc para añadir un alias, si quieres hacerlo, tendrás que hacerlo a mano.

No obstante, cuando instalamos por primera vez un software de este repositorio se nos viene como dependencia un paquete llamado scl-utils, que nos permitirá trabajar con los ejecutables de las diferentes versiones tal que así:

scl enable rh-php71 "php -a"

Y nos abrirá una consola lista para poder trabajar con el PHP recién instalado.

Ejecutando una shell

¡Pero! ¡No te mortifiques! También puedes cargar una shell bash que te permite cargar todo lo necesario (ruta de los binarios...) si ejecutas:

scl enable rh-php71 bash

Y lanzas un env verás como te carga los PATH necesarios para trabajar con soltura.

Servicios

Los servicios por lo general si que se instalan en el directorio que toca, en este caso es: /usr/lib/systemd/

  • Puedes habilitarlo si ejecutas:
sudo systemctl enable rh-mariadb102-mariadb.service
  • O deshabilitarlo al arranque:
sudo systemctl disable rh-mariadb102-mariadb.service
  • Iniciar el servicio
sudo systemctl start rh-mariadb102-mariadb.service
  • Parar el servicio
sudo systemctl stop rh-mariadb102-mariadb.service
  • Reiniciar el servicio
sudo systemctl restart rh-mariadb102-mariadb.service

¿Qué pasa si no recuerdo lo que instalé?

Con el comando scl podemos listar todos los paquetes instalados de la colección de software:

scl -l
rh-php71

Extras

Este repositorio también se puede utilizar en "containers", un concepto que verás más adelante, y también es posible reconstruir los paquetes de estas versiones con un comando llamado cbs que verás en otra ocasión.

Recursos

Instalando Docker en CentOS 8

¿Te imaginas tener un sistema que te permitira probar aplicaciones sin tener que desplegar máquinas virtuales? Ese proceso tan engorroso de tener que estar descargando una .iso, esperar a que descargue, crear la máquina virtual, instalarla, actualizarla, buscar las dependencias... todo ese proceso engorroso que te afecta si lo único que quieres probar es tu aplicación.

Pues hay una alternativa, y esa alternativa es Docker. Docker es un gestor de despliegue de contenedores que te permite ejecutar con un tamaño muy reducido comparado con el de una máquina virtual tu aplicación en un par de segundos y de forma aislada de tu sistema haciendo uso de un servicio.

"Docker"

Conceptos básicos

Vamos a explicar unos cuántos conceptos básicos, no te preocupes si hay algunas cosas que no entiendas, lo iré explicando en entregas posteriores.

¿Contenedor? ¿Qué es eso?

Un contenedor es la unidad de Docker, los contenedores son imágenes que se han desplegado y que están ocupando una serie de recursos de tu sistema para que puedan funcionar. Estos pueden contener software adicional que es añadido por un particular, empresa o proyecto que elabore esas imágenes.

¿Qué es una imagen?

Una imagen contiene un nombre único y un sistema base Linux mínimo para que pueda ejecutarse así mismo, ésta imagen utiliza un sistema de archivos llamado overlay2 que utiliza capas como mecanismo de control de cambios. Éstas capas se van añadiendo en el proceso de construcción de una imagen. Un ejemplo más cercano y no muy bien explicado, sería, instalar un sistema mínimo de alguna distribución de Linux (da igual cual sea), comprimimos todo el sistema con un .tar.gz y ya tendríamos nuestra imagen. Después, vas añadiendo más información en este .tar.gz, esto sería una capa nueva en una imagen de Docker.

¿Quién construye las imágenes?

Las imágenes suelen construirse por un particular, una empresa, una organización...o espera... ¡Tú también puedes hacerlo! más adelante explicaremos cómo lo puedes hacer.

¿Los contenedores se ejecutan de forma aislada?

Sí, los contenedores son como cajas de arena con las que puedes jugar sin afectar a tu propio sistema, ¡eso es lo bueno que tiene! Podemos desplegar un servidor Web NGINX con PHP incorporado y un sistema gestor de base de datos como es MariaDB ¡en segundos! ¡Nos dejamos de instalar esas engorrosas máquinas virtuales!

¿Se pueden definir límites de recursos del sistema por contenedor?

Sí, podemos decirle a los contenedores que no superen los recursos que le podemos asignar como es la memoria o el CPU entre otras cosas. También lo veremos más adelante.

¿Los contenedores son efímeros?

Sí, los contenedores pueden desaparecer y todo lo que haya dentro de elimina, por lo que si tu aplicación necesita guardar los archivos en algún sitito, es mejor que creas un volumen persistente.

¿Qué son los volúmenes persistentes?

Son como "particiones" de disco que podemos montar en nuestro contenedor o contenedores y permiten guardar archivos en ellos. Éstos se almacenan en un directorio del sistema.

¿Se puede usar un directorio del sistema como volumen persistente?

Sí, podemos usar un directorio actual cómo /home/sincorchetes/Descargas y montarlo como un volumen persistente en el contenedor, esto provocará que los archivos se guarden ahí.

Si los contenedores se ejecutan de forma aislada, ¿Cómo podemos acceder a ellos?

Se puede acceder, al instalar Docker en tu sistema, se crea una nueva interfaz en modo puente llamada docker0 y ademñas se crean unas rutas estáticas para llegar a esta red. Ésta interfaz de red suele tener una ip 172.17.0.1/16 y si ejecutamos un contenedor de Docker por defecto, éste contenedor se ejecutará utilizando esta red con la que podremos acceder a él si exponemos sus puertos. Es como cuando queremos acceder desde fuera al router de nuestra casa, exponemos el puerto 80 en el firewall y podemos acceder. Algo similar.

Cuando lo instalemos, ejecutamos nmcli, podemos ver como está en modo bridge por software:

docker0: connected to docker0
        "docker0"
        bridge, 02:42:BE:58:51:06, sw, mtu 1500
        inet4 172.17.0.1/16
        route4 172.17.0.0/16
        inet6 fe80::42:beff:fe58:5106/64
        route6 fe80::/64
        route6 ff00::/8

Y podemos ver la ruta estática que se crea con el comando ip addr:

default via 192.168.1.1 dev enp0s3 proto dhcp metric 100 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
192.168.1.0/24 dev enp0s3 proto kernel scope link src 192.168.1.167 metric 100 

Por otro lado, podemos acceder a la shell del contenedor mediante comandos que veremos más adelante, por lo que tenemos acceso a la gestión interna del contenedor por consola y acceso a las aplicaciones expuestas por puertos.

¿Puertos? ¿Redes? ¿Pueden los contenedores tener otras redes?

Sí, los contenedores podemos exponerlos o no para poder acceder a las aplicaciones que se ejecutan dentro, es decir, si tienes un servidor Web NGINX escuchando las peticiones en el puerto 80 (como es habitual), le tienes que decir que acepte peticiones desde fuera de esta red, por lo que estamos exponiendo ese contenedor hacia fuera mediante unos puertos específicos. Esto lo explicaremos más adelante.

Y sí, en Docker hay tres tipos de red que se pueden utilizar, una interfaz puente, una red aislada, o una red interna, ¡se pueden hacer maravillas! Pero este contenido se me escapa de las manos.

Pero... espera. ¿De dónde se sacan las imágenes?

Docker tiene la capacidad de buscar las imágenes dentro de un "Registry". Un "Registry" es un servidor o conjunto de servidores que nos ofertan múltiples imágenes y que también podemos interactuar con él (o ellos) como por ejemplo subir|eliminar|descargar las imágenes que hemos construido (si tenemos permisos para hacerlo).

Las imágenes contienen unas etiquetas que podemos especificarle o no (tags) éstas identifican la versión mayor, menor o si es la última versión liberada. Cada vez que se añadan capas nuevas o se modifique el contenido de una imagen, ésta se actualizará con un etiqueta nueva. Si no especificamos la etiqueta nueva, la última imagen que haya en el "registry" local no tendrá la etiqueta latest, la imagen que se descarga sí que la contendrá.

Por defecto Docker conecta con DockerHub y consulta las imágenes ahí.

Entonces el proceso de despliegue de una imagen es de la siguiente manera:

Entonces... ¿Quiere decir que tenemos un Registry en nuestro sistema?

¡Sí! lo tendremos. Cuando descargamos la imagen, ésta se descarga por defecto en un directorio llamado /var/lib/docker/, cuando queramos desplegar una imagen la buscará aquí primero antes de tirar de otro registry.

¡Muy bien! ¿Podemos empezar?

¡Pues claro!

Instalando Docker en CentOS 8

Primero quiero hacer una puntualización, Red Hat y las distribuciones como Fedora y CentOS están recomendando utilizar Podman. Podman es también un sistema de gestión de despliegues de contenedores muy parecido a Docker pero que utiliza un aislamiento mucho más estricto ya que dicen que el que Docker utiliza un servicio para gestionarlo todo es un agujero muy grande de seguridad y tiene razón, Docker tampoco es compatible con la nueva versión de cgroups. Los cgroups conocidos como "Control Groups" es una colección de procesos que están balanceados y están asociados con un conjunto de parámetros o límites. Estos grupos pueden ser jerárquicos refiriéndose a que cada grupo hereda los límites de su grupo padre. El núcleo accede a los múltiples controladores (también llamados subsistemas) a través de un interfaz cgroup; por ejemplo, el controlador de la "memoria" limita el uso de la memoria, "cpuacct" el uso de las cuentas de CPU...

Por lo visto, se reescribió la versión de CGroup en su segunda versión, y tanto CentOS 8 como Fedora usan la versión 2 que no está soportada por Docker. Para ello tenemos que añadir la siguiente línea en la línea del núcleo.

Habilitando cgroup v1

Hacemos una copia de seguridad de este archivo:

# cp -va /etc/default/grub /etc/default/grub.bck.$(date +%d-%m-%y_%H_%M)

Editamos el archivo y añadimos al final de la variable GRUB_CMDLINE_LINUX=

systemd.unified_cgroup_hierarchy=0

Por ejemplo, en mi máquina lo tengo así:

GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl_docker--server-swap rd.lvm.lv=cl_docker-server/root rd.lvm.lv=cl_docker-server/swap rhgb quiet systemd.unified_cgroup_hierarchy=0"

Regeneramos el fichero de configuración de arranque:

  • Si usas UEFI, este estará en:
# grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
  • Si usas MBR:
# grub2-mkconfig -o /boot/grub2/grub.cfg

Reiniciamos el sistema.

Instalando Docker-CE

CentOS no posee una versión de Docker por lo que hemos comentado más arriba. Siguiendo parte de la documentación oficial, instalaremos la versión estable y comunitaria mediante los repositorios oficiales de Docker-CE (Community Edition).

# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# dnf config-manager --enable docker-ce-stable
# dnf check-update
# dnf install docker-ce docker-ce-cli containerd.io --nobest

Como curiosidad podemos ver las múltiples versiones disponibles que podemos instalar:

$ dnf list docker-ce --showduplicates | sort -r
Installed Packages
docker-ce.x86_64            3:19.03.8-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.7-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.6-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.5-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.4-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.3-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.2-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.1-3.el7                    docker-ce-stable 
...

Arrancando los servicios de Docker

# systemctl start docker.service

Revisamos que se está ejecutando correctamente:

$ sudo systemctl status docker.service

● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor pre>
   Active: active (running) since Sun 2020-05-03 18:09:57 CEST; 3s ago
     Docs: https://docs.docker.com
 Main PID: 25800 (dockerd)
    Tasks: 17
   Memory: 49.6M
   CGroup: /system.slice/docker.service
           ├─25800 /usr/bin/dockerd -H fd://
           └─25809 containerd --config /var/run/docker/containerd/containerd.to>

Ya que vemos que funciona, lo dejamos habilitado al arranque de la máquina:

$ systemctl enable docker.service

Probamos a correr un contenedor hello-world de Docker:

 # docker run hello-world

Como explicamos anteriormente, como la imagen hello-world no está en nuestro registry local, va a buscarla a Docker Hub por defecto, la descargará y luego creará el contenedor. Esta es la salida correcta: ``` Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 0e03bdcc26d7: Pull complete Digest: sha256:8e3114318a995a1ee497790535e7b88365222a21771ae7e53687ad76563e8e76 Status: Downloaded newer image for hello-world:latest

Hello from Docker! This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.

To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/

For more examples and ideas, visit: https://docs.docker.com/get-started/ ```

¡Con esto ya habremos acabado!

NOTA: _Si quieres simplificar el proceso de administración en un servidor de pruebas, puedes añadir tu usuario al grupo docker para que no solicite privilegios, pero esto se considera un fallo de seguridad ya que puedes escalar privilegios. Así que cuidado. # usermod -aG docker your-user

Comandos de Docker

Si ejecutamos el comando docker a secas, veremos una lista enorme de opciones que podemos utilizar. Por un lado tenemos las opciones de gestión:

  builder     Manage builds
  config      Manage Docker configs
  container   Manage containers
  context     Manage contexts
  engine      Manage the docker engine
  image       Manage images
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Y por otro lado, tenemos comandos:

  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  deploy      Deploy a new stack or update an existing stack
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

En los siguientes tutoriales veremos como utilizar los comandos de gestión de Docker.

Instalando Gentoo con LVM,LUKS y SELinux

Hemos hablado una vez de Gentoo en un post anterior, por lo que voy a ir más al grano en este post sobre cómo lo he conseguido instalar y cómo ayudarte si tienes dudas haciéndolo. Te recomiendo que si no tienes una pantalla dónde puedas consultar la información de este post, que utilices un medio live que te permita interactuar con todos estos pasos, porque es muy importante que no te pierdas al llevar a cabo este post. También es importante TENER TIEMPO para hacer esta instalación y no esperes que este proceso se hace en un par de horas. Se compilará mucho código fuente y este proceso ES COSTOSO en todos sus aspectos, por lo que te recomiendo QUE NO HAGAS muchas compilaciones a la vez.

Consideraciones

  • Configurar la BIOS de tu equipo para que arranque en modo UEFI y sin tener activado el secure boot.
  • Tener mucho tiempo libre y pensar las cosas antes de ejecutarlas
  • Tener un tazón y una cafetera enorme de café al lado.
  • Tener un buen respaldo en la silla y tiene que ser cómodo, nada de taburetes de 100 montaditos

Hardware que utilicé

Estas son algunas de las especificaciones de Hardware con los que hice la instalación: * BIOS configurada para arrancar con UEFI sin secure boot. * Modelo: Portátil Gigabyte Sabre 15 * Procesador: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz * Memoria RAM: Kingston 8GB 64 bits 2400MHz * Disco NVME: Western Digital Black HD 2018 256GB * Audio integrado: Intel CM238 HD Audio Controller * Gráfica integrada: Intel HD Graphics 630 * Gráfica dedicada: NVIDIA GP107M GeForce GTX 1050 Mobile * Audio dedicado: NVIDIA GP107GL High Definition Audio Controller * USB con espacio mínimo de 4GB

Creando un live

En mi caso, como prefiero ver vídeos, distraerme y ver la documentación bien y de forma clara, prefiero realizar este proceso desde una imagen live con un entorno de escritorio como es Calculate Linux antes de utilizar la imagen que Gentoo libera para la instalación que es todo en terminal. No obstante, si quieres, puedes utilizar los siguientes comandos que utilicé para generar el pendrive con Calculate Linux para crearte tu pendrive con la imagen de Gentoo.

Siguiendo la documentación de Calculate Linux, insertamos el USB. Ejecutamos dmesg veremos cuál es el pendrive reconocido en el sistema:

$ dmesg
[ 6451.987041] usb 1-11: new high-speed USB device number 6 using xhci_hcd
[ 6452.167412] usb 1-11: New USB device found, idVendor=0951, idProduct=1666, bcdDevice= 1.00
[ 6452.167417] usb 1-11: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 6452.167421] usb 1-11: Product: DataTraveler 3.0
[ 6452.167424] usb 1-11: Manufacturer: Kingston
[ 6452.167426] usb 1-11: SerialNumber: 002618A369C3B1A0B7AC022F
[ 6452.168867] usb-storage 1-11:1.0: USB Mass Storage device detected
[ 6452.169331] scsi host3: usb-storage 1-11:1.0
[ 6453.203673] scsi 3:0:0:0: Direct-Access     Kingston DataTraveler 3.0 PMAP PQ: 0 ANSI: 6
[ 6453.204285] sd 3:0:0:0: Attached scsi generic sg1 type 0
[ 6453.204565] sd 3:0:0:0: [sdb] 121110528 512-byte logical blocks: (62.0 GB/57.8 GiB)
[ 6453.205397] sd 3:0:0:0: [sdb] Write Protect is off
[ 6453.205403] sd 3:0:0:0: [sdb] Mode Sense: 2b 00 00 08
[ 6453.206361] sd 3:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[ 6453.241654]  sdb: sdb1 sdb2
[ 6453.244855] sd 3:0:0:0: [sdb] Attached SCSI removable disk

En mi caso, es el /dev/sdb, el cuál usaré de ejemplo.

  1. Descargamos una imagen de Calculate Linux
  2. Comprobamos que la suma de verificación para evitar que la imagen esté corrupta, el enlace para comprobar en MD5 o en SHA1 está justo al lado del enlace de descarga:

En mi caso, utilicé la imagen de Calculate Linux MATE 64 bits y con SHA1:

84ffa7fbce9c557b810f6204dd3e75b153aa5bf2  cldm-20-x86_64.iso

Comprobamos que sea el mismo hash:

$ sha1sum cldm-20-x86_64.iso
84ffa7fbce9c557b810f6204dd3e75b153aa5bf2

Está perfecta, y no está corrupta.

Generamos el pendrive live como dice la documentación:

# dd if=IMAGEN_CALCULATE.iso of=/dev/sdN
  • dd es un comando que permite copiar tal cual un archivo, y tiene múltiples usos entre ellos hacer imágenes live.
  • if ruta del archivo fuente
  • IMAGEN_CALCULATE nombre de la imagen
  • /dev/sdN el archivo dispositivo de bloques detectado por el SO
  • of ruta del archivo destino, no olvidemos que aunque hemos conectado un pendrive, este en Linux es un dispositivo de bloques y queda reflejado como si fuera un archivo.

En mi caso:

# dd if=cldm-20-x86_64.iso of=/dev/sdb

Reiniciamos el ordenador y arrancamos el SO del pendrive. Esperamos a que cargue el entorno de escritorio y estará la primera parte hecha.

Particionando

Particionamos el dispositivo, en mi caso es un SSD NVME que tiene otro conector diferente y el núcleo de Linux lo llama como /dev/nvme0n1.

Definimos el siguiente esquema de particionamiento:

Partición Pto montaje Formato Nombre Tamaño Bandera
/dev/nvme0n1p1 X FAT32 grub 2MB bios_grub
/dev/nvme0n1p2 /boot ext4 boot 512MB X
/dev/nvme0n1p3 /boot/efi FAT32 efi 128MB boot, esp
/dev/nvme0n1p4 * LVM rootfs * lvm

NOTA: Si tienes un disco sda|sdb|sdc... adáptalo como gustes.

Dentro del LVM, crearemos un grupo de volúmenes llamado gentoo, y dentro de él, crearemos un volúmen lógico para la swap, y le definiré un tamaño de 8GB porque suelo tirar mucho de ella, y crearemos otro volúmen lógico para root utilizando el resto de espacio libre.

NOTA: El primer * es un grupo de volúmen que haremos más adelante, y el segundo, todo el espacio libre restante.

Abrimos una consola, escalamos privilegios para tener acceso como root:

# parted -a optimal /dev/sdN
GNU Parted 3.2
Using /dev/sdN
Welcome to GNU Parted! Type 'help' to view a list of commands.

Creamos el esquema de particionamiento

(parted) mklabel
(parted) unit mib
(parted) mkpart primary 1 3
(parted) name 1 grub
(parted) set 1 bios_grub on
(parted) mkpart primary 3 512
(parted) name 2 boot
(parted) mkpart primary 512 640
(parted) name 3 efi
(parted) set 3 boot on
(parted) mkpart primary 640 -1
(parted) name 4 rootfs
(parted) quit

Ya tendremos nuestro esquema listo, ahora toca darle formato.

Creamos las particiones EXT4 y FAT32 para la partición EFI

# mkfs.ext4 /dev/nvme0n1p2
# mkfs.fat  -F 32 /dev/nvme0n1p3

Creamos la partición cifrada:

# cryptsetup luksFormat /dev/nvme0n1p3

Confirmamos en mayúsculas que si queremos (YES).

Descriframos la partición cifrada:

# cryptsetup luksOpen /dev/nvme0n1p3 world

Creamos el volúmen físico:

# pvcreate /dev/mapper/world

Creamos el grupo de volúmen:

# vgcreate gentoo /dev/mapper/world

Creamos los volúmenes lógicos:

# lvcreate -L 8G -n swap gentoo
# lvcreate -l100%FREE -n root gentoo

Formateamos los volúmenes lógicos:

# mkfs.ext4 /dev/mapper/gentoo-root
# mkswap /dev/mapper/gentoo-swap

Activamos la swap:

# swapon /dev/mapper/gentoo-swap

Creamos el directorio /mnt/gentoo:

# mkdir /mnt/gentoo

Montamos la partición raíz:

# mount /dev/mapper/gentoo-root /mnt/gentoo

Creamos la partición /boot y /boot/efi:

# mkdir /mnt/gentoo/boot
# mount /dev/nvme0n1p2 /boot
# mkdir /mnt/gentoo/boot/efi
# mount /dev/nvme0n1p3 /boot/efi

Hemos terminado el particionamiento, el formato y el montaje de los sistemas de archivos que hemos formateado.

Descargando e instalando el stage3

El stage3 es un conjunto de librerías y binarios precompilados por el grupo de desarrollo de Gentoo que está casi listo para utilizar. El stage2 y stage1 son para personas que quieren armarse Gentoo casi desde 0, no es recomendado hasta que lleves una cierta soltura con el sistema. Además, hay un stage4 que es un nivel más arriba de abstracción pero que nunca he probado.

Descargamos el stage3 de Gentoo hardened+selinux desde este espejo mismo. Si no va bien, hay una amplia lista de espejos que tiene Gentoo disponibles para probar.

Descargamos los archivos .tar.xz y .DIGESTS con wget situados en el directorio /mnt/gentoo

# cd /mnt/gentoo
# wget https://ftp-stud.hs-esslingen.de/pub/Mirrors/gentoo/releases/amd64/autobuilds/current-stage3-amd64-hardened-selinux/stage3-amd64-hardened-selinux-20200422T214502Z.tar.xz
# wget https://ftp-stud.hs-esslingen.de/pub/Mirrors/gentoo/releases/amd64/autobuilds/current-stage3-amd64-hardened-selinux/stage3-amd64-hardened-selinux-20200422T214502Z.tar.xz.DIGESTS

Nos fijamos en la suma de verificación SHA512 del stage3 en el .DIGESTS:

# cat stage3-amd64-hardened-selinux-20200422T214502Z.tar.xz.DIGESTS
# SHA512 HASH
0ac73366478b4c0ac2f35b1f19a64e8041f666a9f9afd2a67691f77e9ab67d6a8f672d740b2faeb8851c4095e54cdb04f3d6e08a262ce5135840db5ac5bf0181  stage3-amd64-hardened-selinux+nomultilib-20200422T214502Z.tar.xz

Comprobamos que es la misma que el stage3:

# sha512sum stage3-amd64-hardened-selinux-20200422T214502Z.tar.xz

Si es correcta, descomprimimos el tarball

# tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner --selinux --acls

Configuraciones iniciales

Editamos el archivo /mnt/gentoo/etc/portage/make.conf

NOTA: En este archivo se define todo lo que tenga que ver con la compilación de los paquetes del sistema entre otras cosas.

Añadiendo optimización en la compilación

Y en la variables CFLAGS añadimos el parámetro -march=native. Este parámetro tomará de forma automática todas las instrucciones de tu procesador y lo compilará solo y exclusivamente para que esté soportado por él. Si tienes intención de portal el software a otras tipos de CPU, entonces no lo pongas.

NOTA: Las CFLAGS y otras variables permiten pasar una serie de instrucciones al compilador para que el código compilado en C y C++ sea más óptimo y reducido (o por lo menos eso es lo que se busca). Puedes leer más información en la documentación de Gentoo.

Y lo dejamos así por el momento, si en el futuro quieres añadir más parámetros o modificadores en el comportamiento de la compilación de los programas lo dejo a libre elección.

 These settings were set by the catalyst build script that automatically
# built this stage.
# Please consult /usr/share/portage/config/make.conf.example for a more
# detailed example.
COMMON_FLAGS="-march=native -O2 -pipe"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"

Añadiendo los mirrors

Creamos una variable llamada GENTOO_MIRRORS="https://ftp.fau.de/gentoo" y añadimos este mirror, si quieres otro puedes añadirlo también consultando la lista de espejos aquí y seguidos de un espacio.

# echo 'GENTOO_MIRRORS="https://ftp.fau.de/gentoo"' >> /etc/portage/make.conf

Añadiendo soporte multihilo

Añadimos otra variable que se llama MAKEOPTS="-jN", dónde N equivale al número de CPUS que tienes + 1. Por ejemplo, en mi caso tengo 8, pues le asigno MAKEOPTS="-j9". ¿Cómo puedes ver la cantidad de CPU (CPU e hilos) que tienes? con el comando lscpu:

$ lscpu
Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   39 bits physical, 48 bits virtual
CPU(s):                          8******

El valor mostrado en el apartado CPU(s), es el que cuenta.

Configurando el repositorio de Gentoo

Creamos directorios necesarios para portage:

# mkdir --parents /mnt/gentoo/etc/portage/repos.conf

Creamos este archivo /mnt/gentoo/etc/portage/repos.conf/gentoo.conf y le añadimos:

[DEFAULT]
main-repo = gentoo

[gentoo]
location = /var/db/repos/gentoo
sync-type = rsync
sync-uri = rsync://rsync.gentoo.org/gentoo-portage
auto-sync = yes
sync-rsync-verify-jobs = 1
sync-rsync-verify-metamanifest = yes
sync-rsync-verify-max-age = 24
sync-openpgp-key-path = /usr/share/openpgp-keys/gentoo-release.asc
sync-openpgp-key-refresh-retry-count = 40
sync-openpgp-key-refresh-retry-overall-timeout = 1200
sync-openpgp-key-refresh-retry-delay-exp-base = 2
sync-openpgp-key-refresh-retry-delay-max = 60
sync-openpgp-key-refresh-retry-delay-mult = 4

Copiando los DNS a lo que será nuestro SO

Copiamos la información de los DNS

# cp --dereference /etc/resolv.conf /mnt/gentoo/etc/

Pasos previos a la instalación

Estos pasos son necesarios para poder continuar, hay que asegurarse de que todo está correctamente.

Montando los pseudos sistemas de archivos

Montamos los pseudosistemas de archivos necesarios para poder hacer un chroot:

root #mount --types proc /proc /mnt/gentoo/proc
root #mount --rbind /sys /mnt/gentoo/sys
root #mount --rbind /dev /mnt/gentoo/dev

NOTA: Estamos haciendo una "redirección" de estos pseudo sistemas de archivos para que podamos ejecutar comandos que interactúen con el hardware de nuestro equipo.

NOTA: Si haces la instalación con algún live que use systemd, tienes que ejecutar estos comandos adicionales, si no, ignora este paso:

# mount --make-rslave /mnt/gentoo/sys
# mount --make-rslave /mnt/gentoo/dev

NOTA: Si no utilizas el live de instalación de Gentoo como yo usando Calculate Linux, ejecuta los siguientes comandos como dice la documentación, de lo contrario omite este paso:

# test -L /dev/shm && rm /dev/shm && mkdir /dev/shm
# mount --types tmpfs --options nosuid,nodev,noexec shm /dev/shm
# chmod 1777 /

Accediendo a nuestro futuro sistema

El chroot permite "aislar" el sistema que vamos configurar del actual evitando accidentes, por lo que habrán variables, comandos y directorios que no existan, y lo que era /mnt/gentoo se volverà /. ¡Cuidado con no confundirse dónde estás trabajando!

# chroot /mnt/gentoo /bin/bash
# source /etc/profile
# export PS1="(chroot) ${PS1}"

NOTA: Ejecutamos un mount y tenemos que ver que las particiones /boot, /boot/efi se encuentren montadas, si no habrá que salir del chroot y montarlas de nuevo como en comento en los primeros pasos.

Configurando Portage

Portage es un conjunto de directorios bien organizados por categorías basadas en el criterio de los desarrolladores de Gentoo, y que cada una de ellas, hay un directorio con el nombre del software cuyo interior hay scripts como .ebuilds, parches...etc necesarios para instalar los paquetes.

Descargamos todos el árbol de portage para poder instalar software necesario.

# emerge-webrsync
# emerge --sync

Por lo general en la documentación te recomiendan que leas las noticias de Portage, en mi caso no tuve ningún problema, pero si lees este post y ha pasado un tiempo, es preferible que te informes:

# eselect news list
News items:
  [1]      2016-06-19  L10N USE_EXPAND variable replacing LINGUAS
  [2]      2018-08-07  Migration required for OpenSSH with LDAP
  [3]      2019-05-23  Change of ACCEPT_LICENSE default
  [4]   N  2019-12-30  Genkernel 4 changed default filenames
  [5]   N  2020-02-07  Python 2.7 went EOL
  [6]   N  2020-02-20  OpenSSH 8.2_p1 running sshd breakage
  [7]      2020-04-22  Python 3.7 to become the default target

Para leer una a una:

# eselect news read 1
2016-06-23-l10n-use_expand
  Title                     L10N USE_EXPAND variable replacing LINGUAS
  Author                    Mart Raudsepp <leio@gentoo.org>
  Author                    Ulrich Müller <ulm@gentoo.org>
  Posted                    2016-06-19
  Revision                  1

The L10N variable is replacing LINGUAS as a USE_EXPAND, to avoid a
conceptual clash with the standard gettext LINGUAS behaviour.
[...]

Seleccionando el perfil

Comprobamos que el perfil que tenemos es el correcto:

# eselec profile list
Available profile symlink targets:
  [1]   default/linux/amd64/17.0 (stable)
  [2]   default/linux/amd64/17.0/selinux (stable)
  [3]   default/linux/amd64/17.0/hardened (stable)
[...]

NOTA: Los perfiles tienen una serie de configuraciones de USE, CFLAGS, paquetes que no deben compilarse para evitar incompatibilidades...etc que están definidas por el equipo de desarrolladores de Gentoo. Puedes ver que USE contiene este perfilemerge --info | grep ^USE

NOTA: Las USE flags, son características que queremos que tenga el paquete, puede que existan incompatibilidades entre paquetes al definirlas, otras no estén disponibles, y otras pueden estar bloqueadas por motivos de estabilidad package.mask.

En esta lista, debe estar marcado con asterisco esta opción:

  [19]  default/linux/amd64/17.1/hardened/selinux (stable) *

Configurando los locales

Los "locales" es el soporte idiomático/codificación que queremos que tenga soportada por defecto nuestro sistema. En mi caso, he configurado que el idioma por defecto sea el inglés norteamericano y el español como idioma secundario. Ambos idiomas tienen soporte UTF-8.

# echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
# echo "es_ES.UTF-8 UTF-8" >> /etc/locale.gen

Generamos los locales:

# locale-gen

Seleccionamos el locale por defecto:

# eselect locale list
Available targets for the LANG variable:
  [1]   C *
  [2]   C.utf8
  [3]   en_US.utf8
  [4]   es_ES.utf8
  [5]   POSIX
  [ ]   (free form)

Lo cambiamos:

# eselect profile set 3

Regeneramos toda la configuración de nuestro entorno:

# env-update && source /etc/profile && export PS1="(chroot) ${PS1}"

Haciendo un pequeño tunning al /etc/portage/make.conf

Los siguientes pasos nos ayudarán en la instalación de los paquetes.

Soporte de instrucciones de procesamiento en paquetes

Instalamos el paquete app-portage/cpuid2cpuflags:

# emerge -av app-portage/cpuid2cpuflags

Ejecutamos:

# cpuid2cpuflags >> /etc/portage/make.conf

Editamos el archivo /etc/portage/make.conf y cambiamos:

CPU_FLAGS_X86: aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3

Por esto:

CPU_FLAGS_X86="aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3"

Esto nos añadirá el soporte específico para los paquetes que definen las instrucciones que tiene nuestro procesador para aquellos paquetes que lo permitan mediante USE. Puedes ver los paquetes que usan estas USE si lo buscas en una sección de la página de paquetes de Gentoo.

Soporte idiomático en las aplicaciones

También añadiremos la variable L10N="es en" para tener soporte idiomático de los paquetes que instalemos en nuestro sistema.

# echo 'L10N="es en"' >> /etc/portage/make.conf

Definir la versión de Python por defecto para el sistema

Podemos optar por: * Python 2.7: Intentar evitarlo porque su soporte finalizó el 31 de diciembre de 2019, aún así pueden haber programas que lo necesiten. No obstante, si no lo defines no importa. * Python 3.6 * Python 3.7 * Python 3.8 * Python 3.9

En mi caso, escogí el 3.7 porque vi que no tenía problemas con él, en contra posición con el 3.8 o 3.9 que hay paquetes que no están todavía migrados como sys-apps/policycoreutils, también puedes mezclarlos, pero a mí no me gusta mucho esa idea.

# echo 'PYTHON_TARGETS="python3_7"' >> /etc/portage/make.conf

Dejando la versión por defecto 3.7 en el sistema:

# eselect python list
Available Python interpreters, in order of preference:
  [1]   python3.7
  [2]   python3.6 (uninstalled)
  [3]   python3.8 (fallback)
  [4]   python2.7 (fallback)

En mi caso, pues dejo por defecto 3.7

# eselect set 1

Instalando y configurando ccache

ccache permite ahorrarte tiempo en la compilación porque queda almacenado código compilado en un directorio definido en su configuración, siguiendo las notas de la documentación.

# emerge -av dev-util/ccache

Ejecutamos los siguientes comandos:

# echo 'FEATURES="ccache"' >> /etc/portage/make.conf
# echo 'CCACHE_DIR="/var/cache/ccache"' >> /etc/portage/make.conf

Creamos un directorio específico y aplicamos permisos:

# mkdir -p /var/cache/ccache
# chown root:portage /var/cache/ccache
# chmod 2775 /var/cache/ccache

Editamos el archivo de configuración /var/cache/ccache/ccache.conf y lo dejamos como este:

# Maximum cache size to maintain
max_size = 100.0G

# Allow others to run 'ebuild' and share the cache.
umask = 002

# Preserve cache across GCC rebuilds and
# introspect GCC changes through GCC wrapper.
compiler_check = %compiler% -v

# I expect 1.5M files. 300 files per directory.
cache_dir_levels = 3

compression = true
compression_level = 1

Regeneramos toda la configuración de nuestro entorno:

# env-update && source /etc/profile && export PS1="(chroot) ${PS1}"

Instalando el núcleo del sistema y algunas utilidades

Ejecutamos los siguientes comandos:

# echo ">=sys-kernel/linux-firmware-20200519 initramfs" >> /etc/portage/package.use/usevars
# echo ">=sys-firmware/intel-microcode-20200520_p20200601 initramfs" >> /etc/portage/package.use/usevars
# echo ">=sys-kernel/linux-firmware-20200519 linux-fw-redistributable no-source-code" >> /etc/portage/package.license
# echo ">=sys-firmware/intel-microcode-20200520_p20200601 intel-ucode" >> /etc/portage/package.license

Añadimos las USE para todo /etc/portage/make.conf:

USE="device-mapper lvm audit"

Instalamos los siguientes paquetes ys-kernel/gentoo-sources sys-apps/pciutils sys-kernel/genkernel sys-kernel/linux-firmware:

# emerge -av sys-kernel/gentoo-sources sys-apps/pciutils sys-kernel/genkernel sys-kernel/linux-firmware

Editamos el /etc/fstab

/dev/nvme0n1p2      /boot       ext4        noauto,noatime  1 2
/dev/nvme0n1p3      /boot/efi   vfat        noauto,noatime  1 2
/dev/mapper/gentoo-root /       ext4        noatime 0 0
/dev/mapper/gentoo-swap  none       swap        sw      0 0

Compilamos el núcleo y lo instalamos:

# genkernel all --lvm --luks

NOTA: En mi caso, preferí compilar el kernel con opciones personalizadas, es un proceso más engorroso y necesitas tener un poco más de conocimiento. Más adelante haré un pequeño tutorial de tres cosas básicas para optimizarlo, pero de momento, instalamos todo.

NOTA: Este proceso dura bastante, tómate 7-8 cafés...

Cuando termine, podemos verificar que se han instalado correctamente:

# ls /boot/vmlinu* /boot/initramfs*
/boot/initramfs-5.4.38-gentoo-x86_64.img  /boot/vmlinuz-5.4.38-gentoo-x86_64

Configurando la red

Configuramos el nombre de nuestra máquina a nivel de red, editamos el archivo /etc/conf.d/hostname:

# Set to the hostname of this machine
hostname="shark"

shark es el nombre que le asigno a mi máquina.

Le asignamos un dominio local, editamos /etc/conf.d/net:

# Set the dns_domain_lo variable to the selected domain name
dns_domain_lo="lan"

Mi máquina será identificada en la red como shark.lan

Instalamos el paquete net-misc/netifrc:

# emerge --ask --noreplace net-misc/netifrc

Editamos el archivo /etc/hosts y definimos el nombre de nuestra máquina en él:

127.0.0.1     shark.lan shark localhost
::1                shark.lan shark localhost

Gestionando los usuarios del sistema

Ejecutamos:

# passwd

Creamos un usuario sin privilegios:

# useradd -m sincorchetes
# passwd sincorchetes
# gpasswd -a sincorchetes wheel

Cambiando el idioma del teclado

Editamos el archivo /etc/conf.d/keymaps:

# Use keymap to specify the default console keymap.  There is a complete tree
# of keymaps in /usr/share/keymaps to choose from.
keymap="es"

Cambiando la hora del equipo

Editamos el archivo /etc/conf.d/hwclock

# Set CLOCK to "UTC" if your Hardware Clock is set to UTC (also known as
# Greenwich Mean Time).  If that clock is set to the local time, then
# set CLOCK to "local".  Note that if you dual boot with Windows, then
# you should set it to "local".
clock="local"

Instalando herramientas del sistema

Instalamos el gestor de logs app-admin/syslog-ng y el un software de rotado de logs app-admin/logrotate

# emerge -av app-admin/syslog-ng app-admin/logrotate
# rc-update add syslog-ng default

Instalamos el gestor de tareas sys-process/cronie:

# emerge -av sys-process/cronie
# rc-update add cronie default

Instalamos los paquetes net-misc/dhcpcd, net-wireless/iw y net-wireless/wpa_supplicant

# emerge -av net-misc/dhcpcd net-wireless/wpa_supplicant net-wireless/iw

Dejando SELinux en modo permissive

Cómo tenemos que aprender a tratar y gestionar nuestras propias políticas, tenemos que dejarlo en modo permissive y no targeted. En modo permissive, el sistema envía alertas de políticas incorrectas como una posible vulneración de se seguridad por ejecutar determinado software.

Editamos el archivo /etc/config/selinux y cambiamos:

SELINUX=targeted

Por:

SELINUX=permissive

Configurando el gestor de arranque

Añadimos las USE necesarias para compilar el software:

# echo ">=sys-boot/grub-2.04-r1 device-mapper truetype mount" >> /etc/portage/package.use/usevars

Añadimos el soporte EFI para el GRUB

# echo 'GRUB_PLATFORMS="efi-64"' >> /etc/portage/make.conf

Instalamos el GRUB y además actualizamos todo el software que necesite tomar las nuevas variables USE configuradas:

# emerge --ask --update --newuse --verbose sys-boot/grub:2

Instalamos el gestor de arranque, en mi caso fue con un nvme0n1:

# grub-install --target=x86_64-efi --efi-directory=/boot/efi

Generamos la configuración del gestor de arranque, editamos /etc/default/grub

GRUB_DISTRIBUTOR="Gentoo"
GRUB_CMDLINE_LINUX="dolvm crypt_root=/dev/nvme0n1p4"

NOTA: En el caso de que tengas la partición de LVM en /dev/sda4, cambia /dev/nvme0n1p4 por esa.

Guarda el archivo y genera el fichero de configuración del grub:

# grub-mkconfig -o /boot/grub/grub.cfg

Saliendo del chroot:

# exit

En la terminal del pendrive live:

# cd /
# umount -l /mnt/gentoo/dev{/shm,/pts,}
# umount -R /mnt/gentoo
# reboot

Arrancando el sistema

Cuando arranquemos el sistema, podemos hacer login con nuestro usuario y escalar a root. Para poder conectarnos via Wi-Fi, podemos usar wpa_supplicant.

Conectándonos a una red Wi-Fi

Identificamos nuestra interfaz Wi-Fi

# ip addr

Por regla general, las tarjetas wireless son mapeadas por el sistema con el nombre de wlpNsM, en mi caso es wlp0s4.

Generamos el archivo de conexión:

# wpa_passphrase SSID contraseña > /root/config

Conectamos:

# wpa_supplicant -D nl80211 -i wlan0 -c /root/config &

Asignamos una IP dinámica:

# dhcpcd wlp4s0

Si hacemos un ip addr, veremos que ya tendremos conexión, si no, probamos:

# ping google.es

Ahora podemos continuar instalando paquetes, en los próximos tutoriales, veremos cómo instalar X.org con los drivers de NVIDIA y MATE Desktop, las políticas de SELinux...etc