Saltar a contenido

2022

Actualizando Zabbix 5.0 LTS a 6.0 LTS en Rocky Linux

Zabbix es un software de monitorización que permite monitorizar la red, servidores, entornos cloud, aplicaciones que puede ejecutarse en entornos on premise y en entornos cloud. Tiene como características escalabilidad ilimitada, monitorización distribuída, alta disponibilidad, es flexible y segura.

Es fácil de implementar y posee compatibilidad con MariaDB y PostgreSQL como sistema de gestión y tratamiento de datos. Es un proyecto open source bastante atractivo y con alta actividad tanto en IRC (Libera.chat) como en sus foros.

En este tutorial veremos cómo hacer la actualización con el siguiente esquema de servidor:

Puesta en marcha

Pre:

  • RockyLinux 8.5
  • MariaDB 10.3
  • Zabbix 5.0 LTS
  • NGINX

Post:

  • RockyLinux 8.5
  • MariaDB 10.5
  • Zabbix 6.0 LTS
  • NGINX

NOTA: Si podemos hacer snapshot del servidor, apagamos el servidor, lo hacemos e iniciamos el sistema.

  1. Deshabilitamos todos los User media tales como integraciones con Slack, Telegram, Email... para evitar avisos

  2. Apagamos los siguientes servicios:

sudo systemctl stop nginx.service
sudo systemctl stop zabbix-server.service
sudo systemctl stop zabbix-proxy.service # En caso de que tuvieras
sudo systemctl stop zabbix-agent.service 
sudo systemctl stop zabbix-agent2.service # Depende cuál uses
  1. Hacemos un backup de la base de datos y de otras configuraciones esenciales de Zabbix.
sudo mkdir /opt/zabbix-backup/
mysqldump -u root zabbix > dump.sql
sudo mv dump.sql /opt/zabbix-backup/dump.sql
sudo cp /etc/zabbix/zabbix_server.conf /opt/zabbix-backup/
sudo cp /etc/nginx/conf.d/zabbix.conf  /opt/zabbix-backup/
sudo cp -R /usr/share/zabbix/ /opt/zabbix-backup/
sudo cp -R /usr/share/doc/zabbix-* /opt/zabbix-backup/
  1. Apagamos la base de datos
sudo systemctl stop mariadb.service
  1. Instalamos el nuevo repositorio
sudo rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-1.el8.noarch.rpm
  1. Actualizamos los paquetes
sudo dnf upgrade zabbix-server-mysql zabbix-web-mysql zabbix-agent zabbix-nginx-conf
  1. Comprobamos las configuraciones que tengamos en /etc/nginx/conf.d/ y aplicamos los cambios convenientes (Mejor que se respete la nueva y los cambios que se introduzcan sean los de los certificados por ejemplo)

  2. Eliminamos la versión anterior de MariaDB

    NOTA: Si no, no podrás instalarla porque da conflictos. Los archivos quedan guardados en /var/lib/mysql no se eliminan.

sudo dnf remove mariadb-server
  1. Desactivamos la rama 10.3 y activamos 10.5
sudo dnf -y module disable mariadb:10.3
sudo dnf -y module enable mariadb:10.5
  1. Instalamos la nueva versión
sudo dnf install mariadb-server

NOTA: Verás que es la 10.5 y no 10.3, si es así, mejor que vuelvas al paso anterior.

  1. Arrancamos el servidor
sudo systemctl enable --now mariadb.service
  1. Ejecutamos el upgrade:
sudo mysql_upgrade -u root -p

NOTA: ¿Por qué ejecutarlo con sudo? Porque si no, no podrá crear el archivo de información resultante: /var/lib/mysql/mysql_upgrade_info.

Veremos una salida como esta:

Phase 1/7: Checking and upgrading mysql database
Processing databases
mysql
mysql.column_stats                                 OK
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.event                                        OK
mysql.func                                         OK
mysql.gtid_slave_pos                               OK
mysql.help_category                                OK
mysql.help_keyword                                 OK
mysql.help_relation                                OK
mysql.help_topic                                   OK
mysql.host                                         OK
mysql.index_stats                                  OK
mysql.innodb_index_stats                           OK
mysql.innodb_table_stats                           OK
mysql.plugin                                       OK
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 OK
mysql.roles_mapping                                OK
mysql.servers                                      OK
mysql.table_stats                                  OK
mysql.tables_priv                                  OK
mysql.time_zone                                    OK
mysql.time_zone_leap_second                        OK
mysql.time_zone_name                               OK
mysql.time_zone_transition                         OK
mysql.time_zone_transition_type                    OK
mysql.transaction_registry                         OK
mysql.user                                         OK
Phase 2/7: Installing used storage engines... Skipped
Phase 3/7: Fixing views
Phase 4/7: Running 'mysql_fix_privilege_tables'
Phase 5/7: Fixing table and database names
Phase 6/7: Checking and upgrading tables
Processing databases
information_schema
performance_schema
zabbix
zabbix.acknowledges                                OK
zabbix.actions                                     OK
zabbix.alerts                                      OK
zabbix.application_discovery                       OK
zabbix.application_prototype                       OK
zabbix.application_template                        OK
zabbix.applications                                OK
zabbix.auditlog                                    OK
zabbix.auditlog_details                            OK
zabbix.autoreg_host                                OK
zabbix.conditions                                  OK
zabbix.config                                      OK
zabbix.config_autoreg_tls                          OK
zabbix.corr_condition                              OK
zabbix.corr_condition_group                        OK
zabbix.corr_condition_tag                          OK
zabbix.corr_condition_tagpair                      OK
zabbix.corr_condition_tagvalue                     OK
zabbix.corr_operation                              OK
zabbix.correlation                                 OK
zabbix.dashboard                                   OK
zabbix.dashboard_user                              OK
zabbix.dashboard_usrgrp                            OK
zabbix.dbversion                                   OK
zabbix.dchecks                                     OK
zabbix.dhosts                                      OK
zabbix.drules                                      OK
zabbix.dservices                                   OK
zabbix.escalations                                 OK
zabbix.event_recovery                              OK
zabbix.event_suppress                              OK
zabbix.event_tag                                   OK
zabbix.events                                      OK
zabbix.expressions                                 OK
zabbix.functions                                   OK
zabbix.globalmacro                                 OK
zabbix.globalvars                                  OK
zabbix.graph_discovery                             OK
zabbix.graph_theme                                 OK
zabbix.graphs                                      OK
zabbix.graphs_items                                OK
zabbix.group_discovery                             OK
zabbix.group_prototype                             OK
zabbix.history                                     OK
zabbix.history_log                                 OK
zabbix.history_str                                 OK
zabbix.history_text                                OK
zabbix.history_uint                                OK
zabbix.host_discovery                              OK
zabbix.host_inventory                              OK
zabbix.host_tag                                    OK
zabbix.hostmacro                                   OK
zabbix.hosts                                       OK
zabbix.hosts_groups                                OK
zabbix.hosts_templates                             OK
zabbix.housekeeper                                 OK
zabbix.hstgrp                                      OK
zabbix.httpstep                                    OK
zabbix.httpstep_field                              OK
zabbix.httpstepitem                                OK
zabbix.httptest                                    OK
zabbix.httptest_field                              OK
zabbix.httptestitem                                OK
zabbix.icon_map                                    OK
zabbix.icon_mapping                                OK
zabbix.ids                                         OK
zabbix.images                                      OK
zabbix.interface                                   OK
zabbix.interface_discovery                         OK
zabbix.interface_snmp                              OK
zabbix.item_application_prototype                  OK
zabbix.item_condition                              OK
zabbix.item_discovery                              OK
zabbix.item_preproc                                OK
zabbix.item_rtdata                                 OK
zabbix.items                                       OK
zabbix.items_applications                          OK
zabbix.lld_macro_path                              OK
zabbix.lld_override                                OK
zabbix.lld_override_condition                      OK
zabbix.lld_override_opdiscover                     OK
zabbix.lld_override_operation                      OK
zabbix.lld_override_ophistory                      OK
zabbix.lld_override_opinventory                    OK
zabbix.lld_override_opperiod                       OK
zabbix.lld_override_opseverity                     OK
zabbix.lld_override_opstatus                       OK
zabbix.lld_override_optag                          OK
zabbix.lld_override_optemplate                     OK
zabbix.lld_override_optrends                       OK
zabbix.maintenance_tag                             OK
zabbix.maintenances                                OK
zabbix.maintenances_groups                         OK
zabbix.maintenances_hosts                          OK
zabbix.maintenances_windows                        OK
zabbix.mappings                                    OK
zabbix.media                                       OK
zabbix.media_type                                  OK
zabbix.media_type_message                          OK
zabbix.media_type_param                            OK
zabbix.module                                      OK
zabbix.opcommand                                   OK
zabbix.opcommand_grp                               OK
zabbix.opcommand_hst                               OK
zabbix.opconditions                                OK
zabbix.operations                                  OK
zabbix.opgroup                                     OK
zabbix.opinventory                                 OK
zabbix.opmessage                                   OK
zabbix.opmessage_grp                               OK
zabbix.opmessage_usr                               OK
zabbix.optemplate                                  OK
zabbix.problem                                     OK
zabbix.problem_tag                                 OK
zabbix.profiles                                    OK
zabbix.proxy_autoreg_host                          OK
zabbix.proxy_dhistory                              OK
zabbix.proxy_history                               OK
zabbix.regexps                                     OK
zabbix.rights                                      OK
zabbix.screen_user                                 OK
zabbix.screen_usrgrp                               OK
zabbix.screens                                     OK
zabbix.screens_items                               OK
zabbix.scripts                                     OK
zabbix.service_alarms                              OK
zabbix.services                                    OK
zabbix.services_links                              OK
zabbix.services_times                              OK
zabbix.sessions                                    OK
zabbix.slides                                      OK
zabbix.slideshow_user                              OK
zabbix.slideshow_usrgrp                            OK
zabbix.slideshows                                  OK
zabbix.sysmap_element_trigger                      OK
zabbix.sysmap_element_url                          OK
zabbix.sysmap_shape                                OK
zabbix.sysmap_url                                  OK
zabbix.sysmap_user                                 OK
zabbix.sysmap_usrgrp                               OK
zabbix.sysmaps                                     OK
zabbix.sysmaps_elements                            OK
zabbix.sysmaps_link_triggers                       OK
zabbix.sysmaps_links                               OK
zabbix.tag_filter                                  OK
zabbix.task                                        OK
zabbix.task_acknowledge                            OK
zabbix.task_check_now                              OK
zabbix.task_close_problem                          OK
zabbix.task_data                                   OK
zabbix.task_remote_command                         OK
zabbix.task_remote_command_result                  OK
zabbix.task_result                                 OK
zabbix.timeperiods                                 OK
zabbix.trends                                      OK
zabbix.trends_uint                                 OK
zabbix.trigger_depends                             OK
zabbix.trigger_discovery                           OK
zabbix.trigger_tag                                 OK
zabbix.triggers                                    OK
zabbix.users                                       OK
zabbix.users_groups                                OK
zabbix.usrgrp                                      OK
zabbix.valuemaps                                   OK
zabbix.widget                                      OK
zabbix.widget_field                                OK
Phase 7/7: Running 'FLUSH PRIVILEGES'
OK
  1. Iniciamos los servicios
