{
    "version": "https://jsonfeed.org/version/1",
    "title": "Skamasle",
    "description": "",
    "home_page_url": "https://skamasle.com",
    "feed_url": "https://skamasle.com/feed.json",
    "user_comment": "",
    "author": {
        "name": "Maks"
    },
    "items": [
        {
            "id": "https://skamasle.com/ghostlock-cve-2026-43499-openvz-7-patch.html",
            "url": "https://skamasle.com/ghostlock-cve-2026-43499-openvz-7-patch.html",
            "title": "Ghostlock - (CVE-2026-43499 ) OpenVZ 7 Patch",
            "summary": "Sí, lo de siempre, mucho jaleo esta vez, un bug gordo que afecta a OpenVZ Todavía habemos gente que gestionamos algunos nodos con OpenVZ7 y no se sabe si sacarán un backport Así que dejo aquí uno: From 1fa0a12de3aca9816a9d953b1af395bcdb20901c Mon Sep 17 00:00:00 2001 From:&hellip;",
            "content_html": "<p>Sí, lo de siempre, mucho jaleo esta vez, un bug gordo que afecta a OpenVZ</p>\n<p>Todavía habemos gente que gestionamos algunos nodos con OpenVZ7 y no se sabe si sacarán un backport</p>\n<p>Así que dejo aquí uno:</p>\n<p> </p>\n<pre class=\"language-git\"><code>From 1fa0a12de3aca9816a9d953b1af395bcdb20901c Mon Sep 17 00:00:00 2001\nFrom: Keenan Dong &lt;keenanat2000@gmail.com&gt;\nDate: Wed, 8 Apr 2026 16:46:00 +0800\nSubject: [PATCH] rtmutex: Use waiter::task instead of current in\n remove_waiter()\n\nremove_waiter() is used by the slowlock paths, but it is also used for\nproxy-lock rollback in rt_mutex_start_proxy_lock() when invoked from\nfutex_requeue().\n\nIn the latter case waiter::task is not current, but remove_waiter()\noperates on current for the dequeue operation. That results in several\nproblems:\n\n  1) the rbtree dequeue happens without waiter::task::pi_lock being held\n\n  2) the waiter task's pi_blocked_on state is not cleared, which leaves a\n     dangling pointer primed for UAF around.\n\n  3) rt_mutex_adjust_prio_chain() operates on the wrong top priority waiter\n     task\n\nUse waiter::task instead of current in all related operations in\nremove_waiter() to cure those problems.\n\n[ tglx: Fixup rt_mutex_adjust_prio_chain(), add a comment and amend the\n  changelog ]\n\nFixes: 8161239a8bcc (\"rtmutex: Simplify PI algorithm and make highest prio task get lock\")\nReported-by: Yuan Tan &lt;yuantan098@gmail.com&gt;\nReported-by: Yifan Wu &lt;yifanwucs@gmail.com&gt;\nReported-by: Juefei Pu &lt;tomapufckgml@gmail.com&gt;\nReported-by: Xin Liu &lt;bird@lzu.edu.cn&gt;\nSigned-off-by: Keenan Dong &lt;keenanat2000@gmail.com&gt;\nSigned-off-by: Thomas Gleixner &lt;tglx@kernel.org&gt;\nCc: stable@vger.kernel.org\n\n[ OpenVZ 7 backport: retain struct rt_mutex and explicit\n  raw_spin_lock_irqsave() APIs from the 3.10 tree instead of the modern\n  struct rt_mutex_base and scoped_guard() APIs. ]\n\n(cherry picked from commit 3bfdc63936dd4773109b7b8c280c0f3b5ae7d349)\n---\n kernel/rtmutex.c | 11 +++++++----\n 1 file changed, 7 insertions(+), 4 deletions(-)\n\ndiff --git a/kernel/rtmutex.c b/kernel/rtmutex.c\nindex 6131a046aab..3ed572ecdb8 100644\n--- a/kernel/rtmutex.c\n+++ b/kernel/rtmutex.c\n@@ -604,19 +604,22 @@ static void mark_wakeup_next_waiter(struct wake_q_head *wake_q,\n  *\n  * Must be called with lock-&gt;wait_lock held and\n  * have just failed to try_to_take_rt_mutex().\n+ *\n+ * When invoked from rt_mutex_start_proxy_lock() waiter-&gt;task != current!\n  */\n static void remove_waiter(struct rt_mutex *lock,\n \t\t\t  struct rt_mutex_waiter *waiter)\n {\n \tint first = (waiter == rt_mutex_top_waiter(lock));\n \tstruct task_struct *owner = rt_mutex_owner(lock);\n+\tstruct task_struct *waiter_task = waiter-&gt;task;\n \tunsigned long flags;\n \tint chain_walk = 0;\n \n-\traw_spin_lock_irqsave(&amp;current-&gt;pi_lock, flags);\n+\traw_spin_lock_irqsave(&amp;waiter_task-&gt;pi_lock, flags);\n \trt_mutex_dequeue(lock, waiter);\n-\tcurrent-&gt;pi_blocked_on = NULL;\n-\traw_spin_unlock_irqrestore(&amp;current-&gt;pi_lock, flags);\n+\twaiter_task-&gt;pi_blocked_on = NULL;\n+\traw_spin_unlock_irqrestore(&amp;waiter_task-&gt;pi_lock, flags);\n \n \tif (!owner)\n \t\treturn;\n@@ -649,7 +652,7 @@ static void remove_waiter(struct rt_mutex *lock,\n \n \traw_spin_unlock(&amp;lock-&gt;wait_lock);\n \n-\trt_mutex_adjust_prio_chain(owner, 0, lock, NULL, current);\n+\trt_mutex_adjust_prio_chain(owner, 0, lock, NULL, waiter_task);\n \n \traw_spin_lock(&amp;lock-&gt;wait_lock);\n }\n-- \n2.53.0\n</code></pre>\n<p> </p>\n<p>Es un backport para el 3.10 basado en el parche oficial: <a href=\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=88614876370aac8ad1050ad785a4c095ba17ac11\">https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=88614876370aac8ad1050ad785a4c095ba17ac11</a></p>\n<p>Lo he compilado y  desplegado el kernel en varios nodos.</p>\n<p>Esto soluciona CVE-2026-43499 en Openvz7 con el kernel 3.10.x</p>\n<p>Si alguien quiere el RPM con el kernel que me escriba, cuando tenga un rato actualizo este post con el RPM del kernel o las instrucciones de compilación.</p>",
            "author": {
                "name": "Maks"
            },
            "tags": [
            ],
            "date_published": "2026-07-09T19:31:31+02:00",
            "date_modified": "2026-07-10T19:52:42+02:00"
        },
        {
            "id": "https://skamasle.com/openlitespeed-en-plesk-como-modulo.html",
            "url": "https://skamasle.com/openlitespeed-en-plesk-como-modulo.html",
            "title": "OpenLiteSpeed en plesk como módulo",
            "summary": "Llevo más de 15 años como sysadmin. Entre los primeros servidores que toqué con problemas, algunos tenían Plesk 8, casi al final del ciclo de este; luego vino Plesk 9. Lo mismo con cPanel. LiteSpeed Enterprise se abrió paso muy rápido en el mundillo y&hellip;",
            "content_html": "<p data-path-to-node=\"2\">Llevo más de 15 años como sysadmin. Entre los primeros servidores que toqué con problemas, algunos tenían Plesk 8, casi al final del ciclo de este; luego vino Plesk 9.</p>\n<p data-path-to-node=\"3\">Lo mismo con cPanel. LiteSpeed Enterprise se abrió paso muy rápido en el mundillo y siempre me pregunté: ¿por qué nadie ha hecho un módulo de OpenLiteSpeed para Plesk?</p>\n<p data-path-to-node=\"4\">No entraremos en detalles. Está claro que hay motivos económicos; vistos los costes de licenciamiento, en parte se entiende. LiteSpeed ha hecho un trabajo bastante bueno y debe recuperar la inversión. Básicamente es un Apache que no lee el .htaccess en cada acceso para ver si hay cambios, y luego tiene su propio LSAPI/LSPHP, que es realmente donde más se nota el rendimiento.</p>\n<p>Recordemos que Nginx ya de por sí podría competir con LiteSpeed. El solo hecho de no usar .htaccess ya tiene sus ventajas competitivas, pero el cuello de botella sigue estando en la ejecución de PHP. PHP-FPM funciona bien, pero no está tan integrado con el servidor web como LiteSpeed/OpenLiteSpeed + LSAPI. Así que una integración de OpenLiteSpeed en cPanel o Plesk podría ser interesante, pero es compleja.</p>\n<p data-path-to-node=\"6\">Hace años tocaba mucho cPanel, pero desde hace unos 6 años toco mucho más Plesk, así que analicemos el problema. Plesk está diseñado para trabajar con Apache:</p>\n<ul data-path-to-node=\"7\">\n<li>\n<p data-path-to-node=\"7,0,0\">Añadir, modificar y actualizar dominios toca Apache.</p>\n</li>\n<li>\n<p data-path-to-node=\"7,1,0\"><code data-path-to-node=\"7,1,0\" data-index-in-node=\"0\">plesk repair web</code> y <code data-path-to-node=\"7,1,0\" data-index-in-node=\"19\">plesk repair</code> tocan Apache.</p>\n</li>\n<li>\n<p data-path-to-node=\"7,2,0\">Plesk necesita que Apache esté funcionando; necesita internamente verificar que los vhosts estén OK. Si algo no devuelve un OK en Apache y en los test, la interfaz se rompe.</p>\n</li>\n</ul>\n<p data-path-to-node=\"8\"><strong data-path-to-node=\"8\" data-index-in-node=\"0\">¿Cuál es el problema para instalar OpenLiteSpeed?</strong></p>\n<p data-path-to-node=\"8\"> </p>\n<p data-path-to-node=\"8\">El problema es que LiteSpeed Enterprise se basa en un negocio. El código de OpenLiteSpeed no lee los vhosts de Apache, así que eso complica todo muchísimo. Quitar Apache es inviable para dejar OpenLiteSpeed y tener acceso a LSAPI para mejorar el rendimiento.</p>\n<p data-path-to-node=\"9\">Así que la conclusión es: No es posible quitar Apache y poner OpenLiteSpeed. Aunque se logre integrar con plantillas, Plesk se rompería al ejecutar <code data-path-to-node=\"9\" data-index-in-node=\"148\">plesk repair</code>, entre otras cosas. Aunque se logre solucionar el problema y no romper Plesk, una conversión masiva de Apache &gt; OpenLiteSpeed en un servidor en producción rompería webs. Recordemos que OpenLiteSpeed sí es compatible con .htaccess<code data-path-to-node=\"9\" data-index-in-node=\"381\"></code> y puede cargarlo, pero LiteSpeed solo ha integrado <code data-path-to-node=\"9\" data-index-in-node=\"442\">mod_rewrite</code>; el resto de reglas no van a cargarse. Podemos ver esto en la documentación oficial: <a _ngcontent-ng-c4238799277=\"\" target=\"_blank\" rel=\"noopener\" externallink=\"\" _nghost-ng-c2784932951=\"\" jslog=\"197247;track:generic_click,impression,attention;BardVeMetadataKey:[[&quot;r_d63f311b39ab5556&quot;,&quot;c_d4683ebfb3885965&quot;,null,&quot;rc_694ee7c827daed70&quot;,null,null,&quot;es&quot;,null,1,null,null,1,0]]\" href=\"https://docs.openlitespeed.org/config/rewriterules/\" class=\"ng-star-inserted\" data-hveid=\"0\" decode-data-ved=\"1\" data-ved=\"0CAAQ_4QMahcKEwjhiLLW24SVAxUAAAAAHQAAAAAQQQ\">https://docs.openlitespeed.org/config/rewriterules/</a></p>\n<p data-path-to-node=\"10\">Realmente todo son complicaciones, tanto por parte de Plesk como por parte de LiteSpeed, a la que evidentemente no le interesa portar cierto código a OpenLiteSpeed para reemplazar a Apache. Y se entiende: el negocio se terminaría, viven de ello, y el sistema que tienen funciona bien y genera beneficios.</p>\n<p data-path-to-node=\"11\">¿Qué tal si les digo que yo soy muy cabezón y que hoy en día picar código con la IA nos ayuda mucho a todos? Para qué engañarnos, solo tenemos que partirnos la cabeza para tener una buena idea y estructura, y luego la IA nos ayudará con el código o incluso podría ayudarnos con la idea, aunque a veces no sea el caso.</p>\n<p data-path-to-node=\"12\">Pues yo tengo una idea en la que estoy trabajando y pronto verá la luz en: <a href=\"https://github.com/Skamasle/ols\">https://github.com/Skamasle/ols</a> </p>\n<p data-path-to-node=\"13\">Hoy, 13 de junio de 2026, no hay nada en el Git, pero para julio espero tener algo ya subido que funcione medianamente bien, o eso espero. La idea está; estoy redactando el proyecto y dándole vueltas a posibles problemas, y luego ya usaremos la IA para que nos haga algo de código y no tardar meses desarrollando.</p>\n<p data-path-to-node=\"14\">Voy a adelantar algo. La solución al problema de OpenLiteSpeed en Plesk no pasa por quitar Apache, pasa por hacer que los dos funcionen a la vez, y aquí es donde entra Nginx en la ecuación. Y lo bueno de todo esto es que LSAPI / LSPHP ya viene de serie en Plesk, así que solo necesitamos enrutar correctamente el tráfico hacia OpenLiteSpeed sin alterar Apache para nada. Plesk seguirá funcionando con Apache y Nginx como hasta ahora, pero nuestro módulo debería hacer la magia interna para añadir un tercer servidor web para las webs que necesiten LSAPI y OpenLiteSpeed.</p>\n<p data-path-to-node=\"15\">La idea no parece gran cosa ahora mismo explicada en un párrafo, pero cuando el proyecto esté redactado, la idea esté bien plasmada y el desarrollo empiece, quedará más claro. Así que estén atentos a GitHub; si las pruebas dan frutos, aparecerá el código en GitHub o, al menos inicialmente, la idea del proyecto.</p>\n<p data-path-to-node=\"15\"> </p>\n<p data-path-to-node=\"15\">Update:</p>\n<p data-path-to-node=\"15\">EL modulo toma forma, hay problemas que resolver aún pero poco a poco se vuelve funcional, al menos ya tenemos una interfaz en plesk, instalación segura despliegue de Openlitespeed y dominios trabajando con LSPHP con OpenLitespeed y trabajando ya en la integración con LSCACHE y cuando todo sea funcional hay que pulir muchas cosas, activaciones / desactivaciones / cambios de versión de PHP</p>\n<p data-path-to-node=\"15\"><br>Pero creo que en un par de semanas podremos tener ya  OpenLiteSpeed En plesk completamente funcional</p>\n<p data-path-to-node=\"15\"> </p>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/25/cap1-ols.png\" alt=\"\" width=\"1352\" height=\"736\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/25/responsive/cap1-ols-xs.png 640w ,https://skamasle.com/media/posts/25/responsive/cap1-ols-sm.png 768w ,https://skamasle.com/media/posts/25/responsive/cap1-ols-md.png 1024w ,https://skamasle.com/media/posts/25/responsive/cap1-ols-lg.png 1366w ,https://skamasle.com/media/posts/25/responsive/cap1-ols-xl.png 1600w ,https://skamasle.com/media/posts/25/responsive/cap1-ols-2xl.png 1920w\"></figure>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/25/cap2-ols.png\" alt=\"\" width=\"1338\" height=\"786\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/25/responsive/cap2-ols-xs.png 640w ,https://skamasle.com/media/posts/25/responsive/cap2-ols-sm.png 768w ,https://skamasle.com/media/posts/25/responsive/cap2-ols-md.png 1024w ,https://skamasle.com/media/posts/25/responsive/cap2-ols-lg.png 1366w ,https://skamasle.com/media/posts/25/responsive/cap2-ols-xl.png 1600w ,https://skamasle.com/media/posts/25/responsive/cap2-ols-2xl.png 1920w\"></figure>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/25/cap3-ols.png\" alt=\"\" width=\"1345\" height=\"544\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/25/responsive/cap3-ols-xs.png 640w ,https://skamasle.com/media/posts/25/responsive/cap3-ols-sm.png 768w ,https://skamasle.com/media/posts/25/responsive/cap3-ols-md.png 1024w ,https://skamasle.com/media/posts/25/responsive/cap3-ols-lg.png 1366w ,https://skamasle.com/media/posts/25/responsive/cap3-ols-xl.png 1600w ,https://skamasle.com/media/posts/25/responsive/cap3-ols-2xl.png 1920w\"></figure>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/25/cap4-ols.png\" alt=\"\" width=\"1374\" height=\"203\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/25/responsive/cap4-ols-xs.png 640w ,https://skamasle.com/media/posts/25/responsive/cap4-ols-sm.png 768w ,https://skamasle.com/media/posts/25/responsive/cap4-ols-md.png 1024w ,https://skamasle.com/media/posts/25/responsive/cap4-ols-lg.png 1366w ,https://skamasle.com/media/posts/25/responsive/cap4-ols-xl.png 1600w ,https://skamasle.com/media/posts/25/responsive/cap4-ols-2xl.png 1920w\"></figure>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/25/cap5-ols.png\" alt=\"\" width=\"1349\" height=\"269\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/25/responsive/cap5-ols-xs.png 640w ,https://skamasle.com/media/posts/25/responsive/cap5-ols-sm.png 768w ,https://skamasle.com/media/posts/25/responsive/cap5-ols-md.png 1024w ,https://skamasle.com/media/posts/25/responsive/cap5-ols-lg.png 1366w ,https://skamasle.com/media/posts/25/responsive/cap5-ols-xl.png 1600w ,https://skamasle.com/media/posts/25/responsive/cap5-ols-2xl.png 1920w\"></figure>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/25/cap6-ols.png\" alt=\"\" width=\"1374\" height=\"422\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/25/responsive/cap6-ols-xs.png 640w ,https://skamasle.com/media/posts/25/responsive/cap6-ols-sm.png 768w ,https://skamasle.com/media/posts/25/responsive/cap6-ols-md.png 1024w ,https://skamasle.com/media/posts/25/responsive/cap6-ols-lg.png 1366w ,https://skamasle.com/media/posts/25/responsive/cap6-ols-xl.png 1600w ,https://skamasle.com/media/posts/25/responsive/cap6-ols-2xl.png 1920w\"></figure>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/25/cap7-ols.png\" alt=\"\" width=\"748\" height=\"135\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/25/responsive/cap7-ols-xs.png 640w ,https://skamasle.com/media/posts/25/responsive/cap7-ols-sm.png 768w ,https://skamasle.com/media/posts/25/responsive/cap7-ols-md.png 1024w ,https://skamasle.com/media/posts/25/responsive/cap7-ols-lg.png 1366w ,https://skamasle.com/media/posts/25/responsive/cap7-ols-xl.png 1600w ,https://skamasle.com/media/posts/25/responsive/cap7-ols-2xl.png 1920w\"></figure>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/25/cap9-ols.png\" alt=\"\" width=\"421\" height=\"135\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/25/responsive/cap9-ols-xs.png 640w ,https://skamasle.com/media/posts/25/responsive/cap9-ols-sm.png 768w ,https://skamasle.com/media/posts/25/responsive/cap9-ols-md.png 1024w ,https://skamasle.com/media/posts/25/responsive/cap9-ols-lg.png 1366w ,https://skamasle.com/media/posts/25/responsive/cap9-ols-xl.png 1600w ,https://skamasle.com/media/posts/25/responsive/cap9-ols-2xl.png 1920w\"></figure>",
            "author": {
                "name": "Maks"
            },
            "tags": [
                   "PLesk module",
                   "Openlitespeed plesk",
                   "Openlitespeed"
            ],
            "date_published": "2026-06-13T19:18:14+02:00",
            "date_modified": "2026-06-14T15:21:37+02:00"
        },
        {
            "id": "https://skamasle.com/pang-renovado-para-android-juego-sin-publicidad-sin-tracking-gratis-y-opensource.html",
            "url": "https://skamasle.com/pang-renovado-para-android-juego-sin-publicidad-sin-tracking-gratis-y-opensource.html",
            "title": "Pang Renovado para Android, Juego sin Publicidad, sin Tracking, Gratis y OpenSource",
            "summary": "Desde que inicié en internet he aprendido muchas cosas. Mi trabajo, al fin y al cabo, lo tengo gracias a que entre los años 2000 y 2010 todo se compartía, sobre todo el conocimiento. Al final, la filosofía de este blog es esa: ir compartiendo.",
            "content_html": "<p data-path-to-node=\"3\">Desde que inicié en internet he aprendido muchas cosas. Mi trabajo, al fin y al cabo, lo tengo gracias a que entre los años 2000 y 2010 todo se compartía, sobre todo el conocimiento. Al final, la filosofía de este blog es esa: ir compartiendo.</p>\n<p data-path-to-node=\"4\">Ahora estoy inmerso en la creación de un juego: un <strong data-path-to-node=\"4\" data-index-in-node=\"51\">Pang renovado</strong>. De momento, estoy trabajando en la lógica (bolas, disparos, niveles, etc.). Muchos os preguntaréis: ¿para qué hacer un juego?</p>\n<p data-path-to-node=\"5\">A mi mujer le gusta jugar a títulos retro, tipo Pang y similares. El problema en Android es que los juegos tienen miles de anuncios; es muy tedioso y, si no pagas, olvídate de jugar bien. Aquí es donde nace este proyecto.</p>\n<p><strong>Pues aquí es donde nace el pang renovado.</strong></p>\n<p> </p>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/24/pang1.png\" alt=\"Pang\" width=\"742\" height=\"386\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/24/responsive/pang1-xs.png 640w ,https://skamasle.com/media/posts/24/responsive/pang1-sm.png 768w ,https://skamasle.com/media/posts/24/responsive/pang1-md.png 1024w ,https://skamasle.com/media/posts/24/responsive/pang1-lg.png 1366w ,https://skamasle.com/media/posts/24/responsive/pang1-xl.png 1600w ,https://skamasle.com/media/posts/24/responsive/pang1-2xl.png 1920w\"></figure>\n<h3 data-path-to-node=\"6\">Estado actual: Release 0.7.8-alpha</h3>\n<p data-path-to-node=\"7\">A día de hoy, el juego es <strong data-path-to-node=\"7\" data-index-in-node=\"26\">completamente jugable</strong>. No se ha trabajado nada en los gráficos base, ya que solucionar bugs y hacerlo funcional lleva el 90% del tiempo. Del sonido ni hablamos: no hay, de momento.</p>\n<p data-path-to-node=\"8\">Pronto lo subiré a GitHub para que quien quiera colaborar, o simplemente usarlo, pueda hacerlo. Tengo pensado subirlo a la Play Store con la garantía de la casa: <strong data-path-to-node=\"8\" data-index-in-node=\"162\">gratis, 0 anuncios, 0 tracking; descargar y jugar.</strong></p>\n<p data-path-to-node=\"9\">El problema es que hay que pagar la tasa de 25 dólares y contar con <strong data-path-to-node=\"9\" data-index-in-node=\"68\">20 beta testers</strong> que prueben el juego durante 14 días. Eso será lo más complicado de conseguir.</p>\n<h3 data-path-to-node=\"10\">Mecánicas y contenido</h3>\n<p data-path-to-node=\"11\">En cuanto al desarrollo, me he enfocado en las bolas y los disparos. Las escaleras se me están resistiendo; no hay forma de hacerlas funcionar de manera decente, siempre generan algún problema.</p>\n<p data-path-to-node=\"12\">Esto es lo que podemos encontrar actualmente (¡ya van 80 niveles!):</p>\n<ul data-path-to-node=\"13\">\n<li>\n<p data-path-to-node=\"13,0,0\"><strong data-path-to-node=\"13,0,0\" data-index-in-node=\"0\">Checkpoints configurables:</strong></p>\n<ul data-path-to-node=\"13,0,1\">\n<li>\n<p data-path-to-node=\"13,0,1,0,0\">Volver al nivel 1.</p>\n</li>\n<li>\n<p data-path-to-node=\"13,0,1,1,0\">Checkpoint cada 5 niveles.</p>\n</li>\n<li>\n<p data-path-to-node=\"13,0,1,2,0\">Checkpoint cada 10 niveles.</p>\n</li>\n</ul>\n</li>\n<li>\n<p data-path-to-node=\"13,1,0\"><strong data-path-to-node=\"13,1,0\" data-index-in-node=\"0\">Guardado de partida</strong> con opción de \"Continuar\".</p>\n</li>\n</ul>\n<h4 data-path-to-node=\"14\">Tipos de disparo:</h4>\n<ul data-path-to-node=\"15\">\n<li>\n<p data-path-to-node=\"15,0,0\">Arpón básico.</p>\n</li>\n<li>\n<p data-path-to-node=\"15,1,0\">Doble.</p>\n</li>\n<li>\n<p data-path-to-node=\"15,2,0\">Trampa.</p>\n</li>\n<li>\n<p data-path-to-node=\"15,3,0\">Tridente.</p>\n</li>\n<li>\n<p data-path-to-node=\"15,4,0\">Spray (con munición limitada).</p>\n</li>\n</ul>\n<h4 data-path-to-node=\"16\">Tipos de bola (por tamaño):</h4>\n<p data-path-to-node=\"17\"><code data-path-to-node=\"17\" data-index-in-node=\"0\">SMALL</code>, <code data-path-to-node=\"17\" data-index-in-node=\"7\">MEDIUM</code>, <code data-path-to-node=\"17\" data-index-in-node=\"15\">LARGE</code>, <code data-path-to-node=\"17\" data-index-in-node=\"22\">GIANT</code> y <code data-path-to-node=\"17\" data-index-in-node=\"30\">EXTRA_LARGE</code>.</p>\n<h4 data-path-to-node=\"18\">Bolas especiales:</h4>\n<p data-path-to-node=\"19\"><code data-path-to-node=\"19\" data-index-in-node=\"0\">ULTRA_FAST</code>, <code data-path-to-node=\"19\" data-index-in-node=\"12\">STAR_CHAOS</code>, <code data-path-to-node=\"19\" data-index-in-node=\"24\">GHOST</code>, <code data-path-to-node=\"19\" data-index-in-node=\"31\">INVERTED_GRAVITY</code> y <code data-path-to-node=\"19\" data-index-in-node=\"50\">ORTHOGONAL</code>.</p>\n<h4 data-path-to-node=\"20\">Núcleos especiales:</h4>\n<p data-path-to-node=\"21\"><i data-path-to-node=\"21\" data-index-in-node=\"0\">(Bolas marcadas que, al explotar, ejecutan acciones distintas)</i> <code data-path-to-node=\"21\" data-index-in-node=\"63\">TRIANGLE</code>, <code data-path-to-node=\"21\" data-index-in-node=\"73\">SHIELDED</code>, <code data-path-to-node=\"21\" data-index-in-node=\"83\">BINARY</code>, <code data-path-to-node=\"21\" data-index-in-node=\"91\">RHOMBUS</code>, <code data-path-to-node=\"21\" data-index-in-node=\"100\">BLACK_RHOMBUS</code>, <code data-path-to-node=\"21\" data-index-in-node=\"115\">SUPREME_RHOMBUS</code>, <code data-path-to-node=\"21\" data-index-in-node=\"132\">BROOD</code> y <code data-path-to-node=\"21\" data-index-in-node=\"140\">MUTATOR</code>.</p>\n<h4 data-path-to-node=\"22\">Comportamientos especiales:</h4>\n<ul data-path-to-node=\"23\">\n<li>\n<p data-path-to-node=\"23,0,0\">Dividirse en tres.</p>\n</li>\n<li>\n<p data-path-to-node=\"23,1,0\">Generar bolas rápidas.</p>\n</li>\n<li>\n<p data-path-to-node=\"23,2,0\">Necesitar dos golpes para romperse.</p>\n</li>\n<li>\n<p data-path-to-node=\"23,3,0\">Mutar en otros tipos.</p>\n</li>\n<li>\n<p data-path-to-node=\"23,4,0\">Soltar bolas pequeñas al rebotar.</p>\n</li>\n<li>\n<p data-path-to-node=\"23,5,0\">Volverse caóticas.</p>\n</li>\n<li>\n<p data-path-to-node=\"23,6,0\">Atravesar plataformas.</p>\n</li>\n<li>\n<p data-path-to-node=\"23,7,0\">Dejar triángulos que bloquean el paso.</p>\n</li>\n<li>\n<p data-path-to-node=\"23,8,0\">Dejar agua o chicle en el suelo.</p>\n</li>\n</ul>\n<h4 data-path-to-node=\"24\">Bonus y ayudas:</h4>\n<p data-path-to-node=\"25\">Corazón, reloj, escudo (normal y temporal) y tiempo extra.</p>\n<hr data-path-to-node=\"26\">\n<p data-path-to-node=\"27\">Voy a pulir algunas cosas más antes de subir la release, ya que tengo varios bugs pendientes de corregir. Si quieres colaborar como <strong data-path-to-node=\"27\" data-index-in-node=\"132\">beta tester</strong>, escríbeme a <strong data-path-to-node=\"27\" data-index-in-node=\"157\">yo@skamasle.com</strong>. Necesito a 20 valientes dispuestos a probar la app durante 14 días para poder subirla a la Play Store.</p>\n<p> </p>\n<p>Descarga de la primera versión liberada pang-0.8.6-alpha.apk -&gt;  <a href=\"https://skamasle.com/apk/pang-0.8.6-alpha.apk\">https://skamasle.com/apk/pang-0.8.6-alpha.apk</a></p>\n<p>Garantías del juego:</p>\n<p>NO tiene anuncios</p>\n<p>NO Se cobrará</p>\n<p>NO tiene tracking </p>\n<p>NO necesita ningún tipo de permiso en el dispositivo</p>\n<p> </p>\n<p> </p>\n<p><br><br></p>\n<p> </p>\n<p> </p>",
            "author": {
                "name": "Maks"
            },
            "tags": [
            ],
            "date_published": "2026-04-05T18:41:43+02:00",
            "date_modified": "2026-04-08T21:21:36+02:00"
        },
        {
            "id": "https://skamasle.com/proxmox-mail-gateway-ratelimit-centralizado-en-cluster-de-relay-de-correo.html",
            "url": "https://skamasle.com/proxmox-mail-gateway-ratelimit-centralizado-en-cluster-de-relay-de-correo.html",
            "title": "Proxmox Mail Gateway  Ratelimit Centralizado en Cluster de Relay de Correo",
            "summary": "Sí, toca tocar el correo, llevo tiempo trabajando en mejoras para un sistema anti spam que incluyen un rotador de IPs para postfix que auto excluye las IPs de las listas negras, en postfix se puede hacer con randmap que básicamente selecciona un transport de&hellip;",
            "content_html": "<p>Sí, toca tocar el correo, llevo tiempo trabajando en mejoras para un sistema anti spam que incluyen un rotador de IPs para postfix que auto excluye las IPs de las listas negras, en postfix se puede hacer con randmap que básicamente selecciona un transport de forma aleatoria, pero... cuando quieres quitar un transport tiene que reiniciar postfix, así que he hecho un sistema adicional que le manda las IPs a postfix, que publicaré más pronto que tarde en el blog.</p>\n<p>Hay varias opciones para ratelimit, podemos usar rspamd, que ya nos toca un poco el lado del milter y choca un poco con spamassasin, pero tiene un ratelimit integrado y puedes generar reglas hasta por asunto o cualquier cosa que se te ocurra</p>\n<p>Luego tenemos <a href=\"https://postfwd.org/\">https://postfwd.org/</a> un sistema sin duda probado y con bastante tiempo en desarrollo, este actúa en<a href=\"https://www.postfix.org/postconf.5.html#smtpd_end_of_data_restrictions\" target=\"_blank\" rel=\"noopener noreferrer\"> smtpd_end_of_data_restrictions  </a></p>\n<p>Lo que tenemos que hacer es crear un check_policy_service y enviar información a postfwd</p>\n<p>Check_police_service le envía a postfwd la siguiente información </p>\n<blockquote>\n<p>ccert_fingerprint= | ccert_issuer= | ccert_pubkey_fingerprint= | ccert_subject= | client_address= | client_name | client_port= | compatibility_level=3.11 | encryption_cipher= | encryption_keysize= | encryption_protocol= | etrn_domain= | helo_name= | instance= | mail_version= | policy_context= | protocol_name=ESMTP | protocol_state=RCPT | queue_id= | recipient= | recipient_count=0 | request=smtpd_access_policy | reverse_client_name= | sasl_method= | sasl_sender= | sasl_username= | sender= | server_address= | server_port=25 | size=xxx | stress=</p>\n</blockquote>\n<p>¿ Como lo se ? pues estoy haciendo mi propio ratelimit.</p>\n<p>¿por que hacer mi propio ratelimit si tengo postfwd ?</p>\n<p>Básicamente por que estoy haciendo un panel completo para gestión y quiero integración total, pero el sistema no dista mucho, en vez de hacerlo en perl lo estoy haciendo en go, un poco más rápido todo.</p>\n<p>Primero veamos las diferencias que tendrá con postfwd, postfwd, esta pensado para trabajar en smtpd_end_of_data_restrictions mi sistema esta pensado para trabajar ahí y también para trabajar en smtpd_recipient_restrictions. Parece lo mismo pero no.</p>\n<p>La diferencia sustancial es que postfwd recibe recipient_count= ya que es lo que puede recibir en end_of_data es más rápido procesarlo ahí pero  en smtpd_recipient_restrictions recibimos RCPT TO</p>\n<p>Que quiere decir esto, que en un sistio recibimos solo a cuantos destinatarios va el correo, ej</p>\n<p>Un correo desde <a href=\"mailto:hola@dominio.com\">hola@dominio.com</a> se envía a 50 personas, en smtpd_end_of_data_restrictions recipient_count=50 y en smtpd_recipient_restrictions uno a uno la lista de destinatarios, por lo tanto, sacrificamos algo de tiempo y recursos procesando todos los destinatarios, pero ganamos una cosa, poder aplicar limites.</p>\n<p>En pocas palabras si queremos que un dominio no pueda enviar más de 50 mensajes por minuto a hotmail.com solo podemos hacerlo desde smtpd_recipient_restrictions, si queremos poner un ratelimit a destinatarios por patrones tenemos que hacerlo desde smtpd_recipient_restrictions ya que aquí es donde recibimos todos los destinatarios.</p>\n<p>Con postfwd, solo aplicamos al número total ya que no recibimos los destinatarios si no el número.</p>\n<p>Por lo tanto, si quieres un ratelimit ahora mismo, usa postfwd, funciona bien y te hace el apaño, si quieres algo más complejo que previene ataques de diccionario y demás, pues tendrás que esperar un poco más a que el sistema pase las pruebas.</p>\n<p>Entre otras cosas el skamale-ratelimit hace:</p>\n<ol>\n<li>Ratelimit por dominio, ip, destinatario, ataques de diccionario, peso por mensaje etc</li>\n<li>Ratelimit centralizado, todo el cluster comunica entre si y genera ratelimit en todos los nodos</li>\n<li>Muy ligero, de 4 o 8 MB de ram de consumo en entorno real</li>\n<li>Limite dinámico, modifica el limite si el remitente a generado bounces o deferred, esto quiere decir que en una hora una cuenta puede tener 300 mails para enviar, pero si tiene muchos bounces o deferred el limite por hora se ajusta automáticamente a la baja ya que es un remitente de poca confianza pudiendo limitarse a 200, 150, 100 etc según la personalización que se quiera dar por bounce o deferred que se detecte en el cluster</li>\n<li>Panel de control de gestión para establecer limites</li>\n<li>Panel de status para ver limites</li>\n<li>Overrides a determinadas IPs, dominios y cuentas de correo desde el panel.</li>\n<li>Opciones adicionales de checks contra SPFS y demás integrado en el ratelimit</li>\n</ol>\n<p>El ataque de diccionario es lo siguiente:</p>\n<p><a href=\"mailto:alberto@test.com\">alberto@test.com</a></p>\n<p><a href=\"mailto:alfredo@test.com\">alfredo@test.com</a></p>\n<p><a href=\"mailto:albondiga@test.com\">albondiga@test.com</a></p>\n<p>sender+al+test.com es el patrón detectado y en el que actual el ratelimit.</p>\n<p> </p>\n<p>Pues si, en eso estoy trabajando, disculpen lo encuesto del post pero ando mal de tiempo  y tengo esto un poco descuidado.</p>\n<p>2 Imagenes de la config y el ratelimit funcionando en producción</p>\n<p> </p>\n<p>Aunque el proyecto lo voy a subir separado, tal vez sea más útil el ratelimit y el selector para postfix aparte</p>\n<p> </p>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/23/ratelimit-status.png\" alt=\"\" width=\"1817\" height=\"955\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/23/responsive/ratelimit-status-xs.png 640w ,https://skamasle.com/media/posts/23/responsive/ratelimit-status-sm.png 768w ,https://skamasle.com/media/posts/23/responsive/ratelimit-status-md.png 1024w ,https://skamasle.com/media/posts/23/responsive/ratelimit-status-lg.png 1366w ,https://skamasle.com/media/posts/23/responsive/ratelimit-status-xl.png 1600w ,https://skamasle.com/media/posts/23/responsive/ratelimit-status-2xl.png 1920w\"></figure>\n<p> </p>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/23/ratelimit-config-2.png\" alt=\"\" width=\"1011\" height=\"1177\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/23/responsive/ratelimit-config-2-xs.png 640w ,https://skamasle.com/media/posts/23/responsive/ratelimit-config-2-sm.png 768w ,https://skamasle.com/media/posts/23/responsive/ratelimit-config-2-md.png 1024w ,https://skamasle.com/media/posts/23/responsive/ratelimit-config-2-lg.png 1366w ,https://skamasle.com/media/posts/23/responsive/ratelimit-config-2-xl.png 1600w ,https://skamasle.com/media/posts/23/responsive/ratelimit-config-2-2xl.png 1920w\"></figure>\n<p> </p>",
            "author": {
                "name": "Maks"
            },
            "tags": [
                   "Ratelimit",
                   "PMG",
                   "Correo",
                   "Cluster"
            ],
            "date_published": "2026-03-23T21:34:28+01:00",
            "date_modified": "2026-04-16T22:03:58+02:00"
        },
        {
            "id": "https://skamasle.com/web-mas-lenta-con-cloudflare-450-ms.html",
            "url": "https://skamasle.com/web-mas-lenta-con-cloudflare-450-ms.html",
            "title": "Web más lenta con cloudflare +450 MS",
            "summary": "Desde que reabrí el blog, he escrito algunos artículos sobre unas garantías de carga que hasta ahora no he cumplido, más que nada por falta de tiempo. Hoy me he puesto a mirar un poco el Webmaster Tools y el Core Web Vitals de Google,&hellip;",
            "content_html": "<p data-path-to-node=\"2\">Desde que reabrí el blog, he escrito algunos artículos sobre unas garantías de carga que hasta ahora no he cumplido, más que nada por falta de tiempo. Hoy me he puesto a mirar un poco el Webmaster Tools y el Core Web Vitals de Google, por curiosidad más que nada y para aprender un poco más.</p>\n<p data-path-to-node=\"3\">Y bueno, también para ver por qué Google no estaba indexando luego de un parón de tres años; resulta que había quitado la etiqueta de verificación y el blog seguía en Google con \"www\"... pero bueno, eso es otro tema.</p>\n<p data-path-to-node=\"4\">Volvamos a Core Web Vitals. De momento el blog rinde bien con 1 core y 512 MB de RAM.</p>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/22/core-vitals2026.png\" alt=\"\" width=\"962\" height=\"659\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/22/responsive/core-vitals2026-xs.png 640w ,https://skamasle.com/media/posts/22/responsive/core-vitals2026-sm.png 768w ,https://skamasle.com/media/posts/22/responsive/core-vitals2026-md.png 1024w ,https://skamasle.com/media/posts/22/responsive/core-vitals2026-lg.png 1366w ,https://skamasle.com/media/posts/22/responsive/core-vitals2026-xl.png 1600w ,https://skamasle.com/media/posts/22/responsive/core-vitals2026-2xl.png 1920w\"></figure>\n<p><span class=\"\">Números muy buenos,</span><span class=\"\"> pero...</span><span class=\"\"> ¿Speed Index de 2 segundos?</span><span class=\"\"> Ahí ya me ha chirriado un poco el tema,</span><span class=\"\"> así que vamos a ver qué más nos dice Google al respecto:</span></p>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/22/corevitals2.png\" alt=\"\" width=\"993\" height=\"531\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/22/responsive/corevitals2-xs.png 640w ,https://skamasle.com/media/posts/22/responsive/corevitals2-sm.png 768w ,https://skamasle.com/media/posts/22/responsive/corevitals2-md.png 1024w ,https://skamasle.com/media/posts/22/responsive/corevitals2-lg.png 1366w ,https://skamasle.com/media/posts/22/responsive/corevitals2-xl.png 1600w ,https://skamasle.com/media/posts/22/responsive/corevitals2-2xl.png 1920w\"></figure>\n<p>Mucho hemos hablado de montar webs y ya, dejarlas a su suerte y solo quejarte de que van lento; pero tener una web implica saber qué hace la web y todo lo que carga. Y esto me sonaba muy raro, el enlace: <code data-path-to-node=\"2\" data-index-in-node=\"204\">/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js</code>.</p>\n<pre class=\"language-javascript\"><code>!function(){\"use strict\";function e(e){try{if(\"undefined\"==typeof console)return;\"error\"in console?console.error(e):console.log(e)}catch(e){}}function t(e){return d.innerHTML='&lt;a href=\"'+e.replace(/\"/g,\"&amp;quot;\")+'\"&gt;&lt;/a&gt;',d.childNodes[0].getAttribute(\"href\")||\"\"}function r(e,t){var r=e.substr(t,2);return parseInt(r,16)}function n(n,c){for(var o=\"\",a=r(n,c),i=c+2;i&lt;n.length;i+=2){var l=r(n,i)^a;o+=String.fromCharCode(l)}try{o=decodeURIComponent(escape(o))}catch(u){e(u)}return t(o)}function c(t){for(var r=t.querySelectorAll(\"a\"),c=0;c&lt;r.length;c++)try{var o=r[c],a=o.href.indexOf(l);a&gt;-1&amp;&amp;(o.href=\"mailto:\"+n(o.href,a+l.length))}catch(i){e(i)}}function o(t){for(var r=t.querySelectorAll(u),c=0;c&lt;r.length;c++)try{var o=r[c],a=o.parentNode,i=o.getAttribute(f);if(i){var l=n(i,0),d=document.createTextNode(l);a.replaceChild(d,o)}}catch(h){e(h)}}function a(t){for(var r=t.querySelectorAll(\"template\"),n=0;n&lt;r.length;n++)try{i(r[n].content)}catch(c){e(c)}}function i(t){try{c(t),o(t),a(t)}catch(r){e(r)}}var l=\"/cdn-cgi/l/email-protection#\",u=\".__cf_email__\",f=\"data-cfemail\",d=document.createElement(\"div\");i(document),function(){var e=document.currentScript||document.scripts[document.scripts.length-1];e.parentNode.removeChild(e)}()}();</code></pre>\n<p data-path-to-node=\"0\"> </p>\n<p data-path-to-node=\"2\">450 ms por una opción que yo no pedí, pero en la que evidentemente tampoco reparé al activar Cloudflare.</p>\n<p data-path-to-node=\"3\">¿Qué hace esto? Podemos leerlo aquí: <a _ngcontent-ng-c1126866592=\"\" target=\"_blank\" rel=\"noopener\" externallink=\"\" _nghost-ng-c2191985446=\"\" jslog=\"197247;track:generic_click,impression,attention;BardVeMetadataKey:[[&quot;r_75ff401785b94960&quot;,&quot;c_8f0099835ff221e8&quot;,null,&quot;rc_8c3454bdf81b4533&quot;,null,null,&quot;es&quot;,null,1,null,null,1,0]]\" href=\"https://developers.cloudflare.com/waf/tools/scrape-shield/email-address-obfuscation/\" class=\"ng-star-inserted\" data-hveid=\"0\" decode-data-ved=\"1\" data-ved=\"0CAAQ_4QMahgKEwjIrZb71OKSAxUAAAAAHQAAAAAQ1wY\">https://developers.cloudflare.com/waf/tools/scrape-shield/email-address-obfuscation/</a></p>\n<p data-path-to-node=\"4\">Básicamente protege las direcciones de correo; tú pones <code data-path-to-node=\"4\" data-index-in-node=\"56\">hola@gmail.com</code> y Cloudflare lo convierte en una imagen o pone <code data-path-to-node=\"4\" data-index-in-node=\"118\">hola [at] gmail.com</code> para que los bots no la pillen para enviar spam. A mí me da igual, solo tengo una dirección de correo en el blog y confiaré en el antispam del servidor de correo.</p>\n<p data-path-to-node=\"5\">Me costó encontrar dónde se desactiva, pero dejo una captura de pantalla:</p>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/22/cloudflare-ofusca.png\" alt=\"\" width=\"1535\" height=\"698\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/22/responsive/cloudflare-ofusca-xs.png 640w ,https://skamasle.com/media/posts/22/responsive/cloudflare-ofusca-sm.png 768w ,https://skamasle.com/media/posts/22/responsive/cloudflare-ofusca-md.png 1024w ,https://skamasle.com/media/posts/22/responsive/cloudflare-ofusca-lg.png 1366w ,https://skamasle.com/media/posts/22/responsive/cloudflare-ofusca-xl.png 1600w ,https://skamasle.com/media/posts/22/responsive/cloudflare-ofusca-2xl.png 1920w\"></figure>\n<p data-path-to-node=\"2\">También he desactivado el Rocket Loader. Esto no debería afectar mucho, pero en mi caso tengo gestión total del JavaScript y cargo solo lo necesario, así que el Rocket Loader puede que no me haga mal, pero el Core Web Vitals me dice que tengo que subirle el tiempo de caché. Cloudflare parece que no permite el control de ese tiempo, o yo no he visto dónde gestionarlo, así que va fuera. Aunque luego nos añada un <i data-path-to-node=\"2\" data-index-in-node=\"414\">blocking time</i> de 30 ms, ese bloqueo no me importa mucho; al final el funcionamiento va a ser el mismo y, mientras no suba la latencia por otro lado, todo está bien.</p>\n<p data-path-to-node=\"3\">Una vez desactivado y hecha la limpieza de la caché de Cloudflare, hacemos el test de nuevo</p>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/22/bloqueo-render.png\" alt=\"\" width=\"957\" height=\"253\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/22/responsive/bloqueo-render-xs.png 640w ,https://skamasle.com/media/posts/22/responsive/bloqueo-render-sm.png 768w ,https://skamasle.com/media/posts/22/responsive/bloqueo-render-md.png 1024w ,https://skamasle.com/media/posts/22/responsive/bloqueo-render-lg.png 1366w ,https://skamasle.com/media/posts/22/responsive/bloqueo-render-xl.png 1600w ,https://skamasle.com/media/posts/22/responsive/bloqueo-render-2xl.png 1920w\"></figure>\n<p data-path-to-node=\"2\">Bien, hemos quitado 450 ms en Core Web Vitals de una opción que no necesitamos; no está mal. Ahora tenemos una puntuación de 100, 100, 100, 92, 100. Un 92 en recomendaciones no está nada mal.</p>\n<p data-path-to-node=\"3\">Nos tocará pulir el tema del árbol de dependencias de red. Tengo solo un CSS y un JS y tengo todo ahí metido. Básicamente, Google dice que estoy haciendo una petición de más y que tengo que esperar a esa petición para seguir cargando la web.</p>\n<p data-path-to-node=\"4\">Como el CSS pesa 9,5 KB lo dejaremos para otro día; de momento, me quedo contento quitando 450 ms de carga innecesaria, que solo protegía una dirección de correo en la que no me importa mucho recibir algo de spam, en caso claro, de que falle el filtro.</p>\n<p> </p>",
            "author": {
                "name": "Maks"
            },
            "tags": [
            ],
            "date_published": "2026-02-18T11:35:32+01:00",
            "date_modified": "2026-02-18T12:14:43+01:00"
        },
        {
            "id": "https://skamasle.com/install-freebsd-en-alder-lake-placa-asus-prime.html",
            "url": "https://skamasle.com/install-freebsd-en-alder-lake-placa-asus-prime.html",
            "title": "Install Freebsd en Alder Lake placa asus prime 6660, radeon 6660 y  RTL8125 sin morir en el intento",
            "summary": "Y como es costumbre en este blog, vamos a escribir esto sobre la marcha. De momento estamos muriendo y no hemos empezado, freebsd va perfecto en mis servidores y maquinas virtuales y cuando todo esta testeado, pero el equipo es del 2022 y parece que&hellip;",
            "content_html": "<p>Y como es costumbre en este blog, vamos a escribir esto sobre la marcha.</p>\n<h2>Como instalar freebsd y no morir en el intento..</h2>\n<p>De momento estamos muriendo y no hemos empezado, freebsd va perfecto en mis servidores y maquinas virtuales y cuando todo esta testeado, pero el equipo es del 2022 y parece que ya tenemos problemas con la red.</p>\n<p>En el instalador ya nos dio problemas, no detecta la red, tarjeta detectada <strong>RTL8125 2.5GvE Controller</strong></p>\n<p>Ahí morimos, así que toca meter el driver a mano a ver si hay suerte, podemos, hacer varias cosas</p>\n<p>Instalar el sistema sin red y luego meter el driver, es casi lo mismo, pero el instalador prefiero que descargue los drivers de todo lo demás y lo deje fino, aunque sin escritorio, que para el caso da lo mismo.</p>\n<p>He buscado los drivers por internet y no hay manera de encontrar el bendito enlace del .pkg, mi falta de experiencia con los paquetes de <strong>freebsd </strong>es lo que tiene</p>\n<p>Así que he descargado el paquete desde un <strong>freebsd </strong>que tengo en producción:</p>\n<pre class=\"language-bash\"><code>pkg fetch realtek-re-kmod</code></pre>\n<p>Copiamos el archivo descargado a /root luego lo descargamos y metemos en el pendrive junto con la ISO</p>\n<pre class=\"language-bash\"><code>cp /var/cache/pkg/realtek-re-kmod-1101.00.1305000.pkg /root</code></pre>\n<p>Y ahora vuelta a empezar con el instalador a ver que sale de todo esto </p>\n<h2>¿para que freebsd en mi equipo?</h2>\n<p>Esto tenia que haberlo dicho al inicio, pero como todo aquí, va sobre la marcha...</p>\n<p>Quiero probar los <strong>e-cores y p-cores  en freebsd</strong> y comparar como se comporta, lo mismo que hicimos la otra vez en linux -&gt; <span style=\"color: #3598db;\"><a href=\"https://skamasle.com/e-cores-y-p-cores-de-forma-grafica-ander-lake-i5-12600k.html\" style=\"color: #3598db;\">https://skamasle.com/e-cores-y-p-cores-de-forma-grafica-ander-lake-i5-12600k.html</a></span></p>\n<p>Por eso he descargado la versión 15 de freebsd, quiero generar las trazas desde el kernel y ver si el scheduler de freebsd lo hace bien, poca información hay en internet sobre esto, así que a ver que sale, pero primero tenemos que instalar freebsd en un equipo no muy antiguo y la ultima versión de freebsd nos esta dando ya problemillas menores que hay que ir solventando.</p>\n<p>Seguimos....</p>\n<p>---------- Media hora después.</p>\n<p>Un desastre, he intentado cargar el modulo desde el pendrive en el que tengo la ISO  y no hay manera desde el instalador, así que instale el sistema base y arranque<strong> freebsd 15</strong>.......... no he podido montar el pendrive, no hay forma de que freebsd detecte el sistema de archivos que metió ventoy, no carga los drivers de msdosfs tampoco.. en fin al fallar el driver de la tarjeta de red no se instala nada...</p>\n<p>Volvemos a debian para escribir esta frustración y preparar un pendrive con Fat32 y cargar el driver desde ahí, esperemos tener mejor suerte con esa estrategia.</p>\n<p>1 hora después, nada de nada, imposible con el pendrive, viene tan base el sistema que no me lo detecta por algún motivo  y el modulo no existe tampoco, no hay evidencias de nada tampoco, al final no se puede copiar y pegar bien la info sin entorno gráfico...</p>\n<p>En todo caso da igual, he montado el zroot en debian y he copiado el fichero y lo había bajado para la versión 13 desde el propio freebsd, así que no me sirvió de nada y llevo media hora buscando donde descargar el PKG para la 15 y no he encontrado nada.......</p>\n<p>Investigando he descargado el packagesite.pkg</p>\n<pre class=\"language-bash\"><code>wget http://pkg.freebsd.org/FreeBSD:15:amd64/latest/packagesite.pkg</code></pre>\n<p>Lo he descomprimido con tar y dentro del packagesite.yaml esta la info de donde están los archivos</p>\n<pre class=\"language-bash\"><code>{\"name\":\"realtek-re-kmod198\",\"origin\":\"net/realtek-re-kmod198\",\"version\":\"198.00.1500068\",\"comment\":\"Kernel driver for Realtek PCIe Ethernet Controllers\",\"maintainer\":\"george@m5p.com\",\"www\":\"https://github.com/alexdupre/rtl_bsd_drv\",\"abi\":\"FreeBSD:15:amd64\",\"arch\":\"freebsd:15:x86:64\",\"prefix\":\"/usr/local\",\"sum\":\"1f2c81bf5b133fa62ceebe7c731ff1607320254f12032f8ff912d012bead5c24\",\"flatsize\":1068248,\"path\":\"All/Hashed/realtek-re-kmod198-198.00.1500068~1f2c81bf5b.pkg\",\"repopath\":\"All/Hashed/realtek-re-kmod198-198.00.1500068~1f2c81bf5b.pkg\",\"licenselogic\":\"single\",\"licenses\":[\"BSD4CLAUSE\"],\"pkgsize\":104691,\"desc\":\"Realtek PCIe FE / GBE / 2.5G / Gaming Ethernet Family Controller\\nkernel driver.\\n\\nThis is the official driver from Realtek with a few patches to\\nimprove stability and performance. It can be loaded instead of\\nthe FreeBSD driver built into the GENERIC kernel if you experience\\nissues with it (eg. watchdog timeouts), or your card is not supported.\\n\\nSupported devices:\\n\\n* 2.5G Gigabit Ethernet\\n  - RTL8125 / RTL8125B(S)(G)\\n\\n* 10/100/1000M Gigabit Ethernet\\n  - RTL8111B / RTL8111C / RTL8111D / RTL8111E / RTL8111F / RTL8111G(S)\\n    RTL8111H(S) / RTL8118(A)(S) / RTL8119i / RTL8111L / RTL8111K\\n  - RTL8168B / RTL8168E / RTL8168H\\n  - RTL8111DP / RTL8111EP / RTL8111FP\\n  - RTL8411 / RTL8411B\\n\\n* 10/100M Fast Ethernet\\n  - RTL8101E / RTL8102E / RTL8103E / RTL8105E / RTL8106E / RTL8107E\\n  - RTL8401 / RTL8402\\n\\nSee also: https://www.realtek.com/en/component/zoo/category/network-interface-controllers-10-100-1000m-gigabit-ethernet-pci-express-software\",\"categories\":[\"kld\",\"net\"],\"annotations\":{\"FreeBSD_version\":\"1500068\",\"build_timestamp\":\"2026-02-13T09:34:35+0000\",\"built_by\":\"poudriere-git-3.4.4-15-g61aba751\",\"port_checkout_unclean\":\"no\",\"port_git_hash\":\"b64b73fd938d5b2788547d16ed6a76493acc9142\",\"ports_top_checkout_unclean\":\"no\",\"ports_top_git_hash\":\"98350da90e9369a1b0c6ed070ba8ae746cabe387\"},\"messages\":[{\"message\":\"Add the following lines to your /boot/loader.conf\\nto override the built-in FreeBSD re(4) driver.\\n\\nif_re_load=\\\"YES\\\"\\nif_re_name=\\\"/boot/modules/if_re.ko\\\"\\n\\nBy default, the size of allocated mbufs is enough\\nto receive the largest Ethernet frame supported\\nby the card.  If your memory is highly fragmented,\\ntrying to allocate contiguous pages (more than\\n4096 bytes) may result in driver hangs.\\nFor this reason the value is tunable at boot time,\\ne.g. if you don't need Jumbo frames you can lower\\nthe memory requirements and avoid this issue with:\\n\\nhw.re.max_rx_mbuf_sz=\\\"2048\\\"\",\"type\":\"install\"}]}\n{\"name\":\"realtek-re-kmod\",\"origin\":\"net/realtek-re-kmod\",\"version\":\"1101.00.1500068\",\"comment\":\"Kernel driver for Realtek PCIe Ethernet Controllers\",\"maintainer\":\"ale@FreeBSD.org\",\"www\":\"https://github.com/alexdupre/rtl_bsd_drv\",\"abi\":\"FreeBSD:15:amd64\",\"arch\":\"freebsd:15:x86:64\",\"prefix\":\"/usr/local\",\"sum\":\"ee9ead4a1dceb8969a27887d89e0336c0ca1f33a452ccf19f93f88d238962bd4\",\"flatsize\":1417361,\"path\":\"All/Hashed/realtek-re-kmod-1101.00.1500068~ee9ead4a1d.pkg\",\"repopath\":\"All/Hashed/realtek-re-kmod-1101.00.1500068~ee9ead4a1d.pkg\",\"licenselogic\":\"single\",\"licenses\":[\"BSD4CLAUSE\"],\"pkgsize\":160623,\"desc\":\"Realtek PCIe FE / GBE / 2.5G / 5G Ethernet Family Controller\\nkernel driver.\\n\\nThis is the official driver from Realtek with a few patches to\\nimprove stability and performance. It can be loaded instead of\\nthe FreeBSD driver built into the GENERIC kernel if you experience\\nissues with it (eg. watchdog timeouts), or your card is not supported.\\n\\nSupported devices:\\n\\n* 5G Gigabit Ethernet\\n  - RTL8126\\n\\n* 2.5G Gigabit Ethernet\\n  - RTL8125 / RTL8125B(G)\\n\\n* 10/100/1000M Gigabit Ethernet\\n  - RTL8111B / RTL8111C / RTL8111D / RTL8111E / RTL8111F / RTL8111G\\n    RTL8111H / RTL8118(A) / RTL8119i / RTL8111L / RTL8111K\\n  - RTL8168B / RTL8168E / RTL8168H\\n  - RTL8111DP / RTL8111EP(P) / RTL8111FP\\n  - RTL8411 / RTL8411B\\n\\n* 10/100M Fast Ethernet\\n  - RTL8101E / RTL8102E / RTL8103E / RTL8105E / RTL8106E / RTL8107E\\n  - RTL8401 / RTL8402\\n\\nSee also: https://www.realtek.com/en/component/zoo/category/network-interface-controllers-10-100-1000m-gigabit-ethernet-pci-express-software\",\"categories\":[\"kld\",\"net\"],\"annotations\":{\"FreeBSD_version\":\"1500068\",\"build_timestamp\":\"2026-02-13T04:25:42+0000\",\"built_by\":\"poudriere-git-3.4.4-15-g61aba751\",\"port_checkout_unclean\":\"no\",\"port_git_hash\":\"78fcec37bd2016f6ade0e323acf43fa576126e43\",\"ports_top_checkout_unclean\":\"no\",\"ports_top_git_hash\":\"98350da90e9369a1b0c6ed070ba8ae746cabe387\"},\"messages\":[{\"message\":\"Add the following lines to your /boot/loader.conf\\nto override the built-in FreeBSD re(4) driver.\\n\\nif_re_load=\\\"YES\\\"\\nif_re_name=\\\"/boot/modules/if_re.ko\\\"\\n\\nBy default, the size of allocated mbufs is enough\\nto receive the largest Ethernet frame supported\\nby the card.  If your memory is highly fragmented,\\ntrying to allocate contiguous pages (more than\\n4096 bytes) may result in driver hangs.\\nFor this reason the value is tunable at boot time,\\ne.g. if you don't need Jumbo frames you can lower\\nthe memory requirements and avoid this issue with:\\n\\nhw.re.max_rx_mbuf_sz=\\\"2048\\\"\\n\\nTo enable Wake on LAN (WoL) support you might need\\nto set the following tunables:\\n\\nhw.re.s5wol=\\\"1\\\"\\nhw.re.s0_magic_packet=\\\"1\\\"\\n\\nIf you experience network hangs with IPv6 enabled,\\nyou might need to disable the checksum offloading\\nby adding the following parameters to the related\\nifconfig line in your /etc/rc.conf file:\\n\\n-rxcsum -txcsum -rxcsum6 -txcsum6\",\"type\":\"install\"}]}\n</code></pre>\n<p>No repare en la carpeta Hashed...</p>\n<p>El driver para la RTL8125 esta aquí: </p>\n<p><code>http://pkg.freebsd.org/FreeBSD:15:amd64/latest/All/Hashed/realtek-re-kmod-1101.00.1500068~ee9ead4a1d.pkg</code></p>\n<p>Vamos a meter el driver directamente al disco  de freebsd desde debian, instalando las herramientas de zfs para gestionar el sistema, el paquete que necesitamos instalar es <code>zfsutils-linux</code></p>\n<pre class=\"language-bash\"><code>zpool import -N -f zroot\nzpool export zroot\nzpool import -f -R /mnt zroot</code></pre>\n<blockquote>\n<p><code>IMPORTANTE: si usas zfs mount zroot/ROOT/default </code></p>\n<p><code>Vas a tener un problema y es que se va a montar sobre /</code> </p>\n</blockquote>\n<p> </p>\n<p><strong>Al fin el driver... costo más encontrarlo que instalarlo..</strong></p>\n<p> </p>\n<div>Con el driver correcto todo fluye y hay que decir la verdad, freebsd enamora, aún con estos problemas, aún sabiendo que se instala sin entorno gráfico, simple y sencillamente es control total, ni un solo driver innecesario, ni un solo paquete que no necesites, todo lo que tienes en el PC es lo que has instalado y nadie ha decidido instalarlo por ti.</div>\n<div> </div>\n<div>Resumiendo</div>\n<div> </div>\n<div>\n<pre class=\"language-bash\"><code>pkg add  realtek-re-kmod-1101.00.1500068~ee9ead4a1d.pkg</code></pre>\n</div>\n<div> </div>\n<div>Una vez instalado editamos: <code>vi /boot/loader.conf</code></div>\n<div> </div>\n<div>Añadimos lo básico:</div>\n<div> </div>\n<pre>if_re_load=\"YES\" <br><br>if_re_name=\"/boot/modules/if_<wbr>re.ko\"</pre>\n<div> </div>\n<div>Cargamos el driver</div>\n<div> </div>\n<pre>kldload /boot/modules/if_re.ko</pre>\n<div> </div>\n<div>Vemos si tenemos la tarjeta de red:<code> ifconfig</code></div>\n<div> </div>\n<div>Si no esta levantamos la tarjeta:</div>\n<div> </div>\n<div><code>ifconfig re0 up </code></div>\n<div> </div>\n<div>Y con la tarjeta funcionando pedimos una IP a nuestro router:</div>\n<div> </div>\n<div><code>dhclient re0</code></div>\n<div> </div>\n<div>\n<pre class=\"language-bash\"><code># ifconfig\nlo0: flags=1008049&lt;UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP&gt; metric 0 mtu 16384\noptions=680003&lt;RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6&gt;\ninet 127.0.0.1 netmask 0xff000000\ninet6 ::1 prefixlen 128\ninet6 fe80::1%lo0 prefixlen 64 scopeid 0x1\ngroups: lo\nnd6 options=21&lt;PERFORMNUD,AUTO_LINKLOCAL&gt;\nre0: flags=1008843&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP&gt; metric 0 mtu 1500\noptions=60251b&lt;RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,TSO4,LRO,WOL_MAGIC,RXCSUM_IPV6,TXCSUM_IPV6&gt;\nether b2:fc:e6:15:89:53\ninet 192.168.1.21 netmask 0xffffff00 broadcast 192.168.1.255\nmedia: Ethernet autoselect (1000baseT &lt;full-duplex,rxpause,txpause&gt;)\nstatus: active\nnd6 options=29&lt;PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL&gt;</code></pre>\n</div>\n<div> </div>\n<div>Ahora ya tenemos red y el mundo es nuestro.</div>\n<div> </div>\n<pre>pkg install xorg mate mate-desktop slim drm-61-kmod gpu-firmware-kmod</pre>\n<div> </div>\n<div>Con eso lo tenemos casi</div>\n<div> </div>\n<div>Editamos <code>/etc/rc.conf</code></div>\n<div> </div>\n<div>Añadimos:</div>\n<div>\n<pre class=\"language-bash\"><code>sysrc dbus_enable=\"YES\" \n# Activar el gestor de login  slim\nsysrc slim_enable=\"YES\" \n# Cargar el driver de AMD\nsysrc kld_list+=\"amdgpu\"</code></pre>\n</div>\n<div> </div>\n<div>Si todo ha ido bien podemos cargar el modulo de la gráfica</div>\n<div> </div>\n<div><code>kldload amdgpu</code></div>\n<div> </div>\n<div>Esto hará que la pantalla parpadee o se ponga en negro o se resetee y las enormes letras blancas pasarán a ser letras mas pequeñas, vamos que de unos 800x600 pasaremos a la resolución del monitor, la más alta que soporte la gráfica / monitor:</div>\n<div> </div>\n<div>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/21/freebsd.png\" alt=\"\" width=\"1706\" height=\"1152\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/21/responsive/freebsd-xs.png 640w ,https://skamasle.com/media/posts/21/responsive/freebsd-sm.png 768w ,https://skamasle.com/media/posts/21/responsive/freebsd-md.png 1024w ,https://skamasle.com/media/posts/21/responsive/freebsd-lg.png 1366w ,https://skamasle.com/media/posts/21/responsive/freebsd-xl.png 1600w ,https://skamasle.com/media/posts/21/responsive/freebsd-2xl.png 1920w\"></figure>\n</div>\n<div> </div>\n<div>Y aquí estamos, tenemos la base instalada, el sistema funciona, el navegador está instalado, la primera parte fue bien, hemos sufrido por el driver de la tarjeta de red. Sin duda el peor driver que nos puede fallar, si no tenemos internet se nos complicará descargar todo lo que nos hace falta y se alargará más todo, si nos falla el sonido o cualquier otra cosa podemos solucionarlo descargando drivers y demás, pero sin internet es imposible avanzar.</div>\n<div> </div>\n<div>Seriamente me estoy planteando dejar debian y pasarme a freebsd como entorno principal, pero es tanto tiempo usando debian.. tendría que valorar que aplicaciones necesito si o si y que problemas me darán en freebsd, aunque tampoco es complicado dejar debian a este nivel de limpieza.</div>\n<div> </div>\n<div>El problema que veo es que freebsd, con una instalación tan minimalista, sigue tardando en iniciar y apagar más que el debian más cargado.</div>\n<div> </div>\n<h2>Freebsd vs linux e-cores y  p-cores </h2>\n<p> </p>\n<div>En fin, me voy a poner con el objetivo de tener freebsd en el equipo y es probar los e-cores y p-cores a ver como se le da a freebsd gestionar esa parte, esto da para otro post que tengo que escribir tras hacer pruebas, pero de momento lo que he probado no me qeuda del todo claro, parece que en freebsd funciona todo al revez, los p-cores se encargan de todo y los e-cores aveces hacen algo, no es como en linux -&gt; <a href=\"https://skamasle.com/e-cores-y-p-cores-de-forma-grafica-ander-lake-i5-12600k.html\">https://skamasle.com/e-cores-y-p-cores-de-forma-grafica-ander-lake-i5-12600k.html</a> la última foto donde sale xorg, vemos que xorg permanece casi siempre en e-cores, pues en freebsd de momento lo que he visto es que permanece más en p-cores:</div>\n<div> </div>\n<div>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/21/grafica_freebsd_heavy4.png\" alt=\"\" width=\"1300\" height=\"763\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/21/responsive/grafica_freebsd_heavy4-xs.png 640w ,https://skamasle.com/media/posts/21/responsive/grafica_freebsd_heavy4-sm.png 768w ,https://skamasle.com/media/posts/21/responsive/grafica_freebsd_heavy4-md.png 1024w ,https://skamasle.com/media/posts/21/responsive/grafica_freebsd_heavy4-lg.png 1366w ,https://skamasle.com/media/posts/21/responsive/grafica_freebsd_heavy4-xl.png 1600w ,https://skamasle.com/media/posts/21/responsive/grafica_freebsd_heavy4-2xl.png 1920w\"></figure>\n</div>\n<div> </div>\n<div>Veamos solo xorg y chrome, mater terminal y el mate monitor:</div>\n<div> </div>\n<div>\n<figure class=\"post__image\"><img loading=\"lazy\"  src=\"https://skamasle.com/media/posts/21/grafica_freebsd_e-cores-pcores.png\" alt=\"\" width=\"1200\" height=\"704\" sizes=\"(max-width: 1920px) 100vw, 1920px\" srcset=\"https://skamasle.com/media/posts/21/responsive/grafica_freebsd_e-cores-pcores-xs.png 640w ,https://skamasle.com/media/posts/21/responsive/grafica_freebsd_e-cores-pcores-sm.png 768w ,https://skamasle.com/media/posts/21/responsive/grafica_freebsd_e-cores-pcores-md.png 1024w ,https://skamasle.com/media/posts/21/responsive/grafica_freebsd_e-cores-pcores-lg.png 1366w ,https://skamasle.com/media/posts/21/responsive/grafica_freebsd_e-cores-pcores-xl.png 1600w ,https://skamasle.com/media/posts/21/responsive/grafica_freebsd_e-cores-pcores-2xl.png 1920w\"></figure>\n</div>\n<div> </div>\n<div>Se ve claro, xorg esta en todo lado pero bastante menos en los e-cores, en linux estaba en los e-cores y bastante menos en los p-pcores.</div>\n<div> </div>\n<div>Extenderé este tema en otro POST, pero me parece que freebsd diferencia bastante bien los e-cores y p-cores, pero el uso que les da parece bastante distinto</div>",
            "author": {
                "name": "Maks"
            },
            "tags": [
            ],
            "date_published": "2026-02-14T11:30:19+01:00",
            "date_modified": "2026-02-14T21:57:27+01:00"
        },
        {
            "id": "https://skamasle.com/repositorios-source-formato-nuevo-deb822-todo-cambia-toca-modernizar-el-repositorio.html",
            "url": "https://skamasle.com/repositorios-source-formato-nuevo-deb822-todo-cambia-toca-modernizar-el-repositorio.html",
            "title": "Repositorios .source formato nuevo DEB822 todo cambia, toca modernizar el repositorio",
            "summary": "Llevo en Debian desde Debian 4 y ya hace tiempo que veo mensajes por parte de apt-get de que hay cosas que tengo que cambiar. Sí, sigo usando apt-get aunque cada vez hago más cosas con apt; al final hay que ceder, las cosas van&hellip;",
            "content_html": "<p>Llevo en Debian desde Debian 4 y ya hace tiempo que veo mensajes por parte de <code data-path-to-node=\"3\" data-index-in-node=\"78\">apt-get</code> de que hay cosas que tengo que cambiar. Sí, sigo usando <code data-path-to-node=\"3\" data-index-in-node=\"142\">apt-get</code> aunque cada vez hago más cosas con <code data-path-to-node=\"3\" data-index-in-node=\"185\">apt</code>; al final hay que ceder, las cosas van cambiando.</p>\n<p>Me salía constantemente en <code data-path-to-node=\"3\" data-index-in-node=\"266\">apt</code>:</p>\n<pre class=\"language-bash\"><code>Información: Algunas fuentes se pueden modernizar. Ejecute «apt modernize-sources» para hacerlo.\n</code></pre>\n<p> </p>\n<p>Se podría explicar todo, pero ya está explicado en la documentación oficial: <a _ngcontent-ng-c4263628808=\"\" target=\"_blank\" rel=\"noopener\" externallink=\"\" _nghost-ng-c2086529133=\"\" jslog=\"197247;track:generic_click,impression,attention;BardVeMetadataKey:[[&quot;r_88d3175105deaf17&quot;,&quot;c_58cb53b1ec0a7020&quot;,null,&quot;rc_2c278e4e7551b7f0&quot;,null,null,&quot;es&quot;,null,1,null,null,1,0]]\" href=\"https://wiki.debian.org/SourcesList\" class=\"ng-star-inserted\" data-hveid=\"0\" decode-data-ved=\"1\" data-ved=\"0CAAQ_4QMahcKEwiG2IXSytiSAxUAAAAAHQAAAAAQeQ\">https://wiki.debian.org/SourcesList</a></p>\n<p>Ahí se explica todo: el antiguo <code data-path-to-node=\"5\" data-index-in-node=\"145\">sources.list</code> y los archivos <code data-path-to-node=\"5\" data-index-in-node=\"173\">*.list</code>, que eran los de toda la vida:</p>\n<pre class=\"language-bash\"><code>deb http://deb.debian.org/debian bookworm main non-free-firmware</code></pre>\n<p>Ahora se verán así:</p>\n<pre class=\"language-bash\"><code>Types: deb deb-src\nURIs: http://deb.debian.org/debian\nSuites: trixie trixie-updates\nComponents: main non-free-firmware\nSigned-By: /usr/share/keyrings/debian-archive-keyring.gpg</code></pre>\n<p>Realmente es lo mismo, pero más manejable. Cada vez metemos más cosas en los repositorios y a veces se ven enormes, por ejemplo cuando añadimos el <code data-path-to-node=\"9\" data-index-in-node=\"147\">signed-by</code>:</p>\n<pre class=\"language-bash\"><code>deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main\n</code></pre>\n<p>Lo bueno es que el sistema lo hace todo al ejecutar: <code>apt modernize-sources</code></p>\n<h2>Otros problemas...</h2>\n<p>En mi caso, habilité hace no mucho <code data-path-to-node=\"13\" data-index-in-node=\"35\">i386</code>, ya que era requisito para probar Steam y ya lo dejé; muchos repos saltan con el mensaje informativo:</p>\n<pre>Información: Omitiendo el uso del fichero configurado «main/binary-i386/Packages» ya que el repositorio «https://dl.google.com/linux/chrome/deb stable InRelease» no admite la arquitectura «i386»</pre>\n<p>NOTA: sí, dejé de usar Chromium y me pasé a Chrome luego de años, aunque inicialmente usaba Firefox y también lo dejé atrás... chrome oficial esta bastante bien cuando tienes google integrado, nunca quise tenerlo pero por necesidad y facilidades.</p>\n<p>Curiosamente, en la documentación que hemos visto antes, no pone cómo establecer una arquitectura al repositorio.</p>\n<p>Y para qué mentir, se lo he preguntado a la IA y rápido me ha dado la solución.</p>\n<p>Simplemente es añadir:</p>\n<pre class=\"language-bash\"><code>Architectures: amd64</code></pre>\n<p>Y es por eso que escribir un blog en esta época con este tipo de cosas no tiene sentido; ¿para qué buscar en Google y entrar en un blog si la IA te lo da mascado?</p>\n<p>Pero yo he comenzado a escribir el blog nuevamente en 2026, no para tener visitas —ya ves que ni comentarios tengo habilitados, ni publicidad ni nada—, he hecho todo distinto a lo que tenía en 2009.</p>\n<p><br>Este blog es para ir aprendiendo cosas; cuando escribo todo en vez de copiar y pegar, escrito por mí, recuerdo mejor las cosas y voy aprendiendo.</p>\n<p> </p>",
            "author": {
                "name": "Maks"
            },
            "tags": [
            ],
            "date_published": "2026-02-14T10:02:50+01:00",
            "date_modified": "2026-02-14T10:02:50+01:00"
        },
        {
            "id": "https://skamasle.com/redimensionar-discos-con-lvm-luks-cuando-parted-te-complica-la-vida.html",
            "url": "https://skamasle.com/redimensionar-discos-con-lvm-luks-cuando-parted-te-complica-la-vida.html",
            "title": "Redimensionar discos con LVM + LUKS: Cuando parted te complica la vida",
            "summary": "En una máquina virtual (VM) he asignado espacio extra, como de costumbre. A la hora de redimensionar, el proceso debería haber sido sencillo: Lo de siempre: Informar de los cambios: partprobe /dev/sda Redimensionar la partición cifrada: cryptsetup resize sda5_crypt Redimensionar el Volumen Físico: pvresize /dev/mapper/sda5_crypt&hellip;",
            "content_html": "<p data-path-to-node=\"3\">En una máquina virtual (VM) he asignado espacio extra, como de costumbre. A la hora de redimensionar, el proceso debería haber sido sencillo:</p>\n<p data-path-to-node=\"4\"><strong data-path-to-node=\"4\" data-index-in-node=\"0\">Lo de siempre:</strong></p>\n<ol start=\"1\" data-path-to-node=\"5\">\n<li>\n<p data-path-to-node=\"5,0,0\">Informar de los cambios: <code data-path-to-node=\"5,0,0\" data-index-in-node=\"25\">partprobe /dev/sda</code></p>\n</li>\n<li>\n<p data-path-to-node=\"5,1,0\">Redimensionar la partición cifrada: <code data-path-to-node=\"5,1,0\" data-index-in-node=\"36\">cryptsetup resize sda5_crypt</code></p>\n</li>\n<li>\n<p data-path-to-node=\"5,2,0\">Redimensionar el Volumen Físico: <code data-path-to-node=\"5,2,0\" data-index-in-node=\"33\">pvresize /dev/mapper/sda5_crypt</code></p>\n</li>\n<li>\n<p data-path-to-node=\"5,3,0\">Expandir el volumen lógico y el sistema de archivos: <code data-path-to-node=\"5,3,0\" data-index-in-node=\"53\">lvextend -l +100%FREE /dev/debian-vg/root -r</code></p>\n</li>\n</ol>\n<p><strong> ¿Que pasó ?</strong></p>\n<p>No me acordaba que estaba cifrado y lo primero que hice fue meterme a parted:</p>\n<pre class=\"language-bash\"><code>parted /dev/sda \nunit s\nresizepart 5 -1s</code></pre>\n<p data-path-to-node=\"9\">Luego vi que tenía <strong data-path-to-node=\"9\" data-index-in-node=\"19\">LVM</strong>. Es normal; llevo levantado desde las 4 AM y ya son las 21:00. Menos mal que es un entorno de pruebas que se me quedó sin espacio, pero tampoco pasó nada grave.</p>\n<p data-path-to-node=\"10\">Se desalinearon las particiones y luego <code data-path-to-node=\"10\" data-index-in-node=\"40\">cryptsetup resize</code>, junto con todo lo demás, no detectaba los cambios en el disco porque estaban trabajando directamente sobre la partición 5:</p>\n<pre class=\"language-bash\"><code>Disposit.  Inicio Comienzo    Final Sectores Tamaño Id Tipo\n/dev/sda1  *          2048  1980415  1978368   966M 83 Linux\n/dev/sda2          1982462 41940991 39958530  19,1G  f W95 Ext'd (LBA)\n/dev/sda5          1982464 41940991 39958528  19,1G 83 Linux\n</code></pre>\n<p data-path-to-node=\"12\">Básicamente, al redimensionar con <code data-path-to-node=\"12\" data-index-in-node=\"34\">parted</code>, tanto la partición extendida como la lógica se quedaron bloqueadas en el sector <strong data-path-to-node=\"12\" data-index-in-node=\"122\">41940991</strong>.</p>\n<h3 data-path-to-node=\"13\">Solución: Eliminar y recrear</h3>\n<p data-path-to-node=\"14\">Aquí hubo un error interesante. Pego el <code data-path-to-node=\"14\" data-index-in-node=\"40\">history</code> completo del proceso con <code data-path-to-node=\"14\" data-index-in-node=\"73\">fdisk</code>:</p>\n<pre class=\"language-bash\"><code>fdisk /dev/sda\n\nBienvenido a fdisk (util-linux 2.41).\nLos cambios solo permanecerán en la memoria, hasta que decida escribirlos.\nTenga cuidado antes de utilizar la orden de escritura.\n\nEste disco está actualmente en uso - no se aconseja volver a crear particiones.\nSe recomienda desmontar todos los sistemas de ficheros y deshacer todas las\nparticiones de intercambio de este disco.\n\n\nOrden (m para obtener ayuda): p\n\nDisco /dev/sda: 97,66 GiB, 104857600000 bytes, 204800000 sectores\nModelo de disco: VBOX HARDDISK   \nUnidades: sectores de 1 * 512 = 512 bytes\nTamaño de sector (lógico/físico): 512 bytes / 512 bytes\nTamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes\nTipo de etiqueta de disco: dos\nIdentificador del disco: 0x05f1eb04\n\nDisposit.  Inicio Comienzo    Final Sectores Tamaño Id Tipo\n/dev/sda1  *          2048  1980415  1978368   966M 83 Linux\n/dev/sda2          1982462 41940991 39958530  19,1G  f W95 Ext'd (LBA)\n/dev/sda5          1982464 41940991 39958528  19,1G 83 Linux\n\nOrden (m para obtener ayuda): d\nNúmero de partición (1,2,5, valor predeterminado 5): \n\nSe ha borrado la partición 5.\n\nOrden (m para obtener ayuda): d\nNúmero de partición (1,2, valor predeterminado 2): 2\n\nSe ha borrado la partición 2.\n\nOrden (m para obtener ayuda): n\nTipo de partición\n   p   primaria (1 primaria(s), 0 extendida(s), 3 libre(s))\n   e   extendida (contenedor para particiones lógicas)\nSeleccionar (valor predeterminado p): e\nNúmero de partición (2-4, valor predeterminado 2): 2\nPrimer sector (1980416-204799999, valor predeterminado 1980416): 1982462\nÚltimo sector, +/-sectores o +/-tamaño{K,M,G,T,P} (1982462-204799999, valor predeterminado 204799999): \n\nCrea una nueva partición 2 de tipo 'Extended' y de tamaño 96,7 GiB.\n\nOrden (m para obtener ayuda): n\nSe está utilizando todo el espacio para particiones primarias.\nSe añade la partición lógica 5\nPrimer sector (1984510-204799999, valor predeterminado 1984512): 1982464\nEl valor está fuera del rango.\n</code></pre>\n<p>En condiciones normales habría hecho lo correcto, pero yo tenía un valor de referencia que no guardé originalmente antes de ejecutar <code data-path-to-node=\"17\" data-index-in-node=\"133\">parted</code>. El inicio que yo tenía como referencia era <strong data-path-to-node=\"17\" data-index-in-node=\"184\">1982462</strong>, pero <code data-path-to-node=\"17\" data-index-in-node=\"198\">fdisk</code> me recomendaba <strong data-path-to-node=\"17\" data-index-in-node=\"219\">1980416</strong>. Al intentar forzar el valor alterado, generé una desalineación que impedía redimensionar.</p>\n<p>La solución ha sido usar la recomendación de <code data-path-to-node=\"18\" data-index-in-node=\"45\">fdisk</code> para el inicio de la partición extendida. Al no tener la referencia previa a la \"lía\" con <code data-path-to-node=\"18\" data-index-in-node=\"141\">parted</code>, le hacemos caso a la herramienta y regeneramos todo de nuevo:</p>\n<p><strong data-path-to-node=\"16,0\" data-index-in-node=\"0\">NOTA!</strong>: Cuando te pregunte si quieres borrar la firma <code data-path-to-node=\"16,0\" data-index-in-node=\"53\">crypto_LUKS</code>, dile que <strong data-path-to-node=\"16,0\" data-index-in-node=\"75\">NO.</strong>  Si le dices que si igual no podrás salir ya nunca más de ese infierno.</p>\n<pre class=\"language-bash\"><code>orden (m para obtener ayuda): d\nNúmero de partición (1,2, valor predeterminado 2): 2\nSe ha borrado la partición 2.\n\nOrden (m para obtener ayuda): n\nTipo de partición\n   p   primaria (1 primaria(s), 0 extendida(s), 3 libre(s))\n   e   extendida (contenedor para particiones lógicas)\nSeleccionar (valor predeterminado p): e\nNúmero de partición (2-4, valor predeterminado 2): 2\nPrimer sector (1980416-204799999, valor predeterminado 1980416): \nÚltimo sector, +/-sectores o +/-tamaño{K,M,G,T,P} (1980416-204799999, valor predeterminado 204799999): \n\nCrea una nueva partición 2 de tipo 'Extended' y de tamaño 96,7 GiB.\n\nOrden (m para obtener ayuda): n\nSe está utilizando todo el espacio para particiones primarias.\nSe añade la partición lógica 5\nPrimer sector (1982464-204799999, valor predeterminado 1982464): \nÚltimo sector, +/-sectores o +/-tamaño{K,M,G,T,P} (1982464-204799999, valor predeterminado 204799999): \n\nCrea una nueva partición 5 de tipo 'Linux' y de tamaño 96,7 GiB.\nPartición #5: contiene un crypto_LUKS en la firma.\n\n¿Desea eliminar la firma? [S]í/[N]o: N\n\nOrden (m para obtener ayuda): w\n</code></pre>\n<p>En la secuencia no borro la partición 5, ya que la había borrado antes en el history de arriba, que fue cuando cree la partición 2 con el inicio mal y luego la 5 no dejo crearla.</p>\n<p>Aquí borramos la partición -&gt;</p>\n<p>d para borrar </p>\n<p>2 para el número de partición</p>\n<p>n crear nueva partición</p>\n<p>e para extendida</p>\n<p>Ahora sí, con los comandos del inicio del post, redimensionamos la partición y extendemos el volumen. Todo funciona bien y el <code data-path-to-node=\"20\" data-index-in-node=\"126\">fdisk</code> final nos muestra las particiones corregidas:</p>\n<pre class=\"language-bash\"><code>Disposit.  Inicio Comienzo     Final  Sectores Tamaño Id Tipo\n/dev/sda1  *          2048   1980415   1978368   966M 83 Linux\n/dev/sda2          1980416 204799999 202819584  96,7G  5 Extendida\n/dev/sda5          1982464 204799999 202817536  96,7G 83 Linux\n</code></pre>\n<p data-path-to-node=\"22\">El cambio se ve claramente en <code data-path-to-node=\"22\" data-index-in-node=\"30\">/dev/sda2</code>: antes iniciaba en <strong data-path-to-node=\"22\" data-index-in-node=\"59\">1982462</strong> y ahora en <strong data-path-to-node=\"22\" data-index-in-node=\"78\">1980416</strong>. La lógica (<code data-path-to-node=\"22\" data-index-in-node=\"98\">/dev/sda5</code>) mantiene su sector de inicio original, pero el final de ambas se extiende hasta el límite del nuevo espacio asignado. Pasamos de <strong data-path-to-node=\"22\" data-index-in-node=\"238\">20 GB a 100 GB</strong>.</p>\n<p data-path-to-node=\"23\">Sí, acojona un poco borrar particiones en caliente, pero es un mal necesario cuando la hemos liado previamente. Borrar la tabla de particiones <strong data-path-to-node=\"23\" data-index-in-node=\"143\">no borra los datos</strong>; los bits seguirán ahí. Solo hay que asegurarse de que la partición que contiene el cifrado empiece exactamente en el mismo sector que antes.</p>\n<p>En fin, parted es muy amigable, toma decisiones por nosotros y aveces pasan estas cosas.</p>\n<p> </p>\n<p> </p>",
            "author": {
                "name": "Maks"
            },
            "tags": [
                   "Linux, Pariticiones"
            ],
            "date_published": "2026-02-11T21:40:02+01:00",
            "date_modified": "2026-02-14T10:18:34+01:00"
        },
        {
            "id": "https://skamasle.com/la-evolucion-del-cifrado-de-contrasenas-y-que-tan-dificil-es-averiguarlas.html",
            "url": "https://skamasle.com/la-evolucion-del-cifrado-de-contrasenas-y-que-tan-dificil-es-averiguarlas.html",
            "title": "La evolución del cifrado de contraseñas y que tan difícil es averiguarlas.",
            "summary": "Se habla mucho de que hay fugas de información en grandes empresas y que han robado contraseñas y que esas contraseña estaban cifradas, o sea han robado los hashes. Bien que es un hash: Imagina que quieres enviar una carta confidencial, pero no quieres que&hellip;",
            "content_html": "<p>Se habla mucho de que hay fugas de información en grandes empresas y que han robado contraseñas y que esas contraseña estaban cifradas, o sea han robado los hashes.</p>\n<p>Bien que es un hash:</p>\n<p data-path-to-node=\"4\">Imagina que quieres enviar una carta confidencial, pero no quieres que nadie sepa qué dice. Podrías cifrarla. Pero un <strong data-path-to-node=\"4\" data-index-in-node=\"118\">hash</strong> es algo distinto: es como una <strong data-path-to-node=\"4\" data-index-in-node=\"153\">huella digital</strong> única de esa carta.</p>\n<p data-path-to-node=\"5\">Si pasas cualquier texto (desde una letra \"A\" hasta la Biblia entera) por una función de hash, el resultado siempre será una cadena de caracteres de longitud fija. Por ejemplo, en MD5 siempre serán 32 caracteres.</p>\n<h4 data-path-to-node=\"6\">Las 3 reglas de oro de un Hash:</h4>\n<ol start=\"1\" data-path-to-node=\"7\">\n<li>\n<p data-path-to-node=\"7,0,0\"><strong data-path-to-node=\"7,0,0\" data-index-in-node=\"0\">Es unidireccional:</strong> Puedes convertir \"Contraseña123\" en un hash, pero no puedes meter el hash en una máquina y que te devuelva \"Contraseña123\". Solo puedes adivinarla probando billones de combinaciones (que es lo que estamos haciendo con Hashcat).</p>\n</li>\n<li>\n<p data-path-to-node=\"7,1,0\"><strong data-path-to-node=\"7,1,0\" data-index-in-node=\"0\">Es determinista:</strong> La palabra \"Hola\" siempre, siempre generará el mismo hash. Si cambia una sola coma o un espacio, el hash será totalmente distinto (efecto avalancha).</p>\n</li>\n<li>\n<p data-path-to-node=\"7,2,0\"><strong data-path-to-node=\"7,2,0\" data-index-in-node=\"0\">Es rápido de calcular (para el software):</strong> Y como estamos viendo, ¡extremadamente rápido para una tarjeta gráfica!</p>\n</li>\n</ol>\n<h2>El problema de la perdida de hashes</h2>\n<p> </p>\n<p>Con el tiempo la seguridad ha ido evolucionando, al inicio se usaba MD5, pero un hash MD5 es muy sencillo y los sistemas que lo sigan usando para guardar las contraseñas corren un peligro importante</p>\n<p>Vamos a ver un ejemplo, usando hashcat, podemos comprobar en mi caso, con un equipo modesto 16 Mil Millones de hashes por segundo.</p>\n<p>Ej:</p>\n<pre class=\"language-bash\"><code>Speed.#01........: 16893.2 MH/s (11.99ms) @ Accel:17 Loops:1024 Thr:512 Vec:8\n</code></pre>\n<p>Es importante tener las contraseñas cifradas, pero una web debe ir evolucionando, no solo es usar algún hash y ya, es ir cambiando con los años y muchos esta claro que no lo hacen por la perdida de información que se ha tenido y cuantos hashes se han sacado.</p>\n<p> </p>\n<table data-path-to-node=\"24\">\n<thead>\n<tr>\n<td><strong>Algoritmo</strong></td>\n<td><strong>Velocidad  de crackeo</strong></td>\n<td><strong>Tiempo para 9 caracteres</strong></td>\n<td> </td>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><span data-path-to-node=\"24,1,0,0\"><strong data-path-to-node=\"24,1,0,0\" data-index-in-node=\"0\">MD5</strong></span></td>\n<td><span data-path-to-node=\"24,1,1,0\"><strong data-path-to-node=\"24,1,1,0\" data-index-in-node=\"0\">16.8 GH/s</strong></span></td>\n<td><span data-path-to-node=\"24,1,2,0\"><strong data-path-to-node=\"24,1,2,0\" data-index-in-node=\"0\">~18 días</strong></span></td>\n<td><span data-path-to-node=\"24,1,3,0\">Un atacante lo rompe en vacaciones.</span></td>\n</tr>\n<tr>\n<td><span data-path-to-node=\"24,2,0,0\"><strong data-path-to-node=\"24,2,0,0\" data-index-in-node=\"0\">SHA-256</strong></span></td>\n<td><span data-path-to-node=\"24,2,1,0\"><strong data-path-to-node=\"24,2,1,0\" data-index-in-node=\"0\">~5.2 GH/s</strong></span></td>\n<td><span data-path-to-node=\"24,2,2,0\"><strong data-path-to-node=\"24,2,2,0\" data-index-in-node=\"0\">~60 días</strong></span></td>\n<td><span data-path-to-node=\"24,2,3,0\">Sigue siendo inseguro para contraseñas.</span></td>\n</tr>\n<tr>\n<td><span data-path-to-node=\"24,3,0,0\"><strong data-path-to-node=\"24,3,0,0\" data-index-in-node=\"0\">BCrypt</strong></span></td>\n<td><span data-path-to-node=\"24,3,1,0\"><strong data-path-to-node=\"24,3,1,0\" data-index-in-node=\"0\">~12 kH/s</strong></span></td>\n<td><span data-path-to-node=\"24,3,2,0\"><strong data-path-to-node=\"24,3,2,0\" data-index-in-node=\"0\">Milenios</strong></span></td>\n<td><span data-path-to-node=\"24,3,3,0\">Aquí es donde la GPU \"sufre\" de verdad.</span></td>\n</tr>\n<tr>\n<td><span data-path-to-node=\"24,4,0,0\"><strong data-path-to-node=\"24,4,0,0\" data-index-in-node=\"0\">Argon2id</strong></span></td>\n<td><span data-path-to-node=\"24,4,1,0\"><strong data-path-to-node=\"24,4,1,0\" data-index-in-node=\"0\">~200 H/s</strong></span></td>\n<td><span data-path-to-node=\"24,4,2,0\"><strong data-path-to-node=\"24,4,2,0\" data-index-in-node=\"0\">Imposible</strong></span></td>\n<td><span data-path-to-node=\"24,4,3,0\">El muro que toda empresa debería usar.</span></td>\n</tr>\n</tbody>\n</table>\n<p> </p>\n<p>Esto aplica para ataques de fuerza bruta</p>\n<h2>¿ Que es un ataque de fuerza bruta ?</h2>\n<p>Es cuando no se sabe nada de la contraseña, no se sabe cuantos caracteres tiene, no se sabe si tiene letras solo, números, mayúsculas o símbolos, así que toca hacer un ataque.</p>\n<p>Básicamente es empezar a combinar todo, ver si la contraseña es a o ab, abc, abdc, a1, a2, abdc1, abdc$ y así infinitamente con todas las combinaciones.</p>\n<p>Para 9 caracteres de longitud letras en mayúsculas y minúsculas, números y 4 símbolos hay que probar 27206534396294947 contraseñas.  o sea 27 mil billones de combinaciones y ahí es donde la tabla de arriba es importante, de 16 mil millones de hasesh por segundo a 200 hashes por segundo, es que no tiene sentido hacer un ataque de fuerza bruta ni a bcrypt, ni a sha512 con +5000 interacciones y si vez argonid2 ni aunque tengas un ordenador cuántico podrías conseguir la contraseña si el uso de RAM esta en mas de 256 MB asignados</p>\n<p>Y aquí es donde entra la evolución de los hashes que va de la mano con la evolución del hardware, cuando salio md5 no habían equipo que pudieran probar 16 mil millones de contraseñas por segundo así que con el paso del tiempo ha ido evolucionando de esta forma:</p>\n<h3 data-path-to-node=\"2\">1. La era de la velocidad: MD5 y SHA</h3>\n<p data-path-to-node=\"3\">Al principio, los hashes (como <strong data-path-to-node=\"3\" data-index-in-node=\"31\">MD5</strong>) se diseñaron para ser <strong data-path-to-node=\"3\" data-index-in-node=\"58\">lo más rápidos posible</strong>. Se usaban para comprobar que un archivo no se hubiera corrompido al descargarlo.</p>\n<ul data-path-to-node=\"4\">\n<li>\n<p data-path-to-node=\"4,0,0\"><strong data-path-to-node=\"4,0,0\" data-index-in-node=\"0\">El error:</strong> Las empresas empezaron a usarlos para guardar contraseñas.</p>\n</li>\n<li>\n<p data-path-to-node=\"4,1,0\"><strong data-path-to-node=\"4,1,0\" data-index-in-node=\"0\">El problema:</strong> Como eran tan rápidos, una GPU moderna podía probar miles de millones de combinaciones por segundo. Si te robaban la base de datos, tus contraseñas eran \"transparentes\".</p>\n</li>\n</ul>\n<h3 data-path-to-node=\"5\">2. La llegada del \"Salt\" </h3>\n<p data-path-to-node=\"6\">Antes del <i data-path-to-node=\"6\" data-index-in-node=\"10\">Salt</i>, si diez usuarios usaban la misma contraseña \"123456\", sus diez hashes en la base de datos eran <strong data-path-to-node=\"6\" data-index-in-node=\"111\">idénticos</strong>. Un hacker podía usar una <strong data-path-to-node=\"6\" data-index-in-node=\"147\">Rainbow Table</strong> (una tabla pre-calculada con millones de hashes) y crackear miles de cuentas en un segundo.</p>\n<ul data-path-to-node=\"7\">\n<li>\n<p data-path-to-node=\"7,0,0\"><strong data-path-to-node=\"7,0,0\" data-index-in-node=\"0\">La solución:</strong> El <strong data-path-to-node=\"7,0,0\" data-index-in-node=\"16\">Salt</strong>. Es un número aleatorio que se añade a la contraseña antes de hashearla.</p>\n</li>\n<li>\n<p data-path-to-node=\"7,1,0\"><strong data-path-to-node=\"7,1,0\" data-index-in-node=\"0\">El resultado:</strong> Ahora, aunque diez personas usen \"123456\", cada una tiene un hash totalmente distinto. El hacker ya no puede usar tablas pre-calculadas; tiene que atacar cada cuenta de una en una.</p>\n</li>\n</ul>\n<h3 data-path-to-node=\"8\">3. Las Iteraciones (Hacerlo lento a propósito)</h3>\n<p data-path-to-node=\"9\">Con el Salt, el hacker aún podía usar la fuerza bruta. Entonces los ingenieros pensaron: <i data-path-to-node=\"9\" data-index-in-node=\"89\">\"¿Y si obligamos a la computadora a repetir el hash 10.000 veces antes de darle el resultado?\"</i>.</p>\n<ul data-path-to-node=\"10\">\n<li>\n<p data-path-to-node=\"10,0,0\"><strong data-path-to-node=\"10,0,0\" data-index-in-node=\"0\">Concepto:</strong> Aparecen algoritmos como <strong data-path-to-node=\"10,0,0\" data-index-in-node=\"35\">PBKDF2</strong> o <strong data-path-to-node=\"10,0,0\" data-index-in-node=\"44\">SHA-512Crypt</strong>.</p>\n</li>\n<li>\n<p data-path-to-node=\"10,1,0\"><strong data-path-to-node=\"10,1,0\" data-index-in-node=\"0\">El impacto:</strong> Para un usuario que se loguea una vez, esperar 0.2 segundos no es nada. Pero para un hacker con una GPU que intenta probar billones de combinaciones, ese retraso de 0.1 segundos multiplicado por billones hace que el ataque tarde <strong data-path-to-node=\"10,1,0\" data-index-in-node=\"241\">siglos</strong>.</p>\n</li>\n</ul>\n<h3 data-path-to-node=\"11\">4. Memory-Hard: La criptografía contra la GPU</h3>\n<p data-path-to-node=\"12\">Las GPUs son rápidas porque tienen miles de núcleos pequeños que hacen cálculos matemáticos simples muy rápido, pero cada núcleo tiene muy poca memoria RAM propia.</p>\n<ul data-path-to-node=\"13\">\n<li>\n<p data-path-to-node=\"13,0,0\"><strong data-path-to-node=\"13,0,0\" data-index-in-node=\"0\">La innovación (Argon2, Scrypt):</strong> Los algoritmos <strong data-path-to-node=\"13,0,0\" data-index-in-node=\"47\">Memory-Hard</strong> obligan al procesador a llenar varios Megabytes de RAM con datos aleatorios y leerlos constantemente mientras calcula el hash.</p>\n</li>\n<li>\n<p data-path-to-node=\"13,1,0\"><strong data-path-to-node=\"13,1,0\" data-index-in-node=\"0\">El jaque mate:</strong> Como la GPU no tiene suficiente RAM dedicada para cada uno de sus miles de núcleos, no puede procesar estos hashes en paralelo. Su gran ventaja (la velocidad masiva) desaparece, y se vuelve casi tan lenta como una CPU normal.</p>\n</li>\n</ul>\n<p>Esa parte me ha ayudado la IA a explicarlo de forma resumida ya que me enrollo mucho, se el concepto pero no lo explicaría así.</p>\n<h1>No fiarnos de nadie y usar contraseñas distintas</h1>\n<p>En temas de seguridad no podemos fiarnos de que las empresa hayan actualizado sus algoritmos internos, nadie garantiza que un ecomerce que nació en el 2000 haya dejado de usar con el tiempo md5 o md5crypt  y haya pasado a bcrypt o argon para guardar sus hashes, así que tu contraseña puede ser muy larga pero si el hash es anticuado la seguridad no es la misma, 20 caracteres en 20 con md5 es peor que 12 caracteres en argon2id ante un ataque de diccionario.</p>\n<p>Por eso  debemos usar contraseñas distintas en todos los sitios en los que nos registramos, si un sitio es comprometido y por un casual usa algún hash antiguo para guardar la contraseña no podemos correr el riesgo de vernos comprometidos, para curarnos en salud usaremos contraseñas distintas en todos los sitios webs.</p>\n<p>Si usas keepass o luks2 estos ya soportan argon2id, sacrificamos unos segundos si asignamos +256 MB de RAM a la contraseña pero nos da una tranquilidad que no esta pagada.</p>\n<p>Ahora espero que quede claro <strong>por que hay que usar contraseñas distintas en todo lado.</strong></p>\n<p> </p>\n<p> </p>\n<p> </p>",
            "author": {
                "name": "Maks"
            },
            "tags": [
                   "Seguridad"
            ],
            "date_published": "2026-02-07T20:10:05+01:00",
            "date_modified": "2026-02-07T20:10:05+01:00"
        },
        {
            "id": "https://skamasle.com/por-que-mi-debian-tardaba-10-segundos-en-apagarse-y-como-lo-arregle.html",
            "url": "https://skamasle.com/por-que-mi-debian-tardaba-10-segundos-en-apagarse-y-como-lo-arregle.html",
            "title": "Por qué mi Debian tardaba 10 segundos en apagarse (y cómo lo arreglé)",
            "summary": "La pregunta del millón: ¿Por qué, si tengo un NVMe de 7000 MB/s que vuela, el sistema se queda \"pensando\" al salir? Después de investigar mis servicios con systemctl, me di cuenta de que mi Debian recién instalado estaba intentando ser \"demasiado amable\". Venía cargado&hellip;",
            "content_html": "<p>La pregunta del millón: ¿Por qué, si tengo un  NVMe de 7000 MB/s que vuela, el sistema se queda \"pensando\" al salir?</p>\n<h3 data-path-to-node=\"5\">El problema: El exceso de \"cortesía\" de Debian</h3>\n<p data-path-to-node=\"6\">Después de investigar mis servicios con <code data-path-to-node=\"6\" data-index-in-node=\"40\">systemctl</code>, me di cuenta de que mi Debian recién instalado estaba intentando ser \"demasiado amable\". Venía cargado con servicios de oficina y redes que yo no había pedido, en parte culpa mia, por usar el debian live para CD, ya que normalmente uso el minimal.</p>\n<p data-path-to-node=\"7\">El culpable del delay al apagar suele ser el <strong data-path-to-node=\"7\" data-index-in-node=\"45\">tiempo de espera (timeout)</strong>. El sistema le dice a un servicio: <i data-path-to-node=\"7\" data-index-in-node=\"107\">\"Oye, voy a apagarme, cierra tus cosas\"</i>. Si el servicio (como el de correo Exim4 o el de red Avahi) se queda esperando una respuesta de la red que ya no existe, el sistema se bloquea hasta que se rinde y lo mata a la fuerza. Esos segundos de espera son los que nos roban la fluidez, me pasa con CUPS y eso que no tengo impresoras, pero algunos días va fino y otros piensa unos 20 segundos antes de morir.</p>\n<h3 data-path-to-node=\"8\">Los servicios que yo no necesitaba (y tú probablemente tampoco)</h3>\n<p data-path-to-node=\"9\">Si como yo, usas tu equipo para desarrollo o uso personal, pero <strong data-path-to-node=\"9\" data-index-in-node=\"64\">no tienes una impresora en cada esquina ni montas un servidor de correo en tu propia torre</strong>, estos procesos son puro lastre:</p>\n<ol start=\"1\" data-path-to-node=\"10\">\n<li>\n<p data-path-to-node=\"10,0,0\"><strong data-path-to-node=\"10,0,0\" data-index-in-node=\"0\">Exim4</strong>: Mi PC no es un servidor de correos. Tener esto intentando gestionar colas de mensajes al apagar  le añadia un par de segundos al apagar y alguno al encender.</p>\n</li>\n<li>\n<p data-path-to-node=\"10,1,0\"><strong data-path-to-node=\"10,1,0\" data-index-in-node=\"0\">Avahi-Daemon</strong>: Muy útil si quieres que tu Mac detecte tu Debian por arte de magia, pero si no compartes nada en red local, solo genera ruido.</p>\n</li>\n<li>\n<p data-path-to-node=\"10,2,0\"><strong data-path-to-node=\"10,2,0\" data-index-in-node=\"0\">ModemManager</strong>: A menos que le pinches un pincho 3G de hace diez años, este servicio solo gasta ciclos de CPU buscando un hardware que no tienes.</p>\n</li>\n<li>\n<p data-path-to-node=\"10,3,0\"><strong data-path-to-node=\"10,3,0\" data-index-in-node=\"0\">CUPS (Impresión)</strong>: Si no imprimes, CUPS es un ninja que a veces se queda atrapado al cerrar los <i data-path-to-node=\"10,3,0\" data-index-in-node=\"95\">sockets</i> de red, retrasando el cierre del sistema.</p>\n</li>\n</ol>\n<h3 data-path-to-node=\"11\">Se pueden desinstalar, aunque no se si usare una impresora un día así que los deshabilitamos</h3>\n<div class=\"code-block ng-tns-c2347699584-62 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation\" data-hveid=\"0\" data-ved=\"0CAAQhtANahgKEwjltJvL_ceSAxUAAAAAHQAAAAAQggE\">\n<div class=\"code-block-decoration header-formatted gds-title-s ng-tns-c2347699584-62 ng-star-inserted\">\n<div class=\"buttons ng-tns-c2347699584-62 ng-star-inserted\"> </div>\n<div>Usamos disable y --now que es deshabilitar y detenet, si usamos solo disable lo deshabilita pero no lo detiene, pero en el siguiente arranque no iniciará.</div>\n</div>\n<div class=\"formatted-code-block-internal-container ng-tns-c2347699584-62\">\n<div class=\"animated-opacity ng-tns-c2347699584-62\">\n<pre class=\"ng-tns-c2347699584-62\"><code class=\"code-container formatted ng-tns-c2347699584-62\" role=\"text\" data-test-id=\"code-content\"><span class=\"hljs-comment\"># Adiós al delay del correo y redes locales</span>\nsudo systemctl <span class=\"hljs-built_in\">disable</span> --now exim4 exim4-base.timer avahi-daemon avahi-daemon.socket\n\n<span class=\"hljs-comment\"># Si no imprimes ni usas módems antiguos</span>\nsudo systemctl <span class=\"hljs-built_in\">disable</span> --now cups.service cups-browsed.service ModemManager\n\n<span class=\"hljs-comment\"># El truco final: acortar el tiempo de paciencia de Systemd</span>\n<span class=\"hljs-comment\"># Edité /etc/systemd/system.conf y bajé el DefaultTimeoutStopSec a 5s</span>\n</code></pre>\n</div>\n</div>\n</div>\n<h3 data-path-to-node=\"14\">Conclusión</h3>\n<p data-path-to-node=\"15\">No aceptes que tu Linux tarde en arrancar o apagar \"porque sí\". Debian es una roca, pero a veces viene con la mochila demasiado llena de herramientas de oficina que no usamos. Una limpieza de servicios no solo libera memoria, sino que devuelve esa sensación de control total sobre tu hardware.</p>\n<p data-path-to-node=\"15\">En todo caso, si quieres evitar esto, usa la ISO minimal, en este caso tenia un livecd y he usado ese pero ya vez, ahorras tiempo por un lado y terminas metiendo mano a otras cosas por otro lado.</p>",
            "author": {
                "name": "Maks"
            },
            "tags": [
                   "Linux"
            ],
            "date_published": "2026-02-07T19:25:17+01:00",
            "date_modified": "2026-02-07T19:25:17+01:00"
        }
    ]
}
