{"id":3238,"date":"2025-10-19T14:37:13","date_gmt":"2025-10-19T14:37:13","guid":{"rendered":"https:\/\/blog.rastersoft.com\/?p=3238"},"modified":"2025-10-19T14:37:29","modified_gmt":"2025-10-19T14:37:29","slug":"problemas-de-apagado","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=3238","title":{"rendered":"Problemas de apagado"},"content":{"rendered":"\n<p>Hace un par de a\u00f1os me compr\u00e9 un Slimbook ProX, ordenador con el que estoy muy contento. Sin embargo, de un tiempo a esta parte me he encontrado con que no se apaga: le doy la orden de \u00abApagar\u00bb en Gnome Shell, el sistema hace todo lo que tiene que hacer (detener procesos, sincronizar unidades&#8230; todo), y, finalmente, apaga los dispositivos y la pantalla. Peeeero&#8230; el LED de encendido y el ventilador se quedan encendidos. Literalmente hace todo el proceso, excepto \u00abcortar la corriente\u00bb.<\/p>\n\n\n\n<p>Lo coment\u00e9 en los foros, pero nadie encontraba una soluci\u00f3n, as\u00ed que me li\u00e9 la manta a la cabeza y decid\u00ed intentar depurar el kernel enviando todos los mensajes a un puerto serie, para ver si hab\u00eda alguno que se mostraba despu\u00e9s de haber desactivado el registro (y, por tanto, no quedar\u00eda grabado en disco para poder leerlo en el siguiente arranque), y despu\u00e9s de que se hubiese desactivado el driver de la tarjeta gr\u00e1fica y, por tanto, no se pudiese leer en pantalla.<\/p>\n\n\n\n<p>Tras muuuuuchas pruebas y errores, descubr\u00ed que para que funcionase el arranque cuando enviaba la salida del kernel a un puerto serie era necesario desactivar el <em>splash<\/em>, la pantalla que se muestra durante el arranque. Pero si lo hac\u00eda&#8230; \u00a1\u00a1\u00a1el apagado volv\u00eda a funcionar!!! Segu\u00ed haciendo pruebas y, finalmente, cuando vi que, efectivamente, era suficiente con <a href=\"https:\/\/askubuntu.com\/questions\/1039707\/what-is-quiet-splash-in-the-grub-file-for\">quitar el <em>splash<\/em> o el <em>quiet<\/em> de los par\u00e1metros de GRUB<\/a>, lo coment\u00e9 en los foros. Pero resulta que el servicio t\u00e9cnico ya lo hab\u00eda descubierto tambi\u00e9n un par de d\u00edas antes, y que todo apuntaba a un <em><a href=\"https:\/\/en.wikipedia.org\/wiki\/Kernel_panic\">kernel panic<\/a><\/em> producido por una <a href=\"https:\/\/en.wikipedia.org\/wiki\/Race_condition\">condici\u00f3n de carrera<\/a> en el driver gr\u00e1fico de AMD. Eso significaba que la soluci\u00f3n no era tal, sino que en cualquier momento pod\u00eda fallar de nuevo.<\/p>\n\n\n\n<p>Adem\u00e1s, un usuario coment\u00f3 que hab\u00eda unos cuantos <a href=\"https:\/\/gitlab.freedesktop.org\/drm\/amd\/-\/issues\/4129\">comentarios en las listas de freedesktop sobre un parche que se hab\u00eda a\u00f1adido en el kernel 6.14<\/a> (con el que empezaron mis problemas) que produc\u00eda un kernel panic en algunos casos, lo que parec\u00eda apuntar a que <a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/0a9906cc45d21e21ca8bb2b98b79fd7c05420fda\">ese commit, el 0a9906cc45d21e21ca8bb2b98b79fd7c05420fda<\/a>, era el responsable.<\/p>\n\n\n\n<p>Ante esto, decid\u00ed probar a compilar un kernel sin dicho parche, a ver qu\u00e9 pasaba, y parece que, efectivamente, resuelve el problema. Mi intenci\u00f3n era <a href=\"https:\/\/atareao.es\/podcast\/que-es-eso-de-los-ppa\/\">crear un PPA<\/a> con \u00e9l, pero por circunstancias, no puedo, as\u00ed que voy a poner aqu\u00ed las instrucciones sobre c\u00f3mo hacerlo uno mismo, junto con un script que simplificar\u00e1 el proceso para aquellos que no tengan demasiados conocimientos.<\/p>\n\n\n\n<p>TLDR; En primer lugar pondr\u00e9 la manera <em>sencilla<\/em> de hacerlo, para aquellos que no necesiten detalles y simplemente quieran resolver el problema <em>y ya.<\/em><\/p>\n\n\n\n<p>Para ello, <a href=\"https:\/\/www.rastersoft.com\/build-kernel.sh\"> bajamos el siguiente script<\/a>, que automatiza todo el proceso de descarga del kernel, parcheado, compilaci\u00f3n y empaquetado. Si prefieres copiarlo y pegarlo en un fichero manualmente, \u00e9ste es su contenido:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted mycode\">#!\/bin\/sh<br><br>set -e<br><br>sudo sed -i 's\/deb$\/deb deb-src\/g' \/etc\/apt\/sources.list.d\/ubuntu.sources<br><br>sudo apt update<br>sudo apt build-dep linux linux-image-unsigned-$(uname -r)<br>sudo apt install libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf llvm<br><br>rm -rf kernel-patch<br>mkdir kernel-patch<br>cd kernel-patch<br><br>apt source linux-image-unsigned-6.17.0-5-generic<br><br>cat &lt;&lt;EOF >patch.diff<br>--- linux-6.17.0\/drivers\/gpu\/drm\/amd\/display\/dc\/core\/dc.c\t2025-09-15 13:53:57.000000000 +0200<br>+++ ..\/kernel_shutdown_failure\/linux-6.17.0\/drivers\/gpu\/drm\/amd\/display\/dc\/core\/dc.c\t2025-10-18 23:29:10.918224279 +0200<br>@@ -5416,26 +5416,11 @@<br> \treturn true;<br> }<br> <br>-static void clear_update_flags(struct dc_surface_update *srf_updates,<br>-\tint surface_count, struct dc_stream_state *stream)<br>-{<br>-\tint i;<br>-<br>-\tif (stream)<br>-\t\tstream->update_flags.raw = 0;<br>-<br>-\tfor (i = 0; i &lt; surface_count; i++)<br>-\t\tif (srf_updates[i].surface)<br>-\t\t\tsrf_updates[i].surface->update_flags.raw = 0;<br>-}<br>-<br> bool dc_update_planes_and_stream(struct dc *dc,<br> \t\tstruct dc_surface_update *srf_updates, int surface_count,<br> \t\tstruct dc_stream_state *stream,<br> \t\tstruct dc_stream_update *stream_update)<br> {<br>-\tbool ret = false;<br>-<br> \tdc_exit_ips_for_hw_access(dc);<br> \t\/*<br> \t * update planes and stream version 3 separates FULL and FAST updates<br>@@ -5452,16 +5437,10 @@<br> \t * features as they are now transparent to the new sequence.<br> \t *\/<br> \tif (dc->ctx->dce_version >= DCN_VERSION_4_01)<br>-\t\tret = update_planes_and_stream_v3(dc, srf_updates,<br>+\t\treturn update_planes_and_stream_v3(dc, srf_updates,<br> \t\t\t\tsurface_count, stream, stream_update);<br>-\telse<br>-\t\tret = update_planes_and_stream_v2(dc, srf_updates,<br>+\treturn update_planes_and_stream_v2(dc, srf_updates,<br> \t\t\tsurface_count, stream, stream_update);<br>-\tif (ret &amp;&amp; (dc->ctx->dce_version >= DCN_VERSION_3_2 ||<br>-\t\tdc->ctx->dce_version == DCN_VERSION_3_01))<br>-\t\tclear_update_flags(srf_updates, surface_count, stream);<br>-<br>-\treturn ret;<br> }<br> <br> void dc_commit_updates_for_stream(struct dc *dc,<br>@@ -5471,8 +5450,6 @@<br> \t\tstruct dc_stream_update *stream_update,<br> \t\tstruct dc_state *state)<br> {<br>-\tbool ret = false;<br>-<br> \tdc_exit_ips_for_hw_access(dc);<br> \t\/* TODO: Since change commit sequence can have a huge impact,<br> \t * we decided to only enable it for DCN3x. However, as soon as<br>@@ -5480,17 +5457,17 @@<br> \t * the new sequence for all ASICs.<br> \t *\/<br> \tif (dc->ctx->dce_version >= DCN_VERSION_4_01) {<br>-\t\tret = update_planes_and_stream_v3(dc, srf_updates, surface_count,<br>+\t\tupdate_planes_and_stream_v3(dc, srf_updates, surface_count,<br> \t\t\t\tstream, stream_update);<br>-\t} else if (dc->ctx->dce_version >= DCN_VERSION_3_2) {<br>-\t\tret = update_planes_and_stream_v2(dc, srf_updates, surface_count,<br>+\t\treturn;<br>+\t}<br>+\tif (dc->ctx->dce_version >= DCN_VERSION_3_2) {<br>+\t\tupdate_planes_and_stream_v2(dc, srf_updates, surface_count,<br> \t\t\t\tstream, stream_update);<br>-\t} else<br>-\t\tret = update_planes_and_stream_v1(dc, srf_updates, surface_count, stream,<br>+\t\treturn;<br>+\t}<br>+\tupdate_planes_and_stream_v1(dc, srf_updates, surface_count, stream,<br> \t\t\t\tstream_update, state);<br>-<br>-\tif (ret &amp;&amp; dc->ctx->dce_version >= DCN_VERSION_3_2)<br>-\t\tclear_update_flags(srf_updates, surface_count, stream);<br> }<br> <br> uint8_t dc_get_current_stream_count(struct dc *dc)<br>EOF<br><br>cd linux-6.17.0<br><br>patch -p1 &lt; ..\/patch.diff<br><br>fakeroot debian\/rules clean<br>fakeroot debian\/rules binary-headers binary-generic binary-perarch<\/pre>\n\n\n\n<p>Ahora tenemos que darle permisos de ejecuci\u00f3n y lanzarlo en un terminal. Si no sabes hacerlo, simplemente sigue estos pasos. Abre la carpeta donde has guardado el script y abre las propiedades del fichero:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2025\/10\/Captura-desde-2025-10-19-14-59-45.png\" rel=\"lightbox-0\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"579\" src=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2025\/10\/Captura-desde-2025-10-19-14-59-45-1024x579.png\" alt=\"\" class=\"wp-image-3251\" srcset=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2025\/10\/Captura-desde-2025-10-19-14-59-45-1024x579.png 1024w, https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2025\/10\/Captura-desde-2025-10-19-14-59-45-300x170.png 300w, https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2025\/10\/Captura-desde-2025-10-19-14-59-45-768x434.png 768w, https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2025\/10\/Captura-desde-2025-10-19-14-59-45.png 1100w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Ah\u00ed, activar la opci\u00f3n de \u00abEjecutable como un programa\u00bb<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2025\/10\/Captura-desde-2025-10-19-15-00-01.png\" rel=\"lightbox-1\"><img loading=\"lazy\" decoding=\"async\" width=\"528\" height=\"731\" src=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2025\/10\/Captura-desde-2025-10-19-15-00-01.png\" alt=\"\" class=\"wp-image-3252\" srcset=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2025\/10\/Captura-desde-2025-10-19-15-00-01.png 528w, https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2025\/10\/Captura-desde-2025-10-19-15-00-01-217x300.png 217w\" sizes=\"auto, (max-width: 528px) 100vw, 528px\" \/><\/a><\/figure>\n\n\n\n<p>Y, finalmente, l\u00e1nzalo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2025\/10\/Captura-desde-2025-10-19-15-00-15.png\" rel=\"lightbox-2\"><img loading=\"lazy\" decoding=\"async\" width=\"561\" height=\"667\" src=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2025\/10\/Captura-desde-2025-10-19-15-00-15.png\" alt=\"\" class=\"wp-image-3253\" srcset=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2025\/10\/Captura-desde-2025-10-19-15-00-15.png 561w, https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2025\/10\/Captura-desde-2025-10-19-15-00-15-252x300.png 252w\" sizes=\"auto, (max-width: 561px) 100vw, 561px\" \/><\/a><\/figure>\n\n\n\n<p>Se abrir\u00e1 un terminal y proceder\u00e1 a instalar los paquetes necesarios para compilar el kernel (nos pedir\u00e1 la clave), aplicar\u00e1 el parche, y compilar\u00e1 todo. Eso s\u00ed, el proceso tarda m\u00e1s de una hora, as\u00ed que pod\u00e9is iros a tomar un caf\u00e9, ver un par de cap\u00edtulos de vuestra serie favorita&#8230;<\/p>\n\n\n\n<p>Cuando haya terminado, tendr\u00e1s en la carpeta <em>kernel<\/em> una serie de paquetes <em>.deb<\/em> con el kernel, los m\u00f3dulos, etc. Instala la imagen del kernel <em>en s\u00ed<\/em> (esto es, linux-image-unsigned-6.17.0-5-generic_6.17.0-5.5_amd64.deb) y el paquete de m\u00f3dulos (linux-modules-6.17.0-5-generic_6.17.0-5.5_amd64.deb).<\/p>\n\n\n\n<p>Una vez hecho, reinicia y todo deber\u00eda funcionar.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hace un par de a\u00f1os me compr\u00e9 un Slimbook ProX, ordenador con el que estoy muy contento. Sin embargo, de un tiempo a esta parte me he encontrado con que no se apaga: le doy la orden de \u00abApagar\u00bb en Gnome Shell, el sistema hace todo lo que tiene que hacer (detener procesos, sincronizar unidades&#8230; &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=3238\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">Problemas de apagado<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-3238","post","type-post","status-publish","format-standard","hentry","category-trucos"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3238","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3238"}],"version-history":[{"count":7,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3238\/revisions"}],"predecessor-version":[{"id":3255,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3238\/revisions\/3255"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3238"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3238"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3238"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}