sudo systemctl start zabbix-server.service
sudo systemctl start zabbix-proxy.service # En caso de que tuvieras
sudo systemctl start zabbix-agent.service 
sudo systemctl start zabbix-agent2.service # Depende cuál uses
sudo systemctl start nginx.service
  1. Ya deberías poder acceder al portal de login.

Recursos

  • Documentación oficial: Zabbix

Documentación offline con Zeal

A veces uno sale de viaje, y bueno aprovecha el avión cuando son recorridos de 1h y más para ser productivos con nuestros portátiles. No obstante, seguro que nos ha pasado que justamente teníamos que acceder a una documentación del proyecto y por culpa de no tener Internet pues no podemos acceder a ella. Acabamos un poco frustrados al no poder terminar nuestra tarea, y terminamos o bien por cerrar la tapa del portátil o bien haciendo otra cosa.

Pues para evitar eso tenemos Zeal, un visor de documentación fuera de línea de los proyectos más populares, entre ellos tenemos algunos como: - NGINX - Javascript - PHP - Python - Ruby - Ruby on rails - C - C++ - Bash - MongoDB - ...

Este programa se distribuye con licencia GPLv3.

Para comenzar, tenemos que instalarlo primero:

En Fedora lo tenemos disponible en los repositorios oficiales:

sudo dnf install zeal

Gentoo Linux lo tenemos masked:

echo "app-doc/zeal ~amd64" | sudo tee /etc/portage/package.accept_keywords/zeal
sudo emerge -av zeal

Arch (AUR)

yay -S zeal

También está disponible para otros sistemas como Windows y Mac (OSX)

Después para instalar la documentación, hay que ir a Tools -> Docsets y en Available seleccionamos lo que queremos tener instalado:

Aquí os comparto unas screenshot: Imagen Imagen

¿Es realmente comunitaria Fedora Project?

Uno de los consejos que os voy a trasladar, es, que si quieren contribuir en un proyecto de Software Libre, Open Source... lo revisen bien. Voy a contaros una experiencia reciente que he tenido con la parte de actualizaciones de Fedora Project.

Estoy en un grupo de Telegram de Fedora ES, donde un compañero menciona que tiene problemas con un programa llamado Stellarium, prácticamente es un visor del cielo que te permite visualizar las constelaciones; ver cómo está el cielo en una determinada fecha y multitud de cosas más interesantes... 100% recomendado.

Bueno, el tema es que cuando él abría el programa le daban muchos destellos hasta tal punto que no se puede utilizar. Como tengo un portátil con gráfica Intel HD 630 y NVIDIA GeForce GTX 1050, me dedico a probar Stellarium y efectivamente, me pasa el mismo problema, sin embargo, si lo ejecutaba con la NVIDIA (DRI_PRIME=1) no tenía el problema, con lo cuál, el problema era de Intel.

Si bien usaba Wayland, probé con X.org, y no se subsanaba el problema, con lo que no es el driver de X.org de Intel, si no era ya problema de MESA.

Entonces, el día 14 de enero de 2022, abro un bug report en el Bugzilla de Red Hat 2040771 y menciono que hay problemas con Stellarium y que hay parpadeos al usarlo, que no funciona con Intel y si con NVIDIA.

Voy investigando e investigando, veo que funciona haciendo un downgrade de paquetes de MESA y resulta, que funcionaba, así que terminaba por confirmar que era MESA, efectivamente.

El día 15 de enero, entro en MESA y veo que una persona puso una solución en este issue. Así que, empecé a informarme sobre cómo compilar un RPM, ver como enviarlo al sistema de construcción de paquetes de Fedora Project llamado Koji... Le dediqué muchas horas, empecé en la tarde y terminé de madrugada ya que finalmente, a la 01:37 de la mañana del día 16 de enero consigo finalmente una compilación con el parche que elaboré y mi cambio en el changelog.

Había puesto que resolví el problema gracias al commit de esa persona que encontré en MESA, y añadí mi parche al Bug Report que abrí. Después veo que para incluir estos cambios en las actualizaciones de Fedora no bastaba con compilar el paquete con la solución en Koji y estudié y pregunté cómo enviar el reporte a Bodhi (sistema de valoración de actualizaciones en Fedora) hice un Pull Request a Fedora.

Todos los días accedía a mi PR y veía que nadie comentaba este PR, y justo el día 22, veo que me cierran el PR sin dar ningún tipo de explicación y entonces pregunté:

Why is closed?

Como vi que pasó un día y no contestó, me da por mirar que había un PR para probar una actualización hecha por Lyude.

Descargo el SRC del rpm, y veo que está el parche con el mismo código que yo añadí en el Bug Report...

Accedo al issue y pregunto el día 23 de enero en su PR:

Why are you closed my PR? https://src.fedoraproject.org/rpms/mesa/pull-request/14

Why you didn't added my contribution in to mesa.spec changelog?

Your patch includes the code I've added into my solution fix.

En español:

¿Por qué cerraste mi PR? https://src.fedoraproject.org/rpms/mesa/pull-request/14

¿Por qué no añadiste mi contribución en el log de cambios del fichero mesa.spec?

Su parche incluye el código que añadí en mi solución.

Lyude, me contestó con este mensaje:

@sincorchetes Sorry about that! The reason I did it was because the way you had incremented the rpm build was incorrect, and because I was finishing up the day at work it was just faster for me to redo it myself. It didn't occur to me you might want your name mentioned in the changelog, my apologies.

Traducción:

@sincorchetes, ¡Siento esto! La razón por la que yo lo hice fue porque la manera en el que habías incrmentado la construcción del rpm fue incorrecta, y porque estaba finalizando mi día de trabajo entonces era más rápido para mí era rehacerlo a mi estilo. No se me ocurrió que quisieras que mencionara tu nombre en el changelog, mis disculpas.

No solo he regalado el trabajo a Lyude, si no que encima, ella no va hacer nada para remediarlo, con lo que le contesté:

Hi @lyude,

Yes, please. Because I have taken time to understand the logic part to contribute to Fedora. How to build rpm How to build a package for Koji How to submit a PR in this infra Looking for the bug in upstream

I made a lot of hours testing and trying to insert this patch in this software to help others, so, yes, I request my work in this rpm rebuilt.

Thanks

En español:

Hola @lyude,

Sí, por favor. Porque me he tomado mi tiempo para entender la parte lógica sobre cómo contribuir a Fedora. Cómo construir un paquete rpm; Cómo construirlo con Koji; Cómo enviar un PR a la Fedora Way para corregir el bug que hay desde upstream.

Adivinen, nadie contestó, se aprobó el PR y se integró en la rama estable.

A todo esto, yo me pregunto. ¿Me he currado todos esos días, todas esas horas, investigando, probando, aprendiendo la "Fedora Way" para contribuir...etc para que después me lo paguen de esta forma?

Solo digo que a esta persona le pagan por esto, a mí, no. ¿A esto se le llama ser comunitario?

