Saltar a contenido

Linux

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

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

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í

Utilizando Podman en Gentoo

Podman es un motor de contenedores que es compatible con la especificación OCI de contenedores. Este software forma parte del ecosistema de Red Hat, pero se puede instalar también en distribuciones como Gentoo. Como cumple las especificaciones OCI, se puede reemplazar directamente por Docker, ya que mucho de los comandos de Docker se han traducido directamente a Podman y así evitar tener que aprender más comandos nuevos.

Las principales diferencias que existen entre Docker y Podman es que Podman no necesita de un servicio, con lo que se incrementa la seguridad en el sistema, y si se tiene systemd, los contenedores pueden ejecutarse como servicios del sistema. Más info sobre esto.

Configurando el kernel

Hay que tener una serie de caracterísitcas habilitadas en el kernel para poder continuar:

General setup  --->
  -*- Control Group support  --->
    [*]   Memory controller
    [*]   IO controller
    [*]   CPU controller  --->
      [*]   Group scheduling for SCHED_OTHER
      [*]     CPU bandwidth provisioning for FAIR_GROUP_SCHED
      [*]   Group scheduling for SCHED_RR/FIFO
    [*]   PIDs controller
    [*]   RDMA controller
    [*]   Freezer controller
    [*]   HugeTLB controller
    [*]   Cpuset controller
    [*]     Include legacy /proc/<pid>/cpuset file
    [*]   Device controller
    [*]   Simple CPU accounting controller
    [*]   Perf controller
    [*]   Misc resource controller
  [*] Configure standard kernel features (expert users)  --->
    [*]   Enable 16-bit UID system calls
    [*]   Multiple users, groups and capabilities support
    [*]   sgetmask/ssetmask syscalls support
    [*]   Sysfs syscall support
    [*]   open by fhandle syscalls
    [*]   Posix Clocks & timers
    [*]   Enable support for printk
    [*]   BUG() support
    [*]   Enable ELF core dumps
    [*]   Enable PC-Speaker support
    [*]   Enable full-sized data structures for core
    [*]   Enable futex support
    -*-   Enable eventpoll support
    -*-   Enable signalfd() system call
    -*-   Enable timerfd() system call
    -*-   Enable eventfd() system call
    -*-   Use full shmem filesystem 
    [*]   Enable AIO support
    [*]   Enable IO uring support
    [*]   Enable madvise/fadvise syscalls
  -*- Namespaces support  --->
    -*-   UTS namespace
    [*]   TIME namespace
    -*-   IPC namespace
    -*-   User namespace
    -*-   PID Namespaces
    -*-   Network namespace
[*] Networking support  --->
  Networking options  --->
    <M> 802.1d Ethernet Bridging
    [*]   IGMP/MLD snooping
    <M> 802.1Q/802.1ad VLAN Support

Device Drivers  --->
  [*] Network device support  --->
    <M>     MAC-VLAN support
    <M>       MAC-VLAN based tap driver
    <M>     Universal TUN/TAP device driver support
    <M>     Virtio network driver
  Character devices  --->
    [*]   Unix98 PTY support

File systems  --->
  <*> FUSE (Filesystem in Userspace) support
  <*> Overlay filesystem support

Creamos este archivo /etc/modules-load.d/networking.conf y añadimos tun.

Configuramos los subuid y subgid al usuario que lo usará

Podman lo utilizará para mapear rangos de UID en los contenedores mediante espacios de nombres de usuario.

# usermod --add-subuids 200000-201000 --add-subgids 200000-201000 sincorchetes

Añadimos soporte CGroups V2 en el arranque

Editamos el archivo /etc/rc.conf y añadimos:

rc_controller_cgroups="YES"

Configuramos las USE flags

Usaremos estas USE flags:

app-containers/podman rootless fuse

Instalamos

# emerge --ask app-containers/crun app-containers/podman

Exponiendo los contenedores a la red local

Habilitamos el servicio:

# rc-update add cni-dhcp default
# rc-service cni-dhcp start

Añadimos la configuración de red /etc/cni/net.d/88-macvlan.conflist:

{
  "cniVersion": "0.4.0",
  "name": "macvlan",
  "plugins": [
    {
      "type": "macvlan",
      "master": "br0",
      "isGateway": true,
      "ipam": {
        "type": "dhcp"
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    },
    {
      "type": "firewall"
    },
    {
      "type": "tuning"
    }
  ]
}

Creamos la interfaz br0 con NetworkManager

Para saber qué tarjetas tenemos y podemos utilizar:

nmcli dev

Haciendo bridging

br0-slave0: Añado la interfaz Ethernet cableada br0-slave1: Vinculo con la de Wireless.

nmcli con add type bridge con-name br0 ifname br0 ip4 10.0.0.3/24 gw4 10.0.0.1
nmcli con add type bridge-slave con-name br0-slave0 ifname enp3s0f1 master br0
nmcli con add type bridge-slave con-name br0-slave1 ifname wlp4s0 master br0
nmcli con up br0

Creamos la red

# podman pod create --name homeserver --network macvlan

Probamos

$ podman run -ti centos bash
[root@f0f1e1bb8d1b /]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"

Fuentes

Gentoo - El arranque no pasa de Loading Linux...

Cuando estuve instalando Gentoo hace unas semanas, me di cuenta que cuando trataba de arrancar el kernel, la pantalla quedaba en "Loading Linux 5.11...", si bien el teclado respondía y el sistema no mostraba un comportamiento típico de kernel panic como los LEDs que parpadean o el cese de actividad en disco. Se me hacía raro.

Esto es debido a que faltaba el soporte de Frame Buffer, que es un dispositivo de tipo bloques que se crea en /dev con nombre fb0 y que permite mostrar textos, gráficos, mostrar logos en el arranque... por lo que es comprensible que no estuviera viendo nada.

Para resolverlo, compilamos el kernel con estas opciones:

Device drivers --->
  Graphics Support --->
    [M] Simple Frame Buffer Driver

Si usas EFI 1.1 o UEFI 2.0, habilita también:

Device drivers --->
  Graphics Support --->
    ---> Frame buffer Devices
      ---> Support for frame buffer devices
        [*] EFI-based Framebuffer Support

Fuente: Gento Forums

Instalando Doas en Gentoo

Doas es una alternativa a sudo, el comando más utilizado por la mayor parte de las distribuciones para obtener privilegios o para ejecutar determinados programas concretos.

Fue desarrollado por el equipo de OpenBSD, intenta ser minimalista y fácilmente entendible en su configuración. Tiene el 95% de características de sudo en una fracción de código base incrementado así la seguridad.

Instalando

Vamos habilitar el USE flag persist para poder hacer uso de esta opción en el /etc/doas.conf, esto nos permitirá poder ejecutar doas sin perdirnos cada 5 minutos la contraseña.

# mkdir /etc/portage/profile
# echo "-persist" > /etc/portage/profile/use.mask
# emerge --ask app-admin/doas

Configurando

Añadiendo nuestro usuario al grupo wheel

# gpasswd -a USUARIO wheel

Añadiendo la siguiente línea:

# echo "permit persist keepenv :wheel" > /etc/doas.conf

Ahora podemos probar a ejecutar algo:

doas cat /var/log/kern.log
doas (sincorchetes@basecamp) password:
doas ls

Veremos que nos solicita contraseña, si queremos dejar que nos pregunte siempre, quitamos persist.

El keepenv permite mantener las variables de entorno que tenemos en nuestro usuario.

Bonus, apagado, reinicio

Para reiniciar o apagar nuestro equipo con Doas, añadimos las siguientes líneas al fichero /etc/doas.conf:

permit nopass :wheel cmd poweroff
permit nopass :wheel cmd reboot

Con esto, cuando hagamos doas reboot o doas poweroff se apagará sin pedir contraseña.

Actualiza de Fedora 31 a Fedora 32

Si tienes Fedora 31 y estás tan desesperado por tener la nueva versión como yo, entonces te voy a guiar en esta senda oscura y pantanosa sobre cómo hacerlo.

Primeros pasos

Antes de ponernos hacer nada, actualizamos todo el sistema:

$ sudo dnf clean all
$ sudo dnf upgrade --refresh

Con estos procesos eliminamos paquetes viejos, informaciones que hayan en cache de los repositorios viejos...etc y actualizamos el software pendiente.

Reiniciamos el sistema por si tenemos algún kernel nuevo instalado:

$ sudo systemctl reboot

Instalamos este paquete:

$ sudo dnf install dnf-plugin-system-upgrade

Descargamos todos los nuevos paquetes de F32:

$ sudo dnf system-upgrade download --refresh --releasever=32 --allowerasing

Como Fedora 32 ha eliminado su soporte con Python 2.7, si no añades el parámetro --allowerasing y tienes GIMP instalado por ejemplo, te dará un error como este:

Problem: conflicting requests
  - nothing provides module(platform:f31) needed by module gimp:2.10:3120191106095052:f636be4b-0.x86_64
Error: 
 Problem: package python2-beautifulsoup4-4.9.0-1.fc31.noarch requires python2-lxml, but none of the providers can be installed
  - python2-lxml-4.4.0-1.fc31.x86_64 does not belong to a distupgrade repository
  - problem with installed package python2-beautifulsoup4-4.9.0-1.fc31.noarch
(try to add '--skip-broken' to skip uninstallable packages)

NOTA: ¿Por qué no usar --skip-broken? Porque se supone que Fedora 32 tiene todas las dependencias arregladas para que no se use Python 2.7, mantener instalado un paquete que ya no está mantenido es un problema de seguridad.

Una vez que lo ejecutemos nos aparecerá un mensaje como este:

Before you continue ensure that your system is fully upgraded by running "dnf --refresh upgrade". Do you want to continue [y/N]: 

Escribimos y y pulsamos Enter.

Se empezarán a refrescar los repositorios, nos avisará de que el módulo de GIMP u otro software que tenga Python 2.7 se eliminará y nos pide confirmación.

Total download size: 2.4 G
DNF will only download packages, install gpg keys, and check the transaction.
Is this ok [y/N]: 

Escribimos y y pulsamos Enter.

Este es un video ejemplo:

Cuando hayamos terminado ejecutamos: NOTA: El siguiente proceso va a demorarse bastante tiempo, tómate un café, una cerveza o haz palomitas. Si vas a actualizar un portátil, no te olvides de conectarlo a la corriente.

sudo dnf system-upgrade reboot

Adjunto algunas capturas de como va el proceso de instalación después de reiniciar el sistema. Yo al no utilizar plymouth ni decoros, es posible que veas más "bonita" la actualización.

Después de arrancar, comenzará a instalar actualizaciones:

Una vez que termine, te comunicará que reiniciará el sistema:

Este es el getor de arranque con el nuevo kernel instalado:

Y voilá ya tendremos SO:

Si experimentas algún problema, puedes revisar la sección de errores frecuentes de la documentación aquí.