<?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 kernel)</title><link>https://sergiobelkin.com/</link><description></description><atom:link href="https://sergiobelkin.com/categories/kernel.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, 20 Apr 2026 23:54:27 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..jpg.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><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>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>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>Como Compilar un kernel Linux en 10 pasos</title><link>https://sergiobelkin.com/posts/como-compilar-un-kernel-linux-en-10-pasos/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;&lt;img alt="Licencia de Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png"&gt;&lt;/a&gt;&lt;br&gt;Autor: Sergio Belkin. Este obra está bajo una &lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;licencia de Creative Commons Reconocimiento-CompartirIgual 4.0 Internacional&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id="advertencia"&gt;Advertencia&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;El kernel que viene con las distribuciones es suficiente para la mayoría de los casos. Usar un kernel compilado a mano puede dejar el sistema inusable sino se realiza correctamente. No debería usarse en sistemas en producción salvo que se sepa exactamente qué, por qué y para qué se hace. Hay distribuciones que limitan o no proveen el soporte en sistemas Linux con kernels compilados a mano. Siempre es recomendable hacer un backup tanto del directorio /boot como del directorio /lib/modules.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id="motivacion"&gt;Motivación&lt;/h4&gt;
&lt;p&gt;Si no has leído la &lt;strong&gt;Advertencia&lt;/strong&gt; por favor no sigas. Leela detenidamente y seguimos.
¿Ya está? ¡OK! ¿Por qué compilar un kernel hoy en 2020? Un razón es que al compilar se puede aprender que funcionalidades proporciona el kernel, deshabilitar funciones que &lt;em&gt;sabemos&lt;/em&gt; no vamos a usar, probar nuevas características ausentes en la versión del kernel de la distribución y también para entender más cómo trabaja el sistema operativo. Este &lt;em&gt;how-to&lt;/em&gt; ha sido probado tanto en Debian 10 como en CentOS 8. En una máquina con 2GB y un único procesador llevaría menos de una hora hacerlo (obviamente cuantos más sean los módulos o componentes agregados más va a tardar). Recordar que se puede compilar como un ususuario común y luego pedir privilegios de root para instalar. 
Basta de palabras y manos a la obra. &lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/nicolas-hoizey-2MuZ23gkFKo-unsplash.jpg"&gt;&lt;img src="https://sergiobelkin.com/images/nicolas-hoizey-2MuZ23gkFKo-unsplash.thumbnail.jpg" alt=""&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3 id="1-instalar-los-pre-requisitos"&gt;1. Instalar los pre-requisitos&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;yum groupinstall "Development Tools" &amp;amp;&amp;amp; yum install ncurses-devel zlib-devel binutils-devel elfutils-libelf-devel libkcapi-hmaccalc openssl-devel
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;En Debian, deberíamos instalar:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;apt -y install build-essential libncurses-dev
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="2-bajar-las-fuentes-del-kernel"&gt;2. Bajar las fuentes del kernel&lt;/h3&gt;
&lt;p&gt;Recomendable bajar o la rama &lt;em&gt;Longterm&lt;/em&gt; o bien la &lt;em&gt;Stable&lt;/em&gt;, por ejemplo:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;curl -L -O https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.8.15.tar.xz
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="3-desempaquetar-las-fuentes"&gt;3. Desempaquetar las fuentes&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;tar avxf linux-5.8.15.tar.xz
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="4-entrar-en-el-directorio-de-las-fuentes"&gt;4. Entrar en el directorio de las fuentes&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;cd linux-5.8.15
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="5-tomar-como-referencia-el-kernel-que-estamos-usando"&gt;5. Tomar como referencia el kernel que estamos usando&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;cp /boot/config-$(uname -r) .config
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="6-tomar-como-base-los-modulos-del-kernel-que-estan-en-uso-actualmente"&gt;6. Tomar como base los módulos del kernel que están en uso actualmente 😉 😉&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;make localmodconfig
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(Le damos Enter hasta que termine)&lt;/p&gt;
&lt;h3 id="7-configuramos-nuestro-kernel-a-medida"&gt;7. Configuramos nuestro kernel a medida&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;make menuconfig
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Esta parte es la más importante. Podemos dejar todo como está pero probablemente haya algo que no estamos usando que no se va a compilar y necesitaremos después. Entonces es importante recorrer algunas secciones para revisar si falta algo, en especial lo que tiene que ver con &lt;strong&gt;Netfilter&lt;/strong&gt;, &lt;strong&gt;File Systems&lt;/strong&gt;, etc . Por ejemplo: tomar los recaudos suficientes si el sistema está virtualizado o si usa containers.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/vboxguest-kernel.png"&gt;&lt;img src="https://sergiobelkin.com/images/vboxguest-kernel.png" alt=""&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Una vez hecho los ajustes necesarios, guardamos y salimos.&lt;/p&gt;
&lt;h3 id="8-compilamos-el-kernel"&gt;8. Compilamos el kernel&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;make
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="9-instalamos-los-modulos-del-kernel-con-privilegios-de-root"&gt;9. Instalamos los módulos del kernel con privilegios de root&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;sudo make modules_install
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="10-instalamos-el-kernel-con-privilegios-de-root"&gt;10. Instalamos el kernel con privilegios de root&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;sudo make install
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;¡Listo! Podemos reiniciar y comenzar a usar el kernel compilado por nosotros mismos.&lt;/p&gt;</description><category>kernel</category><guid>https://sergiobelkin.com/posts/como-compilar-un-kernel-linux-en-10-pasos/</guid><pubDate>Fri, 16 Oct 2020 17:55:01 GMT</pubDate></item><item><title>Instalar Linux desde un archivo ISO</title><link>https://sergiobelkin.com/posts/2015/12/05/instalar-desde-un-archivo-iso/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;En &lt;a href="http://www.sergiobelkin.com/2015/10/02/la-poderosa-shell-de-grub-2/"&gt;el artículo anterior&lt;/a&gt; habíamos visto el potencial de la shell de GRUB 2. Allí habíamos visto que podíamos arrancar directamente desde una imagen ISO sin necesidad de tener que grabarlo en un disco óptico ni copiarlo a una unidad USB.&lt;/p&gt;
&lt;p&gt;Ahora bien, ¿podríamos además instalar un sistema operativo utilizando ese método? La respuesta es sí. En este caso puntual veremos como instalar Fedora 23.&lt;/p&gt;
&lt;p&gt;Aquí, tendremos que tener en cuenta los dos software involucrados principalmente para poder realizar esta tarea. Estos programas son GRUB 2 (naturalmente) y &lt;em&gt;dracut&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Recordemos que en el momento del arranque se utiliza un &lt;a href="https://www.kernel.org/doc/Documentation/initrd.txt"&gt;sistema de archivos temporal&lt;/a&gt; en memoria hasta que se pueda realizar el montaje del definitivo sistema de archivos raiz.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dracut.wiki.kernel.org/index.php/Main_Page"&gt;dracut&lt;/a&gt; es tanto una infraestructura de initramfs manejada por eventos como así también una herramienta que se usa para crear una imagen de disco en memoria.  El comando dracut copiar herramientas y archivos de un sistema instalado y lo combina con el framework dracut.&lt;/p&gt;
&lt;p&gt;Estos archivos se pueden ver en fedora en el directorio &lt;em&gt;/usr/lib/dracut/modules.d&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="markdown-here-wrapper" data-md-url="http://www.sergiobelkin.com/wp-admin/post.php?post=804&amp;amp;action=edit"&gt;
&lt;pre style="font-size: 1em; font-family: Consolas,Inconsolata,Courier,monospace; line-height: 1.2em; margin: 1.2em 0px;"&gt;&lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0.5em 0.7em; white-space: pre; border: 1px solid #cccccc; background-color: #f8f8f8; border-radius: 3px; display: block ! important; overflow: auto;"&gt;
[sergio@hope ~]$ ls /usr/lib/dracut/modules.d
00bash               30convertfs  90dm                      90qemu-net    95fstab-sys     95zfcp            99base
00systemd            40network    90dmraid                  91crypt-gpg   95iscsi         95zfcp_rules      99fs-lib
00systemd-bootchart  45ifcfg      90dmsquash-live           91crypt-loop  95nbd           95znet            99img-lib
01systemd-initrd     45url-lib    90kernel-modules          95cifs        95nfs           97biosdevname     99kdumpbase
02systemd-networkd   50drm        90kernel-network-modules  95dasd        95resume        98dracut-systemd  99shutdown
03modsign            50plymouth   90livenet                 95dasd_mod    95rootfs-block  98ecryptfs        99uefi-lib
03rescue             80cms        90lvm                     95dasd_rules  95ssh-client    98pollcdrom
04watchdog           90bcache     90mdraid                  95debug       95terminfo      98selinux
05busybox            90btrfs      90multipath               95fcoe        95udev-rules    98syslog
10i18n               90crypt      90qemu                    95fcoe-uefi   95virtfs        98usrmount
&lt;/code&gt;&lt;/pre&gt;
&lt;div style="height: 0; width: 0; max-height: 0; max-width: 0; overflow: hidden; font-size: 0em; padding: 0; margin: 0;" title="MDH:PHA+YGBgYDxiciBkYXRhLW1jZS1ib2d1cz0iMSI+PC9wPjxwPltzZXJnaW9AaG9wZSB+XSQgbHMg L3Vzci9saWIvZHJhY3V0L21vZHVsZXMuZDxicj4wMGJhc2gmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsgMzBjb252ZXJ0ZnMmbmJzcDsgOTBkbSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA5MHFlbXUtbmV0Jm5ic3A7 Jm5ic3A7Jm5ic3A7IDk1ZnN0YWItc3lzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDk1emZjcCZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyA5OWJhc2U8YnI+MDBzeXN0ZW1kJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDQwbmV0d29yayZuYnNwOyZuYnNw OyZuYnNwOyA5MGRtcmFpZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyA5MWNyeXB0LWdwZyZuYnNwOyZuYnNwOyA5NWlzY3NpJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDk1emZjcF9ydWxlcyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyA5OWZzLWxpYjxicj4wMHN5c3RlbWQtYm9vdGNoYXJ0Jm5ic3A7IDQ1aWZj ZmcmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgOTBkbXNxdWFzaC1saXZlJm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDkxY3J5 cHQtbG9vcCZuYnNwOyA5NW5iZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA5NXpuZXQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgOTlpbWctbGliPGJyPjAxc3lz dGVtZC1pbml0cmQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgNDV1cmwtbGliJm5ic3A7Jm5ic3A7 Jm5ic3A7IDkwa2VybmVsLW1vZHVsZXMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsgOTVjaWZzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7IDk1bmZzJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDk3Ymlvc2Rldm5hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsgOTlrZHVtcGJhc2U8YnI+MDJzeXN0ZW1kLW5ldHdvcmtkJm5ic3A7Jm5ic3A7IDUwZHJtJm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDkwa2VybmVsLW5ldHdvcmst bW9kdWxlcyZuYnNwOyA5NWRhc2QmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsgOTVyZXN1bWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsg OThkcmFjdXQtc3lzdGVtZCZuYnNwOyA5OXNodXRkb3duPGJyPjAzbW9kc2lnbiZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA1 MHBseW1vdXRoJm5ic3A7Jm5ic3A7IDkwbGl2ZW5ldCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyA5NWRhc2RfbW9kJm5ic3A7Jm5ic3A7Jm5ic3A7IDk1cm9vdGZzLWJsb2Nr Jm5ic3A7IDk4ZWNyeXB0ZnMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsgOTl1ZWZpLWxpYjxicj4wM3Jlc2N1ZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA4MGNtcyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA5MGx2bSZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA5NWRhc2RfcnVsZXMm bmJzcDsgOTVzc2gtY2xpZW50Jm5ic3A7Jm5ic3A7Jm5ic3A7IDk4cG9sbGNkcm9tPGJyPjA0d2F0 Y2hkb2cmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsgOTBiY2FjaGUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgOTBtZHJhaWQmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgOTVkZWJ1ZyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA5NXRlcm1pbmZvJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7IDk4c2VsaW51eDxicj4wNWJ1c3lib3gmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgOTBidHJmcyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA5MG11bHRpcGF0aCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyA5NWZjb2UmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgOTV1 ZGV2LXJ1bGVzJm5ic3A7Jm5ic3A7Jm5ic3A7IDk4c3lzbG9nPGJyPjEwaTE4biZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyA5MGNyeXB0Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDkw cWVtdSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyA5NWZjb2UtdWVmaSZuYnNwOyZuYnNwOyA5NXZpcnRmcyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA5OHVzcm1vdW50PGJyPjwvcD48cD5gYGBgPC9wPg=="&gt;​&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Por lo tanto aquí la clave es pasar los parámetros del kernel y opciones para dracut correctas. Y para agregar la entrada al menú de grub utilizamos el archivo &lt;em&gt;/etc/grub.d/40_custom&lt;/em&gt;.&lt;/p&gt;
&lt;div class="markdown-here-wrapper" data-md-url="http://www.sergiobelkin.com/wp-admin/post-new.php"&gt;
&lt;pre style="font-size: 1em; font-family: Consolas,Inconsolata,Courier,monospace; line-height: 1.2em; margin: 1.2em 0px;"&gt;&lt;code class="hljs language-#!/bin/sh" style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0.5em; white-space: pre; border: 1px solid #cccccc; background-color: #f8f8f8; border-radius: 3px; display: block; overflow: auto; overflow-x: auto; color: #333333; background: #f8f8f8 none repeat scroll 0% 0%;"&gt; exec tail -n +3 $0
 # This file provides an easy way to add custom menu entries. Simply type the
 # menu entries you want to add after this comment. Be careful not to change
 # the ‘exec tail’ line above.