Introducción a Podman

Una herramienta nativa para Linux que se ejecuta sin ser un servicio, es open source y está diseñada para ser fácil de utilizar. Se pueden ejecutar, construir, compartir y desplegar aplicaciones utilizando la definición "Open Containers Initiative (OCI)" e imágenes de contenedor. Los contenedores se pueden ejecutar siendo root o usuario sin privilegios sin hacer uso de ningún servicio que gestione prácticamente nada, que es lo contrario a Docker que es un servicio/cliente. Se pueden configurar los contenedores con systemd para que éstos inicien en caso de reinicio del sistema, por lo que es muy bueno.

¿Qué es la OCI?

La Open Containers Initiative es un pequeño gobierno establecido en 2015 por Docker y otros líderes en la industria de los contenedores que tienen como objetivo implementar estándares abiertos en la industria que gira en torno a los contenedores con el fin de evitar que múltiples empresas generen sus propios formas de crear y desplegar contenedores volviendo a un escenario de los 90 como pasó con las redes, que si un edificio tenía el producto de una empresa A, no era compatible con los dispositivos de la empresa B.

Actualmente hay dos tipos de especificaciones:

La especificación de tiempo de ejecución (runtime-spec) y la especificación de la imagen (image-spec). La primera trata de ver cómo se desempaqueta la imagen y se ejecuta, y en la segunda es cómo y dónde se descarga o se almacena la imagen que contiene ese sistema de archivos y que se ejecutará convirtiéndose en un contenedor. Las imágenes contienen tags para definir las versiones, por ejemplo, rockylinux:latest o rockylinux a secas se refiere a latest. Sin embargo, el proyecto puede tener versiones, por ejemplo: * rockylinux:8.5 * rockylinux:7.9 * rockylinux:alpha-stage * [...]

¿Cómo se puede usar?

Se puede utilizar desde usuario rooto desde un usuario sin privilegios siempre y cuando tenga el subid y subgid definidos.

Comandos de creación

Crear un contenedor con bash basado en una imagen de Rocky Linux

podman run -ti rockylinux:latest /bin/bash

Crear un contenedor con bash basado en una imagen cuya tag es la 8.5

podman run -ti rockylinux:8.5 /bin/bash

Crear un contenedor con nombre único

podman run -ti --name micontenedor rockylinux:latest /bin/bash

NOTA: Si no eliminas el contenedor, no podrás lanzar más contenedores con este nombre.

Crear una red

podman create network nombre_red

Crear un volumen

podman create volume nombre_volumen

Crear un contenedor con una red creada

podman run -ti --network hola_mundo rockylinux /bin/bash

Crear un contenedor con un volumen creado o crearlo "al vuelo"

NOTA: Es un volumen persistente, no se elimina después de finalizar el contenedor

podman run -ti --volume nuevo_volumen:/tmp/my_vol rockylinux /bin/bash

Crear un contenedor y utilizar un archivo como volumen persistente

podman run -ti --volume /home/sincorchetes/hello_world.txt:/tmp/hello_world.txt rockylinux /bin/bash

Crear un contenedor y utilizar un directorio como volumen persistente

podman run -ti --volume /home/sincorchetes/hello_world:/tmp/hello_world rockylinux /bin/bash

Crear un contenedor que se ejecute en segundo plano

NOTA: Este contenedor no tiene acceso al exterior, si haces un curl 127.0.0.1:80 no dará respuesta, además estará mal si lo ejecutas como usuario sin privilegios, ya que el kernel por seguridad no permite exponer programas con puertos inferiores a 1024.

podman run -d nginx 

Crear un contenedor que se ejecute en segundo plano y con mapeo de puertos

podman run -d -p 8080:80 nginx

Si haces un curl 127.0.0.1:8080 obtendrás la página de bienvenida de NGINX

Genera una plantilla servicio para que se ejecute en systemd

podman generate systemd nombre_contenedor|id_imagen

NOTA: Nos genera un .service en la salida de la terminal que podemos añadir como servicio del sistema o de usuario. Hay que añadirlo no se configura solo.

Ejemplo:

podman ps 
CONTAINER ID  IMAGE                           COMMAND               CREATED         STATUS             PORTS       NAMES
a138796be81d  docker.io/library/nginx:latest  nginx -g daemon o...  21 minutes ago  Up 21 minutes ago              inspiring_hertz

podman generate systemd inspiring_hertz
# container-a138796be81d92ae13c7390fe65f3544558ec4640ed20446ac6595e24446dc27.service
# autogenerated by Podman 3.4.4
# Thu Jan 20 17:40:51 WET 2022

[Unit]
Description=Podman container-a138796be81d92ae13c7390fe65f3544558ec4640ed20446ac6595e24446dc27.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=/run/user/1000/containers

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
TimeoutStopSec=70
ExecStart=/usr/bin/podman start a138796be81d92ae13c7390fe65f3544558ec4640ed20446ac6595e24446dc27
ExecStop=/usr/bin/podman stop -t 10 a138796be81d92ae13c7390fe65f3544558ec4640ed20446ac6595e24446dc27
ExecStopPost=/usr/bin/podman stop -t 10 a138796be81d92ae13c7390fe65f3544558ec4640ed20446ac6595e24446dc27
PIDFile=/run/user/1000/containers/overlay-containers/a138796be81d92ae13c7390fe65f3544558ec4640ed20446ac6595e24446dc27/userdata/conmon.pid
Type=forking

[Install]
WantedBy=default.target

Si queremos guardarlo, redirigimos la salida

podman generate systemd inspiring_hertz > nginx.service

Generando una plantilla para Kubernetes

podman generate kube 

Ejemplo:

podman generate kube inspiring_hertz
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-3.4.4
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2022-01-20T17:43:58Z"
  labels:
    app: inspiringhertz
  name: inspiringhertz
spec:
  containers:
  - args:
    - nginx
    - -g
    - daemon off;
    image: docker.io/library/nginx:latest
    name: inspiringhertz
    securityContext:
      capabilities:
        drop:
        - CAP_MKNOD
        - CAP_NET_RAW
        - CAP_AUDIT_WRITE

Si queremos guardarlo, redirigimos la salida

podman generate kube inspiring_hertz > nginx.yaml

Y para ejecutarlo en nuestro cluster (necesitaremos tener kubectl configurado)

kubectl apply -f nginx.yaml

Comandos de construcción

Modificar una imagen

podman run -ti rockylinux /bin/bash
# dnf install -y tmux
[...]
Installed:
  libevent-2.1.8-5.el8.x86_64                            tmux-2.7-1.el8.x86_64

Complete!

En otra terminal, recuperamos el contenedor

podman ps
CONTAINER ID  IMAGE                                COMMAND     CREATED         STATUS                 PORTS       NAMES
d56ed882cbc1  docker.io/library/rockylinux:latest  /bin/bash   59 seconds ago  Up About a minute ago              funny_stonebraker

Hacemos un commit y lo guardamos con otro nombre

podman commit d56ed882cbc1 rockylinux_custom
Getting image source signatures
Copying blob 65dbea0a4b39 skipped: already exists
Copying blob 741ec203d982 done
Copying config 515a64e7ed done
Writing manifest to image destination
Storing signatures
515a64e7ed4cbb778b043820de1ee9054c62a83c3e0462f21b188263374ba522

Ejecutando la nueva imagen

podman run -ti rockylinux_custom tmux

Ó

podman run -ti rockylinux_custom /usr/bin/tmux

Construir una imagen partiendo de un Containerfile

Podemos hacer lo anterior, pero en vez de usar ese método, utilizar un Containerfile que nos da más libertad y facilidad, también te valen los Dockerfile, recordemos (OCI compliant)

Crearmos un archivo Containerfile

mkdir imagen
touch imagen/Containerfile

Editamos imagen/Containerfile

FROM rockylinux:latest
RUN dnf install -y tmux
CMD ["/usr/bin/tmux"]

Construimos la imagen:

podman build -t rockylinux_custom image

Arrancamos la imagen

podman run -ti rockylinux_custom

Se nos abrirá con tmux directamente.

Comandos para listar

Listar imágenes

podman image ls

Listar redes

podman network ls

Listar volúmenes

podman volume ls

Listar todos los ID de las imágenes

podman image ls | awk 'NR>1 { print $3 }'

Listar todos los ID de los contenedores que se están ejecutando

podman ps | awk 'NR>1 { print $3 }'

Listar todos los ID de los contenedores que se están o hayan sido ejecutados

podman ps -a| awk 'NR>1 { print $3 }'

Listar solo el nombre de los volúmenes

podman volume ls | awk 'NR>1 { print $2 }'

Listar solo el ID de las redes y su nombre

podman network ls | awk 'NR>1 { print $2 }'

Comandos de búsqueda

Buscar en todos los registries

podman search rockylinux

Buscar en un solo registry

podman search docker.io/rockylinux

Comandos para eliminar

Eliminar contenedor en ejecución

podman rm -f ID_contenedor

Eliminar volumen

NOTA: No debe haber ningún contenedor que esté explotando el volumen

podman volume rm nombre_volumen

Eliminar una imagen

podman image rm nombre_imagen

