<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux Sin Humo (Publicaciones sobre explanations)</title><link>https://sergiobelkin.com/</link><description></description><atom:link href="https://sergiobelkin.com/categories/cat_explanations.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><copyright>Contents © 2026 &lt;a href="mailto:sebelk@gmail.com"&gt;sebelk&lt;/a&gt; 
&lt;a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/"&gt;
&lt;img alt="Creative Commons License BY-NC-SA"
style="border-width:0; margin-bottom:12px;"
src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"&gt;&lt;/a&gt;
</copyright><lastBuildDate>Mon, 18 May 2026 00:35:28 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Plan Táctico y Estratégico de la Memoria en Linux</title><link>https://sergiobelkin.com/posts/plan-tactico-y-estrategico-de-la-memoria-en-linux/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/sk-CNBRg1K9QvQ-unsplash.jpg"&gt;&lt;/figure&gt; &lt;p&gt;La mitología en torno a la memoria en Linux ha producido una serie de relatos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En un extremo: Linux puede funcionar con muy poca memoria RAM.&lt;/li&gt;
&lt;li&gt;Del otro lado: Linux consume mucha memoria.&lt;/li&gt;
&lt;li&gt;Y que una partición SWAP debe tener entre 1 a 2 veces la memoria RAM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Como vemos algunas historias son más recientes, otros más antiguas, pueden ser parcialmente ciertas y hasta contradictorias entre sí.&lt;/p&gt;
&lt;p&gt;Este artículo tiene como propósitos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Explicar de manera sencilla el funcionamiento de la memoria en Linux, desmitificando también algunos conceptos.&lt;/li&gt;
&lt;li&gt;Enumerar y describir tácticas para que el uso de la memoria proporcione la mejor usabilidad y experiencia del usuario.&lt;/li&gt;
&lt;li&gt;Ofrecer alternativas para que cada uno elija la mejor opción de acuerdo a sus necesidades.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="definiciones"&gt;Definiciones&lt;/h3&gt;
&lt;p&gt;Vamos a repasar algunos conceptos básicos que de manera más o menos frecuente usamos, usaremos metáforas en el camino. Ninguna metáfora es perfecta, sin embargo ellas nos ayudan a entender la realidad.&lt;/p&gt;
&lt;h4 id="memoria-virtual"&gt;Memoria Virtual&lt;/h4&gt;
&lt;p&gt;La memoria virtual es el mecanismo por el cual cada proceso recibe un espacio de direcciones propio, independiente y protegido. El hardware traduce direcciones virtuales a físicas según tablas de páginas. Esto permite aislamiento, sobreasignación, mapeos de archivos y demanda dinámica de páginas, más allá de la cantidad de RAM disponible. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linux trata de usar la mayor cantidad de memoria posible, para poder ejecutar las aplicaciones y acceder a los archivos de la manera más rápida posible. De manera que si la memoria libre es baja no es necesariamente un indicativo de un problema.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id="page"&gt;Page&lt;/h4&gt;
&lt;p&gt;Una página es la unidad mínima de memoria, de tamaño fijo (típicamente 4 KB), que el kernel y el hardware de gestión de memoria del procesador utilizan para organizar el espacio de direcciones y realizar el mapeo entre direcciones virtuales y físicas.&lt;/p&gt;
&lt;h4 id="page-table"&gt;Page table&lt;/h4&gt;
&lt;p&gt;Es una estructura de datos jerárquica administrada por el kernel y usada por el hardware para traducir direcciones virtuales a direcciones físicas, con información de permisos y estado de cada página.&lt;/p&gt;
&lt;h4 id="page-fault"&gt;Page Fault&lt;/h4&gt;
&lt;p&gt;Un &lt;strong&gt;page fault&lt;/strong&gt; ocurre cuando un proceso accede a una dirección válida de su espacio de memoria pero la página correspondiente no está preparada para ese acceso. Puede deberse a que la página aún no fue cargada, a que debe asignarse, o a que debe traerse desde disco. Si la página no está en RAM, el kernel debe cargarla, lo que puede ser lento; si ya estaba en RAM, el costo es menor.&lt;/p&gt;
&lt;h4 id="page-cache"&gt;Page cache&lt;/h4&gt;
&lt;p&gt;Es la caché de páginas de archivos gestionada por el kernel, usada para acelerar lecturas y escrituras almacenando en RAM los datos y metadatos de archivos y directorios, reduciendo accesos al disco.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/cache.png"&gt;&lt;img src="https://sergiobelkin.com/images/cache.thumbnail.png" alt="Page cache"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;h4 id="tipos-de-memoria"&gt;Tipos de memoria&lt;/h4&gt;
&lt;h5 id="file-memory"&gt;File Memory&lt;/h5&gt;
&lt;p&gt;Es la memoria relacionada con el &lt;strong&gt;Page Cache&lt;/strong&gt;.&lt;/p&gt;
&lt;h5 id="anonymous-memory"&gt;Anonymous Memory&lt;/h5&gt;
&lt;p&gt;Es la memoria que un proceso usa y que no está respaldada por un archivo: heap (asignada dinámicamente), stack (llamadas a funciones y almacenamiento de variables locales), COW (parte de la memoria cuando se crea un proceso hijo) y mapeos con MAP_ANONYMOUS. Su único respaldo posible es la swap.
La memoria anónima se crea y utiliza en RAM. Si el kernel necesita expulsarla de RAM, su único destino posible es la swap, porque no tiene un archivo desde el cual reconstruirse. Pero su existencia normal no depende de la swap.&lt;/p&gt;
&lt;h4 id="memory-pressure"&gt;Memory Pressure&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Memory pressure&lt;/strong&gt; es estado en el que las páginas libres caen por debajo de umbrales críticos, obligando al kernel a iniciar mecanismos de liberación de memoria.&lt;/p&gt;
&lt;p&gt;En términos prácticos cuando la presión es alta pueden surgir ciertos síntomas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sitios web / servidores HTTP:&lt;/strong&gt;
  La latencia aumenta porque los workers deben esperar a que el kernel libere páginas. Además, puede haber más CPU gastada en recuperar memoria, lo que degrada aún más los tiempos de respuesta.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sistemas de escritorio:&lt;/strong&gt;
  El sistema pierde fluidez porque el scheduler empieza a verse afectado por stalls debidos a las operaciones para liberar memoria y, si hay swap, el sistema puede entrar en &lt;em&gt;swap thrashing&lt;/em&gt;. Esto produce lag del mouse, ventanas que tardan en responder, escritorios congelados por segundos, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Acceso remoto (SSH, RDP, VNC):&lt;/strong&gt;
  Al haber presión, las operaciones de usuario-espacio tardan más en ejecutarse, y los daemons pueden quedar brevemente estancados esperando memoria. Esto causa retrasos notables en la interacción remota.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;¿Y qué sucede si la presión de memoria puede llegar a ser tan alta que el kernel ya no logra conseguir memoria ni siquiera después de intentar liberarla?&lt;/p&gt;
