3 Power Tips + 1 Power Link I8
Resumen: En esta entrega, un ejemplo del poder que tienen la subshells de bash, como solucionar problemas de SELinux con podman, y el uso de la herramienta yq para procesar archivos yaml. Finalmente un link a una entrevista a Linux Torvalds.
Nota: En los ejemplos de comandos el prompt del usuario no privilegiado es "$", mientras que el del superusuario es "#"
Power Tip #1: Crear entornos de bash efímeros usando subshells
Una subshell es una copia del proceso de la shell actual. Una manera de crear una subshell es usando (), lo cual sirve para personalizar el entorno de bash de manera reversible. Por ejemplo, podemos cambiar de directorio y la variable de entorno C (POSIX) para que muestre los mensajes de salida y de error en inglés:
$ echo "$LANG" es_AR.UTF-8 $ pwd /home/sergio
Ahora creamos una subshell:
$ (LANG=C; echo "La variable LANG cambia a $LANG"; cd /algun_dir || cd /tmp ; echo "el directorio actual es $PWD"; myscript.sh) La variable LANG cambia a C -bash: cd: /algun_dir: No such file or directory el directorio actual es /tmp -bash: myscript.sh: command not found
Al terminar la subshell, volvemos a la shell madre y tanto el directorio de trabajo como la variable LANG, vuelven a sus valores predeterminados:
$ pwd /home/sergio $ echo "$LANG" es_AR.UTF-8
Power Tip #2: Identificar y solucionar problemas de SELinux al usar volúmenes.
Supongamos que necesitamos probar una configuración en un contenedor:
$ podman run --name mynginx -d -v $HOME/sandbox/nginx.conf:/etc/nginx/nginx.conf --pull=never docker.io/library/nginx@sha256:553f64aecdc31b5bf944521731cd70e35da4faed96b2b7548a3d8e2598c52a42
Ahora bien: ¿Qué sucede si el contenedor en realidad, falla al arrancar como lo muestran los logs?:
$ podman logs mynginx /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh /docker-entrypoint.sh: Configuration complete; ready for start up 2025/11/24 20:09:21 [emerg] 1#1: open() "/etc/nginx/nginx.conf" failed (13: Permission denied) nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (13: Permission denied)
Si estás tentado a desactivar SELinux, te recomiendo enfáticamente que leas ¿SELinux? Nah, dejalo en Disabled. Lo que ocurre es que no hay ninguna regla que permita que el contenedor acceda al contexto del archivo nginx.conf del host.
Contexto del archivo:
$ ls -Z $HOME/sandbox/nginx.conf unconfined_u:object_r:user_home_t:s0 /home/sergio/sandbox/nginx.conf
Este problema se soluciona fácilmente:
podman stop mynginx podman rm mynginx podman run --name mynginx -d -v $HOME/sandbox/nginx.conf:/etc/nginx/nginx.conf:Z --pull=never docker.io/library/nginx@sha256:553f64aecdc31b5bf944521731cd70e35da4faed96b2b7548a3d8e2598c52a42
Y ahora el contenedor arrancará sin inconvenientes:
podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a29c08eda1b1 docker.io/library/nginx@sha256:553f64aecdc31b5bf944521731cd70e35da4faed96b2b7548a3d8e2598c52a42 nginx -g daemon o... 12 seconds ago Up 12 seconds mynginx podman logs mynginx /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh /docker-entrypoint.sh: Configuration complete; ready for start up 2025/11/24 21:16:10 [notice] 1#1: using the "epoll" event method 2025/11/24 21:16:10 [notice] 1#1: nginx/1.29.3 2025/11/24 21:16:10y [notice] 1#1: built by gcc 14.2.0 (Debian 14.2.0-19) 2025/11/24 21:16:10 [notice] 1#1: OS: Linux 4.18.0-553.84.1.el8_10.x86_64 2025/11/24 21:16:10 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 262144:262144 2025/11/24 21:16:10 [notice] 1#1: start worker processes 2025/11/24 21:16:10 [notice] 1#1: start worker process 28 2025/11/24 21:16:10 [notice] 1#1: start worker process 29
Ahora bien, la opción :Z no es mágica, para tener una aproximación a lo que hace veamos el contexto del archivo $HOME/sandbox/nginx.conf:
$ ls -Z $HOME/sandbox/nginx.conf system_u:object_r:container_file_t:s0:c369,c839 /home/sergio/sandbox/nginx.conf
| Campo | Antes | Después | Comentario |
|---|---|---|---|
| Usuario (SELinux) | unconfined_u | system_u | Pasa de ser un usuario sin restricciones a un usuario gestionado por el sistema |
| Rol (SELinux) | object_r | object_r | Se mantiene sin cambios |
| Asignación basada en tipos | user_home_t | container_file_t | Cambia a un tipo de asignación en la cual los contenedores pueden escribir |
| Rango (SElinux) | s0 | s0:c369,c839 | Este cambio implica que solamente podrá utilizarlo de manera exclusiva un único contenedor |
Power Tip #3: Filtrar un archivo de template en formato yaml de Zabbix sin instalar absolutamente nada
Solamente necesitamos podman, en el siguiente ejemplo estamos filtrando todos los triggers estáticos con nivel de severidad HIGH o DISASTER:
podman run --rm -v "${PWD}":/workdir:Z mikefarah/yq '.zabbix_export.templates[].items[].triggers[] | select(.priority == "HIGH" or .priority == "DISASTER")| {"Trigger": .name}' template_db_mssql_agent2.yaml Trigger: 'MSSQL: Percentage of the buffer cache efficiency is low' Trigger: 'MSSQL: Page life expectancy is low' Trigger: 'MSSQL: Percentage of work tables available from the work table cache is low' Trigger: 'MSSQL: Service is unavailable'
Fuentes y más recursos
- Container Labeling
- Be careful relabeling volumes with Container run times. Sometimes things can go very wrong?
Power Link
El enlace de esta edición apunta a una entrevista a Linux Torvalds que gira en torno a la evolución del hardware, la IA y su impacto en el Linux y el kernel: Linus Torvalds — Talks about AI Hype, GPU Power, and Linux’s Future . En la actualidad cuestiones como el vibe coding plantean debates importantes, no solamente en Linux sino en el ámbito IT en general.