Eliminar una imagen (forma corta)

podman rmi nombre_imagen

Eliminar una red

podman network rm nombre_red

Eliminar imágenes que no se están utilizando

podman image prune

Eliminar todos los contenedores incluyendo los que ya han finalizado

podman rm -f $(podman ps -a | awk 'NR>1 { print $1 }')

Exportación/Importación

Exportar el FS de un contenedor en ejecución

podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED             STATUS                 PORTS       NAMES
c5d483dc9b77  docker.io/library/nginx:latest  nginx -g daemon o...  About a minute ago  Up About a minute ago              intelligent_archimedes

podman export c5d483dc9b77 > myfs.tar

Tendremos todo el contenido del contenedor exportado.

Importar un contenedor

podman import myfs.tar
Getting image source signatures
Copying blob 0f3fecb21929 done  
Copying config d485510f4c done  
Writing manifest to image destination
Storing signatures
sha256:d485510f4c1ba2ba61bbd2bcdd2e632f404be7ae90b81370fda41dd16b9d3936

podman image ls
[...]
REPOSITORY                                 TAG         IMAGE ID      CREATED         SIZE
<none>                                     <none>      d485510f4c1b  43 seconds ago  144 MB

¡Perfecto!

Comandos de ejecución

Si tenemos contenedores ejecutándose podemos acceder desde otra consola aunque el contenedor lo tengamos abierto en primer/segundo plano.

Obtenemos el contenedor al que queremos acceder

podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS            PORTS       NAMES
a138796be81d  docker.io/library/nginx:latest  nginx -g daemon o...  3 seconds ago  Up 3 seconds ago              inspiring_hertz

Accedemos a él

podman exec -ti a138796be81d /bin/sh
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

También podemos acceder a él por el nombre

podman exec -ti inspiring_hertz /bin/sh

Troubleshooting

No puedo crear un contenedor con puertos inferiores al 1024 cuando lo trato de exponer, obtengo este mensaje:

podman run -d -p 80:8080 nginx
Error: rootlessport cannot expose privileged port 80, you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024), or choose a larger port number (>= 1024): listen tcp 0.0.0.0:80: bind: permission denied

Esto es debido a seguridad del kernel, solo root puede hacerlo, se puede remediar haciendo caso al mensaje, pero es mejor desplegar un reverse-proxy que atienda a los puertos no privilegiados.

Trato de eliminar una imagen y obtengo este resultado, sin embargo, no tengo ningún contenedor que la use:

podman image rm rockylinux
Error: Image used by 260f1173937ca4c82b345f54c3723908d6c4165936870914922a62e42076da00: image is in use by a container

Para solucionarlo:

podman ps -a
[...]
260f1173937c  docker.io/library/rockylinux/rockylinux:latest                 bash                  2 days ago    Exited (0) 2 days ago  
[...]
podman rm -f 260f1173937c
podman image rm rockylinux
Untagged: docker.io/library/rockylinux:latest
Deleted: 300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55

O también

podman image rm -f rockylinux

NOTA: Esto eliminará también el contenedor que use la imagen.

Otra forma de eliminar una imagen

podman rmi rockylinux
podman rmi -f rockylinux

Trato de eliminar una red y obtengo este resultado, pero no hay ningún contenedor ejecutándose:

podman network rm hola
Error: "hola" has associated containers with it. Use -f to forcibly delete containers and pods: network is being used

Lo mismo sucede aquí, hay que forzar la eliminación y eso implica eliminar el contenedor que finalizó la ejecución.

podman network rm -f hola
hola

No puedo montar los archivos o directorios como volúmenes persistentes, pero forman parte de mi usuario

NOTA: Esto se debe a la protección de SELinux, Z le dice a podman que usas SELinux en el sistema

podman run -ti --volume /home/sincorchetes/Downloads:/tmp/Downloads:Z rockylinux /bin/bash 
podman run -d  --volume /home/sincorchetes/Downloads:/tmp/Downloads:Z nginx

No puedo acceder a un contenedor en ejecución con exec

podman exec -ti a138796be81d /bin/ksh
Error: executable file `/bin/ksh` not found in $PATH: No such file or directory: OCI runtime attempted to invoke a command that was not found

Esto se debe porque no soporta esa shell o ese comando, si sabes la ruta

podman exec -ti a138796be81d cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
podman exec -ti a138796be81d /bin/dash
# echo $0
dash

Si buscas un archivo, pues un ls

podman exec -ti a138796be81d ls /etc
adduser.conf            deluser.conf  host.conf      localtime      pam.conf   rc6.d        subuid
alternatives            dpkg          hostname       login.defs     pam.d      rcS.d        systemd
apt                     e2scrub.conf  hosts          logrotate.d    passwd     resolv.conf  terminfo
bash.bashrc             environment   init.d         machine-id     passwd-    rmt          timezone
bindresvport.blacklist  fonts         inputrc        mke2fs.conf    profile    security     ucf.conf
ca-certificates         fstab         issue          motd           profile.d  selinux      update-motd.d
ca-certificates.conf    gai.conf      issue.net      mtab           rc0.d      shadow       xattr.conf
cron.d                  group         kernel         netconfig      rc1.d      shadow-
cron.daily              group-        ld.so.cache    nginx          rc2.d      shells
debconf.conf            gshadow       ld.so.conf     nsswitch.conf  rc3.d      skel
debian_version          gshadow-      ld.so.conf.d   opt            rc4.d      ssl
default                 gss           libaudit.conf  os-release     rc5.d      subgid

Fuentes

DroidCam usa tu smartphone como webcam

Droidcam es un proyecto que pertenece a Dev47apps, dispone de una aplicación para Android e iOS con la que podemos utilizar nuestro smartphone como webcam, podemos configurarla via USB o via red, una estupenda solución cuando no disponemos de una Web cam, o tenemos una que es de mala calidad.

Además, dispone de un cliente para Windows y Linux que es el que nos hará el puente para las aplicaciones/software que tengamos instalados en nuestro sistema.

  • Descarga la aplicación para Android
  • Descarga la aplicación con soporte HD y otras características (de pago 5.20€) para Android
  • Descarga la aplicación para iOS

En mi caso solo he probado la de pago de Android que funciona muy bien, nunca me dio problemas. Tiene otra para OBS Studio que no he probado para Android, pero que tiene buena pinta y es gratuita.

Instalación en Fedora

Como yo utilizo Linux para todo, vamos a seguir los pasos en Linux, estas instrucciones han sido probadas en Fedora 35 Workstation.

Descargar el tarball

wget -O droidcam_latest.zip https://files.dev47apps.net/linux/droidcam_1.8.1.zip

Comprobamos el hash En esta versión 1.8.1, el hash es este: # sha1sum: fb9f0737f45f1904c648dd0e6c1cfa7ff6089aa1

sha1sum droidcam_1.8.1.zip

Descomprime el .zip

unzip droidcam_latest.zip -d droidcam

Instalamos el cliente, el módulo y el sonido

NOTA: Es necesario tener instalado: kernel-devel kernel-headers gcc make binutils pulseaudio-utils.

cd droidcam && sudo ./install-client
sudo ./install-video
sudo ./install-sound

Cargando el módulo

sudo modprobe v4l2loopback-dc

Probamos el módulo nuevo con Cheese, OBS Studio, Kamoso, VLC, mpv...

NOTA: Cada vez que actualicemos el kernel hay que hacer el proceso de sudo ./install-video

GUVCVIEW

Es un cliente muy bueno para las webcam escrito en GTK+, casi que lo recomiendo si quieres hacer pruebas, además de que consume pocos recursos.

Instalando en Gentoo

Para instalarlo en Gentoo, desenmascaramos el paquete y le decimos que instale el cliente GUI:

echo "media-video/droidcam ~amd64" > /etc/portage/package.accept_keywords/droidcam
echo "media-video/droidcam gtk" > /etc/portage/package.use/droidcam
emerge -av media-video/droidcam

Cargando el módulo:

modprobe v4l2loopback-dc

BONUS: Si tienes la versión premium, puedes usar el soporte HD, para ello tendrás que hacer lo siguiente (válido para Fedora/Gentoo):

Editamos el archivo generado por la aplicación ~/.config/droidcam

size=0x0

Lo modificamos por alguno de estos parámetros:

640×480, 960×720, 1280×720 (720p), 1920×1080 (1080p).

Editamos el archivo /etc/modprobe.d/droidcam.conf y modificamos el valor que queramos de tamaño:

options v4l2loopback_dc width=CAMBIAR height=CAMBIAR

Recargamos el módulo

rmmod v4l2loopback-dc
modprobe v4l2loopback-dc

Fuentes

Como instalé Gentoo, hoja de pasos

Hace un tiempo, en el viejo blog (que todo el contenido está si le das archivo), hice un post sobre Gentoo que puedes mirar aquí. En resumidas cuentas, es una meta distribución que contiene un gran corazón del que necesitas tiempo para entender como funciona y como construirte tu sistema operativo a lo DIY (Do It Yourself).