menuentry “Live Fedora 23″ –class fedora {
 set isofile=”/Fedora-Live-KDE-x86_64-23-10.iso”
 loopback loop (hd0,gpt8)$isofile
 linuxefi (loop)/isolinux/vmlinuz0 iso-scan/filename=${isofile} root=live:CDLABEL=Fedora-Live-KDE-x86_64-23-10 rootfstype=auto ro rd.live.image quiet rhgb rd.luks=0 rd.md=0 rd.dm=0
 initrdefi (loop)/isolinux/initrd0.img
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Aquí &lt;a href="https://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html#dracutcmdline7"&gt;los comandos y opciones&lt;/a&gt; claves son respectivamente &lt;em&gt;loopback&lt;/em&gt; e &lt;em&gt;iso-scan&lt;/em&gt;.&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;El comando loopback sirve para especificar la ruta a un archivo ISO para que sea tomado como un dispositivo de bloques. Mientras tanto el parámetro iso-scan sirve para montar el dispositivo de loopback y pasarle los parámetros de kernel y dracut apropiadas.&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;¿Cómo sabemos las opciones y parámetros correctos? Las podemos averiguar montando el archivo ISO e inspeccionando el archivo isolinux.cfg:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="markdown-here-wrapper" data-md-url="http://www.sergiobelkin.com/wp-admin/post.php?post=804&amp;amp;action=edit"&gt;
&lt;pre style="font-size: 1em; font-family: Consolas,Inconsolata,Courier,monospace; line-height: 1.2em; margin: 1.2em 0px;"&gt;&lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0.5em 0.7em; white-space: pre; border: 1px solid #cccccc; background-color: #f8f8f8; border-radius: 3px; display: block ! important; overflow: auto;"&gt;
[root@hope sergio]# mount -o loop /usr/Fedora-Live-KDE-x86_64-23-10.iso /media
mount: /dev/loop0 está protegido contra escritura; se monta como sólo lectura
[root@hope sergio]# grep -m1 append  /media/isolinux/isolinux.cfg 
  append initrd=initrd0.img root=live:CDLABEL=Fedora-Live-KDE-x86_64-23-10 rootfstype=auto ro rd.live.image quiet  rhgb rd.luks=0 rd.md=0 rd.dm=0
&lt;/code&gt;&lt;/pre&gt;
&lt;div style="height: 0; width: 0; max-height: 0; max-width: 0; overflow: hidden; font-size: 0em; padding: 0; margin: 0;" title="MDH:PHAgc3R5bGU9Im1hcmdpbjogMS4yZW0gMHB4ICEgaW1wb3J0YW50OyIgZGF0YS1tY2Utc3R5bGU9 Im1hcmdpbjogMS4yZW0gMHB4ICEgaW1wb3J0YW50OyI+YGBgYDwvcD48cCBzdHlsZT0ibWFyZ2lu OiAxLjJlbSAwcHggISBpbXBvcnRhbnQ7IiBkYXRhLW1jZS1zdHlsZT0ibWFyZ2luOiAxLjJlbSAw cHggISBpbXBvcnRhbnQ7Ij5bcm9vdEBob3BlIHNlcmdpb10jIG1vdW50IC1vIGxvb3AgL3Vzci9G ZWRvcmEtTGl2ZS1LREUteDg2XzY0LTIzLTEwLmlzbyAvbWVkaWE8YnI+bW91bnQ6IC9kZXYvbG9v cDAgZXN0w6EgcHJvdGVnaWRvIGNvbnRyYSBlc2NyaXR1cmE7IHNlIG1vbnRhIGNvbW8gc8OzbG8g bGVjdHVyYTxicj5bcm9vdEBob3BlIHNlcmdpb10jIGdyZXAgLW0xIGFwcGVuZCZuYnNwOyAvbWVk aWEvaXNvbGludXgvaXNvbGludXguY2ZnIDxicj4mbmJzcDsgYXBwZW5kIGluaXRyZD1pbml0cmQw LmltZyByb290PWxpdmU6Q0RMQUJFTD1GZWRvcmEtTGl2ZS1LREUteDg2XzY0LTIzLTEwIHJvb3Rm c3R5cGU9YXV0byBybyByZC5saXZlLmltYWdlIHF1aWV0Jm5ic3A7IHJoZ2IgcmQubHVrcz0wIHJk Lm1kPTAgcmQuZG09MCA8YnI+PC9wPjxwIHN0eWxlPSJtYXJnaW46IDEuMmVtIDBweCAhIGltcG9y dGFudDsiIGRhdGEtbWNlLXN0eWxlPSJtYXJnaW46IDEuMmVtIDBweCAhIGltcG9ydGFudDsiPmBg YGA8L3A+"&gt;​&lt;/div&gt;
&lt;/div&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Sencillamente debemos copiar lo que está a continuación de &lt;em&gt;append initrd=initrd0.img&lt;/em&gt;.&lt;/p&gt;
&lt;div class="markdown-here-wrapper" data-md-url="http://www.sergiobelkin.com/wp-admin/post-new.php"&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Además, se pueden apreciar los comandos &lt;em&gt;linuxefi&lt;/em&gt; e &lt;em&gt;initrdefi&lt;/em&gt; que son equivalente de manera respectiva a las ordenes linux e initrd al utilizar un sistema con UEFI.&lt;/p&gt;
&lt;/div&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Finalmente, debemos ejecutar el comando para generar el nuevo archivo de GRUB 2:&lt;/p&gt;
&lt;pre style="margin: 1.2em 0px ! important;"&gt;[root@hope sergio]# grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg&lt;/pre&gt;
&lt;div class="markdown-here-wrapper" data-md-url="http://www.sergiobelkin.com/wp-admin/post-new.php"&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Reiniciamos, elegimos la opción Live Fedora 23 y luego podremos instalar el sistema operativo.&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;&lt;a href="https://sergiobelkin.com/wp-content/uploads/2015/12/instalar-desde-grub.png"&gt;&lt;img class="aligncenter size-large wp-image-809" src="https://sergiobelkin.com/wp-content/uploads/2015/12/instalar-desde-grub-1024x576.png" alt="Instalar desde un archivo ISO" width="640" height="360"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 style="margin: 1.2em 0px ! important;"&gt;La partición importa&lt;/h2&gt;
&lt;p&gt;La partición en la que está ubicado el archivo ISO importa. Existe un bug en el módulo de python para la configuración de almacenamiento del sistema llamado &lt;a href="https://github.com/rhinstaller/blivet"&gt;blivet&lt;/a&gt; que impide la instalación del sistema operativo si la ISO está en alguna partición marcada en el editor de particiones, más allá de que esta se formatee o no. Como solución provisoria, se puede emplear una partición sin que el instalador la tenga en cuenta. De hecho, hice eso mismo. Luego, posterior a la instalación usé dicha partición para el directorio /usr, usando rysnc, editando el archivo /etc/fstab y borrando el /usr original.&lt;/p&gt;
&lt;h2&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Una vez más, podemos apreciar el potencial de GRUB 2 y como podemos prescindir de otros medios para instalar sistemas operativos. De hecho, dado el gran tamaño de los discos en la actualidad, podríamos tener una partición específicamente para tener ISOS.&lt;/p&gt;
&lt;div style="height: 0; width: 0; max-height: 0; max-width: 0; overflow: hidden; font-size: 0em; padding: 0; margin: 0;" title="MDH:PHA+YGBgYCMhL2Jpbi9zaDxicj4gZXhlYyB0YWlsIC1uICszICQwPGJyPiAjIFRoaXMgZmlsZSBw cm92aWRlcyBhbiBlYXN5IHdheSB0byBhZGQgY3VzdG9tIG1lbnUgZW50cmllcy4gU2ltcGx5IHR5 cGUgdGhlPGJyPiAjIG1lbnUgZW50cmllcyB5b3Ugd2FudCB0byBhZGQgYWZ0ZXIgdGhpcyBjb21t ZW50LiBCZSBjYXJlZnVsIG5vdCB0byBjaGFuZ2U8YnI+ICMgdGhlICdleGVjIHRhaWwnIGxpbmUg YWJvdmUuPC9wPjxwPm1lbnVlbnRyeSAiTGl2ZSBGZWRvcmEgMjMiIC0tY2xhc3MgZmVkb3JhIHs8 YnI+IHNldCBpc29maWxlPSIvRmVkb3JhLUxpdmUtS0RFLXg4Nl82NC0yMy0xMC5pc28iPGJyPiBs b29wYmFjayBsb29wIChoZDAsZ3B0OCkkaXNvZmlsZTxicj4gbGludXhlZmkgKGxvb3ApL2lzb2xp bnV4L3ZtbGludXowIGlzby1zY2FuL2ZpbGVuYW1lPSR7aXNvZmlsZX0gcm9vdD1saXZlOkNETEFC RUw9RmVkb3JhLUxpdmUtS0RFLXg4Nl82NC0yMy0xMCByb290ZnN0eXBlPWF1dG8gcm8gcmQubGl2 ZS5pbWFnZSBxdWlldCByaGdiIHJkLmx1a3M9MCByZC5tZD0wIHJkLmRtPTA8YnI+IGluaXRyZGVm aSAobG9vcCkvaXNvbGludXgvaW5pdHJkMC5pbWc8YnI+IH08YnI+IDwvcD48cD5gYGBgPGJyIGRh dGEtbWNlLWJvZ3VzPSIxIj48L3A+PHA+ZGZkZmRmZjwvcD4="&gt;​&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;</description><category>Fedora</category><category>grub</category><category>kernel</category><guid>https://sergiobelkin.com/posts/2015/12/05/instalar-desde-un-archivo-iso/</guid><pubDate>Sat, 05 Dec 2015 15:02:38 GMT</pubDate></item><item><title>¿Proceso ininterrumpible?</title><link>https://sergiobelkin.com/posts/2013/08/24/proceso-ininterrumpible/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;Todo aquel que tenga un conocimiento decente de Linux sabrá que un proceso cuando está en estado “D” significa que está “durmiendo ininterrumpidamente”.&lt;/p&gt;
&lt;p&gt;Bueno, les comento que no es tan así, sino me creen miren:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;[root@mpinode02 Distros]# time find / -mmin +10 &amp;gt; /dev/null &amp;amp; [1] 15592&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;[root@mpinode02 Distros]# ps -C find -ostat,comm,wchan STAT COMMAND WCHAN D find sleep_on_buffer &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;[root@mpinode02 Distros]# kill 15592&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;[root@mpinode02 Distros]# ps -C find -ostat,comm,wchan STAT COMMAND WCHAN D find sleep_on_buffer [1]+ Terminado time find / -mmin +10 &amp;gt; /dev/null&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Como ven un proceso en estado “D” sí se puede matar. Evidentemente hay algo más detrás, seguramente volveremos a tocar este tema.&lt;/p&gt;</description><category>kernel</category><guid>https://sergiobelkin.com/posts/2013/08/24/proceso-ininterrumpible/</guid><pubDate>Sat, 24 Aug 2013 22:16:35 GMT</pubDate></item><item><title>No abre el DVD</title><link>https://sergiobelkin.com/posts/2013/06/22/no-abre-el-dvd/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;Si al insertar un DVD el reproductor multimedia no lo abre, se puede deber a un problema mucho más sencillo de lo que parece. Probablemente no se deba que el disco no se pueda reproducir, sino que la aplicación está buscando el archivo /dev/dvd y no lo encuentra.&lt;/p&gt;
&lt;p&gt;Lo que tenemos que hacer es crear un archivo en el directorio /etc/udev/rules.d con el siguiente contenido:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;KERNEL==”sr0″, SYMLINK+=”dvd”&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Luego hay que recargar las reglas del servicio &lt;a title="Udev" href="http://es.wikipedia.org/wiki/Udev"&gt;udev&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;udevadm control –reload&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Y listo.&lt;/p&gt;</description><category>kernel</category><guid>https://sergiobelkin.com/posts/2013/06/22/no-abre-el-dvd/</guid><pubDate>Sat, 22 Jun 2013 23:09:28 GMT</pubDate></item><item><title>Estaciones Virtuales Inalámbricas</title><link>https://sergiobelkin.com/posts/2012/04/30/estaciones-virtuales-inalambricas/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;&lt;a href="http://creativecommons.org/licenses/by-sa/2.5/ar/" rel="license"&gt;&lt;img style="border-width: 0;" src="http://i.creativecommons.org/l/by-sa/2.5/ar/88x31.png" alt="Licencia Creative Commons"&gt;&lt;/a&gt;&lt;br&gt;
&lt;span&gt;Estaciones Virtuales inalámbricas&lt;/span&gt; por &lt;a href="http://sergiobelkin.com" rel="cc:attributionURL"&gt;Sergio Belkin&lt;/a&gt; se encuentra bajo una Licencia &lt;a href="http://creativecommons.org/licenses/by-sa/2.5/ar/" rel="license"&gt;Creative Commons Atribución-CompartirDerivadasIgual 2.5 Argentina&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A veces es necesario simular una gran cantidad de  estaciones (es decir clientes o “supplicants”) ante un Access Point para obtener una estimación de las capacidades del equipo y/o firmware. Seguramente existe algún que otro software con licencia restrictiva que nos permita hacer eso. Pero ¿se podrá hacer eso con una sola notebook con Linux? La respuesta es sí.&lt;/p&gt;
&lt;p&gt;Veremos como:&lt;/p&gt;
&lt;h2&gt;Deshabilitamos cifrado por hardware&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;echo options ath9k nohwcrypt=1 &amp;gt; /etc/modprobe.d/ath9k.conf&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;udev&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;Editamos /lib/udev/rules.d/75-persistent-net-generator.rules&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Queremos que udev no maneje la interfaz wireless wlan0, entonces sacamos de la siguiente regla a wlan0&lt;/p&gt;
&lt;p&gt;&lt;code&gt;KERNEL!=”eth*|ath*|ra*|ctc*|lcs*|hsi*”, GOTO=”persistent_net_generator_end”&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Editar el archivo /etc/udev/rules.d/70-persistent-net.rules&lt;/h3&gt;
&lt;p&gt;Tampoco necesitamos la siguiente la regla, así que la borramos:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?*”, ATTR{address}==”68:a3:c4:33:44:55″, ATTR{dev_id}==”0x0″, ATTR{type}==”1″, KERNEL==”wlan*”, NAME=”wlan0″&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Recargar la configuración&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;systemctl restart udev-trigger.service&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Detener servicios que interfieren con la creación de intefaces virtuales&lt;/h2&gt;
&lt;p&gt;systemctl stop NetworkManager.service&lt;/p&gt;
&lt;p&gt;systemctl stop  avahi-daemon.service&lt;/p&gt;
&lt;h2&gt;Terminar procesos de wpa_supplicant&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;killall wpa_supplicant&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Agregamos una interfaz virtual inalámbrica&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;iw phy  phy0 interface add sta0  type station&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Le cambiamos la mac address, sino NO va a funcionar&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;macchanger -r sta0&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Activamos la interfaz&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ip link set dev sta0 up&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Lanzamos el cliente wireless&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;wpa_supplicant -t -ista0 -c      /etc/wpa_supplicant/peap.conf  -B  -f /var/log/wpa-sta0.log&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Arrancamos el cliente dhcp&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dhclient -v   -cf /etc/wpa_supplicant/dhclient.conf sta0&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;¡Listo!&lt;/h2&gt;
&lt;p&gt;Se puede hacer un script (de hecho es lo que hice) para automatizar estos pasos y agregar tantas interfaces virtuales como sea posible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reconocimiento:&lt;/strong&gt; El artículo de &lt;span&gt;Candela Technologies&lt;/span&gt; en&lt;a title="Virtual Wireless Stations" href="http://www.candelatech.com/vsta.php"&gt; http://www.candelatech.com/vsta.php&lt;/a&gt; fue de suma utilidad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Advertencia:&lt;/strong&gt; Esta receta funciona en particular para el módulo ath9k, es probable que sea necesario modificar algo con otros drivers o que directamente no funcione. Asimismo, se utilizó Fedora 16 desde el lado cliente, obviamente deberían realizarse las adapataciones pertinentes de acuerdo a la distribución.&lt;/p&gt;</description><category>kernel</category><category>networking</category><category>wifi</category><guid>https://sergiobelkin.com/posts/2012/04/30/estaciones-virtuales-inalambricas/</guid><pubDate>Mon, 30 Apr 2012 14:40:40 GMT</pubDate></item><item><title>Secretos de ps</title><link>https://sergiobelkin.com/posts/2011/05/07/secretos-de-ps/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;Bueno, no es para tanto, pero es un dato útil: a veces es difícil acordarse de memoria todas las columnas de ps, bien, para eso está la opción “–headers”, por ejemplo:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ps aux –headers&lt;/code&gt;&lt;/p&gt;</description><category>kernel</category><category>monitoreo</category><guid>https://sergiobelkin.com/posts/2011/05/07/secretos-de-ps/</guid><pubDate>Sat, 07 May 2011 23:43:39 GMT</pubDate></item></channel></rss>