&lt;h4 id="thrashing"&gt;Thrashing&lt;/h4&gt;
&lt;p&gt;El &lt;strong&gt;thrashing&lt;/strong&gt; ocurre cuando la memoria RAM no alcanza para mantener las páginas que los procesos usan todo el tiempo. El kernel empieza a sacar páginas de memoria para hacer lugar a otras nuevas, pero enseguida vuelve a necesitarlas. Esto genera un bucle de fallos de página y de recarga constante desde el disco.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Con swap:&lt;/strong&gt; las páginas anónimas van y vienen entre RAM y swap, lo que dispara el uso de disco y vuelve el sistema extremadamente lento.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sin swap:&lt;/strong&gt; las páginas anónimas no tienen adónde ir y el kernel termina activando el &lt;strong&gt;OOM killer&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incluso sin swap:&lt;/strong&gt; puede haber thrashing si las páginas vienen de archivos (page cache), ya que el kernel debe recargarlas una y otra vez.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="oom-out-of-memory"&gt;OOM (Out-Of-Memory) 💀 🔥&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Out-Of-Memory&lt;/strong&gt; es una situación en la cual el kernel agotó todos los mecanismos para liberar memoria:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Liberar páginas del caché.&lt;/li&gt;
&lt;li&gt;Sacar páginas anónimas de swap.&lt;/li&gt;
&lt;li&gt;Compactar memoria.&lt;/li&gt;
&lt;li&gt;Liberar memoria mediante &lt;code&gt;kswapd&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Aplicación de políticas de cgroups (muy común al usar contenedores).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="oomkiller"&gt;OOMKiller&lt;/h4&gt;
&lt;p&gt;El &lt;strong&gt;OOM-killer&lt;/strong&gt; es el mecanismo que usa el kernel cuando ya no puede asignar más memoria, incluso después de intentar liberar todas las páginas que es posible descartar o mover fuera de la RAM.
En esa situación crítica, el kernel calcula un puntaje para cada proceso (&lt;code&gt;oom_score&lt;/code&gt;) y finaliza al que resulte más conveniente para recuperar memoria rápidamente y permitir que el sistema siga funcionando.
Este comportamiento puede influenciarse ajustando &lt;code&gt;oom_score_adj&lt;/code&gt;, que hace que un proceso sea más o menos propenso a ser elegido.&lt;/p&gt;
&lt;h4 id="oom_score"&gt;oom_score&lt;/h4&gt;
&lt;p&gt;Como ya se mencionó a cada proceso se le asigna un puntaje de acuerdo a distintos factores, cuanto más alto es, más susceptible es a ser terminado por OOMKiller. &lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/oom_score-from-proc.webp"&gt;&lt;img src="https://sergiobelkin.com/images/oom_score-from-proc.thumbnail.webp" alt="OOM Scores por proceso en /proc" title="Clic para agrandar"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Y también, como dijimos mediante oom_score_adj podemos influir en el score de un proceso:&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/oom_score-adjfrom-proc.webp"&gt;&lt;img src="https://sergiobelkin.com/images/oom_score-adjfrom-proc.thumbnail.webp" alt="Incidencia en oom_score mediante oom_score_adj"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;En versiones más recientes de las distribuciones existe el comando &lt;strong&gt;&lt;em&gt;choom&lt;/em&gt;&lt;/strong&gt; que permite ver y/o ajustar dicho valor.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/choom.png"&gt;&lt;img src="https://sergiobelkin.com/images/choom.thumbnail.png" alt="choom"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4 id="swap"&gt;Swap&lt;/h4&gt;
&lt;p&gt;Los usuarios ocasionales de Linux y aun muchos sysadmins tienen una idea negativa sobre "la swap". Simplificaciones extremas y conceptos anticuados la han convertido en le gran villana de la historia del sistema operativo.&lt;/p&gt;
&lt;p&gt;Si comparamos a la memoria con un escritorio, sin swap podría lucir así:&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/ashim-d-silva-Kw_zQBAChws-unsplash.jpg"&gt;&lt;img src="https://sergiobelkin.com/images/ashim-d-silva-Kw_zQBAChws-unsplash.jpg" alt="Prescindir de swap no es una opción sana."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Photo by &lt;a href="https://unsplash.com/@randomlies?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Ashim D’Silva&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/mess?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Así que primero vamos a decir lo que &lt;strong&gt;no&lt;/strong&gt; es:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No&lt;/strong&gt; es la &lt;strong&gt;memoria virtual&lt;/strong&gt; sino que &lt;strong&gt;forma parte&lt;/strong&gt; de la &lt;strong&gt;técnica&lt;/strong&gt; que realiza el sistema operativo para administrar la memoria.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No&lt;/strong&gt; es un espacio de reserva ni un último recurso. &lt;strong&gt;Es&lt;/strong&gt; un espacio complementario sirve para liberar RAM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No&lt;/strong&gt; funciona como último recurso, pero el sistema operativo puede mover hacia la swap las páginas de memoria no usadas recientemente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No&lt;/strong&gt; es algo que el sistema operativo pueda alegremente prescindir aun cuando la cantidad de memoria RAM física sea grande. Quienes parecen haber inventado la pólvora, nos cuentan que es posible técnicamente que Linux funcione sin swap. Si bien es cierto, al carecer de swap, el kernel no tiene manera de mover páginas de memoria anónimas hacia el área de swap y liberar así RAM para procesos que la necesitan urgentemente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nuestro escritorio con swap:&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/alexandru-acea-Zg9R__O-8fM-unsplash.jpg"&gt;&lt;img src="https://sergiobelkin.com/images/alexandru-acea-Zg9R__O-8fM-unsplash.thumbnail.jpg" alt="Analogía de Swap"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Photo by &lt;a href="https://unsplash.com/@alexacea?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Alexandru Acea&lt;/a&gt; (edited by me) on &lt;a href="https://unsplash.com/s/photos/desktop-drawer?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;¿Los cajones de un escritorio los usamos cuando lo tenemos abarrotado de cosas? No, los usamos para guardar cosas que no son de alta prioridad. Aunque es cierto, si luego queremos usar esa tijera o aquel destornillador en algún momento requerirá un poco más de trabajo, tendremos que abrir el cajón, buscarlo, extraerlo, etc.&lt;/p&gt;
&lt;p&gt;Ah, y la swap también sirve para hibernar, aunque honestamente no se cuanta gente mantiene esa práctica.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="tuning"&gt;Tuning&lt;/h3&gt;
&lt;p&gt;Ahora veremos diferentes tácticas que podemos usar para optimizar el uso de la memoria.&lt;/p&gt;
&lt;h4 id="cgroupv2"&gt;cgroupv2&lt;/h4&gt;
&lt;p&gt;cgroup es un mecanismo para organizar los procesos de manera jerárquica y distribuir los recursos del sistema a lo largo  de la jerarquía en una manera controlada y configurada.&lt;/p&gt;
&lt;p&gt;Un cgroup se compone de un núcleo que es responsable primariamente en organizar de manera jerárquica los procesos y controladores que comúnmente distribuyen un tipo específico de recurso del sistema a lo largo de la jerarquía.&lt;/p&gt;
&lt;p&gt;En la versión 2 de cgroup un proceso no puede pertenecer a diferentes grupos para diferentes controladores. Si el proceso se uno al grupo alfa, todos los controladores para alfa tomarán control de ese proceso.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/ps-cgroup.png"&gt;&lt;img src="https://sergiobelkin.com/images/ps-cgroup.thumbnail.png" alt="ps mostrando cgroup"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Supongamos que los procesos de un cgroup (y todos los grupos hijos) usan poca memoria, podríamos decirle al kernel que libere memoria de otros cgroups. Esto es precisamente lo que hace el parámetro memory.low.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/memory_low.png"&gt;&lt;img src="https://sergiobelkin.com/images/memory_low.thumbnail.png" alt="el parámetro memory.low"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Otro parámetro interesante para monitorear es &lt;strong&gt;memory.pressure&lt;/strong&gt;, la primera línea tiene el tiempo físico de una o más tareas demoradas debido a la falta de memoria. La segunda sería lo mismo pero para todas las tareas del grupo, full es lo mismo pero para todas las tareas del grupo, Entonces si miramos el archivo &lt;code&gt;/sys/fs/cgroup/user.slice/memory.pressure&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;some avg10=0.00 avg60=0.13 avg300=0.12 total=1690238
full avg10=0.00 avg60=0.10 avg300=0.09 total=1394199
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Significa que, dentro del grupo de control user.slice, en los últimos 10 segundos no hubo tareas afectadas por presión de memoria. Sin embargo, en el último minuto las tareas estuvieron bloqueadas un 0,13% del tiempo y un 0,12% en los últimos cinco minutos. El valor total indica que estas situaciones acumulan aproximadamente 1,7 segundos de espera.
La segunda línea muestra las mismas métricas, pero aplicadas a los casos en que todas las tareas del grupo estuvieron simultáneamente afectadas por presión de memoria (full en lugar de some).&lt;/p&gt;
&lt;p&gt;Es decir:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;some&lt;/code&gt; → indica si un retraso afectó al menos una tarea.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;full&lt;/code&gt; → indica si el retraso afectó a todo el cgroup simultáneamente.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="zram"&gt;zram&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;zram&lt;/strong&gt; es por así decirlo, una manera cool de usar swap gracias a un módulo del kernel. 
&lt;br&gt;
&lt;a class="image-reference" href="https://sergiobelkin.com/images/chuttersnap-4LnSe9KwewA-unsplash.jpg"&gt;&lt;img src="https://sergiobelkin.com/images/chuttersnap-4LnSe9KwewA-unsplash.thumbnail.jpg" alt="zram, swap pero cool"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;Photo by &lt;a href="https://unsplash.com/@chuttersnap?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;chuttersnap&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/cool-drawer-desktop?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;En lugar de gastar espacio en un disco (sea rígido o sólido) usamos dispositivos de bloque en la propia RAM. Los bloques swapeados se guardan comprimidos. Esto discos virtuales son rápidos y ahorran memoria.&lt;/p&gt;
&lt;p&gt;Una de las pocas desventajas que tiene esta metodología es la incapacidad para poder hibernar el sistema operativo, al no estar presente la partición en un almacenamiento de tipo persistente.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/zram.png"&gt;&lt;img src="https://sergiobelkin.com/images/zram.png" alt="zram"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4 id="sistemas-de-archivos"&gt;Sistemas de archivos&lt;/h4&gt;
&lt;p&gt;El journal de ext4 puede ser lento, xfs puede ser una mejor alternativa o mejor aun btrfs.&lt;/p&gt;
&lt;h4 id="earlyoom"&gt;EarlyOOM&lt;/h4&gt;
&lt;p&gt;El oom-killer del kernel solamente se dispara en situaciones extremas y le puede llevar mucho tiempo hasta que puede enviar SIGKILL a los procesos que sean necesarios para poder liberar memoria. Durante ese tiempo probablemente el usuario no pueda interactuar con el sistema operativo.&lt;/p&gt;
&lt;p&gt;EarlyOOM trabaja en espacio de usuario y por lo tanto se puede anticipar y ser mucho más rápido.&lt;/p&gt;
&lt;p&gt;El comportamiento predeterminado en Fedora es que si hay menos del 10% de RAM y/o SWAP libre, earlyoom envía una señal de terminación a todos los procesos con oom_score más alto. Si la RAM como SWAP libre bajan por debajo del 5%, earlyroom enviará una señal para matar todos los procesos con oom_score más elevado.&lt;/p&gt;
&lt;p&gt;La idea es recuperar la usabilidad (especialmente en un entorno de escritorio) lo antes posible.&lt;/p&gt;
&lt;p&gt;El problema es que EarlyOOM no soporta al momento la medición de la &lt;strong&gt;memory pressure&lt;/strong&gt; como indicativo para tomar decisiones.&lt;/p&gt;
&lt;h4 id="nohang"&gt;nohang&lt;/h4&gt;
&lt;p&gt;Este servicio es mucho más configurable y aporta una mejor solución que EarlyOOM.&lt;/p&gt;
&lt;p&gt;Algunas funcionalidades son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se puede elegir la acción que realizará en una situación OOM.&lt;/li&gt;
&lt;li&gt;Ofrece varios criterios para elegir los procesos a finalizar.&lt;/li&gt;
&lt;li&gt;Soporta zram&lt;/li&gt;
&lt;li&gt;Puede usar &lt;strong&gt;memory pressure&lt;/strong&gt; para tomar una acción.&lt;/li&gt;
&lt;li&gt;El archivo de configuración es medianamente sencillo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sin embargo, este proyecto en la actualidad tiene poca actividad comparado por ejemplo con EarlyOOM&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/nohangvseoom.webp"&gt;&lt;img src="https://sergiobelkin.com/images/nohangvseoom.thumbnail.webp" alt="Repos: nohang vs EarlyOOM en Github"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4 id="zswap"&gt;zswap&lt;/h4&gt;
&lt;p&gt;Con zswap no reemplazamos el espacio swap en el disco sino que usamos un caché comprimido en la RAM. Este método ahorra I/O, obteniendo entonces mejor rendimiento y alargando la vida útil de discos flash o sólidos. La única desventaja es usar algo de tiempo del procesador para realizar la compresión.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/pineapple-supply-co-SRKxB1B_sn4-unsplash.jpg"&gt;&lt;img src="https://sergiobelkin.com/images/pineapple-supply-co-SRKxB1B_sn4-unsplash.thumbnail.jpg" alt="zswap"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Photo by &lt;a href="https://unsplash.com/@pineapple?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Pineapple Supply Co.&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/tray-desktop?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Mediante el caché se logra una diferenciación entre páginas más usadas (zswap) y menos usadas (swap).&lt;/p&gt;
&lt;h4 id="systemd-oomd"&gt;systemd-oomd&lt;/h4&gt;
&lt;p&gt;El servicio systemd-oomd es un proyecto en el que comenzó en Facebook para integrarlo con systemd. En un principio estaba pensado para manejo de memoria a gran escala, y bastante más complejo de configurar. Sin embargo ha sido adoptado desde Fedora 34 reemplazando a EarlyOOM. En las distribuciones que usan versiones recientes de systemd, está disponible, aunque no todas lo habilitan de manera predeterminada.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/systemd-oomd.webp"&gt;&lt;img src="https://sergiobelkin.com/images/systemd-oomd.thumbnail.webp" alt="systemd-oomd"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3 id="resumen"&gt;Resumen&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Swap no es la villana de la película&lt;/li&gt;
&lt;li&gt;Si existe la opción de migrar a otros sistema de archivos aunque con características un tanto experimental, elegir btrfs. Una opción más moderada es xfs.&lt;/li&gt;
&lt;li&gt;El tuning de cgroupv2 puede traer grandes beneficios, no obstante existen proyectos y distribuciones que no lo usan.&lt;/li&gt;
&lt;li&gt;EarlyOOM es una solución rápida y aplicable a una amplia gama de sistemas Linux, aunque no siempre es la más exacta ni más elegante.&lt;/li&gt;
&lt;li&gt;El servicio nohang (o no hang-desktop) es una opción más madura aunque algo más compleja que EarlyOOM, pero que sin embargo ha caído en cierta inactividad.&lt;/li&gt;
&lt;li&gt;El servicio &lt;strong&gt;systemd-oomd&lt;/strong&gt; inicialmente incorporado por Facebook es seguramente la opción más adecuada para escenarios más complejos y de manejo de memoria a gran escala. También es utilizado actualmente en sistemas de escritorio.&lt;/li&gt;
&lt;li&gt;Sin embargo, muchas distribuciones o &lt;em&gt;sabores&lt;/em&gt; de distribuciones prefieren usar el mecanismo clásico de OOMKiller.&lt;/li&gt;
&lt;li&gt;A veces se sugiere el ajuste de parámetros del kernel mediante &lt;code&gt;sysctl&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Si se desea ahorrar espacio en disco se puede reemplazar la swap por zram, sacrificando la opción de hibernar el sistema.&lt;/li&gt;
&lt;li&gt;La opción zswap es más sofisticada, aunque dependemos del uso de swap en disco.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;Photo by &lt;a href="https://unsplash.com/@rollelflex_graphy726?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;sk&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/chess?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id="fuentes-consultadas"&gt;Fuentes consultadas&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.suse.com/support/kb/doc/?id=000017834"&gt;Is a swap partition required for SLES? | Support | SUSE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Virtual_memory#Thrashing"&gt;Virtual memory - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Page_(computer_memory)"&gt;Page (computer memory) - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linux-mm.org/VirtualMemory?action=fullsearch&amp;amp;context=180&amp;amp;value=glossary"&gt;VirtualMemory - linux-mm.org Wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kernelnewbies.org/KernelGlossary"&gt;KernelGlossary - Linux Kernel Newbies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lwn.net/Articles/411845/"&gt;Ghosts of Unix Past: a historical search for design patterns [LWN.net]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.vishalchovatiya.com/how-does-virtual-memory-work/#How_Does_Virtual_Memory_Work"&gt;How does virtual memory work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Virtual_memory#Thrashing"&gt;Virtual memory - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Paging#Page_stealing"&gt;Paging - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linux-mm.org/Memory_pressure"&gt;Memory_pressure - linux-mm.org Wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kernel.org/doc/html/latest/admin-guide/mm/concepts.html?highlight=write%20back%20cache#virtual-memory-primer"&gt;Concepts overview — The Linux Kernel documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linux.com/news/all-about-linux-swap-space/"&gt;All about Linux swap space - Linux.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://unix.stackexchange.com/questions/417855/why-does-linux-need-swap-space-in-a-vm"&gt;Why does Linux need swap space in a VM? - Unix &amp;amp; Linux Stack Exchange&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrisdown.name/2018/01/02/in-defence-of-swap.html"&gt;In defence of swap: common misconceptions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/nttlabs/cgroup-v2-596d035be4d7"&gt;The current adoption status of cgroup v2 in containers | by Akihiro Suda | nttlabs | Medium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://facebookmicrosites.github.io/cgroup2/docs/memory-controller.html"&gt;Memory Controller · cgroup2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git/tree/Documentation/admin-guide/cgroup-v2.rst"&gt;cgroup-v2.rst « admin-guide « Documentation - kernel/git/tj/cgroup.git - cgroup export tree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git/tree/Documentation/admin-guide/cgroup-v2.rst"&gt;cgroup-v2.rst « admin-guide « Documentation - kernel/git/tj/cgroup.git - cgroup export tree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.archlinux.org/index.php/Cgroups#Switching_to_cgroups_v2"&gt;cgroups - ArchWiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kernel.org/doc/html/latest/admin-guide/blockdev/zram.html"&gt;zram: Compressed RAM-based block devices — The Linux Kernel documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fedoraproject.org/wiki/Changes/SwapOnZRAM#Summary"&gt;Changes/SwapOnZRAM - Fedora Project Wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fedoraproject.org/wiki/Changes/EnableEarlyoom#Summary"&gt;Changes/EnableEarlyoom - Fedora Project Wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://man7.org/linux/man-pages/man5/proc.5.html"&gt;proc(5) - Linux manual page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hakavlad/nohang"&gt;hakavlad/nohang: A sophisticated low memory handler for Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Zswap"&gt;zswap - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.phoronix.com/scan.php?page=news_item&amp;amp;px=Systemd-OOMD-April-WIP"&gt;Systemd-OOMD Continues Coming Together For Better Linux Out-Of-Memory Handling - Phoronix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=beefUhRH5lU"&gt;SREcon19 Asia/Pacific - Linux Memory Management at Scale: Under the Hood - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.man7.org/linux/man-pages/man2/mmap.2.html"&gt;mmap(2) — Linux manual page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kernel.org/doc/html/v6.13/core-api/mm-api.html"&gt;Memory Management APIs¶&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fedoraproject.org/wiki/Changes/EnableSystemdOomd"&gt;Changes/EnableSystemdOomd&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>kernel</category><category>RAM</category><category>sysadmin</category><guid>https://sergiobelkin.com/posts/plan-tactico-y-estrategico-de-la-memoria-en-linux/</guid><pubDate>Mon, 01 Dec 2025 05:00:32 GMT</pubDate></item><item><title>Comparación de systemd-run con nuhup, tmux y screen</title><link>https://sergiobelkin.com/posts/systemd-run-vs-nohup-vs-tmuxscreen/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;&lt;img alt="systemd-run" class="img-izquierda-responsiva" src="https://sergiobelkin.com/images/systemd-run.webp"&gt;
&lt;br&gt;
Si estamos conectados por ssh y sufrimos una desconexión mientras ejecutamos un comandos, puede representar un problema, desde la interrupción del proceso o la pérdida del acceso a la salida estándar/error del mismo. Existen comandos como nohup que de alguna manera nos ayudan a mitigar esas situaciones, tales como nohup, o multiplexores de terminal como screen y tmux.&lt;/p&gt;
&lt;p&gt;Al usar systemd, contamos con una herramienta tan sencilla como poderosa: el comando &lt;code&gt;systemd-run&lt;/code&gt; que permite ejecutar un comando muy sencillo como el siguiente en un servicio. O para ser más exactos en una &lt;strong&gt;service unit&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;systemd-run&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="w"&gt; &lt;/span&gt;ping&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;.8.8.8
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="comparacion-con-nohup-tmuxscreen"&gt;Comparación con nohup, tmux/screen&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;&lt;code&gt;systemd-run&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;nohup&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;tmux&lt;/code&gt; / &lt;code&gt;screen&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Supervisión del estado&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sí, vía &lt;code&gt;systemctl status&lt;/code&gt; y &lt;code&gt;journalctl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No, se debe usar &lt;code&gt;ps&lt;/code&gt; o &lt;code&gt;pgrep&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Parcial, requiere inspección manual de la sesión&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Control del ciclo de vida&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Completo: iniciar, detener, reiniciar con políticas de reinicio&lt;/td&gt;
&lt;td&gt;Nulo: solo iniciar, sin reinicio automático&lt;/td&gt;
&lt;td&gt;Manual: requiere interacción del usuario&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Manejo de logs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Centralizado en journal, con metadata y timestamps&lt;/td&gt;
&lt;td&gt;Básico: redirige a &lt;code&gt;nohup.out&lt;/code&gt; sin rotación&lt;/td&gt;
&lt;td&gt;Opcional: solo si se configura logging explícitamente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Integración con el sistema&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Alta: como unidad de systemd, con cgroup, slices, y logs centralizados&lt;/td&gt;
&lt;td&gt;Nula: proceso genérico del usuario&lt;/td&gt;
&lt;td&gt;Baja: proceso de usuario sin integración con systemd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Persistencia tras logout&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Alta: configurable vía &lt;code&gt;lingering&lt;/code&gt; o como unidad del sistema&lt;/td&gt;
&lt;td&gt;Limitada: depende de configuración de &lt;code&gt;logind&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Alta (tradicional), pero afectada por &lt;code&gt;KillUserProcesses&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Persistencia tras reinicio&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Posible mediante conversión a unidad persistente o uso de &lt;code&gt;systemd-timer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No, se requiere cron, scripts externos&lt;/td&gt;
&lt;td&gt;No, sesión se pierde tras reboot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Políticas de recursos/aislamiento&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Completa: límites CPU, memoria, I/O, namespaces, privilegios, etc.&lt;/td&gt;
&lt;td&gt;Nula: se requiere uso externo de &lt;code&gt;ulimit&lt;/code&gt; o &lt;code&gt;nice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nula: requiere herramientas externas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Facilidad de uso interactivo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Baja: orientado a ejecución no interactiva&lt;/td&gt;
&lt;td&gt;Nula: no interactivo&lt;/td&gt;
&lt;td&gt;Alta: diseñado para interacción, múltiples ventanas/sesiones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ideal para&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tareas ad-hoc, servicios temporales, pruebas controladas&lt;/td&gt;
&lt;td&gt;Procesos simples que deben continuar tras logout&lt;/td&gt;
&lt;td&gt;Tareas interactivas largas o sesiones remotas persistentes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="mas-ejemplos"&gt;Más Ejemplos&lt;/h3&gt;
&lt;h4 id="ansible"&gt;Ansible&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Advertencia&lt;/strong&gt;: Los siguiente comandos no son para copiar y pegar sin analizarlos, deben ser ajustados al entorno en los cuales se los desea utiizar. El propósito principal es mostrar la potencia práctica de la herramienta &lt;code&gt;systemd-run&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Objetivo&lt;/strong&gt;: Ejecutar playbooks críticos en entornos controlados, como servicios temporales autoreiniciables.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;systemd-run&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;on-failure&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PrivateTmp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Provisionar servidores"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SuccessExitStatus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\ &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;RestartSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\ &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;TimeoutStopSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="se"&gt;\ &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--unit&lt;span class="o"&gt;=&lt;/span&gt;ansible-run&lt;span class="w"&gt; &lt;/span&gt;ansible-playbook&lt;span class="w"&gt; &lt;/span&gt;site.yml&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;inventory/prod
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Ventajas&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crea un entorno temporal (&lt;code&gt;/tmp&lt;/code&gt; aislado).&lt;/li&gt;
&lt;li&gt;Si falla, se reinicia automáticamente.&lt;/li&gt;
&lt;li&gt;El log de toda la ejecución queda en &lt;code&gt;journal&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="mysqldump"&gt;mysqldump&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Objetivo&lt;/strong&gt;: Realizar dumps de bases de datos con límites de memoria y sin cargar el sistema.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;systemd-run&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;MemoryMax&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;750M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;MemorySwapMax&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;150M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Nice&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Backup de MySQL sin afectar el sistema"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--unit&lt;span class="o"&gt;=&lt;/span&gt;mysql-dump&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;bash&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'mysqldump --all-databases &amp;gt; /tmp/backup.sql'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Ventajas&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Protege al sistema de un uso excesivo de memoria&lt;/li&gt;
&lt;li&gt;Baja prioridad de batch (&lt;code&gt;Nice=10&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Log y control vía systemd.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="azure-cli"&gt;Azure CLI&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Objetivo&lt;/strong&gt;: Apagar/desasignar todas las VMs del grupo "GrupoDesarrollo" en segundo plano&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;systemd-run&lt;span class="w"&gt; &lt;/span&gt;--unit&lt;span class="o"&gt;=&lt;/span&gt;apagar_vms&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--service-type&lt;span class="o"&gt;=&lt;/span&gt;oneshot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;WorkingDirectory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;bash&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'az login --identity &amp;amp;&amp;amp; az vm list -g GrupoDesarrollo --query "[].id" -o tsv | xargs -r az vm deallocate --ids'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Ventajas&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ejecución desacoplada de la terminal.&lt;/li&gt;
&lt;li&gt;Se puede usar &lt;code&gt;journalctl&lt;/code&gt; para auditar el comando.&lt;/li&gt;
&lt;li&gt;Control sobre el entorno de ejecución&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="conclusion"&gt;Conclusión&lt;/h3&gt;
&lt;p&gt;El comando &lt;code&gt;systemd-run&lt;/code&gt; es una alternativa más robusta que otros comandos legacy o multiplexores de terminal, ya que permite, no solamente desacoplar el proceso de la terminal sino también poder gestionarlo perfectamente dentro de systend.&lt;/p&gt;
&lt;h3 id="fuentes-y-mas-recursos"&gt;Fuentes y más recursos&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.freedesktop.org/software/systemd/man/latest/systemd-run.html"&gt;Manpage de &lt;code&gt;systemd-run&lt;/code&gt;&lt;/a&gt;&lt;br&gt;
  Documentación oficial de &lt;code&gt;systemd-run&lt;/code&gt;, incluyendo parámetros como &lt;code&gt;--unit&lt;/code&gt;, &lt;code&gt;--service-type&lt;/code&gt;, y ejemplos útiles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html"&gt;Manpage de &lt;code&gt;systemd.service&lt;/code&gt;&lt;/a&gt;&lt;br&gt;
  Referencia esencial sobre unidades de servicio, incluyendo tipos (&lt;code&gt;oneshot&lt;/code&gt;, &lt;code&gt;simple&lt;/code&gt;) y propiedades como &lt;code&gt;Restart=&lt;/code&gt;, &lt;code&gt;WorkingDirectory=&lt;/code&gt;, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/cli/azure/authenticate-azure-cli#sign-in-using-a-managed-identity"&gt;Autenticación con identidad administrada en Azure CLI&lt;/a&gt;&lt;br&gt;
  Cómo usar &lt;code&gt;az login --identity&lt;/code&gt; de forma segura, sin almacenar credenciales.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://unix.stackexchange.com/questions/420594/why-process-killed-with-nohup"&gt;Respuesta que recomienda &lt;code&gt;systemd-run&lt;/code&gt; cuando &lt;code&gt;nohup&lt;/code&gt; falla&lt;/a&gt;&lt;br&gt;
  Explica por qué procesos protegidos con &lt;code&gt;nohup&lt;/code&gt; pueden morir y propone &lt;code&gt;systemd-run --scope --user&lt;/code&gt; como solución más fiable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html"&gt;Explicación de tipos de unidades systemd (Fedora Project)&lt;/a&gt;&lt;br&gt;
  Introducción accesible al funcionamiento de systemd.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><category>systemd</category><guid>https://sergiobelkin.com/posts/systemd-run-vs-nohup-vs-tmuxscreen/</guid><pubDate>Tue, 24 Jun 2025 22:07:30 GMT</pubDate></item><item><title>Frameworks para Bash: ¿realmente los necesitamos? Una mirada profunda a bash-it</title><link>https://sergiobelkin.com/posts/frameworks-para-bash-mirada-en-profundidad/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/posts/frameworks-para-bash-mirada-en-profundidad/images/framework_bash.webp"&gt;&lt;/figure&gt; &lt;p&gt;Después de muchos años 📅de usar &lt;strong&gt;bash&lt;/strong&gt; es normal ir acumulando &lt;strong&gt;alias&lt;/strong&gt;, &lt;strong&gt;funciones&lt;/strong&gt;, &lt;strong&gt;variables&lt;/strong&gt;, &lt;strong&gt;scripts&lt;/strong&gt;, qué ponemos por aquí y por allá, con suerte en algún directorio más o menos estandar. Pero llega un momento que es difícil de manejar todo eso.
De acuerdo a mi experiencia he notado que muchas veces se usa algo porque se sacó de un foro de reddit, stackoverflow, de una búsqueda en google o DuckDuckGo, de una respuesta de a un prompt en la IA... o porque alguien lo dijo. Funciona, pero no se tiene ni idea de &lt;em&gt;por qué&lt;/em&gt; funciona.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/framework_bash-circled.webp"&gt;&lt;img src="https://sergiobelkin.com/images/framework_bash-circled.thumbnail.webp" alt="Organización de nuestro bash profesional"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Una vez en un curso un alumno me dijo:&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;¡Ahora entiendo porque hago lo que hago cada día en mi trabajo! 😀&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Es imposible saber y acordarse de todo, pero tener una idea conceptual al menos general de como funcionan las cosas nos ayuda en el trabajo diario.&lt;/p&gt;
&lt;p&gt;Por eso es importante tener en cuenta algunos conceptos de bash fundamentales.&lt;/p&gt;
&lt;h3 id="alias"&gt;Alias&lt;/h3&gt;
&lt;p&gt;Los alias se usan para abreviar o cambiar el comportamiento de comandos simples o repetitivos.&lt;/p&gt;
&lt;p&gt;Por ejemplo:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;rm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'rm -i'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;De este modo, estamos cambiando el comportamiento del comando rm para que nos pregunte antes de borrar archivos.
Hay otras situaciones en los cuales queremos hacer un comando mucho más sencillo:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;dma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'date +%d-%m-%y'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="funciones"&gt;Funciones&lt;/h3&gt;
&lt;p&gt;Si bien los alias son muy útiles, tienen limitaciones:&lt;/p&gt;
&lt;p&gt;❌  No se expanden de manera predeterminada en scripts.&lt;br&gt; 
❌  No soportan parámetros posicionales.&lt;br&gt; 
❌  Tienen un soporte muy estrecho para lógica condicional.&lt;br&gt; &lt;/p&gt;
&lt;p&gt;Si tenemos alguno de esos requerimientos entonces usaremos funciones, como la siguiente que sirve para ver un archivo sin líneas vacías o con "#":&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;clrfile&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-eq&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Error: Proporciona al menos un archivo."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Error: '&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;' no es un archivo válido."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-Ev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'^[[:space:]]*#|^$|^[[:space:]]*;'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="variables"&gt;Variables&lt;/h3&gt;
&lt;p&gt;A medida que vamos usando bash, encontramos la necesidad de crear variables, por ejemplo:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nv"&gt;HISTFILESIZE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1048576&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nikola&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/home/sergio/Documentos/Arts/nikola-env"&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;GTK_USE_PORTAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="opciones-de-bash"&gt;Opciones de bash&lt;/h3&gt;
&lt;p&gt;Bash posee muchas opciones que nos sirven para modificar el comportamiento del shell como vemos a continuación:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;shopt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;histappend
&lt;span class="nb"&gt;shopt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;autocd
&lt;span class="nb"&gt;shopt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;dirspell
&lt;span class="nb"&gt;shopt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;cdspell
&lt;span class="nb"&gt;shopt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;cdable_vars
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Con el paso del tiempo, nuestro archivo .bashrc, puede hacerse muy largo, poco claro, poco modular, o hasta incluso creamos muchos archivitos aquí y allá con funciones y/o alias como si fueran scripts. Con suerte tal vez los pongamos en &lt;code&gt;~/bin&lt;/code&gt; o &lt;code&gt;~ /.local/bin&lt;/code&gt;.
 Cuando llegamos a este punto tal vez estemos necesitando que nuestras herramientas estén organizadas, que manejen estándares, que podamos contar con módulos que se puedan habilitar o deshabilitar para poder administrar y/o desarrollar de manera más profesional.
 Es decir, necesitamos un &lt;strong&gt;framework&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="bash-it-un-framework-como-aliado"&gt;bash-it, un framework como aliado&lt;/h3&gt;
&lt;p&gt;El shell &lt;strong&gt;zsh&lt;/strong&gt; usa un framework llanado "Oh My Zsh". Sin embargo, las distribuciones principales, a excepción de &lt;strong&gt;Kali&lt;/strong&gt;, el resto usa &lt;strong&gt;bash&lt;/strong&gt; de manera predeterminada. Así que en muchos casos no tiene sentido invertir tiempo en cambiarse a zsh 😄. Y en particular para los que quieran aprender Linux, recomiendo que comiencen con Bash, luego si tienen tiempo y el ámbito corporativo se los permite podrán explorar Zsh como una excelente alternativa.&lt;/p&gt;
&lt;p&gt;Por lo tanto,  ¿qué tenemos para bash? En un principio encontré que justamente existe: &lt;strong&gt;Oh My Bash&lt;/strong&gt;. Este proyecto usa el popular pero no por eso recomendado método de instalación desde el punto de vista de la seguridad que consiste en "curl-pipe-script". Sin embargo, ciertos problemas de Instalación manual con OMB, me llevaron a considerar a &lt;strong&gt;bash-it&lt;/strong&gt; por tener mejores métricas:&lt;/p&gt;
&lt;p&gt;Estas estadísticas hacen que más allá del bonito sitio que armó la comunidad de &lt;strong&gt;Oh My Bash&lt;/strong&gt; eligiera &lt;strong&gt;bash-it&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/image_1743311253683_0.png"&gt;&lt;img src="https://sergiobelkin.com/images/image_1743311253683_0.thumbnail.png" alt="Comarativas de repos bash-it y Oh My Basg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4 id="es-tecnicamente-confiable-bash-it-para-produccion"&gt;✅ ¿Es técnicamente confiable Bash-it para producción?&lt;/h4&gt;
&lt;p&gt;No vamos a encontrar a bash-it en repositorios de las distribuciones principales, sin embargo desde un punto de vista &lt;strong&gt;técnico puro&lt;/strong&gt;, Bash-it es bastante seguro porque:&lt;/p&gt;
&lt;p&gt;✔️ &lt;strong&gt;No requiere privilegios especiales&lt;/strong&gt; (se instala en el home del usuario).  &lt;br&gt;
✔️ Usa &lt;strong&gt;código abierto auditable&lt;/strong&gt; (podés revisar cada plugin, alias, función).  &lt;br&gt;
✔️ Es fácil de &lt;strong&gt;activar/desactivar funcionalidades individuales&lt;/strong&gt; (plugins, alias, temas).  &lt;br&gt;
✔️ Está diseñado para usarse &lt;strong&gt;solo en entornos interactivos&lt;/strong&gt;, no impactando scripts automáticos.   &lt;/p&gt;
&lt;p&gt;&lt;em&gt;Sin embargo, la confiabilidad depende mucho del criterio de quien lo administra.&lt;/em&gt;&lt;/p&gt;
&lt;h4 id="consideraciones-de-seguridad-para-entorno-corporativo"&gt;🔐 ¿Consideraciones de seguridad para entorno corporativo?&lt;/h4&gt;
&lt;p&gt;⚠️ Es código abierto &lt;strong&gt;no revisado oficialmente por las distribuciones más populares&lt;/strong&gt;, por lo cual debés auditar lo que habilitás.  &lt;br&gt;
⚠️ Debe implementarse &lt;strong&gt;con criterio&lt;/strong&gt;, evitando plugins que hagan conexiones externas automáticas o definan alias potencialmente riesgosos.  &lt;br&gt;
⚠️ Es aconsejable &lt;strong&gt;versionar&lt;/strong&gt; y usar un fork corporativo que controles.&lt;/p&gt;
&lt;h4 id="riesgos-o-precauciones-a-considerar"&gt;🚨 ¿Riesgos o precauciones a considerar?&lt;/h4&gt;
&lt;p&gt;❌ Podrías introducir complejidad innecesaria si el equipo no está acostumbrado a Bash avanzado.  &lt;br&gt;
❌ Posibilidad de romper comandos estándar con alias mal elegidos.  &lt;br&gt;
❌ Necesidad de capacitación interna sobre su uso para evitar malentendidos.&lt;/p&gt;
&lt;h4 id="recomendaciones-profesionales-como-hacerlo-confiable"&gt;💡 Recomendaciones profesionales (cómo hacerlo confiable):&lt;/h4&gt;
&lt;p&gt;📌 Usá un &lt;strong&gt;fork interno auditado&lt;/strong&gt; por el equipo de seguridad o infraestructura.  &lt;br&gt;
   📌 Instalá &lt;strong&gt;solo plugins y funcionalidades que realmente necesitás&lt;/strong&gt;.  &lt;br&gt;
   📌 No habilites funciones o plugins "experimentales" o desconocidos.  &lt;br&gt;
   📌 Documentá claramente qué está habilitado y por qué.&lt;/p&gt;
&lt;p&gt;Hechas las aclaraciones en las que me siento obligado a hacer, vayamos al procedimiento de instalación 😄.&lt;/p&gt;
&lt;h4 id="instalacion-de-bash-it"&gt;Instalación de bash-it&lt;/h4&gt;
&lt;p&gt;Clonamos el repositorio y ejecutamos el script de instalación:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;--depth&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;https://github.com/Bash-it/bash-it.git&lt;span class="w"&gt; &lt;/span&gt;~/.bash_it
&lt;span class="w"&gt; &lt;/span&gt;~/.bash_it/install.sh
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;El script nos va a preguntar si queremos mantener el archivo  &lt;code&gt;~/.bashrc&lt;/code&gt; o sobrescribir el archivo y crear un backup (comportamiento por default) o bien agregarlo al final de  &lt;code&gt;~/.bashrc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/image_1743312003981_0.png"&gt;&lt;img src="https://sergiobelkin.com/images/image_1743312003981_0.thumbnail.png" alt="Instalación de bash-it"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3 id="donde-guardamos-nuestras-configuraciones"&gt;¿Dónde guardamos nuestras configuraciones?&lt;/h3&gt;
&lt;p&gt;Sea que necesitemos agregar nuestras propias configuraciones o rescatarlas del archivo de backup &lt;code&gt;~/.bashrc.bak&lt;/code&gt; es importante comprender donde tenemos que guardar cada cosa, para eso contamos la siguiente tabla:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuración&lt;/th&gt;
&lt;th&gt;Ubicación&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Alias&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.bash_it/aliases/custom.aliases.bash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funciones&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.bash_it/lib/custom.bash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opciones de shell&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.bash_it/lib/custom.bash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variables&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.bash_it/lib/custom.bash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autocompletados&lt;/td&gt;
&lt;td&gt;&lt;code&gt;completion/custom.completion.bash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funciones &lt;br&gt;  agrupadas&lt;/td&gt;
&lt;td&gt;&lt;code&gt;plugins/custom.plugins.bash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Temas&lt;/td&gt;
&lt;td&gt;&lt;code&gt;custom/themes/mi-tema/mi-tema.theme.bash&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="donde-colocar-nuestros-scripts"&gt;¿Dónde colocar nuestros scripts?&lt;/h4&gt;
&lt;p&gt;Aquí, abro un paréntesis, ya que es importante que entendamos que si contamos con scripts más complejos, lo recomendable es que esté en algún directorio de nuestro path tal como &lt;code&gt;~/.local/bin&lt;/code&gt;. No sería conveniente sobrecargar el entorno, es decir, usarlo con &lt;strong&gt;bash-it&lt;/strong&gt;.
Si estamos en duda podemos responder algunas de estas preguntas, frente a un determinado script:&lt;/p&gt;
&lt;p&gt;✔️ ¿Tienen su propio &lt;code&gt;#!/bin/bash&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;✔️ ¿Son &lt;strong&gt;ejecutables&lt;/strong&gt; y no deben ser cargados en el entorno de bash?&lt;/p&gt;
&lt;p&gt;✔️ ¿Pueden usarse desde cualquier shell?&lt;/p&gt;
&lt;p&gt;✔️ ¿Podrían ser usados por otros scripts o tareas automatizadas?&lt;/p&gt;
&lt;p&gt;✔️ ¿Dependen del contexto del entorno interactivo?&lt;/p&gt;
&lt;p&gt;Si la respuesta para una o más a estas preguntas es afirmativa entonces lo mejor es &lt;strong&gt;excluirlos&lt;/strong&gt; del framework bash-it.&lt;/p&gt;
&lt;h4 id="gestion-de-alias-de-bash-it"&gt;Gestión de alias de bash-it&lt;/h4&gt;
&lt;p&gt;Podemos ver los alias habilitados con el comando siguiente:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;bash-it&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;help&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;aliases
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ese comando nos va a mostrar en principio, los alias clasificados en dos categorías: &lt;strong&gt;general&lt;/strong&gt; y &lt;strong&gt;custom&lt;/strong&gt;.
Si queremos ver los alias que tenemos disponibles, ejecutamos:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;bash-it&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;help&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;aliases&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;less
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si queremos habilitar los alias para ansible&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;bash-it&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ansible
ansible&lt;span class="w"&gt; &lt;/span&gt;enabled&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;priority&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;150&lt;/span&gt;.
cat&lt;span class="w"&gt; &lt;/span&gt;.bash_it/enabled/150---ansible.aliases.bash&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="c1"&gt;# shellcheck shell=bash&lt;/span&gt;
about-alias&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'ansible abbreviations'&lt;/span&gt;

&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ans&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ansible
&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ansible-playbook&lt;span class="w"&gt;      &lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;En el ejemplo de arriba podemos inspeccionar los alias activados.&lt;/p&gt;
&lt;h4 id="como-ver-y-activar-plugins"&gt;¿Cómo ver y activar plugins?&lt;/h4&gt;
&lt;p&gt;Las funciones son un grupo de funciones relacionados un tema.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;bash-it&lt;span class="w"&gt; &lt;/span&gt;show&lt;span class="w"&gt; &lt;/span&gt;plugins&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fgrep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[x]"&lt;/span&gt;
base&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;x&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;miscellaneous&lt;span class="w"&gt; &lt;/span&gt;tools

bash-it&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;plugin&lt;span class="w"&gt; &lt;/span&gt;fzf
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;⚠  A veces es necesario ejecutar &lt;code&gt;bash-it&lt;/code&gt; restart para que aplique un cambio, por ejemplo la eliminación de un alias.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id="como-activar-temas"&gt;¿Cómo activar temas?&lt;/h4&gt;
&lt;p&gt;Bash-it cuenta con una gran cantidad de temas para darle un aspecto visual al shell&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ls&lt;span class="w"&gt; &lt;/span&gt;~/.bash_it/themes/
&lt;span class="m"&gt;90210&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;candy&lt;span class="w"&gt;                        &lt;/span&gt;elixr&lt;span class="w"&gt;                  &lt;/span&gt;liquidprompt&lt;span class="w"&gt;  &lt;/span&gt;nwinkler&lt;span class="w"&gt;                &lt;/span&gt;pure&lt;span class="w"&gt;          &lt;/span&gt;slick
agnoster&lt;span class="w"&gt;         &lt;/span&gt;clean&lt;span class="w"&gt;                        &lt;/span&gt;emperor&lt;span class="w"&gt;                &lt;/span&gt;luan&lt;span class="w"&gt;          &lt;/span&gt;nwinkler_random_colors&lt;span class="w"&gt;  &lt;/span&gt;purity&lt;span class="w"&gt;        &lt;/span&gt;standard
atomic&lt;span class="w"&gt;           &lt;/span&gt;codeword&lt;span class="w"&gt;                     &lt;/span&gt;envy&lt;span class="w"&gt;                   &lt;/span&gt;mairan&lt;span class="w"&gt;        &lt;/span&gt;oh-my-posh&lt;span class="w"&gt;              &lt;/span&gt;radek&lt;span class="w"&gt;         &lt;/span&gt;tonka
axin&lt;span class="w"&gt;             &lt;/span&gt;cooperkid&lt;span class="w"&gt;                    &lt;/span&gt;essential&lt;span class="w"&gt;              &lt;/span&gt;mbriggs&lt;span class="w"&gt;       &lt;/span&gt;p4helpers.theme.bash&lt;span class="w"&gt;    &lt;/span&gt;rainbowbrite&lt;span class="w"&gt;  &lt;/span&gt;tonotdo
bakke&lt;span class="w"&gt;            &lt;/span&gt;cupcake&lt;span class="w"&gt;                      &lt;/span&gt;font&lt;span class="w"&gt;                   &lt;/span&gt;metal&lt;span class="w"&gt;         &lt;/span&gt;parrot&lt;span class="w"&gt;                  &lt;/span&gt;ramses&lt;span class="w"&gt;        &lt;/span&gt;tylenol
barbuk&lt;span class="w"&gt;           &lt;/span&gt;demula&lt;span class="w"&gt;                       &lt;/span&gt;gallifrey&lt;span class="w"&gt;              &lt;/span&gt;minimal&lt;span class="w"&gt;       &lt;/span&gt;pete&lt;span class="w"&gt;                    &lt;/span&gt;rana&lt;span class="w"&gt;          &lt;/span&gt;wanelo
base.theme.bash&lt;span class="w"&gt;  &lt;/span&gt;dos&lt;span class="w"&gt;                          &lt;/span&gt;githelpers.theme.bash&lt;span class="w"&gt;  &lt;/span&gt;modern&lt;span class="w"&gt;        &lt;/span&gt;powerline&lt;span class="w"&gt;               &lt;/span&gt;redline&lt;span class="w"&gt;       &lt;/span&gt;zitron
binaryanomaly&lt;span class="w"&gt;    &lt;/span&gt;doubletime&lt;span class="w"&gt;                   &lt;/span&gt;gitline&lt;span class="w"&gt;                &lt;/span&gt;modern-t&lt;span class="w"&gt;      &lt;/span&gt;powerline-multiline&lt;span class="w"&gt;     &lt;/span&gt;rjorgenson&lt;span class="w"&gt;    &lt;/span&gt;zork
bira&lt;span class="w"&gt;             &lt;/span&gt;doubletime_multiline&lt;span class="w"&gt;         &lt;/span&gt;hawaii50&lt;span class="w"&gt;               &lt;/span&gt;modern-time&lt;span class="w"&gt;   &lt;/span&gt;powerline-naked&lt;span class="w"&gt;         &lt;/span&gt;robbyrussell
bobby&lt;span class="w"&gt;            &lt;/span&gt;doubletime_multiline_pyonly&lt;span class="w"&gt;  &lt;/span&gt;inretio&lt;span class="w"&gt;                &lt;/span&gt;morris&lt;span class="w"&gt;        &lt;/span&gt;powerline-plain&lt;span class="w"&gt;         &lt;/span&gt;roderik
bobby-python&lt;span class="w"&gt;     &lt;/span&gt;dulcie&lt;span class="w"&gt;                       &lt;/span&gt;iterate&lt;span class="w"&gt;                &lt;/span&gt;n0qorg&lt;span class="w"&gt;        &lt;/span&gt;powerturk&lt;span class="w"&gt;               &lt;/span&gt;sexy
brainy&lt;span class="w"&gt;           &lt;/span&gt;duru&lt;span class="w"&gt;                         &lt;/span&gt;kitsune&lt;span class="w"&gt;                &lt;/span&gt;newin&lt;span class="w"&gt;         &lt;/span&gt;primer&lt;span class="w"&gt;                  &lt;/span&gt;simple
brunton&lt;span class="w"&gt;          &lt;/span&gt;easy&lt;span class="w"&gt;                         &lt;/span&gt;lambda&lt;span class="w"&gt;                 &lt;/span&gt;norbu&lt;span class="w"&gt;         &lt;/span&gt;pro&lt;span class="w"&gt;                     &lt;/span&gt;sirup
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Para cambiar un tema hay que editar una variable y reiniciar bash-it.
Buscar en &lt;code&gt;~./.bashrc&lt;/code&gt; y cambiarla por el tema que nos guste (el predetermindo es &lt;em&gt;bobby&lt;/em&gt;):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;BASH_IT_THEME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'bobby'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/image_1743461015406_0.png"&gt;&lt;img src="https://sergiobelkin.com/images/image_1743461015406_0.thumbnail.png" alt=""&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3 id="entonces-que-significa-que-bash-it-es-un-framework"&gt;🧩 ¿Entonces qué significa que Bash-it es un framework?&lt;/h3&gt;
&lt;p&gt;Significa que Bash-it provee un &lt;strong&gt;entorno estructurado y modular&lt;/strong&gt; para personalizar tu shell Bash, con:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Elemento del framework&lt;/th&gt;
&lt;th&gt;¿Qué ofrece?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;📁 Estructura de directorios&lt;/td&gt;
&lt;td&gt;Carpetas organizadas (&lt;code&gt;aliases/&lt;/code&gt;, &lt;code&gt;plugins/&lt;/code&gt;, &lt;code&gt;completion/&lt;/code&gt;, &lt;code&gt;themes/&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚙️ Convenciones&lt;/td&gt;
&lt;td&gt;Nombres de archivos (&lt;code&gt;custom.aliases.bash&lt;/code&gt;, &lt;code&gt;custom.plugins.bash&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧰 Herramientas&lt;/td&gt;
&lt;td&gt;Comandos como &lt;code&gt;bash-it enable&lt;/code&gt;, &lt;code&gt;bash-it reload&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📦 Contenido reutilizable&lt;/td&gt;
&lt;td&gt;Alias, funciones, completions y temas listos para usar o modificar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔌 Modularidad&lt;/td&gt;
&lt;td&gt;Activar o desactivar componentes sin tocar &lt;code&gt;.bashrc&lt;/code&gt; directamente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚀 Extensibilidad&lt;/td&gt;
&lt;td&gt;Agregás tus propios módulos sin romper la base (&lt;code&gt;custom/&lt;/code&gt; y &lt;code&gt;enabled/&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="comparacion-simple"&gt;🧪 Comparación simple&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sin framework (bash "a mano")&lt;/th&gt;
&lt;th&gt;Con Bash-it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.bashrc&lt;/code&gt; lleno de alias y funciones&lt;/td&gt;
&lt;td&gt;Alias y funciones separados por módulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No hay forma de desactivar cosas fácilmente&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bash-it disable alias docker&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No hay temas de prompt&lt;/td&gt;
&lt;td&gt;Temas configurables (&lt;code&gt;BASH_IT_THEME=...&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Todo depende de cómo lo escribas vos&lt;/td&gt;
&lt;td&gt;Hay convenciones y helpers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="troubleshooting"&gt;🔧 Troubleshooting&lt;/h3&gt;
&lt;p&gt;La mejor manera de descargar falsos positivos es instalar bash-it en contenedor podman o docker. Una vez que lo probamos allí y descartamoos que haya algo inherente a &lt;strong&gt;bash-it&lt;/strong&gt; o al propio contendor. Luego podemos probarlo en la máquina que tiene el problema creando un usuario de prueba y  realizar las siguientes pruebas.&lt;/p&gt;
&lt;h4 id="comparacion-de-archivos-de-configuracion"&gt;Comparación de archivos de configuración&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;diff&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;/home/sergio/.bashrc&lt;span class="w"&gt; &lt;/span&gt;/home/test/.bashrc
diff&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;/home/sergio/.bash_profile&lt;span class="w"&gt; &lt;/span&gt;/home/test/.bash_profile
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="verificar-multiples-cargas-de-un-determinado-componente"&gt;Verificar múltiples cargas de un determinado componente&lt;/h4&gt;
&lt;p&gt;Por ejemplo, si tenemos sourceado &lt;strong&gt;fzf&lt;/strong&gt; en otro lugar además del plugin de fzf, tendrá problemas al hacer autocompletados de rutas inexistentes, y bash se colgará.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;fzf&lt;span class="w"&gt; &lt;/span&gt;~/.bash*
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="deshabilitar-bash-it-temporalmente"&gt;Deshabilitar bash-it temporalmente&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;cp&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc&lt;span class="w"&gt; &lt;/span&gt;~/.bash.bash-it
cp&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc.bak&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;~/.bashrc&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Luego se puede realizar el proceso inverso si estamos en condiciones de volver a cargar bash-it.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;✅ Conclusión&lt;/h3&gt;
&lt;p&gt;Bash-it un &lt;strong&gt;framework&lt;/strong&gt; es decir que no es solo una colección de scripts, sino una &lt;strong&gt;forma organizada, modular y extensible&lt;/strong&gt; de gestionar tu entorno de Bash, con convenciones y herramientas que te permiten escalar y mantener esa personalización de forma profesional.&lt;/p&gt;
&lt;p&gt;Nos puede proporcinar un salto de calidad en el uso de bash. Por supuesto, ningún software es perfecto. Muchos plugins por ejemplo, tienen funcionalidades obsoletas o que no existen más. 
Y recordar que bash-it &lt;strong&gt;puede ser confiable en producción&lt;/strong&gt;, siempre que:&lt;/p&gt;
&lt;p&gt;✔️ Sea auditado y validado por tu equipo.&lt;br&gt;
✔️ Se mantenga un control estricto sobre lo que se habilita.&lt;br&gt;
✔️ Se provea capacitación a los usuarios.&lt;/p&gt;
&lt;p&gt;Si no estás dispuesto a mantener estos controles internos, entonces &lt;strong&gt;sería más seguro no utilizarlo&lt;/strong&gt; y seguir con &lt;code&gt;.bashrc&lt;/code&gt; tradicionales o scripts controlados internamente.&lt;/p&gt;
&lt;p&gt;De todas maneras esas tres condiciones: ¿no deberían aplicarlse a cualquier herramienta que se quiera adoptar?&lt;/p&gt;
&lt;p&gt;Por otro lado, probar &lt;strong&gt;bash-it&lt;/strong&gt; me sirvió para revisar configuraciones que venía acumulando con los años, muchas de ellas, las eliminé y otras las mejoré para adoptar las mejores prácticas de bash. Indudablemente un sysadmin experimentado podrá probablemente prescindir de bash-it, y usar una configuración ajustada a sus necesidades. &lt;strong&gt;Y ese es el aporte de bash-it, hacernos ver que podemos tener una configuración mucho más modular y ordenada.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuándo fue la última vez que verificaste tu entorno de shell?&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id="recursos-recomendados-para-aprovechar-a-fondo-bash"&gt;🔗 Recursos recomendados para aprovechar a fondo Bash&lt;/h4&gt;
&lt;p&gt;🔖 &lt;a href="https://www.gnu.org/software/bash/manual/bash.html"&gt;Bash Manual (GNU)&lt;/a&gt;&lt;br&gt;
La referencia canónica de Bash. Leé esto si querés entender cómo y por qué funciona Bash, no solo qué comandos usar.&lt;/p&gt;
&lt;p&gt;🔖 &lt;a href="https://github.com/Bash-it/bash-it"&gt;Repositorio oficial de Bash-it&lt;/a&gt;&lt;br&gt;
Tu punto de partida para transformar Bash en un entorno potente, modular y personal.&lt;/p&gt;
&lt;p&gt;🔖 &lt;a href="http://wiki.bash-hackers.org/"&gt;The Bash Hackers Wiki&lt;/a&gt;&lt;br&gt;
Recurso mantenido por la comunidad técnica, con explicaciones brillantes sobre los aspectos más sutiles del shell.&lt;/p&gt;
&lt;p&gt;🔖 &lt;a href="https://mywiki.wooledge.org/BashPitfalls"&gt;Greg's Wiki – Bash Pitfalls&lt;/a&gt;&lt;br&gt;
Una lista imprescindible de errores comunes en Bash, explicados por uno de los gurús del scripting shell.&lt;/p&gt;
&lt;p&gt;🔖 &lt;a href="https://www.shellcheck.net/wiki/Checks"&gt;Checks – ShellCheck Wiki&lt;/a&gt;&lt;br&gt;
Una guía didáctica, profunda y sin concesiones. Ideal para quienes ya programan pero quieren escribir Bash de verdad.
ShellCheck es una extraordinaria herramienta para verificar la calidad de nuestrs scrits y configuracines de bash. Aquí podemos consultar los &lt;strong&gt;SC codes&lt;/strong&gt;,&lt;/p&gt;</description><category>bash</category><category>sysadmin</category><guid>https://sergiobelkin.com/posts/frameworks-para-bash-mirada-en-profundidad/</guid><pubDate>Wed, 02 Apr 2025 18:07:44 GMT</pubDate></item><item><title>Introducción a nftables y familia de direcciones</title><link>https://sergiobelkin.com/posts/introduccion-a-nftables/</link><dc:creator>sebelk</dc:creator><description>&lt;h3 id="historia-e-introduccion"&gt;Historia e Introducción&lt;/h3&gt;
&lt;p&gt;Antes de iptables y nftables, existía &lt;strong&gt;ipfwadm&lt;/strong&gt;, una herramienta que se utilizaba en las primeras versiones del kernel de Linux para gestionar el firewall. Aunque ipfwadm sentó las bases para el firewalling en Linux, fue reemplazada debido a su limitada capacidad de manejo de tráfico y escalabilidad. Primero fue sustituida por &lt;em&gt;ipchains&lt;/em&gt; y más tarde por el popular &lt;em&gt;iptables&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/nftables-families-circled.webp"&gt;&lt;img src="https://sergiobelkin.com/images/nftables-families-circled.thumbnail.webp" alt="nftables"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4 id="comunidad-y-grupos-clave"&gt;Comunidad y Grupos Clave&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Netfilter Project&lt;/strong&gt;: La comunidad principal detrás de iptables y nftables. Este grupo ha sido esencial en el desarrollo, mantenimiento y promoción de herramientas de filtrado de paquetes en Linux.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kernel Contributors&lt;/strong&gt;: Muchos desarrolladores de kernel han colaborado en la optimización de las capacidades de firewalling en Linux, asegurando su integración fluida y eficiente.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="creacion-de-nftables"&gt;Creación de nftables&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;nftables&lt;/strong&gt; fue introducido en 2014 como el sucesor de iptables, diseñado para abordar las limitaciones de su predecesor en términos de rendimiento y escalabilidad. &lt;/p&gt;
&lt;p&gt;Si bien eso fue hace más de 10 años, hay cambios tecnológicos que van por ascensor y otros por escalera. En ámbitos corporativos el mero hecho de reemplazar un software que es cardinal en una infraestructura, no es una tarea trivial. Ese cambio se debe a que los tiempos de vida de las distribuciones que las medianas y grandes organizaciones tienen soporte a largo a plazo. A veces es falta de urgencia y otras veces por sencilla negligencia :smile:.&lt;/p&gt;
&lt;p&gt;Sin embargo apenas 3 datos para considerar la adopción de nftables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RHEL9 considera iptables, ipset y ebtables herramientas depreciadas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;iptables no estará disponible en RHEL10 ni en OpenShift 4.16.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Debian Bullseye (a la fecha oldstable) ha depreciado iptables en favor de nftables.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="cual-es-el-problema-de-iptables"&gt;&lt;strong&gt;¿Cuál es el problema de iptables?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Aunque ha sido una herramienta extraordinaria que ha servido de base para muchas soluciones de firewall, &lt;strong&gt;iptables&lt;/strong&gt; presenta algunas limitaciones. A continuación, mencionamos tres de las más importantes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reprocesamiento completo al modificar reglas&lt;/strong&gt;:&lt;br&gt;
   Cada vez que se agrega o elimina una regla, el kernel debe volver a procesar toda la lista de reglas. Este enfoque resulta ineficiente, especialmente en entornos donde se realizan cambios frecuentes o se manejan firewalls con un gran número de reglas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gestión complicada de rangos de direcciones IP&lt;/strong&gt;:&lt;br&gt;
   Manejar rangos de direcciones IP o grandes conjuntos de direcciones en &lt;strong&gt;iptables&lt;/strong&gt; puede ser tedioso y poco práctico. La herramienta &lt;strong&gt;ipset&lt;/strong&gt; fue una solución ingeniosa para optimizar esta tarea, ya que permite manejar conjuntos de IPs, rangos o puertos de manera más eficiente. Sin embargo, su uso añade una capa de complejidad adicional al proceso de configuración y gestión.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Extensiones con sintaxis inconsistente&lt;/strong&gt;:&lt;br&gt;
&lt;strong&gt;iptables&lt;/strong&gt; cuenta con extensiones como &lt;strong&gt;xtables&lt;/strong&gt;, que amplían sus funcionalidades al incluir capacidades avanzadas como el seguimiento de conexiones o la inspección profunda de protocolos. No obstante, la sintaxis de estas extensiones no siempre es uniforme ni intuitiva, lo que puede dificultar su uso y generar confusiones en configuraciones complejas.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En cambio, desde su incorporación, &lt;strong&gt;nftables&lt;/strong&gt; ha demostrado ser una herramienta eficiente y moderna para la gestión del tráfico de red en Linux. Una de sus principales innovaciones es consolidar las herramientas clásicas como iptables, ip6tables, ebtables y arptables en una única interfaz, simplificando tanto la configuración como el mantenimiento.&lt;/p&gt;
&lt;h3 id="conceptos-claves-de-nftables"&gt;Conceptos claves de nftables&lt;/h3&gt;
&lt;h4 id="contexto-y-familias-de-direcciones"&gt;Contexto y Familias de Direcciones&lt;/h4&gt;
&lt;p&gt;En &lt;code&gt;iptables&lt;/code&gt;, cada tipo de tráfico o protocolo tenía su propio comando o herramienta específica, que funcionaba de manera independiente:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Comando/herramienta&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Propósito&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;iptables&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filtrar y manipular tráfico IPv4.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;ip6tables&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filtrar y manipular tráfico IPv6.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;arptables&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filtrar y manipular tráfico ARP.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;ebtables&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filtrar tráfico en bridges (Ethernet frames).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Cada una de estas herramientas tenía su propia sintaxis y requería comandos separados para manejar diferentes tipos de tráfico, lo que podía ser confuso y propenso a errores.&lt;/p&gt;
&lt;h5 id="problemas-del-enfoque-de-iptables"&gt;&lt;strong&gt;Problemas del enfoque de iptables&lt;/strong&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fragmentación:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Si querías manejar tráfico IPv4 e IPv6, debías configurar reglas separadas con &lt;code&gt;iptables&lt;/code&gt; e &lt;code&gt;ip6tables&lt;/code&gt;, incluso si las reglas eran idénticas.&lt;/li&gt;
&lt;li&gt;Lo mismo ocurría si querías gestionar tráfico ARP con &lt;code&gt;arptables&lt;/code&gt; o tráfico en bridges con &lt;code&gt;ebtables&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Falta de unificación:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Cada herramienta tenía su propia lógica, lo que aumentaba la complejidad administrativa.&lt;/li&gt;
&lt;li&gt;No existía una forma centralizada de gestionar tráfico que abarcase múltiples protocolos o tipos de datos.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mantenimiento difícil:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Las configuraciones de firewall requerían gestionar múltiples conjuntos de reglas, lo que hacía el mantenimiento y la depuración más complicados.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id="como-nftables-mejoro-este-enfoque"&gt;&lt;strong&gt;Cómo nftables mejoró este enfoque:&lt;/strong&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Introducción de familias:&lt;/strong&gt; En &lt;code&gt;nftables&lt;/code&gt;, las &lt;strong&gt;familias&lt;/strong&gt; permiten manejar diferentes tipos de tráfico dentro de un mismo marco conceptual, con una sintaxis unificada.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Familia &lt;code&gt;ip&lt;/code&gt;: Maneja tráfico IPv4.&lt;/li&gt;
&lt;li&gt;Familia &lt;code&gt;ip6&lt;/code&gt;: Maneja tráfico IPv6.&lt;/li&gt;
&lt;li&gt;Familia &lt;code&gt;inet&lt;/code&gt;: Unifica IPv4 e IPv6.&lt;/li&gt;
&lt;li&gt;Familia &lt;code&gt;arp&lt;/code&gt;: Maneja tráfico ARP.&lt;/li&gt;
&lt;li&gt;Familia &lt;code&gt;bridge&lt;/code&gt;: Maneja tráfico L2 en bridges.&lt;/li&gt;
&lt;li&gt;Familia &lt;code&gt;netdev&lt;/code&gt;: Maneja tráfico en interfaces específicas.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Unificación de reglas:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Con la familia &lt;code&gt;inet&lt;/code&gt;, puedes escribir reglas que funcionen tanto para IPv4 como para IPv6.&lt;/li&gt;
&lt;li&gt;Esto simplifica significativamente la configuración y el mantenimiento del firewall.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Menor duplicación de configuraciones:&lt;/strong&gt; En lugar de mantener múltiples herramientas (&lt;code&gt;iptables&lt;/code&gt;, &lt;code&gt;ip6tables&lt;/code&gt;, &lt;code&gt;arptables&lt;/code&gt;, &lt;code&gt;ebtables&lt;/code&gt;), todo se gestiona con el comando &lt;code&gt;nft&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Ejemplos en &lt;code&gt;nftables&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;# Una regla para IPv4 e IPv6&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;inet&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;input&lt;span class="w"&gt; &lt;/span&gt;ip&lt;span class="w"&gt; &lt;/span&gt;saddr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.0.0/24&lt;span class="w"&gt; &lt;/span&gt;accept
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;inet&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;input&lt;span class="w"&gt; &lt;/span&gt;ip6&lt;span class="w"&gt; &lt;/span&gt;saddr&lt;span class="w"&gt; &lt;/span&gt;fc00::/7&lt;span class="w"&gt; &lt;/span&gt;accept
&lt;/pre&gt;&lt;/div&gt;

&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;filter
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;chain&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;input&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;input&lt;span class="w"&gt; &lt;/span&gt;priority&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# Permitir solicitudes ARP desde el rango 192.168.1.0/24 en eth0&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;input&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;sip&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.1.0/24&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;op&lt;span class="w"&gt; &lt;/span&gt;request&lt;span class="w"&gt; &lt;/span&gt;accept

&lt;span class="c1"&gt;# Bloquear cualquier otra solicitud ARP&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;input&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;op&lt;span class="w"&gt; &lt;/span&gt;request&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;chain&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;priority&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# Permitir solicitudes ARP desde direcciones MAC específicas en el bridge br0&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"br0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ether&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;op&lt;span class="w"&gt; &lt;/span&gt;request&lt;span class="w"&gt; &lt;/span&gt;ether&lt;span class="w"&gt; &lt;/span&gt;saddr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:11:22:33:44:55&lt;span class="w"&gt; &lt;/span&gt;accept
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"br0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ether&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;op&lt;span class="w"&gt; &lt;/span&gt;request&lt;span class="w"&gt; &lt;/span&gt;ether&lt;span class="w"&gt; &lt;/span&gt;saddr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:aa:bb:cc:dd:ee&lt;span class="w"&gt; &lt;/span&gt;accept

&lt;span class="c1"&gt;# Bloquear cualquier otra solicitud ARP en el bridge&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"br0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ether&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;op&lt;span class="w"&gt; &lt;/span&gt;request&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;h5 id="diferencia-entre-las-familias-inet-y-netdev"&gt;Diferencia entre las familias inet y netdev&lt;/h5&gt;
&lt;p&gt;La familia &lt;code&gt;netdev&lt;/code&gt;&lt;strong&gt; puede ser una opción adecuada para implementar &lt;/strong&gt;policing&lt;strong&gt; con &lt;code&gt;nftables&lt;/code&gt;, dependiendo del escenario. Esto se debe a que la familia &lt;code&gt;netdev&lt;/code&gt; opera en el &lt;/strong&gt;hook &lt;code&gt;ingress&lt;/code&gt;, lo que significa que puede evaluar el tráfico &lt;strong&gt;directamente en la interfaz&lt;/strong&gt; antes de que llegue al stack de red.&lt;/p&gt;
&lt;p&gt;Vamos a explorar por qué usar la familia &lt;code&gt;netdev&lt;/code&gt; podría ser más apropiado para policing en algunos casos y cuándo es mejor utilizar otras familias.&lt;/p&gt;
&lt;h6 id="por-que-usar-la-familia-netdev-para-policing"&gt;&lt;strong&gt;Por qué usar la familia netdev para policing:&lt;/strong&gt;&lt;/h6&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Posición temprana en el flujo del tráfico:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;La familia &lt;code&gt;netdev&lt;/code&gt; opera en el hook &lt;strong&gt;&lt;code&gt;ingress&lt;/code&gt;&lt;/strong&gt;, lo que significa que intercepta el tráfico &lt;strong&gt;inmediatamente después de que llega a la interfaz de red&lt;/strong&gt; y antes de que sea procesado por el stack TCP/IP.&lt;/li&gt;
&lt;li&gt;Esto permite implementar políticas de policing directamente en el nivel de la interfaz, evitando sobrecargar el sistema con tráfico innecesario.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Ejemplo de regla de policing en &lt;code&gt;netdev&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;ingress
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;chain&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;mychain&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;priority&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;mychain&lt;span class="w"&gt; &lt;/span&gt;ip&lt;span class="w"&gt; &lt;/span&gt;limit&lt;span class="w"&gt; &lt;/span&gt;rate&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mbps&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Esta regla limita el tráfico IP entrante a 10 Mbps en la interfaz.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Evitar procesamiento innecesario:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Como &lt;code&gt;netdev&lt;/code&gt; actúa antes de que los paquetes sean entregados al stack TCP/IP, los paquetes que no cumplen con las políticas son descartados sin consumir recursos adicionales del sistema.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ideal para interfaces específicas:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cuando el objetivo es aplicar policing solo en una interfaz específica (por ejemplo, &lt;code&gt;eth0&lt;/code&gt;), la familia &lt;code&gt;netdev&lt;/code&gt; es la opción más directa.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compatibilidad con &lt;code&gt;limit rate&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;La familia &lt;code&gt;netdev&lt;/code&gt; admite acciones como &lt;code&gt;limit rate&lt;/code&gt;, que es esencial para configurar políticas de policing basadas en rates.&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="cuando-usar-netdev-frente-a-otras-familias-ip-inet"&gt;&lt;strong&gt;¿Cuándo usar netdev frente a otras familias (ip, inet)?&lt;/strong&gt;&lt;/h6&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Criterio&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Familia &lt;code&gt;netdev&lt;/code&gt;&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Familias &lt;code&gt;ip&lt;/code&gt;/&lt;code&gt;inet&lt;/code&gt;&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Posición en el stack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hook &lt;code&gt;ingress&lt;/code&gt;, antes del stack TCP/IP.&lt;/td&gt;
&lt;td&gt;Hook &lt;code&gt;prerouting&lt;/code&gt;, &lt;code&gt;forward&lt;/code&gt;, o &lt;code&gt;input&lt;/code&gt;, después de ingresar al stack.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Eficiencia&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Muy alta: paquetes descartados antes de procesarse.&lt;/td&gt;
&lt;td&gt;Menor: los paquetes son procesados parcialmente antes de aplicar las políticas.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tráfico inspeccionado&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Solo tráfico entrante en una interfaz específica.&lt;/td&gt;
&lt;td&gt;Tráfico en todas las interfaces (dependiendo de la configuración).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complejidad de las reglas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Más limitada: ideal para políticas simples (policing básico).&lt;/td&gt;
&lt;td&gt;Más flexible: soporta reglas complejas (filtrado avanzado, conntrack).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Uso típico&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Policing directo en una interfaz (DDoS, límites de ancho de banda).&lt;/td&gt;
&lt;td&gt;Filtrado y políticas basadas en estado o dirección IP.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h6 id="limitaciones-de-la-familia-netdev"&gt;&lt;strong&gt;Limitaciones de la familia netdev:&lt;/strong&gt;&lt;/h6&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Solo para tráfico entrante:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La familia &lt;code&gt;netdev&lt;/code&gt; opera únicamente en el hook &lt;code&gt;ingress&lt;/code&gt;, por lo que no puedes aplicar policing en el tráfico saliente de una interfaz.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Falta de seguimiento de conexiones (&lt;code&gt;conntrack&lt;/code&gt;):&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No puedes usar estados como &lt;code&gt;NEW&lt;/code&gt; o &lt;code&gt;ESTABLISHED&lt;/code&gt;, ya que &lt;code&gt;netdev&lt;/code&gt; opera antes de que el módulo &lt;code&gt;conntrack&lt;/code&gt; pueda procesar el tráfico.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Menor flexibilidad:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Si necesitás reglas más complejas basadas en capas superiores (por ejemplo, L7 o estados de conexión), las familias &lt;code&gt;ip&lt;/code&gt; o &lt;code&gt;inet&lt;/code&gt; son más adecuadas.&lt;/li&gt;
&lt;/ol&gt;
&lt;h6 id="cuando-es-mejor-usar-la-familia-netdev-para-policing"&gt;&lt;strong&gt;¿Cuándo es mejor usar la familia netdev para policing?&lt;/strong&gt;&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tráfico entrante en una interfaz específica:&lt;/strong&gt; Cuando necesitás limitar o descartar tráfico directamente en una interfaz antes de que afecte el sistema. Ejemplo: Mitigar un ataque DDoS en &lt;code&gt;eth0&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Simplicidad y eficiencia:&lt;/strong&gt; Si solo necesitas evaluar tráfico basándote en tasas o direcciones básicas (IP, MAC).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="ejemplo-practico"&gt;&lt;strong&gt;Ejemplo práctico:&lt;/strong&gt;&lt;/h6&gt;
&lt;p&gt;Supongamos que queremos limitar el tráfico entrante a 100 Mbps en una interfaz específica (&lt;code&gt;eth0&lt;/code&gt;):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;ingress
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;chain&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;eth0_chain&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;priority&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;eth0_chain&lt;span class="w"&gt; &lt;/span&gt;limit&lt;span class="w"&gt; &lt;/span&gt;rate&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mbps&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="diferencia-entre-la-familia-bridge-y-netdev"&gt;Diferencia entre la familia bridge y netdev&lt;/h4&gt;
&lt;p&gt;Dado que la tanto la tabla &lt;strong&gt;bridge&lt;/strong&gt; como la tabla &lt;strong&gt;netdev&lt;/strong&gt; operan en Capa 2 uno podría preguntarse, qué diferencia hay entre estas dos familias, aquí tenemos una tabla comparativa detallada entre las familias &lt;strong&gt;&lt;code&gt;bridge&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;netdev&lt;/code&gt;&lt;/strong&gt; en &lt;code&gt;nftables&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Aspecto&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Familia &lt;code&gt;bridge&lt;/code&gt;&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Familia &lt;code&gt;netdev&lt;/code&gt;&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nivel del modelo OSI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Capa 2 (L2)&lt;/td&gt;
&lt;td&gt;Capa 2 (L2), pero en el contexto de interfaces individuales.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tráfico manejado&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tráfico que cruza un bridge (tramas Ethernet).&lt;/td&gt;
&lt;td&gt;Todo el tráfico en una interfaz específica antes de llegar al stack de red.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Propósito principal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Controlar y filtrar tráfico dentro de bridges.&lt;/td&gt;
&lt;td&gt;Filtrar tráfico en una interfaz individual (sin importar si forma parte de un bridge).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ámbito de aplicación&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Solo funciona en interfaces que forman parte de un bridge.&lt;/td&gt;
&lt;td&gt;Funciona en cualquier interfaz (física o virtual), bridge o no.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Casos de uso típicos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- Aislar tráfico entre puertos de un bridge.&lt;br&gt;- Proteger bridges contra broadcast storms, spoofing de MAC, etc.&lt;br&gt;- Controlar tráfico entre VLANs en un bridge.&lt;/td&gt;
&lt;td&gt;- Filtrar tráfico directo en una interfaz (ingress/egress).&lt;br&gt;- Detectar y mitigar DDoS a nivel de interfaz.&lt;br&gt;- Filtrar ARP o IPv4 antes de pasar al stack de red.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compatibilidad con VLANs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sí, puede filtrar tráfico basado en etiquetas VLAN (802.1Q).&lt;/td&gt;
&lt;td&gt;No trabaja específicamente con VLANs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Estado de conexión&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No tiene integración con &lt;code&gt;conntrack&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;No tiene integración con &lt;code&gt;conntrack&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Posición en el stack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filtra tráfico que pasa a través de un bridge antes de ser reenviado.&lt;/td&gt;
&lt;td&gt;Filtra tráfico directamente en una interfaz, antes de ser procesado por el stack de red.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Soporte de ARP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sí, puede filtrar tramas ARP.&lt;/td&gt;
&lt;td&gt;Sí, puede filtrar tramas ARP.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Soporte de IPv4/IPv6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sí, puede inspeccionar tráfico IP encapsulado.&lt;/td&gt;
&lt;td&gt;Sí, puede inspeccionar tráfico IP encapsulado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Direcciones MAC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Puede filtrar según direcciones MAC de origen y destino.&lt;/td&gt;
&lt;td&gt;Puede filtrar según direcciones MAC de origen y destino.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Uso con interfaces individuales&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No, requiere que las interfaces formen parte de un bridge.&lt;/td&gt;
&lt;td&gt;Sí, funciona en cualquier interfaz individual.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reemplaza a...&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ebtables&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tc ingress&lt;/code&gt; para ciertas tareas de filtrado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Limitaciones&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- Solo opera en tráfico dentro de bridges.&lt;br&gt;- No puede controlar tráfico de interfaces individuales fuera del bridge.&lt;/td&gt;
&lt;td&gt;- No tiene integración con &lt;code&gt;conntrack&lt;/code&gt;.&lt;br&gt;- No puede manejar tráfico reenviado entre interfaces.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h5 id="diferencias-clave-entre-bridge-y-netdev"&gt;&lt;strong&gt;Diferencias clave entre bridge y netdev:&lt;/strong&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ámbito del tráfico manejado:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;bridge&lt;/code&gt;:&lt;/strong&gt; Filtra tráfico que cruza un bridge, conectando múltiples interfaces dentro del mismo dominio de difusión.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;netdev&lt;/code&gt;:&lt;/strong&gt; Filtra tráfico directo en una interfaz individual, antes de pasar al stack de red.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dependencia de bridges:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;bridge&lt;/code&gt;:&lt;/strong&gt; Solo funciona en interfaces que son parte de un bridge.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;netdev&lt;/code&gt;:&lt;/strong&gt; Funciona en cualquier interfaz, sin importar si es parte de un bridge o no.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Posición en el stack de red:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;bridge&lt;/code&gt;:&lt;/strong&gt; Opera después de que el tráfico ha ingresado al bridge pero antes de ser reenviado a otra interfaz.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;netdev&lt;/code&gt;:&lt;/strong&gt; Opera antes de que el tráfico entre al stack de red del sistema operativo, en el &lt;strong&gt;hook &lt;code&gt;ingress&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Casos de uso:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;bridge&lt;/code&gt;:&lt;/strong&gt; Aislar tráfico dentro del bridge, controlar VLANs, proteger contra ataques L2 como spoofing de MAC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;netdev&lt;/code&gt;:&lt;/strong&gt; Inspeccionar todo el tráfico que entra o sale de una interfaz específica, ideal para mitigación temprana de DDoS o filtros basados en MAC/IP/ARP.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h5 id="cuando-usar-cada-una"&gt;&lt;strong&gt;¿Cuándo usar cada una?&lt;/strong&gt;&lt;/h5&gt;
&lt;h6 id="usa-la-familia-bridge-si"&gt;&lt;strong&gt;Usa la familia bridge si:&lt;/strong&gt;&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Tenemos configurado un bridge que conecta múltiples interfaces.&lt;/li&gt;
&lt;li&gt;Necesitamos controlar tráfico entre dispositivos conectados al mismo bridge.&lt;/li&gt;
&lt;li&gt;Queremos aislar tráfico entre VLANs o puertos del bridge.&lt;/li&gt;
&lt;li&gt;Deseamos implementar políticas de seguridad para tráfico L2 dentro del bridge.&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="usa-la-familia-netdev-si"&gt;&lt;strong&gt;Usa la familia netdev si:&lt;/strong&gt;&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Queremos filtrar tráfico directo en una interfaz individual, incluso si no es parte de un bridge.&lt;/li&gt;
&lt;li&gt;Necesitamos mitigar DDoS o ataques en el hook más temprano (&lt;code&gt;ingress&lt;/code&gt;), antes de que el tráfico llegue al stack de red.&lt;/li&gt;
&lt;li&gt;Deseamos inspeccionar tráfico ARP, IPv4 o IPv6 en una interfaz específica.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="ejemplos-practicos"&gt;&lt;strong&gt;Ejemplos prácticos:&lt;/strong&gt;&lt;/h4&gt;
&lt;h5 id="con-bridge"&gt;&lt;strong&gt;Con bridge:&lt;/strong&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;Bloquear tráfico entre dos interfaces en un bridge:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;chain&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;priority&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;oif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;drop
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;oif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Permitir solo tráfico ARP en el bridge:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;ether&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;accept
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;h5 id="con-netdev"&gt;&lt;strong&gt;Con netdev:&lt;/strong&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;Bloquear todo el tráfico IPv4 en una interfaz específica (&lt;code&gt;eth0&lt;/code&gt;):&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;filter
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;chain&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;priority&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ip&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Mitigar ataques DDoS limitando paquetes por segundo:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ip&lt;span class="w"&gt; &lt;/span&gt;limit&lt;span class="w"&gt; &lt;/span&gt;rate&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;/second&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;h5 id="entonces"&gt;&lt;strong&gt;Entonces:&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Familia &lt;code&gt;bridge&lt;/code&gt;:&lt;/strong&gt; Para manejar tráfico dentro de un bridge, enfocándose en L2 (direcciones MAC, VLANs, tramas Ethernet).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Familia &lt;code&gt;netdev&lt;/code&gt;:&lt;/strong&gt; Para filtrar tráfico temprano en una interfaz específica, independientemente de si forma parte de un bridge.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ambas familias trabajan en L2, pero con propósitos distintos y aplicables en diferentes escenarios.&lt;/p&gt;
&lt;h4 id="resumen"&gt;Resumen:&lt;/h4&gt;
&lt;p&gt;En &lt;code&gt;iptables&lt;/code&gt;, no existía el concepto de familias. En su lugar, se usaban herramientas separadas para cada protocolo o tipo de tráfico (&lt;code&gt;iptables&lt;/code&gt;, &lt;code&gt;ip6tables&lt;/code&gt;, &lt;code&gt;arptables&lt;/code&gt;, &lt;code&gt;ebtables&lt;/code&gt;). Esto hacía que la configuración fuera fragmentada y menos eficiente.&lt;/p&gt;
&lt;p&gt;Con la llegada de &lt;code&gt;nftables&lt;/code&gt;, se introdujo el concepto de familias para unificar la gestión de diferentes tipos de tráfico, mejorando la flexibilidad, la simplicidad y el mantenimiento de las reglas de firewall. Este cambio fue una de las razones clave por las que &lt;code&gt;nftables&lt;/code&gt; es considerado un reemplazo moderno y más avanzado.&lt;/p&gt;
&lt;p&gt;Conocer en profundidad nftables y el concepto de las familias, tiene implicancias sumamente prácticas. Por ejemplo: ¿qué familia usarías para poder separar en una misma LAN el tráfico inalámbrico del cableado? Lo dejo para que lo pienses. 😊&lt;/p&gt;
&lt;h3 id="fuentes-y-mas-informacion"&gt;Fuentes y más información&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.nftables.org/wiki-nftables/index.php/Main_Page"&gt;Documentación oficial de nftables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://netfilter.org/"&gt;Sitio Oficial del proyecto netfilter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://netfilter.org/about.html#history"&gt;Historia del proyecto Netfilter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>networking</category><category>seguridad</category><category>sysadmin</category><guid>https://sergiobelkin.com/posts/introduccion-a-nftables/</guid><pubDate>Wed, 22 Jan 2025 18:07:44 GMT</pubDate></item><item><title>¿SELinux? Nah, dejalo en Disabled</title><link>https://sergiobelkin.com/posts/selinux-nah-deshabilitalo/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;En el mundo real muchos sysadmins y developers en sistemas operativos de la familia Red Hat deshabilitan &lt;strong&gt;SELinux&lt;/strong&gt;.
"¡Es muy difícil!" dicen. En Ubuntu ni en Debian existe esa cuestión ya que en su lugar se usa AppArmor.
Este post no te dará servido en bandeja como solucionar un problema, sino algo mucho más valioso, que es &lt;strong&gt;entender el fundamento del comportamiento de SELinux y por qué funciona la solución que vayas a aplicar&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Usamos un caso práctico: tenemos una instalación basada en Laravel, php-fpm y con nginx como web server. &lt;/p&gt;
&lt;div style="float: right; margin-left: 15px; width: 300px; max-width: 100%;"&gt;
&lt;a class="image-reference" href="https://sergiobelkin.com/images/SELINUX_ENABLED.webp"&gt;
&lt;img src="https://sergiobelkin.com/images/SELINUX_ENABLED.thumbnail.webp" alt="Entiendiendo SELinux"&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Tenemos una estructura de directorio así:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;tree&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/home/sergio/laravel-voyager/
/home/sergio/laravel-voyager/
├──&lt;span class="w"&gt; &lt;/span&gt;app
├──&lt;span class="w"&gt; &lt;/span&gt;artisan
├──&lt;span class="w"&gt; &lt;/span&gt;bootstrap
├──&lt;span class="w"&gt; &lt;/span&gt;composer.json
├──&lt;span class="w"&gt; &lt;/span&gt;composer.lock
├──&lt;span class="w"&gt; &lt;/span&gt;config
├──&lt;span class="w"&gt; &lt;/span&gt;database
├──&lt;span class="w"&gt; &lt;/span&gt;lang
├──&lt;span class="w"&gt; &lt;/span&gt;package.json
├──&lt;span class="w"&gt; &lt;/span&gt;phpunit.xml
├──&lt;span class="w"&gt; &lt;/span&gt;public
├──&lt;span class="w"&gt; &lt;/span&gt;README.md
├──&lt;span class="w"&gt; &lt;/span&gt;resources
├──&lt;span class="w"&gt; &lt;/span&gt;routes
├──&lt;span class="w"&gt; &lt;/span&gt;storage
├──&lt;span class="w"&gt; &lt;/span&gt;tests
├──&lt;span class="w"&gt; &lt;/span&gt;vendor
└──&lt;span class="w"&gt; &lt;/span&gt;vite.config.js

&lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;directories,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;files
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Veamos la información de SELinux para algunos archivos y directorios:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="o"&gt;[&lt;/span&gt;sergio@masterk&lt;span class="w"&gt; &lt;/span&gt;laravel-voyager&lt;span class="o"&gt;]&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-Zd&lt;span class="w"&gt; &lt;/span&gt;public/storage&lt;span class="w"&gt; &lt;/span&gt;/etc/nginx&lt;span class="w"&gt; &lt;/span&gt;/home/sergio/.bashrc&lt;span class="w"&gt; &lt;/span&gt;/root/.bashrc&lt;span class="w"&gt; &lt;/span&gt;/usr/share/nginx/&lt;span class="w"&gt; &lt;/span&gt;bootstrap/cache/
&lt;span class="o"&gt;[&lt;/span&gt;sudo&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;password&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sergio:&lt;span class="w"&gt; &lt;/span&gt;
unconfined_u:object_r:user_home_t:s0&lt;span class="w"&gt; &lt;/span&gt;bootstrap/cache/&lt;span class="w"&gt;      &lt;/span&gt;unconfined_u:object_r:user_home_t:s0&lt;span class="w"&gt; &lt;/span&gt;public/storage
&lt;span class="w"&gt; &lt;/span&gt;system_u:object_r:httpd_config_t:s0&lt;span class="w"&gt; &lt;/span&gt;/etc/nginx&lt;span class="w"&gt;               &lt;/span&gt;system_u:object_r:admin_home_t:s0&lt;span class="w"&gt; &lt;/span&gt;/root/.bashrc
&lt;span class="w"&gt;    &lt;/span&gt;system_u:object_r:user_home_t:s0&lt;span class="w"&gt; &lt;/span&gt;/home/sergio/.bashrc&lt;span class="w"&gt;            &lt;/span&gt;system_u:object_r:usr_t:s0&lt;span class="w"&gt; &lt;/span&gt;/usr/share/nginx/
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si bien la salida es demasiado críptica, la podemos descifrar:&lt;/p&gt;
&lt;style&gt;
  table {
  }
  th, td {
    padding: 10px;
    text-align: left;
  }
&lt;/style&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Archivo/Directorio&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Usuario (SELinux)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Rol (SELinux)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Asignación basada en tipos (SELinux)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Rango (SELinux)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descripción y Observaciones&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;bootstrap/cache/&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unconfined_u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object_r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user_home_t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Considerado como parte del directorio personal de un usuario. &lt;strong&gt;Debe ser &lt;code&gt;httpd_sys_rw_content_t&lt;/code&gt;&lt;/strong&gt; para Laravel.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;public/storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unconfined_u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object_r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user_home_t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Similar a &lt;code&gt;bootstrap/cache&lt;/code&gt;. &lt;strong&gt;Debe ser &lt;code&gt;httpd_sys_content_t&lt;/code&gt;&lt;/strong&gt; para que Laravel sirva archivos estáticos.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;/etc/nginx&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;system_u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object_r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;httpd_config_t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Archivo de configuración de Nginx. Correctamente etiquetado como &lt;code&gt;httpd_config_t&lt;/code&gt;. No requiere cambios.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;/home/sergio/.bashrc&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;system_u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object_r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user_home_t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Archivo personal de configuración de un usuario. Etiquetado como &lt;code&gt;user_home_t&lt;/code&gt;, lo cual es correcto.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;/root/.bashrc&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;system_u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object_r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;admin_home_t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Archivo de configuración del usuario &lt;code&gt;root&lt;/code&gt;. Etiquetado como &lt;code&gt;admin_home_t&lt;/code&gt;, lo cual es correcto.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;/usr/share/nginx/&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;system_u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object_r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;usr_t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Etiquetado como &lt;code&gt;usr_t&lt;/code&gt;, que es genérico. &lt;strong&gt;Debe ser &lt;code&gt;httpd_sys_content_t&lt;/code&gt;&lt;/strong&gt; si Nginx sirve contenido estático aquí.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="descripcion-de-los-campos"&gt;Descripción de los campos&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Concepto&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descripción&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Ejemplo&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Usuario (SELinux)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Define el usuario de SELinux asociado al recurso.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;system_u&lt;/code&gt;: Archivo gestionado por el sistema. &lt;br&gt; &lt;code&gt;unconfined_u&lt;/code&gt;: Archivo de un usuario sin restricciones.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rol (SELinux)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Define el rol asignado al recurso.&lt;/td&gt;
&lt;td&gt;Usualmente es &lt;code&gt;object_r&lt;/code&gt; para archivos regulares y directorios.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Asignación basada en tipos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Determina qué procesos o aplicaciones pueden interactuar con un recurso.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;httpd_sys_rw_content_t&lt;/code&gt;: Permite lectura/escritura por parte del servidor web. &lt;br&gt; &lt;code&gt;httpd_sys_content_t&lt;/code&gt;: Permite solo lectura por parte del servidor web. &lt;br&gt; &lt;code&gt;user_home_t&lt;/code&gt;: Para directorios o archivos en &lt;code&gt;/home&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rango (SELinux)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Se usa para configuraciones de seguridad MLS o TE (usualmente &lt;code&gt;s0&lt;/code&gt; en configuraciones estándar).&lt;/td&gt;
&lt;td&gt;Normalmente no requiere ajustes en configuraciones básicas.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ahora bien, hay varios tipos de políticas en cuanto a funcionalidades que se pueden aplicar en SELinux, la que se usa en general es &lt;em&gt;targeted&lt;/em&gt;. El tipo de política targeted significa que determinados servicios se ejecutan de manera confinada, es decir limitada para realizar solamente determinadas acciones más allá de los permisos ordinarios.&lt;/p&gt;
&lt;p&gt;Y es importante enfatizar que cuando usamos &lt;em&gt;targeted&lt;/em&gt; el campo que más nos tiene que interesar de un contexto es el "Type Enforcement". En general no prestaremos demasiada atención al resto de los campos.&lt;/p&gt;
&lt;p&gt;Lo más importante para entender es que las reglas de SELinux tienen &lt;strong&gt;sujetos&lt;/strong&gt; y &lt;strong&gt;objetos&lt;/strong&gt;. El contexto o etiqueta del objeto  podría no permitir que el sujeto realice una determinada acción al sujeto, y es allí cuando se produce un error. Dicho error tiene por objetivo proteger al sistema.
En este ejemplo los sujetos son nginx y php-fpm y los objetos son los directorios &lt;code&gt;bootstrap/cache&lt;/code&gt; y &lt;code&gt;public/storage&lt;/code&gt; (y sus respectivos contenidos).&lt;/p&gt;
&lt;p&gt;Por ejemplo, nginx sería el sujeto y con el siguiente comando vemos el contexto del proceso:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;ps&lt;span class="w"&gt; &lt;/span&gt;-C&lt;span class="w"&gt; &lt;/span&gt;nginx,php-fpm&lt;span class="w"&gt; &lt;/span&gt;-Z
LABEL&lt;span class="w"&gt;                               &lt;/span&gt;PID&lt;span class="w"&gt; &lt;/span&gt;TTY&lt;span class="w"&gt;          &lt;/span&gt;TIME&lt;span class="w"&gt; &lt;/span&gt;CMD
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;898&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;php-fpm
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1118&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;php-fpm
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1119&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;php-fpm
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1120&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;php-fpm
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1121&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;php-fpm
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1122&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;php-fpm
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1451&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;nginx
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1452&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;nginx
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1453&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;nginx
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="pero-habra-problemas"&gt;Pero habrá problemas...&lt;/h4&gt;
&lt;p&gt;La cuestión es que tanto nginx como php-fpm se ejecutan con la asignación de tipo (TE) httpd_t y la TE que tienen directorior como bootstrap/cache y public/storage es user_home_t.&lt;/p&gt;
&lt;p&gt;Con el siguiente comando podemos verificar qué cosas puede hacer el dominio &lt;code&gt;httpd_t&lt;/code&gt; en el contexto del objeto que tiene el tipo de asignación &lt;code&gt;user_home_t&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;sesearch&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;-A&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;user_home_t
allow&lt;span class="w"&gt; &lt;/span&gt;daemon&lt;span class="w"&gt; &lt;/span&gt;user_home_t:file&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;append&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
allow&lt;span class="w"&gt; &lt;/span&gt;domain&lt;span class="w"&gt; &lt;/span&gt;file_type:blk_file&lt;span class="w"&gt; &lt;/span&gt;map&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;domain_can_mmap_files&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;domain&lt;span class="w"&gt; &lt;/span&gt;file_type:chr_file&lt;span class="w"&gt; &lt;/span&gt;map&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;domain_can_mmap_files&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;domain&lt;span class="w"&gt; &lt;/span&gt;file_type:file&lt;span class="w"&gt; &lt;/span&gt;map&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;domain_can_mmap_files&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;domain&lt;span class="w"&gt; &lt;/span&gt;file_type:lnk_file&lt;span class="w"&gt; &lt;/span&gt;map&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;domain_can_mmap_files&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;file_type:dir&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;file_type:filesystem&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="p"&gt;;&lt;/span&gt;
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;user_home_t:file&lt;span class="w"&gt; &lt;/span&gt;map&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;httpd_read_user_content&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;user_home_type:dir&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;ioctl&lt;span class="w"&gt; &lt;/span&gt;lock&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;httpd_read_user_content&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;user_home_type:dir&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;httpd_enable_homedirs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;user_home_type:dir&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;httpd_read_user_content&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;user_home_type:dir&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;httpd_read_user_content&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;user_home_type:file&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;ioctl&lt;span class="w"&gt; &lt;/span&gt;lock&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;httpd_read_user_content&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;user_home_type:lnk_file&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;httpd_enable_homedirs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Cada regla tiene:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El tipo de regla ( &lt;em&gt;allow&lt;/em&gt; )&lt;/li&gt;
&lt;li&gt;El sujeto de la regla ( &lt;em&gt;httpd_t&lt;/em&gt; )&lt;/li&gt;
&lt;li&gt;El contexto y tipo del objeto ( &lt;em&gt;user_home_t:file&lt;/em&gt; )&lt;/li&gt;
&lt;li&gt;Los permisos (&lt;em&gt;append&lt;/em&gt; y &lt;em&gt;getattr&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;¡No hay ninguna regla que permita la modificación total del contenido del archivo ni la creación de archivos en la carpeta (por ejemplo, el permiso &lt;em&gt;write&lt;/em&gt;)!&lt;/strong&gt;. Esto significa que, de manera predeterminada, servicios como apache o nginx no tienen permiso para escribir en los directorios &lt;em&gt;home&lt;/em&gt;  de los usuarios. Y por ese motivo hay cosas que fallarán, sin importar los permisos ni el usuario...&lt;/p&gt;
&lt;p&gt;Por lo tanto los directorios &lt;code&gt;public/storage&lt;/code&gt; y &lt;code&gt;bootstrap/cache&lt;/code&gt; y su contenido necesitan otro contexto para que Laravel funcione correctamente cuando está ubicado en un subdirectorio de /home. Mirando la documentación podemos ver que &lt;em&gt;httpd_sys_content_t&lt;/em&gt;  y &lt;em&gt;httpd_sys_rw_content&lt;/em&gt; son respectivamente los apropiados para esos directorios y su contenido:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;httpd_sys_content_t&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;httpd_sys_content_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;want&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;treat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;httpd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;srv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="o"&gt;^/&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;htdig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;srv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gallery2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;trac&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;htdig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;icons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;glpi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;htdig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;drupal&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;svn&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;icecast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cacti&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ntop&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ghc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;openca&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;htdocs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;selinux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pol&lt;/span&gt;&lt;span class="err"&gt;‐&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;icy&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;^/&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;y&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;httpd_sys_rw_content_t&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;httpd_sys_rw_content_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;want&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;treat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;httpd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;glpi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;horde&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;drupal&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;svn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;svn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;owncloud&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;uploads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wp_back&lt;/span&gt;&lt;span class="err"&gt;‐&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;ups&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sites&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sites&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mock&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;koji&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nextcloud&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;drupal&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;zabbix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;moodle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gosa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;WebCalendar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;joomla&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dokuwiki&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;owncloud&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;viewvc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nextcloud&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pootle&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;po&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;phpMyAdmin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;moodledata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;srv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gallery2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smarty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;moodle&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;graphite&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;shibboleth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gallery&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;albums&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;owncloud&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nextcloud&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wordpress&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mu&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wordpress&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;upgrade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wordpress&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;uploads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="err"&gt;‐&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;uration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;De modo que esos son los contextos que tendrías que aplicar a esos directorios y sus contenidos. El resto, si sos administrador o desarrollador de Linux con algo de experiencia es anecdótico.&lt;/p&gt;
&lt;h3 id="fuentes-y-mas-recursos"&gt;Fuentes y más recursos&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Página del manual de &lt;strong&gt;httpd_selinux&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.redhat.com/es/documentation/red_hat_enterprise_linux/8/html/using_selinux/benefits-of-selinux_getting-started-with-selinux#benefits-of-selinux_getting-started-with-selinux"&gt;Ventajas de usar SELinux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.redhat.com/es/documentation/red_hat_enterprise_linux/8/html/using_selinux/enabling_and_disabling_selinux-disabling_selinux_changing-selinux-states-and-modes#Enabling_and_Disabling_SELinux-Disabling_SELinux_changing-selinux-states-and-modes"&gt;Desactivación de SELinux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Página del manual de &lt;strong&gt;booleans&lt;/strong&gt; (concepto importante que complementan a las reglas de las políticas de SELinux)&lt;/li&gt;
&lt;/ul&gt;</description><category>seguridad</category><category>sysadmin</category><guid>https://sergiobelkin.com/posts/selinux-nah-deshabilitalo/</guid><pubDate>Mon, 25 Nov 2024 00:15:35 GMT</pubDate></item><item><title>Qué son los cgroups y para qué sirven</title><link>https://sergiobelkin.com/posts/que-son-los-cgroups-y-para-que-sirven/</link><dc:creator>sebelk</dc:creator><description>&lt;div style="float: left; margin-right: 10px; width: 300px; max-width: 100%;"&gt;
&lt;a class="image-reference" href="https://sergiobelkin.com/images/cgroups-1.webp"&gt;&lt;img src="https://sergiobelkin.com/images/cgroups-1.thumbnail.webp" alt="Namespaces en Linux"&gt;&lt;/a&gt; 
&lt;/div&gt;

&lt;p&gt;En el &lt;a href="https://sergiobelkin.com/posts/que-son-los-namespaces-y-que-podemos-hacer-con-ellos/"&gt;post anterior&lt;/a&gt; vimos los &lt;strong&gt;namespaces&lt;/strong&gt;, que sirven para aislar diferentes aspectos del sistema, como los procesos, la red y los puntos de montaje, creando entornos independientes para cada grupo de procesos. En este post, exploraremos los &lt;strong&gt;cgroups&lt;/strong&gt;, que permiten controlar cuánto de los recursos del sistema, como CPU, memoria y disco, puede usar cada grupo de procesos. Ambas tecnologías se complementan: los &lt;strong&gt;namespaces&lt;/strong&gt; proporcionan el aislamiento necesario, mientras que los &lt;strong&gt;cgroups&lt;/strong&gt; gestionan y limitan los recursos que esos entornos aislados pueden consumir.&lt;/p&gt;
&lt;h3 id="que-son-los-cgroups"&gt;&lt;strong&gt;¿Qué son los cgroups?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Los &lt;strong&gt;cgroups&lt;/strong&gt; (&lt;em&gt;control groups&lt;/em&gt;) son una funcionalidad del &lt;strong&gt;kernel Linux&lt;/strong&gt; que permite agrupar procesos y controlar de manera granular los recursos del sistema que consumen, como CPU, memoria, I/O, y otros. Se incorporaron en 2008 en el kernel de Linux 2.6.24, los &lt;em&gt;cgroups&lt;/em&gt; permiten a los administradores de sistemas gestionar el uso de recursos por grupos de procesos de forma eficiente, garantizando una distribución justa y controlada.&lt;/p&gt;
&lt;p&gt;Los &lt;strong&gt;cgroups&lt;/strong&gt; crean una jerarquía de control donde es posible asignar límites a recursos específicos para un conjunto de procesos, de manera que el sistema operativo pueda monitorear, limitar, priorizar o aislar estos procesos según sea necesario. Esta capacidad es clave para garantizar que los sistemas multitarea, servidores, y contenedores funcionen de manera eficiente.&lt;/p&gt;
&lt;h5 id="para-que-sirven-los-cgroups"&gt;&lt;strong&gt;¿Para qué sirven los cgroups?&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;Los &lt;strong&gt;cgroups&lt;/strong&gt; sirven para:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Limitar el uso de recursos&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Priorizar procesos&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Aislar procesos&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitorear el consumo de recursos&lt;/strong&gt; &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Controlar procesos en contenedores (Docker, podman,etc.)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="un-pantallazo-de-los-cgroups"&gt;Un pantallazo de los cgroups&lt;/h3&gt;
&lt;p&gt;Dentro del propio directorio /proc podemos encontrar información sobre los cgroups:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;❯&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/proc/cgroups&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="c1"&gt;#subsys_name    hierarchy       num_cgroups     enabled&lt;/span&gt;
cpuset&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;241&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
cpu&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;241&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
cpuacct&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;241&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
blkio&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;241&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
memory&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;241&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
devices&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;241&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
freezer&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;241&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
net_cls&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;241&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
perf_event&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;241&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
net_prio&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;241&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
hugetlb&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;241&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
pids&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;241&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
rdma&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;241&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
misc&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;241&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Este archivo muestra 4 columnas&lt;/p&gt;
&lt;style&gt;
  table {
  }
  th, td {
    padding: 10px;
    text-align: left;
  }
&lt;/style&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Campo&lt;/th&gt;
&lt;th&gt;Significado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;subsys_name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Componente del kernel que controlar un recurso específico un aspecto del sistema.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;hierarchy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;La columna &lt;code&gt;hierarchy&lt;/code&gt; indica el ID de jerarquía asignado a cada subsistema. En este caso, todas las jerarquías tienen el valor &lt;strong&gt;0&lt;/strong&gt;, lo que indica que todos los subsistemas listados están utilizando una &lt;strong&gt;jerarquía unificada&lt;/strong&gt;, común en sistemas que usan &lt;em&gt;cgroups v2&lt;/em&gt;. En &lt;em&gt;cgroups v2&lt;/em&gt;, todos los controladores utilizan una única jerarquía para gestionar los recursos de manera más eficiente, a diferencia de &lt;em&gt;cgroups v1&lt;/em&gt;, donde cada subsistema podía tener su propia jerarquía.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;num_cgroups&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Muestra el número de &lt;em&gt;cgroups&lt;/em&gt; activos o instancias creadas bajo cada controlador. Estos &lt;em&gt;cgroups&lt;/em&gt; pueden pertenecer a procesos que están ejecutándose actualmente en el sistema, como servicios, contenedores, o procesos individuales.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;enabled&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Esta columna muestra si el subsistema está habilitado o no. El valor &lt;strong&gt;1&lt;/strong&gt; indica que el controlador está habilitado y activo, mientras que un valor de &lt;strong&gt;0&lt;/strong&gt; indicaría que está deshabilitado.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="evolucion-de-los-cgroups"&gt;&lt;strong&gt;Evolución de los cgroups:&lt;/strong&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;cgroups v1:&lt;/strong&gt; En la versión original, cada tipo de recurso (CPU, memoria, etc.) tenía su propia jerarquía de control, lo que permitía una gestión separada pero a veces compleja. Aunque era útil, la administración independiente de subsistemas podía resultar difícil de manejar en entornos complejos.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;cgroups v2 (2016):&lt;/strong&gt; Para mejorar la gestión de recursos, se introdujo &lt;strong&gt;cgroups v2&lt;/strong&gt; en el kernel de Linux 4.x, que unificó los diferentes controladores bajo una &lt;strong&gt;jerarquía única&lt;/strong&gt;. Esta versión simplificó el control de recursos y mejoró la eficiencia, permitiendo que todos los subsistemas trabajaran de manera más coordinada y con configuraciones más claras.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="como-crear-un-cgroup-y-limitar-el-uso-de-cpu-en-cgroups-v2"&gt;&lt;strong&gt;Cómo crear un &lt;em&gt;cgroup&lt;em&gt; y limitar el uso de CPU en &lt;/em&gt;cgroups v2&lt;/em&gt;&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;En este ejemplo, limitaremos el uso de CPU de un proceso utilizando &lt;strong&gt;cgroups v2&lt;/strong&gt; en un entorno moderno.&lt;/p&gt;
&lt;h5 id="paso-1-crear-un-directorio-para-el-cgroup"&gt;&lt;strong&gt;Paso 1: Crear un directorio para el &lt;em&gt;cgroup&lt;/em&gt;&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;En &lt;strong&gt;cgroups v2&lt;/strong&gt;, se gestiona todo bajo una jerarquía unificada. Primero, crea un nuevo directorio en &lt;code&gt;/sys/fs/cgroup&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;/sys/fs/cgroup/mi_cgroup
&lt;/pre&gt;&lt;/div&gt;

&lt;h5 id="paso-2-establecer-un-limite-de-cpu"&gt;&lt;strong&gt;Paso 2: Establecer un límite de CPU&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;En &lt;strong&gt;cgroups v2&lt;/strong&gt;, puedes establecer límites en el uso de CPU mediante el archivo &lt;code&gt;cpu.max&lt;/code&gt;. Este archivo recibe dos valores: el primero es el límite de uso de CPU en microsegundos por cada período de 100 milisegundos, y el segundo es la duración del período en microsegundos.&lt;/p&gt;
&lt;p&gt;Para limitar el uso de CPU al 50%, puedes hacer lo siguiente:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"50000 100000"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;tee&lt;span class="w"&gt; &lt;/span&gt;/sys/fs/cgroup/mi_cgroup/cpu.max
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Este comando establece que los procesos en este &lt;em&gt;cgroup&lt;/em&gt; pueden usar un máximo de &lt;strong&gt;50.000 microsegundos&lt;/strong&gt; de CPU en un período de &lt;strong&gt;100.000 microsegundos&lt;/strong&gt; (100 ms), lo que equivale al &lt;strong&gt;50% de un núcleo de CPU&lt;/strong&gt;.&lt;/p&gt;
&lt;h5 id="paso-3-anadir-un-proceso-al-cgroup"&gt;&lt;strong&gt;Paso 3: Añadir un proceso al &lt;em&gt;cgroup&lt;/em&gt;&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;Para añadir un proceso existente al &lt;em&gt;cgroup&lt;/em&gt;, escribe su &lt;strong&gt;PID&lt;/strong&gt; (ID del proceso) en el archivo &lt;code&gt;cgroup.procs&lt;/code&gt; de ese &lt;em&gt;cgroup&lt;/em&gt;. Supongamos que el PID del proceso es &lt;strong&gt;78435&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;78435&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;tee&lt;span class="w"&gt; &lt;/span&gt;/sys/fs/cgroup/mi_cgroup/cgroup.procs
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Esto moverá el proceso con PID &lt;code&gt;78435&lt;/code&gt; al &lt;em&gt;cgroup&lt;/em&gt; &lt;code&gt;mi_cgroup&lt;/code&gt;, aplicando las restricciones de CPU configuradas.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/example-cgroups.webp"&gt;&lt;img src="https://sergiobelkin.com/images/example-cgroups.thumbnail.webp" alt="Ejemplo de uso de cgroups para limitar el uso de CPU" title="Hacer clic para agrandar"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;En &lt;strong&gt;cgroups v1&lt;/strong&gt;, los recursos se gestionan usando archivos como &lt;code&gt;cpu.shares&lt;/code&gt; para establecer prioridades relativas de CPU, y &lt;code&gt;tasks&lt;/code&gt; para asignar procesos a un &lt;em&gt;cgroup&lt;/em&gt;. En cambio, en &lt;strong&gt;cgroups v2&lt;/strong&gt;, el control de CPU se realiza a través de &lt;code&gt;cpu.max&lt;/code&gt;, donde se puede establecer un límite absoluto en el uso de CPU (como un porcentaje). Además, en &lt;strong&gt;v1&lt;/strong&gt; cada subsistema tiene su propio directorio (como &lt;code&gt;cpu/&lt;/code&gt;, &lt;code&gt;memory/&lt;/code&gt;), mientras que en &lt;strong&gt;v2&lt;/strong&gt; todo se gestiona dentro de una única jerarquía unificada bajo &lt;code&gt;/sys/fs/cgroup/&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id="conclusion"&gt;Conclusión&lt;/h4&gt;
&lt;p&gt;Hoy en día, los &lt;em&gt;cgroups&lt;/em&gt; son una herramienta crítica en la &lt;strong&gt;gestión moderna de servidores&lt;/strong&gt;. RHEL8 usa de manera predeterminada la versión 1, pero es posible usar la versión 2, dependiendo del software que utilicemos. En definitiva, los cgroups son fundamentales para la operación de tecnologías como &lt;strong&gt;contenedores&lt;/strong&gt; (&lt;em&gt;Docker&lt;/em&gt;, &lt;em&gt;Podman&lt;/em&gt;), &lt;strong&gt;orquestadores&lt;/strong&gt; como &lt;strong&gt;Kubernetes&lt;/strong&gt;, y cualquier sistema que necesite &lt;strong&gt;control granular de recursos&lt;/strong&gt;. La capacidad de aislar, priorizar y monitorear el uso de recursos en servidores es clave para garantizar la estabilidad y el rendimiento en entornos de alta demanda.&lt;/p&gt;
&lt;h4 id="fuentes-y-mas-informacion"&gt;Fuentes y más información&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/cgroups.html"&gt;CGROUPS v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html"&gt;CGROUPS v2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.nginx.org/blog/what-are-namespaces-cgroups-how-do-they-work"&gt;Explicación de namespaces y cgrous en el blog de NGINX&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>herramientas</category><category>kernel</category><guid>https://sergiobelkin.com/posts/que-son-los-cgroups-y-para-que-sirven/</guid><pubDate>Fri, 25 Oct 2024 22:46:07 GMT</pubDate></item><item><title>Qué son los namespaces y que podemos hacer con ellos</title><link>https://sergiobelkin.com/posts/que-son-los-namespaces-y-que-podemos-hacer-con-ellos/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;En el &lt;a href="https://sergiobelkin.com/posts/que-es-flatpak/"&gt;post anterior&lt;/a&gt;, exploramos qué es Flatpak, una excelente alternativa o complemento a los métodos tradicionales de instalación de programas en Linux. Flatpak utiliza una herramienta llamada &lt;strong&gt;bubblewrap&lt;/strong&gt;, que a su vez emplea la tecnología de &lt;strong&gt;namespaces&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/namespaces.webp"&gt;&lt;img src="https://sergiobelkin.com/images/namespaces.thumbnail.webp" alt="Namespaces en Linux"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Veamos con lupa lo que hay debajo de una aplicación flatpak. &lt;/p&gt;
&lt;h3 id="listado-de-procesos-de-aplicaciones-flatpak"&gt;Listado de procesos de aplicaciones flatpak&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;❯&lt;span class="w"&gt; &lt;/span&gt;flatpak&lt;span class="w"&gt; &lt;/span&gt;ps&lt;span class="w"&gt; &lt;/span&gt;--columns&lt;span class="o"&gt;=&lt;/span&gt;pid,child-pid,application
PID&lt;span class="w"&gt;  &lt;/span&gt;PID-hijo&lt;span class="w"&gt; &lt;/span&gt;Aplicación
&lt;span class="m"&gt;4588&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4610&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;com.github.marktext.marktext
&lt;span class="m"&gt;4629&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4639&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;com.github.marktext.marktext
&lt;span class="m"&gt;4841&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4853&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;com.spotify.Client
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/flatpak-ps.png"&gt;&lt;img src="https://sergiobelkin.com/images/flatpak-ps.thumbnail.png" alt="MarkText y Spotify (aplicaciones instaladas con flatpak)"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Este listado nos muestra que hay dos aplicaciones corriendo: MarkText y Spotify. Vamos a ver qué pasa con uno de los procesos relacionados con MarkText.&lt;/p&gt;
&lt;h3 id="el-comando-detras-de-flatpak"&gt;El comando detrás de flatpak&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;❯&lt;span class="w"&gt; &lt;/span&gt;ps&lt;span class="w"&gt; &lt;/span&gt;p&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;4610&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;o&lt;span class="w"&gt; &lt;/span&gt;args
COMMAND
/usr/bin/bwrap&lt;span class="w"&gt; &lt;/span&gt;--args&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;42&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;spotify
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;bwrap&lt;/strong&gt; es una herramienta para crear  sandboxes por medio de namespaces. Un namespace es un recurso del sistema que se puede aislar, pero... en lugar de abundar en tecnicismos, para comprender este concepto en la práctica, veremos algunas propiedades del proceso 4610 (MarkText):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;❯&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;/proc/4610/ns
total&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
lrwxrwxrwx&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jul&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:46&lt;span class="w"&gt; &lt;/span&gt;cgroup&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'cgroup:[4026531835]'&lt;/span&gt;
lrwxrwxrwx&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jul&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:46&lt;span class="w"&gt; &lt;/span&gt;ipc&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'ipc:[4026531839]'&lt;/span&gt;
lrwxrwxrwx&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jul&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:40&lt;span class="w"&gt; &lt;/span&gt;mnt&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'mnt:[4026532856]'&lt;/span&gt;
lrwxrwxrwx&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jul&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:46&lt;span class="w"&gt; &lt;/span&gt;net&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'net:[4026531840]'&lt;/span&gt;
lrwxrwxrwx&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jul&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:40&lt;span class="w"&gt; &lt;/span&gt;pid&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'pid:[4026532857]'&lt;/span&gt;
lrwxrwxrwx&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jul&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:46&lt;span class="w"&gt; &lt;/span&gt;pid_for_children&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'pid:[4026532857]'&lt;/span&gt;
lrwxrwxrwx&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jul&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:46&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'time:[4026531834]'&lt;/span&gt;
lrwxrwxrwx&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jul&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:46&lt;span class="w"&gt; &lt;/span&gt;time_for_children&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'time:[4026531834]'&lt;/span&gt;
lrwxrwxrwx&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jul&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:40&lt;span class="w"&gt; &lt;/span&gt;user&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'user:[4026532858]'&lt;/span&gt;
lrwxrwxrwx&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;sergio&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jul&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:46&lt;span class="w"&gt; &lt;/span&gt;uts&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'uts:[4026531838]'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ese listado nos muestra que están los namespaces cgroup, ipc, mnt, net, pid, time, user y uts. Cada uno de ellos tiene un número que lo identifica.&lt;/p&gt;
&lt;p&gt;Podemos compararlo con otros procesos por ejemplo con el pid 1 y con el pid del shell que estamos usando:&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/namespaces.png"&gt;&lt;img src="https://sergiobelkin.com/images/namespaces.thumbnail.png" alt="Comparación de procesos y namespaces"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Podemos ver que tanto bash como systemd comparten todos los namespaces. &lt;em&gt;Sin embargo, bwrap tiene namespaces distintos para mnt, pid y user. Es decir tiene esos recursos aislados&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;El cuadro siguiente nos sirve para saber qué namespace usar de acuerdo a lo que queramos aislar:&lt;/p&gt;
&lt;style&gt;
  table {
  }
  th, td {
    padding: 10px;
    text-align: left;
  }
&lt;/style&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Para aislar&lt;/th&gt;
&lt;th&gt;Usar namespace...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Límites de recursos&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;cgroups&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Colas de mensaje, semáforos, memoria compartida&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ipc&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Lista de montajes&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;mount&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Interfaces de red, ruteo, sockets, etc.&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;net&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Números de pid&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;pid&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;UID's, GID's, capabilities, etc&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;user&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Hostnames&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;uts&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Relojes/Tiempo&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;time&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;El soporte en el &lt;strong&gt;kernel&lt;/strong&gt; lo podemos verificar de la siguiente manera:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-E&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'CONFIG_[A-Z]+_NS=y'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/boot/config-&lt;span class="k"&gt;$(&lt;/span&gt;uname&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;CONFIG_UTS_NS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;y
&lt;span class="nv"&gt;CONFIG_TIME_NS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;y
&lt;span class="nv"&gt;CONFIG_IPC_NS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;y
&lt;span class="nv"&gt;CONFIG_USER_NS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;y
&lt;span class="nv"&gt;CONFIG_PID_NS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;y
&lt;span class="nv"&gt;CONFIG_NET_NS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;y
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="crear-nuevos-namespaces-para-procesos-y-usuarios"&gt;Crear nuevos namespaces para procesos y usuarios&lt;/h3&gt;
&lt;p&gt;La herramienta &lt;strong&gt;unshare&lt;/strong&gt; nos permite experimentar y solucionar problemas en aplicaciones y servicios que usan namespaces. En el siguiente ejemplo abrimos un shell con namespaces aislados para usuarios y números de procesos:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;❯&lt;span class="w"&gt; &lt;/span&gt;unshare&lt;span class="w"&gt; &lt;/span&gt;--mount-proc&lt;span class="w"&gt; &lt;/span&gt;--pid&lt;span class="w"&gt; &lt;/span&gt;--fork&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="w"&gt; &lt;/span&gt;bash
❯&lt;span class="w"&gt; &lt;/span&gt;ps&lt;span class="w"&gt; &lt;/span&gt;aux
&lt;span class="w"&gt;   &lt;/span&gt;USER&lt;span class="w"&gt;         &lt;/span&gt;PID&lt;span class="w"&gt; &lt;/span&gt;%CPU&lt;span class="w"&gt; &lt;/span&gt;%MEM&lt;span class="w"&gt;    &lt;/span&gt;VSZ&lt;span class="w"&gt;   &lt;/span&gt;RSS&lt;span class="w"&gt; &lt;/span&gt;TTY&lt;span class="w"&gt;      &lt;/span&gt;STAT&lt;span class="w"&gt; &lt;/span&gt;START&lt;span class="w"&gt;   &lt;/span&gt;TIME&lt;span class="w"&gt; &lt;/span&gt;COMMAND
&lt;span class="w"&gt;   &lt;/span&gt;nobody&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.8&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;237808&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12996&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pts/1&lt;span class="w"&gt;    &lt;/span&gt;S&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;:43&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;bash
&lt;span class="w"&gt;   &lt;/span&gt;nobody&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;104&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;230836&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;4096&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pts/1&lt;span class="w"&gt;    &lt;/span&gt;R+&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;:43&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;ps&lt;span class="w"&gt; &lt;/span&gt;aux
&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Aquí vemos que bash usa el PID 1 en lugar de systemd, y que el comando &lt;code&gt;ps aux&lt;/code&gt; toma el pid 2.&lt;/li&gt;
&lt;li&gt;Además, el usuario pasa a ser &lt;em&gt;nobody&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Para salir del namespace, simplemente hay que ejecutar &lt;code&gt;exit&lt;/code&gt;. Es importante asegurarse de que todos los procesos dentro del namespace hayan terminado, de lo contrario, puede ser que &lt;code&gt;exit&lt;/code&gt;  sea insuficiente para salir completamente del namespace.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="por-que-usamos-mount-proc"&gt;¿Por qué usamos --mount-proc?&lt;/h4&gt;
&lt;p&gt;Bueno... porque si no lo hacemos sucede esto:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;❯&lt;span class="w"&gt; &lt;/span&gt;unshare&lt;span class="w"&gt; &lt;/span&gt;--mount&lt;span class="w"&gt; &lt;/span&gt;--pid&lt;span class="w"&gt; &lt;/span&gt;--fork&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="w"&gt; &lt;/span&gt;/bin/bash
basename:&lt;span class="w"&gt; &lt;/span&gt;falta&lt;span class="w"&gt; &lt;/span&gt;un&lt;span class="w"&gt; &lt;/span&gt;operando
Pruebe&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'basename --help'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;para&lt;span class="w"&gt; &lt;/span&gt;más&lt;span class="w"&gt; &lt;/span&gt;información.
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Este mensaje aparece porque el comando &lt;code&gt;basename&lt;/code&gt; usa &lt;code&gt;readlink&lt;/code&gt; para ver hacia dónde apunta &lt;code&gt;/proc/$$/exe&lt;/code&gt;. Como el PID de la shell en el nuevo namespace es 1, intenta acceder incorrectamente al directorio &lt;code&gt;/proc&lt;/code&gt; en los namespaces del host. Linux impide este acceso para mantener el aislamiento y la seguridad, lo que resulta en ese error.&lt;/p&gt;
&lt;h4 id="particularidades-de-namespaces"&gt;Particularidades de namespaces&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;❯&lt;span class="w"&gt; &lt;/span&gt;unshare&lt;span class="w"&gt; &lt;/span&gt;--mount-proc&lt;span class="w"&gt; &lt;/span&gt;--pid&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="w"&gt; &lt;/span&gt;/bin/bash
unshare:&lt;span class="w"&gt; &lt;/span&gt;mount&lt;span class="w"&gt; &lt;/span&gt;/proc&lt;span class="w"&gt; &lt;/span&gt;failed:&lt;span class="w"&gt; &lt;/span&gt;Operación&lt;span class="w"&gt; &lt;/span&gt;no&lt;span class="w"&gt; &lt;/span&gt;permitida
❯&lt;span class="w"&gt; &lt;/span&gt;unshare&lt;span class="w"&gt; &lt;/span&gt;--pid&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="w"&gt; &lt;/span&gt;/bin/bash
bash:&lt;span class="w"&gt; &lt;/span&gt;fork:&lt;span class="w"&gt; &lt;/span&gt;No&lt;span class="w"&gt; &lt;/span&gt;se&lt;span class="w"&gt; &lt;/span&gt;pudo&lt;span class="w"&gt; &lt;/span&gt;asignar&lt;span class="w"&gt; &lt;/span&gt;memoria
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;En el primer intento, ni siquiera pudo crear los namespaces; en el segundo, aunque lo logró, muestra un mensaje críptico:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;bash: fork: No se pudo asignar memoria&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Estos errores ocurren porque &lt;code&gt;unshare&lt;/code&gt;, por defecto, ejecuta el comando indicado en el mismo proceso (similar a &lt;code&gt;exec&lt;/code&gt;), lo que resulta en:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Error de Montaje&lt;/strong&gt;: El sistema no permite montar &lt;code&gt;/proc&lt;/code&gt; porque el proceso no tiene el contexto completo de namespace de usuario y PID necesario.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error de Memoria&lt;/strong&gt;: Debido a que bash no se convierte en PID 1 ni puede acceder a otro proceso con PID 1, Linux no permite la asignación de memoria porque no hay un proceso para manejar la recolección de zombies y otras tareas esenciales.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Por lo tanto, usar &lt;code&gt;--fork&lt;/code&gt; es necesario para asegurar que el proceso tenga el contexto de namespace completo y para crear un nuevo proceso que actúe como PID 1 en el nuevo namespace.&lt;/em&gt;&lt;/p&gt;
&lt;h4 id="entrar-en-namespaces-de-una-app-de-flatpak"&gt;Entrar en namespaces de una app de flatpak&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;❯&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;nsenter&lt;span class="w"&gt; &lt;/span&gt;--mount&lt;span class="w"&gt; &lt;/span&gt;--pid&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$UID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4610&lt;/span&gt;
-bash-5.2$&lt;span class="w"&gt; &lt;/span&gt;ps&lt;span class="w"&gt; &lt;/span&gt;auxwww
USER&lt;span class="w"&gt;         &lt;/span&gt;PID&lt;span class="w"&gt; &lt;/span&gt;%CPU&lt;span class="w"&gt; &lt;/span&gt;%MEM&lt;span class="w"&gt;    &lt;/span&gt;VSZ&lt;span class="w"&gt;   &lt;/span&gt;RSS&lt;span class="w"&gt; &lt;/span&gt;TTY&lt;span class="w"&gt;      &lt;/span&gt;STAT&lt;span class="w"&gt; &lt;/span&gt;START&lt;span class="w"&gt;   &lt;/span&gt;TIME&lt;span class="w"&gt; &lt;/span&gt;COMMAND
sergio&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;3764&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;1288&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;S&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:40&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/bwrap&lt;span class="w"&gt; &lt;/span&gt;--args&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;40&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;marktext
sergio&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.9&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.5&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;21637908&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;182648&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;     &lt;/span&gt;SLl&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:40&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:15&lt;span class="w"&gt; &lt;/span&gt;/app/marktext/marktext
sergio&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;5640&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;1664&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;S&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:40&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;cat
sergio&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;5640&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;1792&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;S&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:40&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;cat
sergio&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;16987244&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;46720&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;      &lt;/span&gt;S&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:40&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;/app/marktext/marktext&lt;span class="w"&gt; &lt;/span&gt;--type&lt;span class="o"&gt;=&lt;/span&gt;zygote&lt;span class="w"&gt; &lt;/span&gt;--no-zygote-sandbox
sergio&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;Z&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:40&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;zypak-sandbox&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;defunct&amp;gt;
sergio&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;3768&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;1152&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;S&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:40&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/bwrap&lt;span class="w"&gt; &lt;/span&gt;--args&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;42&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;/app/bin/zypak-helper&lt;span class="w"&gt; &lt;/span&gt;child&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;/app/marktext/marktext&lt;span class="w"&gt; &lt;/span&gt;--type&lt;span class="o"&gt;=&lt;/span&gt;zygote
sergio&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;16989892&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;49152&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;      &lt;/span&gt;S&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:40&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;/app/marktext/marktext&lt;span class="w"&gt; &lt;/span&gt;--type&lt;span class="o"&gt;=&lt;/span&gt;zygote
sergio&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;48&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.4&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;17065152&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;72664&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;      &lt;/span&gt;Sl&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:40&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:23&lt;span class="w"&gt; &lt;/span&gt;/app/marktext/marktext&lt;span class="w"&gt; &lt;/span&gt;--type&lt;span class="o"&gt;=&lt;/span&gt;gpu-process&lt;span class="w"&gt; &lt;/span&gt;--field-trial-handle&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;9170851604328465342&lt;/span&gt;,17458150017059513700,131072&lt;span class="w"&gt; &lt;/span&gt;--disable-features&lt;span class="o"&gt;=&lt;/span&gt;SpareRendererForSitePerProcess&lt;span class="w"&gt; &lt;/span&gt;--enable-crash-reporter&lt;span class="o"&gt;=&lt;/span&gt;7744fdfa-fe51-4b1f-adf6-daefea565c51,no_channel&lt;span class="w"&gt; &lt;/span&gt;--global-crash-keys&lt;span class="o"&gt;=&lt;/span&gt;7744fdfa-fe51-4b1f-adf6-daefea565c51,no_channel,_companyName&lt;span class="o"&gt;=&lt;/span&gt;marktext,_productName&lt;span class="o"&gt;=&lt;/span&gt;marktext,_version&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.17.1&lt;span class="w"&gt; &lt;/span&gt;--user-data-dir&lt;span class="o"&gt;=&lt;/span&gt;/home/sergio/.var/app/com.github.marktext.marktext/config/marktext&lt;span class="w"&gt; &lt;/span&gt;--gpu-preferences&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;UAAAAAAAAAAgAAAIAAAAAAAAAAAAAAAAAABgAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--use-gl&lt;span class="o"&gt;=&lt;/span&gt;swiftshader-webgl&lt;span class="w"&gt; &lt;/span&gt;--shared-files
sergio&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;53&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;16998948&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;14448&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;      &lt;/span&gt;S&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:40&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;/app/marktext/marktext&lt;span class="w"&gt; &lt;/span&gt;--type&lt;span class="o"&gt;=&lt;/span&gt;broker
sergio&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;63&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;17044740&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;57216&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;      &lt;/span&gt;Sl&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:40&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;/app/marktext/marktext&lt;span class="w"&gt; &lt;/span&gt;--type&lt;span class="o"&gt;=&lt;/span&gt;utility&lt;span class="w"&gt; &lt;/span&gt;--utility-sub-type&lt;span class="o"&gt;=&lt;/span&gt;network.mojom.NetworkService&lt;span class="w"&gt; &lt;/span&gt;--field-trial-handle&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;9170851604328465342&lt;/span&gt;,17458150017059513700,131072&lt;span class="w"&gt; &lt;/span&gt;--disable-features&lt;span class="o"&gt;=&lt;/span&gt;SpareRendererForSitePerProcess&lt;span class="w"&gt; &lt;/span&gt;--lang&lt;span class="o"&gt;=&lt;/span&gt;es-419&lt;span class="w"&gt; &lt;/span&gt;--service-sandbox-type&lt;span class="o"&gt;=&lt;/span&gt;none&lt;span class="w"&gt; &lt;/span&gt;--enable-crash-reporter&lt;span class="o"&gt;=&lt;/span&gt;7744fdfa-fe51-4b1f-adf6-daefea565c51,no_channel&lt;span class="w"&gt; &lt;/span&gt;--global-crash-keys&lt;span class="o"&gt;=&lt;/span&gt;7744fdfa-fe51-4b1f-adf6-daefea565c51,no_channel,_companyName&lt;span class="o"&gt;=&lt;/span&gt;marktext,_productName&lt;span class="o"&gt;=&lt;/span&gt;marktext,_version&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.17.1&lt;span class="w"&gt; &lt;/span&gt;--user-data-dir&lt;span class="o"&gt;=&lt;/span&gt;/home/sergio/.var/app/com.github.marktext.marktext/config/marktext&lt;span class="w"&gt; &lt;/span&gt;--shared-files&lt;span class="o"&gt;=&lt;/span&gt;v8_context_snapshot_data:100
sergio&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;74&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;.2&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.6&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;25595728&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;212480&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;     &lt;/span&gt;Sl&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:40&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;:27&lt;span class="w"&gt; &lt;/span&gt;/app/marktext/marktext&lt;span class="w"&gt; &lt;/span&gt;--type&lt;span class="o"&gt;=&lt;/span&gt;renderer&lt;span class="w"&gt; &lt;/span&gt;--enable-crash-reporter&lt;span class="o"&gt;=&lt;/span&gt;7744fdfa-fe51-4b1f-adf6-daefea565c51,no_channel&lt;span class="w"&gt; &lt;/span&gt;--global-crash-keys&lt;span class="o"&gt;=&lt;/span&gt;7744fdfa-fe51-4b1f-adf6-daefea565c51,no_channel,_companyName&lt;span class="o"&gt;=&lt;/span&gt;marktext,_productName&lt;span class="o"&gt;=&lt;/span&gt;marktext,_version&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.17.1&lt;span class="w"&gt; &lt;/span&gt;--user-data-dir&lt;span class="o"&gt;=&lt;/span&gt;/home/sergio/.var/app/com.github.marktext.marktext/config/marktext&lt;span class="w"&gt; &lt;/span&gt;--app-path&lt;span class="o"&gt;=&lt;/span&gt;/app/marktext/resources/app.asar&lt;span class="w"&gt; &lt;/span&gt;--no-sandbox&lt;span class="w"&gt; &lt;/span&gt;--no-zygote&lt;span class="w"&gt; &lt;/span&gt;--field-trial-handle&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;9170851604328465342&lt;/span&gt;,17458150017059513700,131072&lt;span class="w"&gt; &lt;/span&gt;--disable-features&lt;span class="o"&gt;=&lt;/span&gt;SpareRendererForSitePerProcess&lt;span class="w"&gt; &lt;/span&gt;--disable-gpu-compositing&lt;span class="w"&gt; &lt;/span&gt;--lang&lt;span class="o"&gt;=&lt;/span&gt;es-419&lt;span class="w"&gt; &lt;/span&gt;--num-raster-threads&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--enable-main-frame-before-activation&lt;span class="w"&gt; &lt;/span&gt;--renderer-client-id&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--no-v8-untrusted-code-mitigations&lt;span class="w"&gt; &lt;/span&gt;--shared-files&lt;span class="o"&gt;=&lt;/span&gt;v8_context_snapshot_data:100
sergio&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;144&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;7884&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;4224&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;S&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt;:08&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;-bash
sergio&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;145&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;11032&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;4608&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;R+&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt;:08&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;ps&lt;span class="w"&gt; &lt;/span&gt;auxwww
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;La herramienta &lt;strong&gt;nsenter&lt;/strong&gt; permite ejecutar comandos en namespaces de un proceso determinado, en este caso, el de bwrap. Como no especificamos ningún comando, corre el shell bash.&lt;/p&gt;
&lt;p&gt;Allí podemos ver el espacio de nombres aislados de números de procesos, como se ve arriba, o como mostramos a continuación, los montajes aislados:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;-bash-5.2$&lt;span class="w"&gt; &lt;/span&gt;df&lt;span class="w"&gt; &lt;/span&gt;-h&lt;span class="w"&gt;  &lt;/span&gt;
S.ficheros&lt;span class="w"&gt;     &lt;/span&gt;Tamaño&lt;span class="w"&gt; &lt;/span&gt;Usados&lt;span class="w"&gt;  &lt;/span&gt;Disp&lt;span class="w"&gt; &lt;/span&gt;Uso%&lt;span class="w"&gt; &lt;/span&gt;Montado&lt;span class="w"&gt; &lt;/span&gt;en&lt;span class="w"&gt;  &lt;/span&gt;
tmpfs&lt;span class="w"&gt;             &lt;/span&gt;16G&lt;span class="w"&gt;    &lt;/span&gt;92K&lt;span class="w"&gt;   &lt;/span&gt;16G&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;/etc/timezone&lt;span class="w"&gt;  &lt;/span&gt;
/dev/sda6&lt;span class="w"&gt;        &lt;/span&gt;511G&lt;span class="w"&gt;   &lt;/span&gt;434G&lt;span class="w"&gt;   &lt;/span&gt;76G&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;86&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;/cs&lt;span class="w"&gt;  &lt;/span&gt;
tmpfs&lt;span class="w"&gt;             &lt;/span&gt;16G&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;16G&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;/usr/lib/x86_64-linux-gnu/GL&lt;span class="w"&gt;  &lt;/span&gt;
/dev/sda6&lt;span class="w"&gt;        &lt;/span&gt;511G&lt;span class="w"&gt;   &lt;/span&gt;434G&lt;span class="w"&gt;   &lt;/span&gt;76G&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;86&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;/home&lt;span class="w"&gt;  &lt;/span&gt;
tmpfs&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;,2G&lt;span class="w"&gt;    &lt;/span&gt;11M&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;,2G&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;/run/host/monitor&lt;span class="w"&gt;  &lt;/span&gt;
tmpfs&lt;span class="w"&gt;             &lt;/span&gt;16G&lt;span class="w"&gt;    &lt;/span&gt;15M&lt;span class="w"&gt;   &lt;/span&gt;16G&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;/dev&lt;span class="w"&gt;  &lt;/span&gt;
devtmpfs&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;,0M&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;,0M&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;/dev/tty&lt;span class="w"&gt;  &lt;/span&gt;
tmpfs&lt;span class="w"&gt;             &lt;/span&gt;16G&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;16G&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;/home/sergio/.local/share/flatpak&lt;span class="w"&gt;  &lt;/span&gt;
tmpfs&lt;span class="w"&gt;             &lt;/span&gt;16G&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;16G&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;/home/sergio/.var/app&lt;span class="w"&gt;  &lt;/span&gt;
/dev/sda3&lt;span class="w"&gt;        &lt;/span&gt;382G&lt;span class="w"&gt;   &lt;/span&gt;100G&lt;span class="w"&gt;  &lt;/span&gt;283G&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;/mnt/win10&lt;span class="w"&gt;  &lt;/span&gt;
tmpfs&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;,3G&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;,3M&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;,3G&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;/run/media&lt;span class="w"&gt;  &lt;/span&gt;
tmpfs&lt;span class="w"&gt;             &lt;/span&gt;16G&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;,0M&lt;span class="w"&gt;   &lt;/span&gt;16G&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;/tmp&lt;span class="w"&gt;  &lt;/span&gt;
tmpfs&lt;span class="w"&gt;             &lt;/span&gt;16G&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;16G&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;%&lt;span class="w"&gt; &lt;/span&gt;/tmp/.X11-unix&lt;span class="w"&gt;  &lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;También podemos pensar que estos recursos que se aíslan se virtualizan. Cuando hablamos de virtualización, probablemente pensemos en un disco o en una interfaz de red virtual. Pero aquí vemos, por ejemplo, que un espacio de nombres de PID's también se puede virtualizar.&lt;/p&gt;
&lt;p&gt;Y cuando más de un recurso se puede virtualizar, de ahí a crear un contenedor hay una corta distancia. De hecho, los namespaces sirve tanto para un usuario final con flatpak como en la creación de contenedores lxc (ah, sí lxc existe desde 2008, aunque ya no esté más de moda 😁) &lt;strong&gt;docker&lt;/strong&gt; o &lt;strong&gt;podman&lt;/strong&gt; para un sysadmin o un desarrollador.&lt;/p&gt;
&lt;p&gt;A continuación, veremos algunos ejemplos de cómo utilizar los namespaces en contenedores Podman. Es importante conocer el PID del contenedor en el host para estos ejemplos.&lt;/p&gt;
&lt;h4 id="ejemplo-1-ver-la-configuracion-de-red-del-contenedor-que-usa-network-mode-pasta"&gt;Ejemplo 1: Ver la configuración de red del contenedor que usa network mode pasta&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;❯&lt;span class="w"&gt; &lt;/span&gt;podman&lt;span class="w"&gt; &lt;/span&gt;unshare&lt;span class="w"&gt; &lt;/span&gt;nsenter&lt;span class="w"&gt; &lt;/span&gt;--target&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;29420&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--net&lt;span class="w"&gt;  &lt;/span&gt;
❯&lt;span class="w"&gt; &lt;/span&gt;ip&lt;span class="w"&gt; &lt;/span&gt;a
&lt;span class="m"&gt;1&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;lo:&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;mtu&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;65536&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;qdisc&lt;span class="w"&gt; &lt;/span&gt;noqueue&lt;span class="w"&gt; &lt;/span&gt;state&lt;span class="w"&gt; &lt;/span&gt;UNKNOWN&lt;span class="w"&gt; &lt;/span&gt;group&lt;span class="w"&gt; &lt;/span&gt;default&lt;span class="w"&gt; &lt;/span&gt;qlen&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;link/loopback&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00:00:00:00&lt;span class="w"&gt; &lt;/span&gt;brd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00:00:00:00
&lt;span class="w"&gt;    &lt;/span&gt;inet&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1/8&lt;span class="w"&gt; &lt;/span&gt;scope&lt;span class="w"&gt; &lt;/span&gt;host&lt;span class="w"&gt; &lt;/span&gt;lo
&lt;span class="w"&gt;       &lt;/span&gt;valid_lft&lt;span class="w"&gt; &lt;/span&gt;forever&lt;span class="w"&gt; &lt;/span&gt;preferred_lft&lt;span class="w"&gt; &lt;/span&gt;forever
&lt;span class="w"&gt;    &lt;/span&gt;inet6&lt;span class="w"&gt; &lt;/span&gt;::1/128&lt;span class="w"&gt; &lt;/span&gt;scope&lt;span class="w"&gt; &lt;/span&gt;host&lt;span class="w"&gt; &lt;/span&gt;proto&lt;span class="w"&gt; &lt;/span&gt;kernel_lo&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;valid_lft&lt;span class="w"&gt; &lt;/span&gt;forever&lt;span class="w"&gt; &lt;/span&gt;preferred_lft&lt;span class="w"&gt; &lt;/span&gt;forever
&lt;span class="m"&gt;2&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;wlp108s0:&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;mtu&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;65520&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;qdisc&lt;span class="w"&gt; &lt;/span&gt;fq_codel&lt;span class="w"&gt; &lt;/span&gt;state&lt;span class="w"&gt; &lt;/span&gt;UNKNOWN&lt;span class="w"&gt; &lt;/span&gt;group&lt;span class="w"&gt; &lt;/span&gt;default&lt;span class="w"&gt; &lt;/span&gt;qlen&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;link/ether&lt;span class="w"&gt; &lt;/span&gt;ea:38:5b:0b:a8:a8&lt;span class="w"&gt; &lt;/span&gt;brd&lt;span class="w"&gt; &lt;/span&gt;ff:ff:ff:ff:ff:ff
&lt;span class="w"&gt;    &lt;/span&gt;inet&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.0.144/24&lt;span class="w"&gt; &lt;/span&gt;brd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.0.255&lt;span class="w"&gt; &lt;/span&gt;scope&lt;span class="w"&gt; &lt;/span&gt;global&lt;span class="w"&gt; &lt;/span&gt;noprefixroute&lt;span class="w"&gt; &lt;/span&gt;wlp108s0
&lt;span class="w"&gt;       &lt;/span&gt;valid_lft&lt;span class="w"&gt; &lt;/span&gt;forever&lt;span class="w"&gt; &lt;/span&gt;preferred_lft&lt;span class="w"&gt; &lt;/span&gt;forever
&lt;span class="w"&gt;    &lt;/span&gt;inet6&lt;span class="w"&gt; &lt;/span&gt;fe80::e838:5bff:fe0b:a8a8/64&lt;span class="w"&gt; &lt;/span&gt;scope&lt;span class="w"&gt; &lt;/span&gt;link&lt;span class="w"&gt; &lt;/span&gt;proto&lt;span class="w"&gt; &lt;/span&gt;kernel_ll&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;valid_lft&lt;span class="w"&gt; &lt;/span&gt;forever&lt;span class="w"&gt; &lt;/span&gt;preferred_lft&lt;span class="w"&gt; &lt;/span&gt;forever
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="ejemplo-2-ver-la-configuracion-de-red-del-contenedor-que-usa-network-mode-slirp4netns"&gt;Ejemplo 2: Ver la configuración de red del contenedor que usa network mode slirp4netns&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="w"&gt;  &lt;/span&gt;podman&lt;span class="w"&gt; &lt;/span&gt;unshare&lt;span class="w"&gt; &lt;/span&gt;nsenter&lt;span class="w"&gt; &lt;/span&gt;--target&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;46222&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--net&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;root&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/to_delete&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;❯&lt;span class="w"&gt; &lt;/span&gt;ip&lt;span class="w"&gt; &lt;/span&gt;a
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;lo:&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;mtu&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;65536&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;qdisc&lt;span class="w"&gt; &lt;/span&gt;noqueue&lt;span class="w"&gt; &lt;/span&gt;state&lt;span class="w"&gt; &lt;/span&gt;UNKNOWN&lt;span class="w"&gt; &lt;/span&gt;group&lt;span class="w"&gt; &lt;/span&gt;default&lt;span class="w"&gt; &lt;/span&gt;qlen&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;link/loopback&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00:00:00:00&lt;span class="w"&gt; &lt;/span&gt;brd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00:00:00:00
&lt;span class="w"&gt;      &lt;/span&gt;inet&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;127&lt;/span&gt;.0.0.1/8&lt;span class="w"&gt; &lt;/span&gt;scope&lt;span class="w"&gt; &lt;/span&gt;host&lt;span class="w"&gt; &lt;/span&gt;lo
&lt;span class="w"&gt;         &lt;/span&gt;valid_lft&lt;span class="w"&gt; &lt;/span&gt;forever&lt;span class="w"&gt; &lt;/span&gt;preferred_lft&lt;span class="w"&gt; &lt;/span&gt;forever
&lt;span class="w"&gt;      &lt;/span&gt;inet6&lt;span class="w"&gt; &lt;/span&gt;::1/128&lt;span class="w"&gt; &lt;/span&gt;scope&lt;span class="w"&gt; &lt;/span&gt;host&lt;span class="w"&gt; &lt;/span&gt;proto&lt;span class="w"&gt; &lt;/span&gt;kernel_lo&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;valid_lft&lt;span class="w"&gt; &lt;/span&gt;forever&lt;span class="w"&gt; &lt;/span&gt;preferred_lft&lt;span class="w"&gt; &lt;/span&gt;forever
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;tap0:&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;BROADCAST,UP,LOWER_UP&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;mtu&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;65520&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;qdisc&lt;span class="w"&gt; &lt;/span&gt;fq_codel&lt;span class="w"&gt; &lt;/span&gt;state&lt;span class="w"&gt; &lt;/span&gt;UNKNOWN&lt;span class="w"&gt; &lt;/span&gt;group&lt;span class="w"&gt; &lt;/span&gt;default&lt;span class="w"&gt; &lt;/span&gt;qlen&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;link/ether&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;92&lt;/span&gt;:b6:67:25:13:33&lt;span class="w"&gt; &lt;/span&gt;brd&lt;span class="w"&gt; &lt;/span&gt;ff:ff:ff:ff:ff:ff
&lt;span class="w"&gt;      &lt;/span&gt;inet&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.0.2.100/24&lt;span class="w"&gt; &lt;/span&gt;brd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.0.2.255&lt;span class="w"&gt; &lt;/span&gt;scope&lt;span class="w"&gt; &lt;/span&gt;global&lt;span class="w"&gt; &lt;/span&gt;tap0
&lt;span class="w"&gt;         &lt;/span&gt;valid_lft&lt;span class="w"&gt; &lt;/span&gt;forever&lt;span class="w"&gt; &lt;/span&gt;preferred_lft&lt;span class="w"&gt; &lt;/span&gt;forever
&lt;span class="w"&gt;      &lt;/span&gt;inet6&lt;span class="w"&gt; &lt;/span&gt;fd00::90b6:67ff:fe25:1333/64&lt;span class="w"&gt; &lt;/span&gt;scope&lt;span class="w"&gt; &lt;/span&gt;global&lt;span class="w"&gt; &lt;/span&gt;dynamic&lt;span class="w"&gt; &lt;/span&gt;mngtmpaddr&lt;span class="w"&gt; &lt;/span&gt;proto&lt;span class="w"&gt; &lt;/span&gt;kernel_ra&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;valid_lft&lt;span class="w"&gt; &lt;/span&gt;86356sec&lt;span class="w"&gt; &lt;/span&gt;preferred_lft&lt;span class="w"&gt; &lt;/span&gt;14356sec
&lt;span class="w"&gt;      &lt;/span&gt;inet6&lt;span class="w"&gt; &lt;/span&gt;fe80::90b6:67ff:fe25:1333/64&lt;span class="w"&gt; &lt;/span&gt;scope&lt;span class="w"&gt; &lt;/span&gt;link&lt;span class="w"&gt; &lt;/span&gt;proto&lt;span class="w"&gt; &lt;/span&gt;kernel_ll&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;valid_lft&lt;span class="w"&gt; &lt;/span&gt;forever&lt;span class="w"&gt; &lt;/span&gt;preferred_lft&lt;span class="w"&gt; &lt;/span&gt;forever
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="ejemplo-3-probar-la-resolucion-de-nombres-usando-el-archivo-etcresolvconf-del-contenedor"&gt;Ejemplo 3: Probar la resolución de nombres usando el archivo /etc/resolv.conf del contenedor&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;❯&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;container_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;podman&lt;span class="w"&gt; &lt;/span&gt;inspect&lt;span class="w"&gt; &lt;/span&gt;--format&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{{.Id}}'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;namespace-demo&lt;span class="k"&gt;)&lt;/span&gt;
❯&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;/run/user/1000/containers/overlay-containers/&lt;span class="nv"&gt;$container_id&lt;/span&gt;/userdata/resolv.conf&lt;span class="w"&gt; &lt;/span&gt;/tmp/container_resolv.conf&lt;span class="w"&gt;    &lt;/span&gt;
❯&lt;span class="w"&gt; &lt;/span&gt;podman&lt;span class="w"&gt; &lt;/span&gt;unshare&lt;span class="w"&gt; &lt;/span&gt;nsenter&lt;span class="w"&gt; &lt;/span&gt;--target&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;46222&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;--net&lt;span class="w"&gt; &lt;/span&gt;dig&lt;span class="w"&gt; &lt;/span&gt;google.com&lt;span class="w"&gt; &lt;/span&gt;@&lt;span class="k"&gt;$(&lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'nameserver'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/container_resolv.conf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{print $2}'&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;DiG&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;.18.26&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;google.com&lt;span class="w"&gt; &lt;/span&gt;@10.0.2.3
&lt;span class="p"&gt;;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;global&lt;span class="w"&gt; &lt;/span&gt;options:&lt;span class="w"&gt; &lt;/span&gt;+cmd
&lt;span class="p"&gt;;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Got&lt;span class="w"&gt; &lt;/span&gt;answer:
&lt;span class="p"&gt;;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&amp;gt;&amp;gt;HEADER&lt;span class="s"&gt;&amp;lt;&amp;lt;- opco&lt;/span&gt;de:&lt;span class="w"&gt; &lt;/span&gt;QUERY,&lt;span class="w"&gt; &lt;/span&gt;status:&lt;span class="w"&gt; &lt;/span&gt;NOERROR,&lt;span class="w"&gt; &lt;/span&gt;id:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;25213&lt;/span&gt;
&lt;span class="p"&gt;;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;flags:&lt;span class="w"&gt; &lt;/span&gt;qr&lt;span class="w"&gt; &lt;/span&gt;rd&lt;span class="w"&gt; &lt;/span&gt;ra&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;QUERY:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;ANSWER:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;AUTHORITY:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;ADDITIONAL:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;

&lt;span class="p"&gt;;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;OPT&lt;span class="w"&gt; &lt;/span&gt;PSEUDOSECTION:
&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;EDNS:&lt;span class="w"&gt; &lt;/span&gt;version:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;flags:&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;udp:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;65494&lt;/span&gt;
&lt;span class="p"&gt;;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;QUESTION&lt;span class="w"&gt; &lt;/span&gt;SECTION:
&lt;span class="p"&gt;;&lt;/span&gt;google.com.&lt;span class="w"&gt;                    &lt;/span&gt;IN&lt;span class="w"&gt;      &lt;/span&gt;A

&lt;span class="p"&gt;;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ANSWER&lt;span class="w"&gt; &lt;/span&gt;SECTION:
google.com.&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="m"&gt;263&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;IN&lt;span class="w"&gt;      &lt;/span&gt;A&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;142&lt;/span&gt;.251.133.78

&lt;span class="p"&gt;;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Query&lt;span class="w"&gt; &lt;/span&gt;time:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;msec
&lt;span class="p"&gt;;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;SERVER:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.0.2.3#53&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.0.2.3&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;UDP&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;WHEN:&lt;span class="w"&gt; &lt;/span&gt;Thu&lt;span class="w"&gt; &lt;/span&gt;Jul&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;25&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt;:50:18&lt;span class="w"&gt; &lt;/span&gt;-03&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;
&lt;span class="p"&gt;;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;MSG&lt;span class="w"&gt; &lt;/span&gt;SIZE&lt;span class="w"&gt;  &lt;/span&gt;rcvd:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;55&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="ejemplo-4-ver-los-procesos-de-un-contenedor-rootless"&gt;Ejemplo 4: Ver los procesos de un contenedor rootless&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;❯&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;nsenter&lt;span class="w"&gt; &lt;/span&gt;--pid&lt;span class="o"&gt;=&lt;/span&gt;/proc/&lt;span class="nv"&gt;$container_pid&lt;/span&gt;/ns/pid&lt;span class="w"&gt; &lt;/span&gt;unshare&lt;span class="w"&gt; &lt;/span&gt;--mount-proc
&lt;span class="o"&gt;[&lt;/span&gt;sudo&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;contraseña&lt;span class="w"&gt; &lt;/span&gt;para&lt;span class="w"&gt; &lt;/span&gt;sergio:&lt;span class="w"&gt; &lt;/span&gt;
❯&lt;span class="w"&gt; &lt;/span&gt;ps
&lt;span class="w"&gt;  &lt;/span&gt;PID&lt;span class="w"&gt; &lt;/span&gt;TTY&lt;span class="w"&gt;          &lt;/span&gt;TIME&lt;span class="w"&gt; &lt;/span&gt;CMD
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1508&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pts/6&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;bash
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1612&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pts/6&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;ps
❯&lt;span class="w"&gt; &lt;/span&gt;ps&lt;span class="w"&gt; &lt;/span&gt;aux
USER&lt;span class="w"&gt;         &lt;/span&gt;PID&lt;span class="w"&gt; &lt;/span&gt;%CPU&lt;span class="w"&gt; &lt;/span&gt;%MEM&lt;span class="w"&gt;    &lt;/span&gt;VSZ&lt;span class="w"&gt;   &lt;/span&gt;RSS&lt;span class="w"&gt; &lt;/span&gt;TTY&lt;span class="w"&gt;      &lt;/span&gt;STAT&lt;span class="w"&gt; &lt;/span&gt;START&lt;span class="w"&gt;   &lt;/span&gt;TIME&lt;span class="w"&gt; &lt;/span&gt;COMMAND
sergio&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;14932&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;7168&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;Ss&lt;span class="w"&gt;   &lt;/span&gt;jul25&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;/usr/sbin/sshd&lt;span class="w"&gt; &lt;/span&gt;-D
sergio&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;14084&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;7936&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;S&lt;span class="w"&gt;    &lt;/span&gt;jul25&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;sshd:&lt;span class="w"&gt; &lt;/span&gt;/usr/sbin/sshd&lt;span class="w"&gt; &lt;/span&gt;-D&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;listener&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;-100&lt;span class="w"&gt; &lt;/span&gt;startups
root&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;1508&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.5&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;231260&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;6528&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pts/6&lt;span class="w"&gt;    &lt;/span&gt;S&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt;:00&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;-bash
root&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;1641&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;230836&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;3968&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pts/6&lt;span class="w"&gt;    &lt;/span&gt;R+&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt;:00&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;:00&lt;span class="w"&gt; &lt;/span&gt;ps&lt;span class="w"&gt; &lt;/span&gt;aux
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="ejemplo-5-crear-namespaces-no-privilegiados-con-un-poco-de-ayuda"&gt;Ejemplo 5: Crear namespaces no privilegiados con un poco de ayuda&lt;/h4&gt;
&lt;p&gt;Por último, veamos como usar la herramienta rootlesskit para crear fácilmente namespaces rootless:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;❯&lt;span class="w"&gt; &lt;/span&gt;rootlesskit&lt;span class="w"&gt; &lt;/span&gt;bash
❯&lt;span class="w"&gt; &lt;/span&gt;id
&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;root&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;root&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;grupos&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;root&lt;span class="o"&gt;)&lt;/span&gt;,65534&lt;span class="o"&gt;(&lt;/span&gt;nobody&lt;span class="o"&gt;)&lt;/span&gt;
❯&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;
❯&lt;span class="w"&gt; &lt;/span&gt;rootlesskit&lt;span class="w"&gt; &lt;/span&gt;--copy-up&lt;span class="o"&gt;=&lt;/span&gt;/etc&lt;span class="w"&gt; &lt;/span&gt;bash&lt;span class="w"&gt;  &lt;/span&gt;
❯&lt;span class="w"&gt; &lt;/span&gt;touch&lt;span class="w"&gt; &lt;/span&gt;/etc/sample
❯&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;/etc/sample
-rw-r--r--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;root&lt;span class="w"&gt; &lt;/span&gt;root&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jul&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;:12&lt;span class="w"&gt; &lt;/span&gt;/etc/sample
❯&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;
❯&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;/etc/sample
ls:&lt;span class="w"&gt; &lt;/span&gt;no&lt;span class="w"&gt; &lt;/span&gt;se&lt;span class="w"&gt; &lt;/span&gt;puede&lt;span class="w"&gt; &lt;/span&gt;acceder&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'/etc/sample'&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;No&lt;span class="w"&gt; &lt;/span&gt;existe&lt;span class="w"&gt; &lt;/span&gt;el&lt;span class="w"&gt; &lt;/span&gt;fichero&lt;span class="w"&gt; &lt;/span&gt;o&lt;span class="w"&gt; &lt;/span&gt;el&lt;span class="w"&gt; &lt;/span&gt;directorio
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="conclusion"&gt;Conclusión&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;En este post, hemos visto que los namespaces sirven para aislar recursos con diferentes propósitos y que herramientas como &lt;code&gt;unshare&lt;/code&gt; y &lt;code&gt;nsenter&lt;/code&gt; son muy útiles para entender cómo funciona una aplicación instalada con Flatpak, pero también un contenedor podman o similar, lo cual facilita la resolución de problemas.&lt;/strong&gt;
Algunas actividades que propongo para continuar ejercitando este tema son:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Instalar aplicaciones de Flatpak y observar qué sucede cuando más de un proceso está involucrado.&lt;/li&gt;
&lt;li&gt;Examinar qué ocurre con las tablas de ruteo, las listas de iptables o nftables, etc., en un nuevo namespace de red.&lt;/li&gt;
&lt;li&gt;Crear un namespace de usuario y explorar cómo este afecta la ejecución de comandos y procesos.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;¡Hasta la próxima!&lt;/p&gt;
&lt;h3 id="fuentes-y-recursos"&gt;Fuentes y Recursos&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://man7.org/linux/man-pages/man7/namespaces.7.html"&gt;&lt;strong&gt;man7.org - namespaces&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://man7.org/linux/man-pages/man1/unshare.1.html"&gt;&lt;strong&gt;man1.org - unshare&lt;/strong&gt;)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://man7.org/linux/man-pages/man1/nsenter.1.html"&gt;&lt;strong&gt;man1.org - nsenter&lt;/strong&gt;)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/engine/security/userns-remap/"&gt;&lt;strong&gt;Docker - Namespaces Overview&lt;/strong&gt;&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rootless-containers/rootlesskit"&gt;&lt;strong&gt;Linux-native "fake root" for implementing rootless containers&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description><category>contenedores</category><category>herramientas</category><guid>https://sergiobelkin.com/posts/que-son-los-namespaces-y-que-podemos-hacer-con-ellos/</guid><pubDate>Sat, 03 Aug 2024 19:29:34 GMT</pubDate></item><item><title>¿Qué es flatpak?</title><link>https://sergiobelkin.com/posts/que-es-flatpak/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;Es conveniente y merecido que &lt;strong&gt;Flatpak&lt;/strong&gt; tenga un post especialmente dedicado a él, más allá de su interacción con polkit que dejamos planteado en el &lt;a href="https://sergiobelkin.com/posts/entendiendo-polkit/"&gt;post anterior&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/flatpak-spirit.webp"&gt;&lt;img src="https://sergiobelkin.com/images/flatpak-spirit.thumbnail.webp" alt="Flatpak"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;h2 id="brevisimo-repaso-historico"&gt;Brevísimo repaso histórico&lt;/h2&gt;
&lt;p&gt;En agosto de &lt;strong&gt;2007&lt;/strong&gt; el desarrollador sueco &lt;strong&gt;Alexander Larsson&lt;/strong&gt; lanza su primer intento de empaquetar aplicaciones con todas sus dependencias. A fines de &lt;strong&gt;2014&lt;/strong&gt; comienza a trabajar en el proyecto &lt;strong&gt;xdg-app&lt;/strong&gt;, el cual cambia de nombre a &lt;strong&gt;Flatpak&lt;/strong&gt; en 2016.&lt;/p&gt;
&lt;h3 id="que-es-flatpak"&gt;¿Qué es Flatpak?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Flatpak&lt;/strong&gt; es un sistema para compilar, distribuir y ejecutar aplicaciones. Las aplicaciones se pueden compilar y distribuir independientemente del sistema en que se usan, y al ejecutarse están aisladas del mismo hasta cierto punto.&lt;/p&gt;
&lt;p&gt;Cada aplicación está en un sandbox, de manera predeterminada solamente puede acceder al contenido del mismo. Cada programa en flatpak tiene acceso a &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.var/app/$FLATPAK_ID&lt;/code&gt;, y &lt;code&gt;$XDG_RUNTIME_DIR/app/$FLATPAK_ID&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;De manera limitada a llamadas del sistema.&lt;/li&gt;
&lt;li&gt;De manera limitada a la instancia de &lt;strong&gt;D-BUS&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aun así, para ser realistas, las aplicaciones en general necesitan más permisos, en este caso se insta a los empaquetadores a que adviertan qué accesos necesitará la aplicación para que el usuario esté conciente de ello, tal como cuando se instala una app desde el Play Store de Android.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/flatseal.png"&gt;&lt;img src="https://sergiobelkin.com/images/flatseal.thumbnail.png" alt="Flatseal mostrando los permisos que usa cada una de las aplicaciones instaladas" title="Hacer clic para agrandar"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Flatpak ofrece un repositorio llamado &lt;a href="https://flathub.org/"&gt;Flathub&lt;/a&gt;. Nada impide que cualquier persona o proyecto (como es el caso de Fedora) tenga el suyo propio.&lt;/p&gt;
&lt;p&gt;Flatpak usa &lt;strong&gt;OSTree&lt;/strong&gt; (&lt;em&gt;Fedora usa OCI&lt;/em&gt;) para distribuir y desplegar datos. OSTree es similar a &lt;em&gt;Git&lt;/em&gt; pero está diseñado para hacer control de versiones de binarios y archivos grandes de datos. El uso de OSTree permite además que un mismo archivo sea usado por más de una misma aplicación, ahorrando de esta manera espacio en disco. Cada aplicación que se instala es almacenada en un repositorio local de control de versiones, y luego se mapea en el sistema de archivos local.&lt;/p&gt;
&lt;p&gt;Los cambios entre las diferentes versiones de una aplicación se aplican en el filesystem mediante enlaces duros.&lt;/p&gt;
&lt;p&gt;Por ejemplo, con el comando siguiente podemos ver log del último commit de una aplicación flatpak (Logseq):
.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;❯&lt;span class="w"&gt; &lt;/span&gt;ostree&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;--repo&lt;span class="o"&gt;=&lt;/span&gt;/var/lib/flatpak/repo&lt;span class="w"&gt;  &lt;/span&gt;deploy/app/com.logseq.Logseq/x86_64/stable
commit&lt;span class="w"&gt; &lt;/span&gt;a54ee70b0ec9047c2083f77b9f9175e8e8edcac998e3be8d395009255a6a03f6
Parent:&lt;span class="w"&gt;  &lt;/span&gt;8c36feebe7ea23654917f542eb5419b71426359a42165f53496c9d82049a6806
ContentChecksum:&lt;span class="w"&gt;  &lt;/span&gt;4d06f4e875d0335f2ff1c7a30ffa5b200c9a3eb3aeb0b608588eadb045994b22
Date:&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-06-09&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;07&lt;/span&gt;:22:27&lt;span class="w"&gt; &lt;/span&gt;+0000

&lt;span class="w"&gt;    &lt;/span&gt;Remove&lt;span class="w"&gt; &lt;/span&gt;screenshot&lt;span class="w"&gt; &lt;/span&gt;locale&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;8a160109&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;Name:&lt;span class="w"&gt; &lt;/span&gt;com.logseq.Logseq
&lt;span class="w"&gt;    &lt;/span&gt;Arch:&lt;span class="w"&gt; &lt;/span&gt;x86_64
&lt;span class="w"&gt;    &lt;/span&gt;Branch:&lt;span class="w"&gt; &lt;/span&gt;stable
&lt;span class="w"&gt;    &lt;/span&gt;Built&lt;span class="w"&gt; &lt;/span&gt;with:&lt;span class="w"&gt; &lt;/span&gt;Flatpak&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.14.8

&amp;lt;&amp;lt;&lt;span class="w"&gt; &lt;/span&gt;History&lt;span class="w"&gt; &lt;/span&gt;beyond&lt;span class="w"&gt; &lt;/span&gt;this&lt;span class="w"&gt; &lt;/span&gt;commit&lt;span class="w"&gt; &lt;/span&gt;not&lt;span class="w"&gt; &lt;/span&gt;fetched&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;En realidad el comando mostrado es de bajo nivel solamente a los efectos de mostrar ostree como software subyacente, para obtener información a más alto nivel, es conveniente usar directamente el comando &lt;strong&gt;flatpak&lt;/strong&gt; para obtener información de la aplicación:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;flatpak&lt;span class="w"&gt; &lt;/span&gt;info&lt;span class="w"&gt; &lt;/span&gt;com.logseq.Logseq&lt;span class="w"&gt; &lt;/span&gt;

Logseq&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Connect&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;notes&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;knowledge

&lt;span class="w"&gt;                 &lt;/span&gt;ID:&lt;span class="w"&gt; &lt;/span&gt;com.logseq.Logseq
&lt;span class="w"&gt;         &lt;/span&gt;Referencia:&lt;span class="w"&gt; &lt;/span&gt;app/com.logseq.Logseq/x86_64/stable
&lt;span class="w"&gt;       &lt;/span&gt;Arquitectura:&lt;span class="w"&gt; &lt;/span&gt;x86_64
&lt;span class="w"&gt;               &lt;/span&gt;Rama:&lt;span class="w"&gt; &lt;/span&gt;stable
&lt;span class="w"&gt;            &lt;/span&gt;Versión:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.10.9
&lt;span class="w"&gt;           &lt;/span&gt;Licencia:&lt;span class="w"&gt; &lt;/span&gt;AGPL-3.0-or-later
&lt;span class="w"&gt;             &lt;/span&gt;Origen:&lt;span class="w"&gt; &lt;/span&gt;flathub
&lt;span class="w"&gt;          &lt;/span&gt;Colección:&lt;span class="w"&gt; &lt;/span&gt;org.flathub.Stable
&lt;span class="w"&gt;        &lt;/span&gt;Instalación:&lt;span class="w"&gt; &lt;/span&gt;system
&lt;span class="w"&gt;          &lt;/span&gt;Instalada:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;437&lt;/span&gt;,7&lt;span class="w"&gt; &lt;/span&gt;MB
Tiempo&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;ejecución:&lt;span class="w"&gt; &lt;/span&gt;org.freedesktop.Platform/x86_64/23.08
&lt;span class="w"&gt;                &lt;/span&gt;Sdk:&lt;span class="w"&gt; &lt;/span&gt;org.freedesktop.Sdk/x86_64/23.08

&lt;span class="w"&gt;             &lt;/span&gt;Commit:&lt;span class="w"&gt; &lt;/span&gt;a54ee70b0ec9047c2083f77b9f9175e8e8edcac998e3be8d395009255a6a03f6
&lt;span class="w"&gt;              &lt;/span&gt;Padre:&lt;span class="w"&gt; &lt;/span&gt;8c36feebe7ea23654917f542eb5419b71426359a42165f53496c9d82049a6806
&lt;span class="w"&gt;             &lt;/span&gt;Asunto:&lt;span class="w"&gt; &lt;/span&gt;Remove&lt;span class="w"&gt; &lt;/span&gt;screenshot&lt;span class="w"&gt; &lt;/span&gt;locale&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;8a160109&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;Fecha:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-06-09&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;07&lt;/span&gt;:22:27&lt;span class="w"&gt; &lt;/span&gt;+0000
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="comparacion-entre-dnf-apt-y-flatpak"&gt;Comparación entre dnf, apt y flatpak&lt;/h3&gt;
&lt;p&gt;Flatpak está pensado para todo tipo de aplicaciones de escritorio y se esfuerza por ser tan neutral como sea posible en cuanto a los métodos que usa para compilar aplicaciones.&lt;/p&gt;
&lt;p&gt;Además, flatpak proporciona actualizaciones atómicas, rollback y consistencia post-instalación.&lt;/p&gt;
&lt;p&gt;El siguiente cuadro nos ayuda a ver las diferencias con los dos gestores populares de paquetes: &lt;em&gt;dnf&lt;/em&gt; y &lt;em&gt;apt&lt;/em&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;DNF&lt;/th&gt;
&lt;th&gt;APT&lt;/th&gt;
&lt;th&gt;Flatpak&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distribución Principal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fedora, RHEL, CentOS&lt;/td&gt;
&lt;td&gt;Debian, Ubuntu&lt;/td&gt;
&lt;td&gt;Varias distribuciones de Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Formato de Paquete&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RPM&lt;/td&gt;
&lt;td&gt;DEB&lt;/td&gt;
&lt;td&gt;OSTree, Flatpak Bundle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gestión de Dependencias&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manejo automático de dependencias&lt;/td&gt;
&lt;td&gt;Manejo automático de dependencias&lt;/td&gt;
&lt;td&gt;Manejo dentro del sandbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aislamiento&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Sí, aplicaciones ejecutadas en sandbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Instalación de Aplicaciones&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Desde repositorios específicos del sistema&lt;/td&gt;
&lt;td&gt;Desde repositorios específicos del sistema&lt;/td&gt;
&lt;td&gt;Desde repositorios centralizados (Flathub) y repositorios personalizados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Actualizaciones&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dnf update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;apt update &amp;amp;&amp;amp; apt upgrade&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;flatpak update&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permisos de Instalación&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Requiere permisos de root&lt;/td&gt;
&lt;td&gt;Requiere permisos de root&lt;/td&gt;
&lt;td&gt;Puede instalarse sin permisos de root&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compatibilidad entre Distros&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limitada a sistemas basados en RPM&lt;/td&gt;
&lt;td&gt;Limitada a sistemas basados en DEB&lt;/td&gt;
&lt;td&gt;Compatible con múltiples distribuciones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Seguridad&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Depende de la configuración del sistema&lt;/td&gt;
&lt;td&gt;Depende de la configuración del sistema&lt;/td&gt;
&lt;td&gt;Sandboxing y permisos controlados por portales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Facilidad de Uso&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Interfaz de línea de comandos&lt;/td&gt;
&lt;td&gt;Interfaz de línea de comandos&lt;/td&gt;
&lt;td&gt;Interfaz de línea de comandos y GUI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Espacio de Disco&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compartido entre aplicaciones&lt;/td&gt;
&lt;td&gt;Compartido entre aplicaciones&lt;/td&gt;
&lt;td&gt;Deduplicación y compartición de runtimes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Formato de Archivo Individual&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No aplica&lt;/td&gt;
&lt;td&gt;No aplica&lt;/td&gt;
&lt;td&gt;Flatpak Bundle (&lt;code&gt;.flatpak&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Desventajas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Depende de la política de la distro&lt;/td&gt;
&lt;td&gt;Dependencia de la política de la distro&lt;/td&gt;
&lt;td&gt;Las aplicaciones pueden tener un mayor tamaño inicial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compatibilidad con Aplicaciones Antiguas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sí, con soporte de versiones específicas&lt;/td&gt;
&lt;td&gt;Sí, con soporte de versiones específicas&lt;/td&gt;
&lt;td&gt;Generalmente más adecuado para nuevas aplicaciones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Desarrollo y Mantenimiento&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Desarrollado por el proyecto Fedora&lt;/td&gt;
&lt;td&gt;Desarrollado por el proyecto Debian&lt;/td&gt;
&lt;td&gt;Desarrollado por el proyecto Flatpak, con apoyo de Red Hat y GNOME&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Adopción&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Usado por muchas distribuciones y entornos de escritorio&lt;/td&gt;
&lt;td&gt;Usado principalmente en Debian, Ubuntu y derivadas&lt;/td&gt;
&lt;td&gt;Usado en diversas distribuciones, especialmente para aplicaciones portátiles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ejemplo de Comando de Instalación&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dnf install gedit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;apt install gedit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;flatpak install flathub org.gnome.Gedit&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;br&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="inconvenientes-para-usuarios-y-desarrolladores-de-aplicaciones-linux"&gt;Inconvenientes para usuarios y desarrolladores de aplicaciones Linux&lt;/h3&gt;
&lt;p&gt;Si bien Linux mejoró significativamente en cuando a usabilidad y experiencia de usuario en los últimos años, hay obstáculos tanto para usuarios como para desarrolladores:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Una aplicación para un entorno de escritorio en Linux se debe empaquetar para que esté disponible (como Debian, Fedora, Ubuntu, Arch Linux, etc.), y asegurarse de que cumpla con los requisitos específicos de cada sistema de paquetes (deb, rpm, etc.). Esto requiere un esfuerzo considerable para mantener múltiples versiones y asegurarse de que cada paquete funcione correctamente en su respectiva distribución. Todo esto &lt;strong&gt;demanda o más tiempo o bien más gente idónea dedicada en la tarea de crear y mantener paquetes&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Si un usuario quiere usar aplicación que no está empaquetada en la distribución, tendrá que realizar &lt;strong&gt;algún paso extra&lt;/strong&gt;, que van desde operaciones relativamente sencillas como bajar un ejecutable (darle permisos, ubicarlo en un directorio del PATH, etc.), hasta &lt;strong&gt;procedimientos bastante más complejos y fuera del interés y conocimiento de un usuario final como puede ser compilar el programa&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Una distribución de soporte a largo plazo como &lt;em&gt;Debian Stable&lt;/em&gt; no posee versiones actualizadas de la mayoría de las aplicaciones. Por lo tanto un usuario tiene que &lt;strong&gt;elegir estabilidad a cambio de software un tanto anticuado&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Flatpak tiene como propósito justamente eliminar esas barreras&lt;/strong&gt;. Gracias a Flatpak un usuario podrá instalar una aplicación como &lt;a href="https://logseq.com/"&gt;Logseq&lt;/a&gt; aun cuando no esté incluida en los repositorios de su distribución, o instalar una versión reciente de &lt;em&gt;&lt;a href="https://kdenlive.org/en/"&gt;Kdenlive&lt;/a&gt;&lt;/em&gt; en Debian Stable.&lt;/p&gt;
&lt;p&gt;En la actualidad existen distribuciones con la mirada puesta en la innovación que se benefician de Flatpak, por ejemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vanillaos.org/"&gt;Vanilla OS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fedoraproject.org/atomic-desktops/"&gt;Fedora Atomic desktops&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.endlessos.org/os"&gt;Endless OS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="caracteristicas-de-flatpak"&gt;Características de flatpak&lt;/h3&gt;
&lt;p&gt;Analicemos &lt;strong&gt;la app ONLYOFFICE&lt;/strong&gt; en flatpak:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;flatpak&lt;span class="w"&gt; &lt;/span&gt;info&lt;span class="w"&gt; &lt;/span&gt;org.onlyoffice.desktopeditors

ONLYOFFICE&lt;span class="w"&gt; &lt;/span&gt;Desktop&lt;span class="w"&gt; &lt;/span&gt;Editors&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Office&lt;span class="w"&gt; &lt;/span&gt;productivity&lt;span class="w"&gt; &lt;/span&gt;suite

&lt;span class="w"&gt;                 &lt;/span&gt;ID:&lt;span class="w"&gt; &lt;/span&gt;org.onlyoffice.desktopeditors
&lt;span class="w"&gt;         &lt;/span&gt;Referencia:&lt;span class="w"&gt; &lt;/span&gt;app/org.onlyoffice.desktopeditors/x86_64/stable
&lt;span class="w"&gt;       &lt;/span&gt;Arquitectura:&lt;span class="w"&gt; &lt;/span&gt;x86_64
&lt;span class="w"&gt;               &lt;/span&gt;Rama:&lt;span class="w"&gt; &lt;/span&gt;stable
&lt;span class="w"&gt;            &lt;/span&gt;Versión:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;.0.1
&lt;span class="w"&gt;           &lt;/span&gt;Licencia:&lt;span class="w"&gt; &lt;/span&gt;AGPL-3.0-only
&lt;span class="w"&gt;             &lt;/span&gt;Origen:&lt;span class="w"&gt; &lt;/span&gt;flathub
&lt;span class="w"&gt;          &lt;/span&gt;Colección:&lt;span class="w"&gt; &lt;/span&gt;org.flathub.Stable
&lt;span class="w"&gt;        &lt;/span&gt;Instalación:&lt;span class="w"&gt; &lt;/span&gt;system
&lt;span class="w"&gt;          &lt;/span&gt;Instalada:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;863&lt;/span&gt;,8&lt;span class="w"&gt; &lt;/span&gt;MB
Tiempo&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;ejecución:&lt;span class="w"&gt; &lt;/span&gt;org.freedesktop.Platform/x86_64/23.08
&lt;span class="w"&gt;                &lt;/span&gt;Sdk:&lt;span class="w"&gt; &lt;/span&gt;org.freedesktop.Sdk/x86_64/23.08

&lt;span class="w"&gt;             &lt;/span&gt;Commit:&lt;span class="w"&gt; &lt;/span&gt;c9f73db43c9639df65e597108eb4c685025fe484fde05f73f650d05f9ea28512
&lt;span class="w"&gt;              &lt;/span&gt;Padre:&lt;span class="w"&gt; &lt;/span&gt;a38db7bbfaa18eda6d26e9d113ce850c077bf533d9ebf5aa7e34988a58b91b28
&lt;span class="w"&gt;             &lt;/span&gt;Asunto:&lt;span class="w"&gt; &lt;/span&gt;Update&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;.0.1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;#117) (a88ad400)&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;Fecha:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-03-04&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;:34:56&lt;span class="w"&gt; &lt;/span&gt;+0000
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;La aplicación &lt;strong&gt;ONLYOFFICE&lt;/strong&gt; usa como &lt;strong&gt;runtime&lt;/strong&gt;  org.freedesktop.Platform/x86_64/23.08. El runtime org.freedesktop.Platform/x86_64/23.08 es un entorno estandarizado y versionado que provee FreeDesktop.org para ejecutar aplicaciones de escritorio en Linux. Incluye una colección de librerías y servicios comunes, que aseguran la compatibilidad y la estabilidad entre las diferentes distribuciones de Linux. Este runtime está compilado específicamente para arquitecturas de 64-bit y fue actualizado o liberado en agosto de 2023. &lt;/p&gt;
&lt;p&gt;Los runtimes no dependen ni de una distribución ni de una versión en particular de una distribución. Y una aplicación instalada en flatpak será exactamente igual no importa si se instala en Debian o en Fedora. Una aplicación como GIMP, empaquetada como Flatpak, debería proporcionar la misma funcionalidad principal y experiencia de usuario tanto en Debian como en Fedora, dado que todas las dependencias y configuraciones críticas se gestionan dentro del contenedor Flatpak. Desde luego, hay diferencias potenciales: Si una aplicación Flatpak utiliza características específicas del sistema, como integraciones con servicios de notificación de escritorio, la forma en que estas integraciones funcionan puede variar ligeramente entre GNOME en Fedora y KDE en Debian.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/flatpak-runtimes.png"&gt;&lt;img src="https://sergiobelkin.com/images/flatpak-runtimes.thumbnail.png" alt="Existen diferentes runtimes para Flatpak, tales como freedesktop, GNOME, KDE y Elementary" title="Hacer clic para agrandar"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3 id="objeciones-en-cuanto-a-la-seguridad"&gt;Objeciones en cuanto a la seguridad&lt;/h3&gt;
&lt;p&gt;Han existido críticas severas a la seguridad de flatpak, en especial por el sitio anónimo &lt;a href="https://flatkill.org/2020"&gt;Flatkill&lt;/a&gt;. El siguiente cuaddro es un resumen de los argumentos en contra y favor de Flatpak en cuanto a este tema:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Objeción de Seguridad&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descripción&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Respuesta / Acción Tomada&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sandboxing Ineficaz&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Muchas aplicaciones en Flathub tienen permisos amplios como &lt;code&gt;filesystem=host&lt;/code&gt; o &lt;code&gt;filesystem=home&lt;/code&gt;, lo que permite acceso completo al sistema de archivos del usuario.&lt;/td&gt;
&lt;td&gt;Flatpak ha mejorado la transparencia sobre los permisos de las aplicaciones y trabaja en fortalecer el modelo de sandboxing. Se han introducido portales para permitir el acceso controlado a los recursos del sistema. &lt;a href="https://docs.flatpak.org/en/latest/using-flatpak.html#sandboxes-and-permissions"&gt;Flatpak Documentation&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Actualizaciones de Seguridad Retrasadas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Algunas aplicaciones y runtimes en Flatpak no reciben actualizaciones de seguridad oportunas, lo que deja a los usuarios expuestos a vulnerabilidades conocidas.&lt;/td&gt;
&lt;td&gt;La herramienta flatpak-external-data-checker automatiza la verificación de fuentes externas y la generación de solicitudes de fusión cuando se encuentran actualizaciones. Al implementar f-e-d-c, los desarrolladores pueden asegurar que las aplicaciones en Flathub se mantengan actualizadas más fácilmente y de manera más eficiente, lo que reduce el tiempo de espera para las actualizaciones de los usuarios finales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Integración Limitada del Escritorio&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Problemas con la integración de aplicaciones Flatpak en escritorios Linux, como la falta de soporte para configuraciones de fuentes y temas de escritorio.&lt;/td&gt;
&lt;td&gt;Se han mejorado los mecanismos de integración de escritorio, incluyendo mejor soporte para fuentes y temas en KDE y GNOME. Flatpak sigue trabajando en mejorar la compatibilidad con configuraciones del sistema host.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Explotación Local de Root&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Riesgo de explotación de root local debido a aplicaciones Flatpak instaladas con permisos &lt;strong&gt;suid&lt;/strong&gt;.&lt;/td&gt;
&lt;td&gt;Flatpak utiliza nuevas APIs de libostree para rechazar cualquier archivo con permisos suid o de escritura mundial al instalar aplicaciones.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gestión de Permisos Confusa para el Usuario&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Los usuarios pueden ser engañados por íconos y descripciones que indican un falso sentido de seguridad sobre las aplicaciones sandboxed.&lt;/td&gt;
&lt;td&gt;Flatpak ha mejorado la interfaz de usuario para mostrar de manera más clara los permisos que solicita cada aplicación, ayudando a los usuarios a tomar decisiones informadas sobre las aplicaciones que instalan.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br&gt;
&lt;a class="image-reference" href="https://sergiobelkin.com/images/flathub.png"&gt;&lt;img src="https://sergiobelkin.com/images/flathub.thumbnail.png" alt="Sitio de Flathub mostrando las advertencias pertinentes a una determinada aplicación" title="Haga clic para agrandar"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3 id="como-hace-flatpak-para-no-pedirle-a-un-usuario-de-un-grupo-administrativo-que-se-autentique-nuevamente"&gt;¿Cómo hace flatpak para no pedirle a un usuario de un grupo administrativo que se autentique nuevamente?&lt;/h3&gt;
&lt;p&gt;En el &lt;a href="https://sergiobelkin.com/posts/entendiendo-polkit/"&gt;post anterior&lt;/a&gt; vimos como funciona polkit. Flatpak se vale de polkit para facilitar la instalación de paquetes por parte de usuarios con permisos administrativos. Basta con mirar el archivo &lt;code&gt;/usr/share/polkit-1/rules.d/org.freedesktop.Flatpak.rules&lt;/code&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nx"&gt;polkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addRule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"org.freedesktop.Flatpak.app-install"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"org.freedesktop.Flatpak.runtime-install"&lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"org.freedesktop.Flatpak.app-uninstall"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"org.freedesktop.Flatpak.runtime-uninstall"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"org.freedesktop.Flatpak.modify-repo"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isInGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"wheel"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;polkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;polkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NOT_HANDLED&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;polkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addRule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"org.freedesktop.Flatpak.override-parental-controls"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;polkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH_ADMIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;polkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NOT_HANDLED&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Este archivo tiene dos reglas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Permite a los usuarios del grupo "wheel", que están loogoueados localmente y tienen una sesión activa instalar, desinstalar, y modificar aplicaciones y repositorios sin autenticación adicional.&lt;/li&gt;
&lt;li&gt;No se pueden pasar por arriba de los controles parentales sin autenticarse con una cuenta de usuario administrativa.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para ambos casos, si las condiciones no se cumplen, el resultado dependerá de otras reglas o de la regla predeterminada.&lt;/p&gt;
&lt;h3 id="para-terminar"&gt;Para terminar...&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Flatpak&lt;/strong&gt; elimina barreras y obstáculos tanto para desarrolladores como para usuarios finales. Para los primeros, significa les ofrece la posibilidad de poner aplicaciones disposición de cualquier distribución de Linux. Para los segundos representa una mayor facilidad para obtener los programas que están necesitando.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/Discover-Flatpak.png"&gt;&lt;img src="https://sergiobelkin.com/images/Discover-Flatpak.thumbnail.png" alt="Discover mostrando aplicaciones disonibles en Flathub" title="Haga clic para agrandar"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4 id="fuentes-y-mas-recursos"&gt;Fuentes y Más Recursos&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://docs.flatpak.org/en/latest/using-flatpak.html"&gt;Flatpak Documentation - Using Flatpak&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flathub.org"&gt;Flathub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flatkill.org/2020/"&gt;Flatkill - Flatpak, a security nightmare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tesk.page/2021/02/11/response-to-flatkill-org/"&gt;Respuestas a objecioones planteadas en Flatkill&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.fedoraproject.org/en-US/flatpak/"&gt;Flatpak en Fedora&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description><category>herramientas</category><category>package-management</category><category>seguridad</category><guid>https://sergiobelkin.com/posts/que-es-flatpak/</guid><pubDate>Sat, 22 Jun 2024 20:11:07 GMT</pubDate></item><item><title>Entendiendo Polkit</title><link>https://sergiobelkin.com/posts/entendiendo-polkit/</link><dc:creator>sebelk</dc:creator><description>&lt;div&gt;&lt;h3 id="introduccion"&gt;Introducción&lt;/h3&gt;
&lt;p&gt;El esquema de permisos en Linux es simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Un superusuario con todos los poderes para leer, modificar y ejecutar todo.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;El resto de los usuarios con permisos limitados.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Es decir, la clasificación de usuarios en tres categorías, el famoso UGO (User, Group, Others) y el trío de permisos: rwx (read, write y execution).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pero esa simpleza tiene sus limitaciones, &lt;a href="https://sergiobelkin.com/posts/2008/07/06/permisos/"&gt;como vimos ya anteriormente&lt;/a&gt;, con el paso del tiempo se han ideado maneras de hacer esos permisos más granulares y que superusuario root pueda delegar atribuciones.&lt;/p&gt;
&lt;p&gt;Una herramienta muy importante en este sentido es &lt;strong&gt;polkit&lt;/strong&gt; (antiguamente conocido como PolicyKit). En este post vamos a explorar para develar qué es polkit, como funciona, y como se diferencia de sudo. Además, en el próximo post, veremos la relación que tiene con flatpak.&lt;/p&gt;
&lt;h3 id="que-es-polkit"&gt;¿Qué es polkit?&lt;/h3&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/polkit-featured.webp"&gt;&lt;img src="https://sergiobelkin.com/images/polkit-featured.thumbnail.webp" alt="Polkit"&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="https://sergiobelkin.com/posts/entendiendo-polkit/"&gt;Leer más…&lt;/a&gt; (quedan 9 minutos de lectura)&lt;/p&gt;&lt;/div&gt;</description><category>herramientas</category><category>seguridad</category><guid>https://sergiobelkin.com/posts/entendiendo-polkit/</guid><pubDate>Sat, 15 Jun 2024 18:56:09 GMT</pubDate></item><item><title>¿Qué significa en Linux que todo es archivo?</title><link>https://sergiobelkin.com/posts/que-significa-en-linux-que-todo-es-archivo/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;En un &lt;a href="https://www.sergiobelkin.com/posts/2008/10/26/una-presentacion-sobre-sistemas-de-archivos/"&gt;viejo artículo&lt;/a&gt;, hay una presentación en la que mencioné una frase bastante habitual en el mundo Unix/Linux: &lt;strong&gt;«Todo es archivo»&lt;/strong&gt;. Vamos a explicar qué significa realmente esa frase.&lt;/p&gt;
&lt;h3 id="todo-es-archivo"&gt;Todo es archivo&lt;/h3&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/_8dd3f6d7-7b75-40a1-a463-6b1f2ce740bf.jpg"&gt;&lt;img src="https://sergiobelkin.com/images/_8dd3f6d7-7b75-40a1-a463-6b1f2ce740bf.thumbnail.jpg" alt="¿Todo es Archivo?"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;En realidad, ese dicho no es del todo correcto. Sin embargo, proviene de lo que hoy tal vez podríamos llamar la &lt;strong&gt;filosofía Unix&lt;/strong&gt;. Probablemente, nadie dijo esa frase de manera literal en los primeros años de esa familia de sistemas operativos. Aun así, ideas de ese estilo estaban en la mente desde los comienzos y en los trabajos de por ejemplo, Bill Joy (pionero de TCP/IP). Linus Torvalds, no estuvo ausente en esta discusión. Y mucho más cerca en el tiempo,  Lennart Poettering, retoma esa idea una vez más para defender el trabajo realizado en systemd. Por si no se dieron cuenta dice Poettering la interfaz de cgroups están expuesta en un pseudo-sistema de archivos...&lt;/p&gt;
&lt;p&gt;Sin embargo, es más apropiado decir que todo es un descriptor de archivo o que todo puede tener un descriptor de archivo. 
En Linux un descriptor de archivo es un identificador único de proceso para un archivo u otro recurso de entrada o salida. Por ejemplo, no existe necesariamente un archivo para una interfaz de red. Sin embargo, existen sockets relacionados con ellas.&lt;/p&gt;
&lt;p&gt;En el siguiente ejemplo podemos ver los descriptores de archivos para la dirección ip 127.0.0.1 de la interfaz &lt;strong&gt;lo&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lsof&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="mf"&gt;@127.0.0.1&lt;/span&gt;
&lt;span class="n"&gt;COMMAND&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;PID&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;USER&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;FD&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;TYPE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DEVICE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SIZE&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;OFF&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NODE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NAME&lt;/span&gt;
&lt;span class="n"&gt;chronyd&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;1337&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;chrony&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;5u&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;IPv4&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;8171&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;UDP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;127.0.0.1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;323&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="n"&gt;cupsd&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;1538&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;7u&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;IPv4&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;14727&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;TCP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;127.0.0.1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ipp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LISTEN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;qemu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;syst&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1774&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;qemu&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;32u&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;IPv4&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;19480&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;TCP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;127.0.0.1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;rfb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LISTEN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;syncthing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2620&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;19u&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;IPv4&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;22825&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;TCP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;127.0.0.1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8384&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LISTEN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;En este caso, vemos los descriptores de archivos de lectura y escritura 5u, 7u, 32u y 19u.&lt;/p&gt;
&lt;p&gt;Para ver la relación entre descriptores y sockets podemos hacer un ping a una determinada dirección ip:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ping -c 10000 9.9.9.9 &amp;amp;&amp;gt; /dev/null
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si buscamos los descriptores de archivos con lsfd, mostrará el siguiente resultado:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nx"&gt;lsfd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;914323&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Q&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;FD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="nx"&gt;COMMAND&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;PID&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nx"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ASSOC&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;XMODE&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nx"&gt;TYPE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SOURCE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MNTID&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;INODE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NAME&lt;/span&gt;
&lt;span class="nx"&gt;ping&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;914323&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rw&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;D&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;CHR&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;pts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;pts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="nx"&gt;ping&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;914323&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;CHR&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;mem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;null&lt;/span&gt;
&lt;span class="nx"&gt;ping&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;914323&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;CHR&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;mem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;null&lt;/span&gt;
&lt;span class="nx"&gt;ping&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;914323&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rw&lt;/span&gt;&lt;span class="o"&gt;---&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nx"&gt;PING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sockfs&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30437500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;close&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;laddr&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m m-Double"&gt;0.0.0.0&lt;/span&gt;
&lt;span class="nx"&gt;ping&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;914323&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rw&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PINGv6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sockfs&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30437501&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="mi"&gt;30437501&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Analicemos cada descriptor de archivo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0: Es la "standard input" que apunta  a una pseudoterminal (dispositivo de caracteres), al tratarlo como un archivo tiene permisos: de lectura y escritura.  Usa un sistema de archivos y como tal también maneja inodos.&lt;/li&gt;
&lt;li&gt;1: Es la "standard output" que apunta a /dev/null. Solamente tiene permisos de escritura, el sistema de archivos proviene de la memoria principal y tiene permisos solamente de escritura.&lt;/li&gt;
&lt;li&gt;2: Es el "standard error" que apunta también a /dev/null.&lt;/li&gt;
&lt;li&gt;3: Apunta a un socket de tipo IPv4, y tiene permisos de lectura y además está siendo utilizado por un evento de multiplexación.&lt;/li&gt;
&lt;li&gt;4: Finalmente tenemos el descriptor de 5 que apunta a un tipo de socket que usa IPv6.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dentro del directorio /proc podemos ver que los descriptores 1 (salida estándar) y 2 (error estándar) se redirigen al archivo /dev/null, mientras tanto, 3 y 4 apuntan a sockets:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;proc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;914323&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt;
&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;lrwx&lt;/span&gt;&lt;span class="o"&gt;------&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;may&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;'/dev/pts/6 (deleted)'&lt;/span&gt;
&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;wx&lt;/span&gt;&lt;span class="o"&gt;------&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;may&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;
&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;wx&lt;/span&gt;&lt;span class="o"&gt;------&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;may&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;
&lt;span class="n"&gt;lrwx&lt;/span&gt;&lt;span class="o"&gt;------&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;may&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;'socket:[30437500]'&lt;/span&gt;
&lt;span class="n"&gt;lrwx&lt;/span&gt;&lt;span class="o"&gt;------&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;may&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;'socket:[30437501]'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Podemos hacer otra prueba, en este caso usaremos solamente ping sobre ipv6 y en lugar de redireccionar a /dev/null, lo haremos redirigiendo stdin y stderr a archivos regulares distintos:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ping6 -c 10000 ::1 &amp;gt; out.txt 2&amp;gt; errors.txt &amp;amp;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Aquí solamente usará un socket (ya que no usa ipv4):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nx"&gt;lsfd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;926928&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Q&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;FD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="nx"&gt;COMMAND&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;PID&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nx"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ASSOC&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;XMODE&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nx"&gt;TYPE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SOURCE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MNTID&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;INODE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NAME&lt;/span&gt;
&lt;span class="nx"&gt;ping6&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;926928&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rw&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;CHR&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;pts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;pts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;
&lt;span class="nx"&gt;ping6&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;926928&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;REG&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;38207299&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;txt&lt;/span&gt;
&lt;span class="nx"&gt;ping6&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;926928&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;REG&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;38207300&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;txt&lt;/span&gt;
&lt;span class="nx"&gt;ping6&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;926928&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rw&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PINGv6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sockfs&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;31193485&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;close&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;laddr&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;¿Qué sucede si se borra /tmp/errors.txt?&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nx"&gt;lsfd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;926928&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Q&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;FD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="nx"&gt;COMMAND&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;PID&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nx"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ASSOC&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;XMODE&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nx"&gt;TYPE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SOURCE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MNTID&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;INODE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NAME&lt;/span&gt;
&lt;span class="nx"&gt;ping6&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;926928&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rw&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;CHR&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;pts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;pts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;
&lt;span class="nx"&gt;ping6&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;926928&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;REG&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;38207299&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;txt&lt;/span&gt;
&lt;span class="nx"&gt;ping6&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;926928&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;D&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;REG&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;38207300&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;txt&lt;/span&gt;
&lt;span class="nx"&gt;ping6&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;926928&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sergio&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rw&lt;/span&gt;&lt;span class="o"&gt;----&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PINGv6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sockfs&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;31193485&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;close&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;laddr&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Bueno, veremos que el archivo aparece con el flag &lt;strong&gt;D&lt;/strong&gt; indicando que borró del respectivo sistema de archivos. &lt;/p&gt;
&lt;p&gt;Por lo tanto, si bien literalmente no todo es archivo, podemos afirmar que en general podríamos mediante los descriptores de archivos establecer un puente entre un proceso y los recursos a los que está accediendo. En definitiva, un descriptor de archivos, permite al proceso comunicarse con el recurso subyacente de manera eficiente y uniforme, independientemente de si el recurso es un archivo en el sistema de archivos, un dispositivo de hardware o un socket de red.&lt;/p&gt;
&lt;h3 id="enlaces-utiles"&gt;Enlaces útiles&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Everything_is_a_file"&gt;Everything is a file, artículo de Wikipedia&lt;/a&gt; y &lt;a href="https://en.wikipedia.org/wiki/Talk:Everything_is_a_file"&gt;es interesante leer la discusión sobre ese artículo, allí se menciona a Bill Joy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lwn.net/Articles/411845/"&gt;Patrones de diseño en la historia de Unix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=9-IWMbJXoLM"&gt;Una charla en la que alguien manifiesta sus experiencias trabajando con Linux y el concepto de "todo es archivo", el expositor agrega además, experiencias sobre otros temas menos técnicos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yarchive.net/comp/linux/everything_is_file.html"&gt;Linus Torvalds dando su punto de vista sobre el tema&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://0pointer.de/blog/projects/the-biggest-myths"&gt;El creador de systemd haciendo mención a esta famosa tradición Unix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>filesystems</category><category>sysadmin</category><guid>https://sergiobelkin.com/posts/que-significa-en-linux-que-todo-es-archivo/</guid><pubDate>Mon, 13 May 2024 21:14:03 GMT</pubDate></item></channel></rss>