Aquí dejo los pasos que utilicé, no explico mucho voy al grano, por lo que, si tienes dudas, consulta la doc oficial Gentoo Handbook, hubiera utilizado el live que da Gentoo para la instalación, pero pasé un poco del tema, y lo instalaba mientras jugaba a Cyberpunk 2077 a través del servicio de NVIDIA GeForce NOW usando un live de Manjaro. (si, muy raro todo).

Hardware

El hardware con el que hice la instalación

  • Portátil: Gigabyte Sabre 15
  • CPU: Intel i7-7700HQ
  • RAM: 32GB
  • Disp. Almacenamiento: NVME Sandisk Corp WD Black 2018/SN750
  • Gráfica integrada: Intel Corporation HD Graphics 630
  • Gráfica dedicada: GeForce GTX 1050 Mobile
  • Adaptador de Red Ethernet cableada: RTL8111/8168/8411
  • Adaptador de Red Wireless: Intel Corporation Dual Band Wireless-AC 3168NGW
  • Adaptador de Red Bluetooth: Intel Corp. Wireless-AC 3168 Bluetooth
  • Webcam: Acer, Inc BisonCam,NB Pro

Esquema de particionado (GPT)

Este fue el esquema de particionado que utilicé, las particiones / y swap estaban crifradas bajo LUKS.

Partición Pto. Montaje Tipo de partición Tamaño
/dev/nvme0n1p1 /boot/efi EFI 512MiB
/dev/nvme0n1p2 /boot/ ext4 1GiB
/dev/nvme0n1p3 ------------ LVM Restante
/dev/mapper/gentoo-root / ext4 Todo
/dev/mapper/gentoo-swap swap swap 8GiB

Preparando el entorno

Requisitos previos:

  1. Tener conexión estable a Internet
  2. Tener configurada la tarjeta de red
  3. Un termo de café

Particionando

Definimos primero la tabla de particiones

sudo fdisk /dev/nvme0n1
Command (? for help): n
First sector........: [Enter]
Last sector.........: +512MiB
Command (? for help): t
Partition type......: 1
Command (? for help): n
Partition number....: [Enter]
First sector........: [Enter]
Last sector.........: +1GiB
Command (? for help): n
First sector........: [Enter]
Last sector.........: [Enter]
Command (? for help): t
Partition type......: 31
Command (? for help): w
Command (? for help): q

Damos formato a las particiones que hemos creado:

sudo mkfs.fat -F32 /dev/nvme0n1p1
sudo mkfs.ext4 /dev/nvme0n1p2
sudo cryptsetup luksFormat /dev/nvme0n1p3
YES
Introduciendo la contraseña y la confirmación...
sudo cryptsetup luksOpen /dev/nvme0n1p3 data
sudo pvcreate /dev/mapper/data
sudo vgcreate gentoo /dev/mapper/data
sudo lvcreate -L8GiB -n swap gentoo
sudo lvcreate -l100%FREE -n root gentoo
sudo mkswap /dev/mapper/gentoo-swap
sudo mkfs.ext4 /dev/mapper/gentoo-root
Montaje, parte I:
sudo mkdir /mnt/gentoo
sudo mount /dev/mapper/gentoo-root /mnt/gentoo
sudo mkdir /mnt/gentoo/boot
sudo mount /dev/nvme0n1p2 /mnt/gentoo/boot
sudo mkdir /mnt/gentoo/boot/efi
sudo mount /dev/nvme0n1p1 /mnt/gentoo/boot/efi

Fase de instalación de archivos

Accedemos a la página de Gentoo y descargamos la versión OpenRC que era la que yo usé, hacemos la comprobación de suma e instalamos.

Ejemplo de verificación:

Accedo aquí y me encuentro que tengo estos archivos: * stage3-amd64-openrc-20220116T170534Z.tar.xz * stage3-amd64-openrc-20220116T170534Z.tar.xz.DIGESTS

En el DIGESTS obtengo los hashes, algo parecido a esto:

# BLAKE2 (b2sum) HASH
e59f339039029f009b23ff211d11007a49efba49857b6ed0591620c96323c6d3493b7bc7467b4910f4213a2d6399432d44785e171ba06a3f033ea1c158d99b0b  /var/tmp/catalyst/builds/default/stage3-amd64-openrc-20220116T170534Z.tar.xz
# SHA512 HASH
e801e19d5e2931675d4ac6ce20aa4c2213e612384c95b9270ef9be2f8ac550faea74adc82d07ac123c621e7fae0d6796e074c186cab4868bf584f0e0f01800b6  stage3-amd64-openrc-20220116T170534Z.tar.xz
# BLAKE2 (b2sum) HASH
c78ed26c7188b6ed54f5682dab9aaaf1fcc59b30c88f86b74848d3a1a68db65743171e1e7d0a97fc77a6bb9e6849e334da3615fcbd819d8d2544943eeab92798  /var/tmp/catalyst/builds/default/stage3-amd64-openrc-20220116T170534Z.tar.xz.CONTENTS.gz
# SHA512 HASH
f5d892f8939690e96690d207cc9f8f8321ec35780057a4b643218521f763acb69054ccf41e96b189ea558b0032ec968299528dbfc3f292f79c4850ad3889c8dc  stage3-amd64-openrc-20220116T170534Z.tar.xz.CONTENTS.gz

En este caso, solo nos fijamos en el SHA512SUM del archivo stage3-amd64-openrc-20220116T170534Z.tar.xz,

sha512sum stage3-amd64-openrc-20220116T170534Z.tar.xz
e801e19d5e2931675d4ac6ce20aa4c2213e612384c95b9270ef9be2f8ac550faea74adc82d07ac123c621e7fae0d6796e074c186cab4868bf584f0e0f01800b6  stage3-amd64-openrc-20220116T170534Z.tar.xz

¿Coincide? Pues continuemos

Extraemos los archivos:

sudo tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner -C /mnt/gentoo/

Hacemos algunos tejemanejes:

sudo cp --dereference /etc/resolv.conf /mnt/gentoo/etc/
sudo mkdir --parents /mnt/gentoo/etc/portage/repos.conf
sudo cp /mnt/gentoo/usr/share/portage/config/repos.conf /mnt/gentoo/etc/portage/repos.conf/gentoo.conf

¡Perfecto! Ya tenemos lo básico para empezar,

Preparando algunas cosas

Comprobamos cuántos nucleos e hilos tiene nuestro procesador:

lscpu |grep On
On-line CPU(s) list:             0-7

En total, 7.

Con todo ya listo:

Editamos /mnt/gentoo/etc/portage/make.conf y añadimos lo siguiente en estas secciones:

  • CFLAGS="..." ---> Añadimos: -march=native
  • MAKEOPTS=-jN --> El resultado de "On-line CPU(s) list, lo ponemos aquí +1, es decir, en mi caso 8.
  • GENTOO_MIRRORS="https://mirrors.evowise.com/gentoo/ https://mirrors.lug.mtu.edu/gentoo/" --> Los mirrors a utilizar
  • ACCEPT_LICENSE="*" ---> Aceptamos todas las licencias de software

Y guardamos el archivo

Montaje, parte II:

Montamos los pseusosistemas de archivo necesarios:

sudo mount --rbind /dev /mnt/gentoo/dev
sudo mount --make-rslave /mnt/gentoo/dev
sudo mount --rbind /sys /mnt/gentoo/sys
sudo mount --make-rslave /mnt/gentoo/sys
sudo mount -t proc /proc /mnt/gentoo/proc
sudo mount --bind /run /mnt/gentoo/run
sudo mount --make-slave /mnt/gentoo/run
sudo test -L /dev/shm && rm /dev/shm && mkdir /dev/shm
sudo mount --types tmpfs --options nosuid,nodev,noexec shm /dev/shm
sudo chmod 1777 /dev/shm

NOTA: Al ser Manjaro y usar systemd, tenemos que ejecutar --make-rslave

¡Listo, podemos empezar a trabajar!

Fase de instalación del sistema

¡Empieza la fiesta, chrooting!

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

Actualizando portage

emerge-webrsync

Hay que leer las news siempre

eselect news list
eselect news read

El perfil lo dejo tal cual, ya habrá tiempo para poner lo demás.

Recompilando todo lo necesario:

emerge --ask --verbose --update --deep --newuse @world

Configuramos el huso horario, en mi caso es Atlantic/Canary

echo "Atlantic/Canary" > /etc/timezone
emerge --config sys-libs/timezone-data

Configuramos las locales, en mi caso usaba English (USA) por defecto, editamos el archivo /etc/locale.gen y añadimos:

nano -w /etc/locale.gen
en_US ISO-8859-1
en_US.UTF-8 UTF-8
es_ES ISO-8859-1
es_ES.UTF-8 UTF-8
C.UTF-8

Regeneramos las locales:

locale-gen
 * Generating 5 locales (this might take a while) with 8 jobs
 *  (2/5) Generating en_US.ISO-8859-1 ...                                 [ ok ]
 *  (4/5) Generating es_ES.ISO-8859-1 ...                                 [ ok ]
 *  (1/5) Generating C.UTF-8 ...                                          [ ok ]
 *  (3/5) Generating en_US.UTF-8 ...                                      [ ok ]
 *  (5/5) Generating es_ES.UTF-8 ...                                      [ ok ]
 * Generation complete
 * Adding locales to archive ...                                          [ ok ]

Seleccionamos las locales por defecto:

eselect locale list
Available targets for the LANG variable:
  [1]   C
  [2]   C.utf8
  [3]   en_US
  [4]   en_US.iso88591
  [5]   en_US.utf8
  [6]   es_ES
  [7]   es_ES.iso88591
  [8]   es_ES.utf8
  [9]   POSIX
  [10]  C.UTF8 *
  [ ]   (free form)


eselect locale set 5
Setting LANG to en_US.utf8 ...
Run ". /etc/profile" to update the variable in your shell.

Refrescamos entorno:

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

Instalando kernel

Instalamos:

emerge --ask sys-kernel/linux-firmware \
sys-kernel/gentoo-sources \
sys-kernel/genkernel \
sys-apps/pciutils

Seleccionando el kernel por defecto:

eselect kernel list
Available kernel symlink targets:
  [1]   linux-5.15.11-gentoo *
eselect kernel set 1

NOTA: Estos pasos requieren cierta habilidad en la compilación del kernel, si es muy difícil, ve al paso (Instalar kernel genérico)

Compilar un kernel personalizado

NOTA: Los pasos a continuación requieren cierta habilidad en la compilación del kernel, si es muy difícil, ve al paso ge (Instalar kernel genérico)

Configuramos el kernel:

cd /usr/src/linux
make menuconfig

NOTA: Utiliza esta documentación que puse, o no pasarás del arranque si no lo tienes activado.

Aquí ya no puedo ayudar, échale un vistazo al Handbook, ya que cada uno tiene un hardware diferente...

Cuando esté listo, guardamos el archivo como kernel.config

genkernel -- lvm --luks --kernel-config=/usr/src/linux/kernel.config all
Instalar kernel genérico

Se va a compilar un kernel con todos los módulos para tener un mayor soporte, tardará más que compilar un kernel personalizado pero te evita el tener que compilarlo y lo puedes hacer más adelante.

Para aquellos que prefieren dejarlo para después.

genkernel --lvm --luks all

No te asustes si sale unos mensajes como estos:

* Gentoo Linux Genkernel; Version 4.2.6
* Using genkernel configuration from '/etc/genkernel.conf' ...
* Running with options: --lvm --luks all

* Working with Linux kernel 5.15.11-gentoo for x86_64
* Using kernel config file '/usr/share/genkernel/arch/x86_64/generated-config' ...
* 
* Note: The version above is subject to change (depends on config and status of kernel sources).

* kernel: >> Initializing ...
*         >> Running 'make mrproper' ...
*         >> Running 'make oldconfig' ...
*         >> Re-running 'make oldconfig' due to changed kernel options ...
*         >> Kernel version has changed (probably due to config change) since genkernel start:
*            We are now building Linux kernel 5.15.11-gentoo-x86_64 for x86_64 ...
*         >> Compiling 5.15.11-gentoo-x86_64 bzImage ...
*         >> Compiling 5.15.11-gentoo-x86_64 modules ...
*         >> Installing 5.15.11-gentoo-x86_64 modules (and stripping) ...
*         >> Generating module dependency data ...
*         >> Saving config of successful build to '/etc/kernels/kernel-config-5.15.11-gentoo-x86_64' ...

* initramfs: >> Initializing ...
*         >> Appending devices cpio data ...
*         >> Appending base_layout cpio data ...
*         >> Appending util-linux cpio data ...
*         >> Appending eudev cpio data ...
*         >> Appending devicemanager cpio data ...
*         >> Appending auxiliary cpio data ...
*         >> Appending busybox cpio data ...
*         >> Appending luks cpio data ...
*         >> Appending lvm cpio data ...
*         >> Appending modprobed cpio data ...
*         >> Appending modules cpio data ...
*         >> Appending linker cpio data ...
*         >> Deduping cpio ...
*         >> Pre-generating initramfs' /etc/ld.so.cache ...
*         >> Compressing cpio data (.xz) ...

* Kernel compiled successfully!
* 
* --no-bootloader set; Skipping bootloader update ...
* 
* Required kernel parameter:
* 
*   root=/dev/$ROOT
* 
* Where $ROOT is the device node for your root partition as the
* one specified in /etc/fstab

* If you require Genkernel's hardware detection features, you MUST
* tell your bootloader to use the provided initramfs file '/boot/initramfs-5.15.11-gentoo-x86_64.img'.

* WARNING... WARNING... WARNING...
* Additional kernel parameters that *may* be required to boot properly:
* - Add "dolvm" for LVM support
* - Add "crypt_root=<device>" for LUKS-encrypted root
* - Add "crypt_swap=<device>" for LUKS-encrypted swap

* Do NOT report kernel bugs as genkernel bugs unless your bug
* is about the default genkernel configuration...
* 
* Make sure you have the latest ~arch genkernel before reporting bugs.

Editando el /etc/fstab

Vamos a definir bien aquí los datos, de lo contrario, el sistema no arrancará:

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

Instalando gestor de arranque

Añadimos al fichero /etc/portage/make.conf:

nano -w /etc/portage/make.conf
GRUB_PLATFORMS="efi-64"

Ejecutamos:

echo "sys-boot/grub:2 device-mapper" >> /etc/portage/package.use/sys-boot
emerge -av grub

NOTA: Si tienes otros SO instalados, entonces tienes que instalar emerge -av sys-boot/os-prober y añadir mount a /etc/portage/package.use/sys-boot

Añadimos al archivo /etc/defaults/grub

nano -w /etc/default/grub
GRUB_CMDLINE_LINUX="dolvm root=/dev/mapper/gentoo-root crypt_root=/dev/nvme0n1p3"

Instalamos el GRUB:

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

Regeneramos la configuración:

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

NOTA: Es posible que salgan avisos como los del siguiente ejemplo sobre todo si lo instalas desde otro SO como yo que utilicé Manjaro

Generating grub configuration file ...
[...]
  WARNING: Failed to connect to lvmetad. Falling back to device scanning.
Found linux image: /boot/vmlinuz-5.15.11-gentoo-x86_64
Found initrd image: /boot/initramfs-5.15.11-gentoo-x86_64.img
  WARNING: Failed to connect to lvmetad. Falling back to device scanning.
  WARNING: Failed to connect to lvmetad. Falling back to device scanning.
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
done

Nos aseguramos de que el servicio LVM quede habilitado al arranque:

rc-update add lvm default

Instalando algunas herramientas básicas

Registrador del sistema:

emerge --ask app-admin/sysklogd
rc-update add sysklogd default

Cronie

emerge --ask sys-process/cronie
rc-update add cronie default

Herramientas ext4 (obligado)

emerge --ask sys-fs/e2fsprogs

Cliente/Servidor DHCP

emerge --ask net-misc/dhcpcd

Soporte Wireless (WPA-/WPA2-)

emerge --ask net-wireless/iw net-wireless/wpa_supplicant

Configurando un usuario

useradd -m usuario
passwd usuario
gpasswd -a usuario wheel

Configurando la contraseña de root

passwd root

Configurando el teclado de tty

nano -w /etc/conf.d/keymaps
keymap="es"

Finalizando

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

Y con esto, tendremos un sistema Gentoo con LVM+LUKS instalado.

Fuentes

Creando un 'box' personalizado con Vagrant

Vagrant nos permite crear entornos de desarrollo virtuales sin afectar a nuestra máquina instalando todos esos molestos y dificultosos componentes y está disponible para múltiples sistemas operativos entre ellos OSX, GNU/Linux, Windows...

Instalar en Fedora

NOTA: Debemos tener habilitados los repositorio RPM Fusion en el sistema para instalar VirtualBox. Échale un vistazo a este tutorial de archivo.

sudo dnf install -y vagrant VirtualBox

Postconfiguración

Añade tu usuario al grupo de VirtualBox para que puedas trabajar con él:

sudo gpasswd -a TU_USUARIO vboxusers

Y haz relogin

Primeros pasos con Vagrant

Para poder tener tu máquina desde 0 (porque puedes crear tu máquina desde una imagen existente), primero descargaremos la image .iso con la que queramos hacerla, en este caso será Rocky Linux 8.

Segundo, crearemos una máquina virtual con las siguientes características:

  • 2 vCPU
  • 4 GB vRAM
  • 1 disco configurado como SSD de 1TiB

Iniciamos la máquina virtual y hacemos la instalación habitual con este esquema de particionado:

Particionado EFI:

  • /dev/sda1 = /boot (1GiB,ext4)
  • /dev/sda2 = /boot/efi (512MiB, EFI)
  • /dev/sda3 = LVM
  • /dev/mapper/rl-root (50GiB, ext4)
  • /dev/mapper/rl-swap (8 GiB, swap)

El usuario deberá ser vagrant con contraseña vagrant y con la casilla de administrador marcada.

Post instalación

Actualizamos el sistema

sudo dnf upgrade -y

Instalamos las guest additions

sudo dnf install rpm-fusion-free epel-release
sudo dnf install VirtualBox-guest-addition

NOTA: Instalo los de RPM Fusion porque cuando actualicemos el kernel, se reconsturirán los módulos sin tener que volver a ejecutar el proceso de construcción que es manual.

Reiniciamos y podremos ver haciendo un lsmod, que cargaron los módulos de la guest additions en el sistema.

Generando nuestro 'box'

Apagamos la máquina virtual y tomamos su nombre, después ejecutamos:

vagrant package --base NOMBRE_VM

En mi caso, la VM se llamaba rockylinux85 y ejecuto:

vagrant package --base rockylinux85

Tendrá una salida similar a esta:

==> rockylinux85: Exporting VM...
==> rockylinux85: Compressing package to: /home/sincorchetes/package.box

BONUS, VM disponible desde Vagrant Cloud

Si quieres que esta imagen sea disponible desde Vagrant Cloud: 1. Creamos una cuenta 2. Iniciamos sesión 3. Crear una nueva 'box' 4. Introducimos los siguientes datos: * Name: Lo_dejamos_como_está / nombre_de_tu_box * Visibility: [] Private (Marcas si quieres que sea privada o no) * Short description: Añades una definición de como que contiene tu box...etc * Create box 5. En la siguiente pantalla introducimos estos datos: * Version: 8.5 (Que es la de Rocky Linux, no nos guiamos por la nuestra, o usa lo que creas conveniente) * Description: Lo que creas conveniente 6. Pulsamos en "Add Provider" * Provider: Seleccionamos VirtualBox * File hosting: Upload to Vagrant Cloud * Checksum type: Cogemos SHA512 * Checksum: Le hacemos sha512sum /home/sincorchetes/package.box (esto lo adaptas a dónde tengas tu 'box' generada) * Continue to upload 7. En la sección "Add Provider File" * Upload File: Buscamos la 'box', en mi caso /home/sincorchetes/package.box * Upload 8. Ya tendremos la máquina subida, pero, tenemos que publicarla, volvemos a la pantalla principal de la máquina 9. Dónde está la versión, pulsamos Edit -> Release y rellenamos los datos ¡Listo!

Si quieres iniciarla en tu máquina ejecuta:

vagrant init sincorchetes/rockylinux \
  --box-version 8.5
vagrant up

NOTA: Dónde va 8.5 va el número de versión.

O también puedes hacerlo:

mkdir ~/tu_maquina
cd ~/tu_maquina
echo 'Vagrant.configure("2") do |config|
  config.vm.box = "sincorchetes/rockylinux"
  config.vm.box_version = "8.5"
end' > Vagrantfile
vagrant up

Para ambos casos después de haberlas descargado, bastará con situarse en el directorio y hacer vagrant up.

Fuentes

Solucionando el problema de parpadeo de Stellarium en Intel

Después de haber publicado el post anterior sobre Stellarium causa parpadeos en Fedora 35, al poco tiempo después, recibo un correo electrónico indicando que habían añadido más información al tema en el bug abierto en MESA. Resulta que era un desarrollador que había publicado un Patch. Me sugirió que lo compilara y lo instalara en la máquina:

There's a patch for this issue already, which you have to apply MANUALLY compiling mesa: pzanoni/mesa@07dc3d42 Again: There is no official release containing this patch, yet (mesa is at version 21.3.4 at the time of this writing).

En vez de hacerlo de forma rudimentaria, decidí construir un paquete RPM para Fedora.

  1. Instalar fedpkg
sudo dnf install fedpkg
  1. Crear el entorno de compilación
rpmdev-setuptree
  1. Ubicarnos y descargar el último SRPM
cd ~/rpmbuild/SRPMS \
dnf download --source mesa
  1. Descomprimir las fuentes
rpm2cpio mesa-21.3.3-2.fc35.src.rpm | cpio -idmvD ~/rpmbuild/SOURCES
  1. Mover el spec
mv ~/rpmbuild/SOURCES/mesa.spec ~/rpmbuild/SPECS
  1. Descomprimir las fuentes, obtener el archivo original, hacemos una copia para introducir el nuevo código, añadimos el nuevo código en él, y hacemos el patch.
tar xfv ~/rpmbuild/SOURCES/mesa-21.3.3.tar.xz -C ~/rpmbuild/SOURCES/ 
cp ~/rpmbuild/SOURCES/mesa-21.3.3/src/gallium/drivers/iris/iris_batch.c \ 
~/rpmbuild/SOURCES/iris_batch_modified.c
diff -urN ~/rpmbuild/SOURCES/mesa-21.3.3/src/gallium/drivers/iris/iris_batch.c \
~/rpmbuild/SOURCES/iris_batch_modified.c > 0007-iris-solve-blinks-problems.patch
  1. Editamos el ~/rpmbuild/SPECS/mesa.spec y vamos realizando los siguientes pasos:
  2. Sumamos +1 al release_number, en vez de 1, fijamos en 2
  3. Buscamos la sección de los parches listados y añadimos un comentario diciendo de dónde se obtuvo el código cambiado y luego Patch0009: 0007-iris-solve-blinks-problems.patch
  4. Vamos a la sección de changelog y añadimos nuestro comentario: ```
  5. Guardamos

  6. Preparamos el entorno antes de construir el paquete

sudo dnf builddep mesa
  1. Construimos el paquete
rpmbuild -ba ~/rpmbuild/SPECS/mesa.spec

Cuando todo acabe, nos habrán generado los paquetes en ~/rpmbuild/RPMS/x86_64/, aplicamos la actualización:

cd ~/rpmbuild/RPMS/x86_64/
sudo dnf install mesa-dri-drivers-21.3.3-2.fc35.x86_64.rpm \
mesa-libEGL-21.3.3-2.fc35.x86_64.rpm mesa-filesystem-21.3.3-2.fc35.x86_64.rpm \
mesa-libgbm-21.3.3-2.fc35.x86_64.rpm mesa-libGL-21.3.3-2.fc35.x86_64.rpm \
mesa-libglapi-21.3.3-2.fc35.x86_64.rpm mesa-libxatracker-21.3.3-2.fc35.x86_64.rpm \
mesa-vdpau-drivers-21.3.3-2.fc35.x86_64.rpm mesa-vulkan-drivers-21.3.3-2.fc35.x86_64.rpm
  1. Reiniciamos

  2. Abrimos Stellarium y ya lo tendremos sin problemas de parpadeos.

Después de haber hecho y haberlo probado en local, lo mandé a Koji (el sistema de compilación de paquetes de Fedora) para que se hiciera ahí, y adjunté el resultado de la compilación al BR para que lo puedan incluir en alguna update de Fedora.

Para mandar la solicitud de compilación a Koji, tienes que registrarte y obtener una FAS, firmar el CLA de Fedora y no sé si falta algún pasito más, luego de eso.

  1. Instalar el kinit
sudo dnf install krb5-workstation
  1. Loguearnos
kinit nombre_usuario_fas@FEDORAPROJECT.ORG
  1. Probar que hicimos bien el login
koji hello
  1. Subir la solicitud a Koji
koji koji build --scratch f35 ~/rpmbuild/SRPMS/mesa-21.3.3-2.fc35.src.rpm
  1. El comando quedará en primer plano informando del proceso de la solicitud, puedes ver el mío aquí

Puedes descargarte los paquetes desde aquí

Fuentes

Stellarium causa parpadeos en Fedora 35

Ayer hablando con un compañero en el canal de @fedoraesp en Telegram, comentaba que Stellarium 0.2.3 (la última versión en los repositorios) no le funcionaba bien porque tenía muchos parpadeos, tampoco le funcionaba la versión obtenida desde el Registry de Flatpak de Fedora, ya que éste está construido con el 'runtime' de Fedora (contiene las librerías esenciales para que funcione).

Entonces, instalé Stellarium desde los repos oficiales y luegos desde Flatpak aprovechando que tengo un portátil Gigabyte Sabre 15 que tiene una gráfica integrada Intel y una dedicada de NVIDIA. Decidí probar y efectivamente, me daba problemas de parpadeos. Mientras que, si lanzaba el programa usando la gráfica NVIDIA (nouveau) con DRI_PRIME=1 stellarium, ésta, no causaba problemas de parpadeos ni en Wayland ni en X.org.

Entonces, me decidí a sumar más información a un caso abierto en Stellarium y creé un Bug Report en el sistema de reporte de errores de Fedora Bugzilla.

Pensando, si el problema era la versión del programa, entonces, bajemos de versión, (quizás el programa tenga alguna manera de comunicarse via OpenGL o algo), pero no resultó, por lo que evidentemente no era problema de Stellarium. Me cercioré y busqué si el driver de X.org de Intel se actualizó pero rpm me dijo que no:

[sincorchetes@fedora ~]$ rpm -qi xorg-x11-drv-intel
Name        : xorg-x11-drv-intel
Version     : 2.99.917
Release     : 51.20200205.fc35
Architecture: x86_64
Install Date: Tue 26 Oct 2021 06:42:42 AM WEST

También es cierto, que si pensamos, que afecta a Wayland y a X.org, este paquete, poco tiene que ver, así que me puse a ver las películas de El Hobbit y dejé de investigar.

Hoy volviendo hablar con mi compañero afectado, retomé la investigación, y empecé a probar cosas.

Hice un downgrade de Stellarium instalado desde el Registry de Fedora, sin efecto, por lo mismo, el runtime, y se me ocurrió instalar la versión de Flathub, y daba el mismo problema.

Entonces, pensé, mmm, ¿Y si instalo la versión anterior pero de Flathub? Pues, 'eureka', la versión de Flathub, la 0.2.2 funcionaba. ¿Por qué? Pues... me puse a investigar y vi que usaba una versión inferior de los drivers de MESA. Su 'runtime' tenía la versión 21.1.8 mientras que la versión de Fedora usaba 21.3.4.

Salida de stellarium --verbose acortada con Stellarium 0.2.2 de Flathub:

Driver version string: "3.0 Mesa 21.1.8 (git-127871cd1e)"

Salida de stellarium --verbose acortada con Stellarium 0.2.3 de repos oficiales:

Driver version string: "4.6 (Compatibility Profile) Mesa 21.3.3 (git-a65ad66c47)"

Entonces, hice un downgrade de los drivers de MESA:

sudo dnf downgrade --version mesa-dri-drivers-21.2.3-6.fc35.x86_64

Me bajo de versión estos paquetes:

mesa-filesystem-21.2.3-6.fc35.x86_64 
mesa-dri-drivers-21.2.3-6.fc35.x86_64 
mesa-libxatracker-21.2.3-6.fc35.x86_64 
mesa-vulkan-drivers-21.2.3-6.fc35.x86_64

Reinicié el entorno gráfico, y volví a lanzar Stellarium, ya andaba perfectamente, busqué un Bug Report abierto de MESA, y ahí puse toda la info que puedes ver desde aquí

Consejos para recién iniciados en la informática

Sí ya lo sé, el título es un poco genérico ¿no?, quizás debería haber puesto algo como ¿Qué le dirías a tu yo del pasado para que haga o no si quiero ser un buen profesional? No sé, me parece acertado tanto uno como otro.

Aquí van estos consejos que había publicado como un hilo en Twitter, y que me gustaría reunirlos aquí, porque puede que a más de uno le salve la vida. Puedes cogerlos o no cogerlos, cogerlos todos, o unos cuántos o uno solo, eres libre de quedarte con cualquiera de ellos.

  • Toca todos los palos para saber qué quieres (redes, sistemas, programación...)
  • Cuando sepas que más te motiva, elige un camino
  • Cuando eligas un camino, puede que te cambien cosas en el camino porque el mercado no para de reinventarse, osea, tienes que estar dispuesto a cambios
  • No te cases con ninguna tecnología, siempre hay algo mejor o peor
  • Ten paciencia, fuerza y ganas para aprender constantemente
  • Escribe tus experiencias, blog, documento interno...
  • Rodéate de gente que te retroalimente
  • Busca una comunidad de Software Libre o de Open Source y participa en ella
  • Usa recursos como http://pluralsight.com, http://Packtpub.com
  • No pienses que los cursos te lo tiene que dar la empresa, hay que interesarse en poder adaptarse al nivel de exigencia
  • Hay que comprender, entender y razonar lo que se aprende, memorizar no tiene cabida aquí
  • Esto no es Matrix , si vas aprender algo, dedícale tiempo, y aprende a lidiar con la frustración, las cosas tienen que salir cuando tengan que salir.
  • Refuerza mucho el inglés, casi todo el contenido está en inglés
  • Ten conceptos claros sobre las cosas, no conozcas todo en profundidad, ya que no existe tiempo físico para hacerlo y te ayudará a solucionar problemas a la hora de buscar
  • Házte un proyecto pequeño con un fin específico y concreto
  • Luego, házte un portfolio con tus proyectos, como por ejemplo, un repositorio en GitLab
  • Trata de buscar formas para diferenciarte sin perjudicar al resto
  • Lo que tú hagas es tú propio sello
  • Lee, lee todo lo que te salga en pantalla. A veces te ofuscas con algo y te pones a buscar, probar y hacer de todo son leer antes ese mensaje de error que te dice bien claro dónde está el fallo.
  • Analiza bien un problema y piensa en múltiples situaciones para resolverlo
  • Cuando tengas una solución, a un problema, cuestiónate si es la solución más eficiente, pero también, la más segura, porque solemos olvidarnos de esta última.
  • Cuando necesites realmente ayuda, pregunta, no te entierres en trabajo si has probado de todo y no das con la tecla.
  • Hay que tener siempre afán por documentar las cosas, y lo mejor que puedes hacer, es ir documentando mientras vas aplicando los cambios para no tener que hacerlo después.
  • Documenta tus scripts, y códigos, te lo agradecerás a ti mismo en un futuro y también se lo agradecerás a los demás.
  • Ten siempre una copia de seguridad, conozco a gente y a mí también me ha pasado sobre todo en la etapa de distro hopping, que ha eliminado por error el contenido de su partición.
  • Cifra todos tus datos cuando sabes que van a moverse fuera de casa
  • Usa software oficial, no uses software crackeado o pirateado, a parte de dañar a la industria y compañer@s, estás facilitando la puerto al malware
  • Averígua que son las licencias de software
  • Si ves o sospechas de un posible infingrimiento de las licencias de SoftwareLibre, OpenSource... repórtarlos, por favor.
  • Lee teoría y practica mucho, no vas a ningún lado por muchos conocimientos prácticos que tengas si no entiendes que hay detrás de lo que estamos haciendo
  • Trata de buscar siempre el hilo a las pistas que te deja el SO, la app... Sé analítico en consecuencia
  • Si hay algo que no te gusta, no te quejes de lo que no te gusta o falta, preocúpate en sumar y desarrolla, crea, reporta, colabora para que subsane esa deficiencia, pero no practiques el deporte nacional de la queja.
  • Trata de defender el por qué surgen las cosas, sobre todo en entornos productivos con argumentos
  • Aplica para certificaciones informáticas de la mano de: Red Hat, Cisco, LPI, Linux Foundation, Microsoft, Amazon, Google... Y en cursos que te puedan dar cierto nivel.
  • Investiga sobre la historia de los SO, no solo está Linux, Android, iOS, Mac y Windows en el mercado.

Espero que os haya gustado, a mí me hubiese gustado tener algo así en su día.

Bonus y sugerencia personal:

  • Si vas a estudiar un grado medio/superior, es muy importante averiguar si los profesores han debutado en el mercado de trabajo porque:
  • Han tocado entornos desarrollo, pre-producción o producción, se han visto con problemas y han aplicado soluciones diferentes para arreglar algo roto.
  • Conocen y se actualizan conforme van saliendo las tecnologías en el mercado
  • Pueden dar una visión más amplia de todo, incluyendo la parte de arquitectura del desarrollo del software o de sistemas o redes inclusive.
  • Enseñan más los diferentes metodologías que hay SCRUM, Agile...
  • Cuentan anécdotas que puedan ayudarnos
  • Tienden a tocar y a ver configuraciones y esquemas complicados de arquitectura

ACTUALIZACIÓN

  • Seguro que te encantan como suena los teclados mecánicos, sobre todo, los que hacen ruidito tipo Fallout 4, pues, como consejo, te diría, que revisa muy, pero que muy bien el teclado mecánico que vayas a usar por estas sencillas razones:

    • Ruido: El ruido que escuchas en la tienda, supermercado... dónde vayas a comprarlo, no suena igual que en un cuarto más pequeño dónde el ruido rebota por las paredes, lo que parecía agradable para tus oídos en el establecimiento se puede convertir en algo muy molesto para ti y para los demás.
    • Muñecas: Ten mucho cuidado con esto, me compré un Scorpion KG935 que me costó lo suyo, el ruido bastante elevado, y con una configuración amplia de efectos LED que iluminaban el cuarto. Sin embargo, al cabo de un par de semanas empezaba a notar dolores en las muñecas, como resultado, me generó una tendinitis. 'Y mira qe tenía reposamuñecas! Al final me terminé comprando un Logitech K270 y encantado de la vida.
  • Hacer ejercicio, ¡MUY IMPORTANTE! no es de locos, pasar 8 horas delante del ordenador/computadora, y no hacer ni un solo gesto después del trabajo, es un ¡error! tus músculos se atrofian y comienzan luego los dolores de espalda sobre todo y puede que una que otra hernia. Si puedes, nada todo lo que puedas.

  • Hidrátate, parece mentira, pero el no beber agua produce mucho debilitamiento a lo largo del día y puedes tener bastante sueño, algo que me pasa.
  • Ház descansos ¡o intenta hacerlos! no descansar, estar en una posición fija lo que va hacer el día de mañana es perjudicarte y sobre todo, la vista que es la que sale peor parada. Por otro lado viene bien porque puede ser que te hayas atascado en algo y parando un poco puede que lo llegues a resolver en un periquete.
  • Intenta usar colores claros o pastel, sobre todo letras blancas y fondo negro, los colores blancos o chillones pueden fastidiarte mucho y además facilita la pérdida de concentración.
  • Usa pantallas con filtros de luz azul como las BenQ que los tienen incorporado, y si puedes usar una resolución con frecuencias altas, mejor.