<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>raspberry &#8211; El Cornijal de Linux</title>
	<atom:link href="https://linuxete.duckdns.org/author/raspberry/feed/" rel="self" type="application/rss+xml" />
	<link>https://linuxete.duckdns.org</link>
	<description>Un blog sobre Linux</description>
	<lastBuildDate>Tue, 02 Jun 2026 20:28:11 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>
	<item>
		<title>Cómo instalar Xfce4 en Raspberry Pi Os.</title>
		<link>https://linuxete.duckdns.org/como-instalar-raspberry-pi-os-con-xfce4-en-raspberry-pi/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=como-instalar-raspberry-pi-os-con-xfce4-en-raspberry-pi</link>
					<comments>https://linuxete.duckdns.org/como-instalar-raspberry-pi-os-con-xfce4-en-raspberry-pi/#respond</comments>
		
		<dc:creator><![CDATA[raspberry]]></dc:creator>
		<pubDate>Sun, 31 May 2026 19:34:05 +0000</pubDate>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Sistema]]></category>
		<category><![CDATA[personalizar xfce4]]></category>
		<category><![CDATA[xfce4]]></category>
		<category><![CDATA[xfce4 Debian Trixie]]></category>
		<category><![CDATA[xfce4 raspberry pi]]></category>
		<guid isPermaLink="false">https://linuxete.duckdns.org/?p=4118</guid>

					<description><![CDATA[Cada nueva versión de Raspberry Pi OS incluye el ya clásico —y un tanto aburrido— escritorio PIXEL. Se trata de un entorno simple y espartano en opciones, donde la mayor novedad visual entre actualizaciones suele ser el fondo de pantalla. Esto tiene su lógica: el sistema oficial no está pensado para competir como un sistema [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Cada nueva versión de Raspberry Pi OS incluye el ya clásico —y un tanto aburrido— escritorio PIXEL. Se trata de un entorno simple y espartano en opciones, donde la mayor novedad visual entre actualizaciones suele ser el fondo de pantalla. Esto tiene su lógica: el sistema oficial no está pensado para competir como un sistema de escritorio tradicional, sino para priorizar el rendimiento y la ligereza en proyectos técnicos.</p>



<p class="wp-block-paragraph">Pero como en mi caso utilizo la placa como un híbrido entre PC y servidor, y aprovechando que la Raspberry Pi 5 va sobrada de potencia, he decidido instalar Xfce4 desde cero para llevar la experiencia de uso a otro nivel.</p>



<figure class="wp-block-image aligncenter size-large is-resized is-style-default"><img fetchpriority="high" decoding="async" width="1024" height="576" src="https://linuxete.duckdns.org/wp-content/uploads/2026/05/mi_escritorio-1024x576.jpg" alt="" class="wp-image-4191" style="width:652px;height:auto" srcset="https://linuxete.duckdns.org/wp-content/uploads/2026/05/mi_escritorio-1024x576.jpg 1024w, https://linuxete.duckdns.org/wp-content/uploads/2026/05/mi_escritorio-300x169.jpg 300w, https://linuxete.duckdns.org/wp-content/uploads/2026/05/mi_escritorio-768x432.jpg 768w, https://linuxete.duckdns.org/wp-content/uploads/2026/05/mi_escritorio.jpg 1280w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">En este artículo te guiaré paso a paso para instalar Xfce, configurar el sistema completamente en español, instalar un navegador web y personalizar el entorno para conseguir un aspecto moderno y atractivo.</p>



<h2 class="wp-block-heading">Requisitos previos</h2>



<ul class="wp-block-list">
<li>Raspberry Pi 5 (también vale para Pi 3/4/400/500)</li>



<li>Disco SSD o Nvme (evita las MicroSD) de 120 GB en adelante.</li>



<li>Raspberry Pi OS Lite <strong>instalado</strong> en el disco (versión 64<strong>-bit</strong>)</li>



<li>Conexión a internet (por cable o WiFi configurada desde <code>raspi-config</code>)</li>



<li>Paciencia y ganas de aprender <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
</ul>



<h2 class="wp-block-heading">¿Por qué empezar con Raspberry Pi OS Lite?</h2>



<p class="wp-block-paragraph">Si ya tienes la versión completa de Raspberry Pi OS (con el escritorio Pixel), instalar otro entorno encima puede provocar conflictos visuales y duplicación de aplicaciones. Por eso es <strong>mejor empezar desde Raspberry Pi OS Lite</strong> (sin escritorio) e instalar solo lo que necesitas.</p>



<ul class="wp-block-list">
<li>Descarga <strong>Raspberry Pi OS Lite</strong> 64 bits, desde la web oficial.</li>



<li>Grábalo en un un disco SSD o Nvme con <strong>Raspberry Pi Imager</strong>.</li>



<li>Usa el asistente para elegir nombre de la máquina, usuario, configurar idioma  etc etc etc .</li>
</ul>



<h2 class="wp-block-heading">1. Instalación base de Xfce</h2>



<p class="wp-block-paragraph">Una vez instalado, entra a tu sistema de terminal pura, e inicia sesión con tu usuario y ejecuta estos comandos <strong>en orden</strong>:</p>



<h3 class="wp-block-heading">1.1 Actualizar el sistema por completo</h3>



<pre class="wp-block-code"><code>sudo apt update
sudo apt full-upgrade -y</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Nota</strong>: <code>full-upgrade</code> es importante porque actualiza el kernel y paquetes con cambios de dependencias, algo que el simple <code>upgrade</code> no hace siempre.</p>
</blockquote>



<h3 class="wp-block-heading">1.2 Instalar Xfce + drivers + gestor de red</h3>



<pre class="wp-block-code"><code>sudo apt install xfce4 xfce4-goodies network-manager-gnome gldriver-test -y</code></pre>



<p class="wp-block-paragraph"><strong>¿Qué es cada cosa?</strong></p>



<ul class="wp-block-list">
<li><code>xfce4</code>: el escritorio base.</li>



<li><code>xfce4-goodies</code>: un montón de utilidades extra (visor de imágenes, archivador, editor de texto, etc.).</li>



<li><code>network-manager-gnome</code>: interfaz gráfica para conectarte a Internet desde el escritorio.</li>



<li><code>gldriver-test</code>: Específico de Raspberry Pi y detecta automáticamente el hardware (Pi 5 con VideoCore VII) para configurar el driver gráfico adecuado.</li>
</ul>



<h3 class="wp-block-heading">1.3 Configurar el arranque en modo gráfico</h3>



<p class="wp-block-paragraph">Ve a las opciones de configuración la eeprom con el siguiente comando.</p>



<pre class="wp-block-code"><code>sudo raspi-config</code></pre>



<p class="wp-block-paragraph">Dentro de la herramienta:</p>



<p class="wp-block-paragraph">Ve a 1. <strong><mark style="background-color:#8ed1fc" class="has-inline-color">System Options       Configure system settings</mark>  </strong></p>



<pre class="wp-block-code"><code>Raspberry Pi 5 Model B Rev 1.0, 8GB


┌─────────┤ Raspberry Pi Software Configuration Tool (raspi-config) ├──────────┐
│                                                                              │
│       <mark style="background-color:#8ed1fc" class="has-inline-color">1 System Options       Configure system settings</mark>                       │
│       2 Display Options      Configure display settings                      │
│       3 Interface Options    Configure connections to peripherals            │
│       4 Performance Options  Configure performance settings                  │
│       5 Localisation Options Configure language and regional settings        │
│       6 Advanced Options     Configure advanced settings                     │
│       8 Update               Update this tool to the latest version          │
│       9 About raspi-config   Information about this configuration tool       │
│                                                                              │
│                                                                              │
│                                                                              │
│                                                                              │
│                                                                              │
│                     &lt;Select&gt;                     &lt;Finish&gt;  </code></pre>



<p class="wp-block-paragraph">Busca la opcion <strong><mark style="background-color:#8ed1fc" class="has-inline-color">S5 Boot            Select boot into desktop or to command line</mark> </strong>y pulsa Enter</p>



<pre class="wp-block-code"><code>


┌─────────┤ Raspberry Pi Software Configuration Tool (raspi-config) ├──────────┐
│                                                                              │
│      S1 Wireless LAN    Enter SSID and passphrase                            │
│      S2 Audio           Select audio out through HDMI or 3.5mm jack          │
│      S3 Password        Change password for the 'raspberry' user             │
│      S4 Hostname        Set name for this computer on a network              │
│      <mark style="background-color:#8ed1fc" class="has-inline-color">S5 Boot            Select boot into desktop or to command line</mark>          │
│      S6 Auto Login      Enable auto login to desktop or to command line      │
│      S7 Splash Screen   Choose graphical splash screen or text boot          │
│      S8 Power LED       Set behaviour of power LED                           │
│      S9 Browser         Choose default web browser                           │
│      S10 Admin Password Enable or disable sudo password                      │
│                                                                              │
│                                                                              │
│                                                                              │
│                     &lt;Select&gt;                     &lt;Back&gt;         </code></pre>



<p class="wp-block-paragraph">Baja con las flechas del teclado hasta <strong>B2 Desktop Desktop GUI</strong></p>



<pre class="wp-block-code"><code>


┌─────────┤ Raspberry Pi Software Configuration Tool (raspi-config) ├──────────┐
│                                                                              │
│                           B1 Console Text console                            │
│                           <mark style="background-color:#8ed1fc" class="has-inline-color">B2 Desktop Desktop GUI</mark>                             │
│                                                                              │
│                                                                              │
│                                                                              │
│                                                                              │
│                                                                              │
│                                                                              │
│                                                                              │
│                                                                              │
│                                                                              │
│                                                                              │
│                                                                              │
│                     &lt;Aceptar&gt;                    &lt;Cancelar&gt;                  │
│                                                               </code></pre>



<p class="wp-block-paragraph">Pulsa Tab, para Aceptar, luego Enter, y al salir te preguntará si quieres reiniciar. Di que <strong>Sí</strong>.</p>



<h3 class="wp-block-heading">1.4 Al reiniciar, ¡magia!</h3>



<p class="wp-block-paragraph">Aparecerá la <strong>pantalla de inicio de sesión de Xfce</strong> (LightDM por defecto). Inicia sesión con tu usuario y contraseña.</p>



<p class="wp-block-paragraph"><strong>¡Felicidades!</strong> Ya tienes Xfce funcionando, con el driver gráfico correcto y el gestor de red listo para conectar por ETHERNET o WiFi.</p>



<h2 class="wp-block-heading">2. Poniendo a punto el sistema.</h2>



<h3 class="wp-block-heading">2.2 Instala los paquetes de idioma de Xfce4.</h3>



<p class="wp-block-paragraph">Xfce recién instalado está en inglés. Vamos a arreglarlo.</p>



<pre class="wp-block-code"><code>sudo apt install task-spanish-desktop -y</code></pre>



<h3 class="wp-block-heading">2.3 Configura el idioma del sistema.</h3>



<pre class="wp-block-code"><code>sudo dpkg-reconfigure locales</code></pre>



<ul class="wp-block-list">
<li>Usa las flechas y la <strong>barra espaciadora</strong> para seleccionar <code>es_ES.UTF-8</code></li>



<li>También marca <code>en_US.UTF-8 UTF-8</code> (por si acaso, no está de más).</li>



<li>En la pantalla siguiente, elige <code>es_ES.UTF-8</code> como <strong>idioma por defecto</strong>.</li>
</ul>



<h3 class="wp-block-heading">2.4 Hacer visibles equipos en red.</h3>



<p class="wp-block-paragraph">Por algún motivo que desconozco, xfce viene de fábrica mas ciego que un topo, no ve ningún equipo en la red.</p>



<p class="wp-block-paragraph">Y para arreglare esto, instala los paquete sugeridos:</p>



<pre class="wp-block-code"><code>sudo apt install thunar-archive-plugin thunar-media-tags-plugin gvfs-backends</code></pre>



<h3 class="wp-block-heading">2.5 Reinicia para que todo se aplique.</h3>



<pre class="wp-block-code"><code>sudo reboot</code></pre>



<p class="wp-block-paragraph">Al volver, <strong>todos los menús de Xfce</strong>, la configuración y las aplicaciones estarán en <strong>español de España</strong> (incluido Firefox cuando lo abras).</p>



<h2 class="wp-block-heading">3. Personaliza Xfce para que se vea BONITO</h2>



<p class="wp-block-paragraph">Xfce por defecto es funcional pero feo. Con estos pasos lo convertirás en un escritorio moderno, similar a macOS o Windows 11.</p>



<h3 class="wp-block-heading">3.1 Instala temas, iconos y un dock</h3>



<pre class="wp-block-code"><code>sudo apt install arc-theme papirus-icon-theme</code></pre>



<ul class="wp-block-list">
<li><strong>Arc-theme</strong>: tema limpio y moderno (versión oscura y clara).</li>



<li><strong>Papirus-icon-theme</strong>: los mejores iconos para Linux, actualizados y vistosos.</li>
</ul>



<h3 class="wp-block-heading">3.1.a Aplicar el tema y los iconos (desde el escritorio)</h3>



<p class="wp-block-paragraph">Ve al menú de aplicaciones &gt; <strong>Settings</strong> &gt; <strong>Appearance</strong>:</p>



<ul class="wp-block-list">
<li>En la pestaña <strong>Style</strong>, selecciona <code>Arc-Darker</code> (o <code>Arc-Dark</code> si te gusta muy oscuro).</li>



<li>En la pestaña <strong>Icons</strong>, selecciona <code>Papirus-Dark</code> (o <code>Papirus</code> para la versión clara).</li>
</ul>



<p class="wp-block-paragraph">Luego ve a <strong>Settings</strong> &gt; <strong>Window Manager</strong> y en la pestaña <strong>Style</strong>, elige también <code>Arc-Darker</code> para que las ventanas combinen.</p>



<h3 class="wp-block-heading">3.1.b Cambiar el fondo de pantalla (opcional)</h3>



<p class="wp-block-paragraph">Haz clic derecho en el escritorio &gt; <strong>Desktop Settings</strong> &gt; <strong>Background</strong>. Elige una imagen bonita. Puedes descargar fondos con:</p>



<pre class="wp-block-code"><code>sudo apt install variety  # gestor de fondos de pantalla (luego lo encuentras en el menú)</code></pre>



<h3 class="wp-block-heading">3.1.c Extra: instalar un tema para LightDM (pantalla de inicio de sesión)</h3>



<pre class="wp-block-code"><code>sudo apt install lightdm-settings</code></pre>



<p class="wp-block-paragraph">Luego ve a <strong>Settings</strong> &gt; <strong>LightDM GTK+ Greeter Settings</strong> para elegir un tema que combine con tu escritorio.</p>



<h2 class="wp-block-heading">4 Trucos adicionales para un escritorio perfecto</h2>



<h3 class="wp-block-heading">4.2 Hacer que el sistema sea más rápido</h3>



<p class="wp-block-paragraph">En una Raspberry Pi 5 va muy fluido, así que no deshabilitaré ningún efecto, pero si tu placa es mas limitada puedes hacerlo así.</p>



<pre class="wp-block-code"><code># Deshabilitar efectos visuales pesados
xfconf-query -c xfwm4 -p /general/use_compositing -s false</code></pre>



<h2 class="wp-block-heading">5 Instalar Software.</h2>



<h3 class="wp-block-heading">5.1 Instalar un navegador web (Firefox en español)</h3>



<p class="wp-block-paragraph">Lo primero que haremos será instalar un navegador, ya que lo vas a necesitar para seguir este tutorial.</p>



<p class="wp-block-paragraph">En una terminal reglamentaria y homologada, escribe:</p>



<pre class="wp-block-code"><code>sudo apt install firefox-esr firefox-esr-l10n-es-es -y</code></pre>



<p class="wp-block-paragraph">Ahora lo encontrarás en el menú de aplicaciones &gt; Internet &gt; Firefox ESR.</p>



<h3 class="wp-block-heading">5.2 Instalar Flatpak</h3>



<p class="wp-block-paragraph">Con Flatpak tendremos acceso a una gran cantidad de software y lo instalaremos mediante el siguiente proceso.</p>



<pre class="wp-block-preformatted"># 1. Instalar Flatpak<br>sudo apt install flatpak -y<br><br># 2. Añadir el repositorio Flathub<br>sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo</pre>



<h3 class="wp-block-heading">5.3 Instalar Telegram desde Flatpak</h3>



<p class="wp-block-paragraph">Telegram no puede faltar en mis equipos, así, que una vez instalado Flatpak, nada nos impide empezar a instalar cualquier software que necesitemos, en este caso empezamos por Telegram.</p>



<pre class="wp-block-code"><code># 3. Instalar Telegram
sudo flatpak install flathub org.telegram.desktop -y

# 4. Ejecutar Telegram
flatpak run org.telegram.desktop</code></pre>



<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">5.4 Instalar software básico</h3>



<pre class="wp-block-code"><code># Reproductor de música
sudo apt install quodlibet

# Reproductor de vídeo
sudo apt install vlc

# Editor de imágenes
sudo apt install gimp

# Oficina (opcional, algo pesado para Pi 5 pero funciona)
sudo apt install libreoffice</code></pre>



<h2 class="wp-block-heading">6. Resumen de comandos útiles (chuleta)</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Acción</th><th>Comando</th></tr></thead><tbody><tr><td>Actualizar sistema</td><td><code>sudo apt update &amp;&amp; sudo apt full-upgrade -y</code></td></tr><tr><td>Instalar Xfce completo</td><td><code>sudo apt install xfce4 xfce4-goodies network-manager-gnome gldriver-test -y</code></td></tr><tr><td>Configurar arranque gráfico</td><td><code>sudo raspi-config</code> (Boot &gt; Desktop GUI)</td></tr><tr><td>Cambiar idioma</td><td><code>sudo dpkg-reconfigure locales</code></td></tr><tr><td>Instalar temas bonitos</td><td><code>sudo apt install arc-theme papirus-icon-theme</code></td></tr><tr><td>Instalar Firefox en español</td><td><code>sudo apt install firefox-esr firefox-esr-l10n-es-es -y</code></td></tr><tr><td>Reiniciar el sistema</td><td><code>sudo reboot</code></td></tr></tbody></table></figure>



<h2 class="wp-block-heading">7. Conclusión</h2>



<p class="wp-block-paragraph">Con este tutorial hemos conseguido:</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Instalar Xfce en Raspberry Pi 5 <strong>sin pantalla negra</strong> (usando <code>gldriver-test</code> y <code>raspi-config</code>).<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Tener el sistema <strong>completo en español de España</strong> (interfaz, teclado y Firefox).<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Un escritorio <strong>bonito y moderno</strong> con temas Arc, iconos Papirus.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Un <strong>navegador web, gestor de red WiFi y aplicaciones básicas</strong> listas para usar.</p>



<p class="wp-block-paragraph">Ahora tu Raspberry Pi 5 tiene un escritorio <strong>ligero, atractivo y totalmente funcional</strong>, perfecto para trabajar, navegar o incluso como pequeño PC de escritorio.</p>



<p class="wp-block-paragraph"><strong>¿Te ha funcionado? ¿Tienes alguna duda?</strong> Déjame un comentario en el blog y te ayudaré.</p>



<p class="wp-block-paragraph"><em>Este tutorial está basado en mi experiencia real y en el vídeo «How to Install XFCE Desktop on Raspberry Pi OS Lite (Trixie)» de Amine Tech. Todos los comandos han sido probados en Raspberry Pi 5 con Debian 13 Trixie</em>,</p>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxete.duckdns.org/como-instalar-raspberry-pi-os-con-xfce4-en-raspberry-pi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cambia la plantilla web de aMule y dale un aspecto moderno</title>
		<link>https://linuxete.duckdns.org/%f0%9f%8e%a8-cambia-la-plantilla-web-de-amule-y-darle-un-aspecto-moderno/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25f0%259f%258e%25a8-cambia-la-plantilla-web-de-amule-y-darle-un-aspecto-moderno</link>
					<comments>https://linuxete.duckdns.org/%f0%9f%8e%a8-cambia-la-plantilla-web-de-amule-y-darle-un-aspecto-moderno/#respond</comments>
		
		<dc:creator><![CDATA[raspberry]]></dc:creator>
		<pubDate>Sun, 31 May 2026 18:38:06 +0000</pubDate>
				<category><![CDATA[amule 2.3.3]]></category>
		<category><![CDATA[aMule WebUI]]></category>
		<category><![CDATA[amuleweb]]></category>
		<category><![CDATA[AmuleWebUI-Reloaded]]></category>
		<category><![CDATA[interfaz remota]]></category>
		<guid isPermaLink="false">https://linuxete.duckdns.org/?p=4182</guid>

					<description><![CDATA[Si has seguido mi guía anterior para compilar aMule desde GitHub en tu Raspberry Pi 5, ya tienes el demonio (amuled) funcionando y accedes a la interfaz web en http://localhost:4711. Estas instrucciones no te funcionarán si instalaste aMule desde repositorios. La plantilla web por defecto es bastante espartana, con un diseño que recuerda a principios [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Si has seguido mi guía anterior para compilar aMule desde GitHub en tu Raspberry Pi 5, ya tienes el demonio (<code>amuled</code>) funcionando y accedes a la interfaz web en <code>http://localhost:4711</code>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Estas instrucciones no te funcionarán si instalaste aMule desde repositorios.</p>
</blockquote>



<p class="wp-block-paragraph"><strong>La plantilla web por defecto es bastante espartana</strong>, con un diseño que recuerda a principios de los 2000. Por suerte, aMule permite cambiarla fácilmente, y existen creaciones de la comunidad mucho más atractivas y modernas.</p>



<p class="wp-block-paragraph">En este artículo te mostraré cómo instalar <strong>AmuleWebUI-Reloaded</strong>, una plantilla que utiliza <strong>Bootstrap, jQuery e iconos</strong> para ofrecer una interfaz responsive, limpia y agradable a la vista, tanto en ordenador como en móvil.</p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ¿Qué mejora esta plantilla?</h3>



<ul class="wp-block-list">
<li><strong>Diseño actualizado</strong> con Bootstrap y animaciones CSS.</li>



<li><strong>Interfaz responsive</strong> que se adapta a pantallas pequeñas (perfecta para usar desde el móvil).</li>



<li><strong>Iconos y botones más claros</strong> que facilitan la navegación.</li>



<li><strong>Transiciones suaves</strong> y logo animado en el inicio de sesión.</li>



<li><strong>Mismas funcionalidades</strong> que la plantilla original, solo mejora la apariencia.</li>
</ul>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cb.png" alt="📋" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Requisitos previos</h3>



<p class="wp-block-paragraph">Antes de empezar, asegúrate de que tienes:</p>



<ul class="wp-block-list">
<li>aMule funcionando en tu Raspberry Pi (siguiendo mi <a href="https://linuxete.duckdns.org/%f0%9f%93%a5-compilar-amule-desde-github-rama-master-en-raspberry-pi-5-usando-cmake/">guía de compilación</a>).</li>



<li>Acceso por SSH a la Raspberry Pi.</li>



<li>El servicio <code>amule.service</code> activo.</li>
</ul>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Instalación paso a paso</h3>



<h4 class="wp-block-heading">1. Detener el servicio aMule</h4>



<p class="wp-block-paragraph">Siempre es recomendable detener el demonio antes de modificar sus archivos:</p>



<pre class="wp-block-code"><code>sudo systemctl stop amule.service</code></pre>



<h4 class="wp-block-heading">2. Clonar la plantilla en el directorio correcto</h4>



<p class="wp-block-paragraph">Como compilamos aMule desde código fuente y lo instalamos en <code>/usr/local</code>, el directorio de plantillas web está en:</p>



<pre class="wp-block-code"><code>cd /usr/local/share/amule/webserver</code></pre>



<p class="wp-block-paragraph">Ahora clonamos el repositorio de la plantilla:</p>



<pre class="wp-block-code"><code>sudo git clone https://github.com/MatteoRagni/AmuleWebUI-Reloaded.git</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Nota:</strong> Usamos <code>sudo</code> porque el directorio pertenece al sistema.</p>
</blockquote>



<h4 class="wp-block-heading">3. Configurar aMule para usar la nueva plantilla</h4>



<p class="wp-block-paragraph">Editamos el archivo de configuración del demonio, que se encuentra en tu carpeta personal:</p>



<pre class="wp-block-code"><code>nano ~/.aMule/amule.conf</code></pre>



<p class="wp-block-paragraph">Buscamos la sección <code>[Webserver]</code> y añadimos o modificamos la línea <code>Template</code>:</p>



<pre class="wp-block-code"><code>&#91;Webserver]
Enabled=1
Password=tu_hash_md5
Port=4711
Template=AmuleWebUI-Reloaded</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Importante:</strong> El nombre <code>Template</code> debe coincidir exactamente con el nombre de la carpeta que clonaste. Respeta mayúsculas y minúsculas.</p>
</blockquote>



<p class="wp-block-paragraph">Guarda los cambios con <code>Ctrl+O</code>, presiona <code>Enter</code> y sal con <code>Ctrl+X</code>.</p>



<h4 class="wp-block-heading">4. Reiniciar el servicio</h4>



<pre class="wp-block-code"><code>sudo systemctl restart amule.service</code></pre>



<h4 class="wp-block-heading">5. ¡Disfrutar de la nueva interfaz!</h4>



<p class="wp-block-paragraph">Abre tu navegador y accede a <code>http://la-ip-de-tu-raspberry:4711</code> (o <code>http://localhost:4711</code> si estás en la propia Raspberry).</p>



<p class="wp-block-paragraph">Verás que la pantalla de login tiene un logo animado y un aspecto mucho más cuidado. Introduce tu contraseña y ¡listo!</p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Verificación de que todo funciona</h3>



<p class="wp-block-paragraph">Si algo no va bien, puedes comprobar los logs del servicio:</p>



<pre class="wp-block-code"><code>journalctl -u amule.service -f</code></pre>



<p class="wp-block-paragraph">Abre la interfaz web mientras observas los logs. Si la plantilla no se carga, puede que el nombre no coincida o que la carpeta no esté en la ruta correcta.</p>



<p class="wp-block-paragraph">También puedes listar las plantillas disponibles para confirmar que está instalada:</p>



<pre class="wp-block-code"><code>ls -la /usr/local/share/amule/webserver/</code></pre>



<p class="wp-block-paragraph">Deberías ver la carpeta <code>AmuleWebUI-Reloaded</code> junto con otras (como <code>default</code> o <code>php-default</code>).</p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5bc.png" alt="🖼" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Comparativa visual</h3>



<p class="wp-block-paragraph">Para que te hagas una idea, así se ve la interfaz <strong>antes</strong> (plantilla clásica):</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="601" height="1024" src="https://linuxete.duckdns.org/wp-content/uploads/2026/05/photo_2026-05-31_20-25-06-601x1024.jpg" alt="" class="wp-image-4184" style="width:455px;height:auto" srcset="https://linuxete.duckdns.org/wp-content/uploads/2026/05/photo_2026-05-31_20-25-06-601x1024.jpg 601w, https://linuxete.duckdns.org/wp-content/uploads/2026/05/photo_2026-05-31_20-25-06-176x300.jpg 176w, https://linuxete.duckdns.org/wp-content/uploads/2026/05/photo_2026-05-31_20-25-06-768x1308.jpg 768w, https://linuxete.duckdns.org/wp-content/uploads/2026/05/photo_2026-05-31_20-25-06-902x1536.jpg 902w, https://linuxete.duckdns.org/wp-content/uploads/2026/05/photo_2026-05-31_20-25-06.jpg 1080w" sizes="(max-width: 601px) 100vw, 601px" /></figure>



<p class="wp-block-paragraph">Y así se ve <strong>después</strong> con AmuleWebUI-Reloaded:</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="597" height="1024" src="https://linuxete.duckdns.org/wp-content/uploads/2026/05/photo_2026-05-31_20-25-02-597x1024.jpg" alt="" class="wp-image-4185" style="width:455px;height:auto" srcset="https://linuxete.duckdns.org/wp-content/uploads/2026/05/photo_2026-05-31_20-25-02-597x1024.jpg 597w, https://linuxete.duckdns.org/wp-content/uploads/2026/05/photo_2026-05-31_20-25-02-175x300.jpg 175w, https://linuxete.duckdns.org/wp-content/uploads/2026/05/photo_2026-05-31_20-25-02-768x1316.jpg 768w, https://linuxete.duckdns.org/wp-content/uploads/2026/05/photo_2026-05-31_20-25-02-896x1536.jpg 896w, https://linuxete.duckdns.org/wp-content/uploads/2026/05/photo_2026-05-31_20-25-02.jpg 1080w" sizes="(max-width: 597px) 100vw, 597px" /></figure>



<p class="wp-block-paragraph">La diferencia es notable, sobre todo si accedes desde el móvil.</p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f41b.png" alt="🐛" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Posibles problemas y soluciones</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Problema</th><th>Posible solución</th></tr></thead><tbody><tr><td>La plantilla no se ve, sigue saliendo la antigua</td><td>Verifica que el nombre en <code>Template</code> sea exactamente <code>AmuleWebUI-Reloaded</code>. Reinicia el servicio.</td></tr><tr><td>Error 404 o página en blanco</td><td>Asegúrate de que la carpeta está en <code>/usr/local/share/amule/webserver/</code> y tiene permisos de lectura.</td></tr><tr><td>El servicio no arranca</td><td>Revisa los logs con <code>journalctl -u amule.service -e</code>. Puede que hayas introducido mal algún parámetro en <code>amule.conf</code>.</td></tr><tr><td>Quiero volver a la plantilla original</td><td>Cambia la línea <code>Template</code> por <code>Template=default</code> y reinicia el servicio.</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Conclusión</h3>



<p class="wp-block-paragraph">Cambiar la plantilla web de aMule es un proceso sencillo que mejora enormemente la experiencia de uso. En pocos minutos, tu interfaz web pasará de ser funcional pero austera a algo mucho más agradable y moderno.</p>



<p class="wp-block-paragraph">Ahora ya puedes gestionar tus descargas desde cualquier dispositivo con un diseño responsive y cuidado. Si te ha gustado este artículo, compártelo o déjame un comentario con tus impresiones.</p>



<p class="wp-block-paragraph">¡Felices descargas! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f418.png" alt="🐘" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Enlaces de interés</h3>



<ul class="wp-block-list">
<li><a href="https://github.com/MatteoRagni/AmuleWebUI-Reloaded">Repositorio de la plantilla AmuleWebUI-Reloaded</a></li>



<li><a href="https://linuxete.duckdns.org/%f0%9f%93%a5-compilar-amule-desde-github-rama-master-en-raspberry-pi-5-usando-cmake/">Guía de compilación de aMule en Raspberry Pi 5</a></li>



<li><a href="https://www.amule.org">Web oficial de aMule</a></li>
</ul>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxete.duckdns.org/%f0%9f%8e%a8-cambia-la-plantilla-web-de-amule-y-darle-un-aspecto-moderno/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Compilar aMule desde GitHub (Rama Master) en Raspberry Pi 5 usando CMake</title>
		<link>https://linuxete.duckdns.org/%f0%9f%93%a5-compilar-amule-desde-github-rama-master-en-raspberry-pi-5-usando-cmake/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25f0%259f%2593%25a5-compilar-amule-desde-github-rama-master-en-raspberry-pi-5-usando-cmake</link>
					<comments>https://linuxete.duckdns.org/%f0%9f%93%a5-compilar-amule-desde-github-rama-master-en-raspberry-pi-5-usando-cmake/#respond</comments>
		
		<dc:creator><![CDATA[raspberry]]></dc:creator>
		<pubDate>Sun, 31 May 2026 17:47:36 +0000</pubDate>
				<category><![CDATA[amule 2.3.3]]></category>
		<category><![CDATA[amule]]></category>
		<category><![CDATA[compilar]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Raspberry Pi 5]]></category>
		<guid isPermaLink="false">https://linuxete.duckdns.org/?p=4171</guid>

					<description><![CDATA[Fecha de actualización: Mayo 2026 Compilar aMule desde GitHub no solo sirve para tener nuevas funciones, sino para asegurar que el programa sea totalmente compatible con hardware y software moderno. En esta guía usaremos el sistema de compilación oficial del proyecto: CMake, que sustituye al antiguo autotools. 🎯 Objetivo: Obtener amuled (demonio), amulegui (interfaz remota), [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Fecha de actualización: Mayo 2026</strong></p>



<p class="wp-block-paragraph">Compilar aMule desde GitHub no solo sirve para tener nuevas funciones, sino para asegurar que el programa sea totalmente compatible con hardware y software moderno. En esta guía usaremos el <strong>sistema de compilación oficial del proyecto: CMake</strong>, que sustituye al antiguo <code>autotools</code>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3af.png" alt="🎯" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Objetivo</strong>: Obtener <code>amuled</code> (demonio), <code>amulegui</code> (interfaz remota), <code>amulecmd</code> (consola) y <code>amuleweb</code> (interfaz web) funcionando en Raspberry Pi 5 con Debian 13 / Raspberry Pi OS.</p>
</blockquote>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cb.png" alt="📋" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Tabla de versiones y ramas</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Tipo</th><th class="has-text-align-left" data-align="left">Qué es</th><th class="has-text-align-left" data-align="left">¿Cuándo elegirla?</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Master (rama principal)</strong></td><td class="has-text-align-left" data-align="left">El tronco principal, con los últimos parches</td><td class="has-text-align-left" data-align="left"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Nuestra elección</strong>. Es la más compatible con sistemas modernos.</td></tr><tr><td class="has-text-align-left" data-align="left"><strong>Tags (etiquetas)</strong></td><td class="has-text-align-left" data-align="left">Versiones congeladas (ej. v2.3.3)</td><td class="has-text-align-left" data-align="left">Solo si usas un sistema operativo muy antiguo.</td></tr><tr><td class="has-text-align-left" data-align="left"><strong>Branches de desarrollo</strong></td><td class="has-text-align-left" data-align="left">Ramas experimentales</td><td class="has-text-align-left" data-align="left">Solo para desarrolladores.</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5a5.png" alt="🖥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Configuración previa: Wayland vs X11</h2>



<p class="wp-block-paragraph">La Raspberry Pi 5 con Debian 13 usa Wayland por defecto. Sin embargo, aMule funciona mejor con X11. </p>



<p class="wp-block-paragraph">Para saber si estás utilizando Wayland o X11 (Xorg) en tu sistema Linux, el método más rápido y universal es <mark>consultarlo en tu terminal</mark>.</p>



<pre class="wp-block-code"><code>echo $XDG_SESSION_TYPE</code></pre>



<p class="wp-block-paragraph">Si la respuesta es <strong><code>wayland</code></strong>, estás usando Wayland.<br>Si la respuesta es <strong><code>x11</code></strong> (o <code>xorg</code>), estás usando el sistema X11</p>



<p class="wp-block-paragraph">Para cambiarlo:</p>



<pre class="wp-block-code"><code>sudo raspi-config</code></pre>



<ul class="wp-block-list">
<li>Ve a <strong>Advanced Options</strong> → <strong>Wayland</strong></li>



<li>Selecciona <strong>X11</strong></li>



<li>Reinicia</li>
</ul>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9f9.png" alt="🧹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 1. Limpieza de instalaciones previas</h2>



<p class="wp-block-paragraph">Si no tenías amule instalado, pasa al punto 2.</p>



<p class="wp-block-paragraph">Si ya tenías aMule instalado de los repositorios o de una compilación anterior, ejecuta los siguientes comandos:</p>



<pre class="wp-block-code"><code>sudo systemctl stop amule.service 2&gt;/dev/null
sudo apt purge amule amule-daemon amule-utils-gui amule-utils amule-common -y
sudo apt autoremove --purge -y</code></pre>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4e6.png" alt="📦" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 2. Instalación de dependencias</h2>



<pre class="wp-block-code"><code>sudo apt update
sudo apt install -y build-essential cmake git \
    libboost-all-dev libwxgtk3.2-dev libcryptsetup-dev \
    libcurl4-openssl-dev libgd-dev libgeoip-dev \
    libupnp-dev libcrypto++-dev libreadline-dev \
    libglib2.0-dev pkg-config gettext zlib1g-dev</code></pre>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f53d.png" alt="🔽" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 3. Obtención del código (rama master)</h2>



<pre class="wp-block-code"><code>cd ~

git clone https://github.com/amule-project/amule.git

cd amule

git checkout master</code></pre>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2699.png" alt="⚙" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 4. Configuración de la compilación con CMake</h2>



<p class="wp-block-paragraph">Creamos un directorio separado para compilar (buena práctica):</p>



<pre class="wp-block-code"><code>mkdir -p build

cd build</code></pre>



<p class="wp-block-paragraph">Ahora configuramos la compilación <strong>optimizada para Raspberry Pi 5</strong> (Cortex-A76):</p>



<pre class="wp-block-code"><code>cmake .. \
    -DCMAKE_CXX_FLAGS="-O3 -march=armv8.2-a+crypto -mtune=cortex-a76 -pipe" \
    -DBUILD_DAEMON=ON \
    -DBUILD_REMOTEGUI=ON \
    -DBUILD_AMULECMD=ON \
    -DBUILD_WEBSERVER=ON \
    -DBUILD_MONOLITHIC=OFF \
    -DENABLE_MMAP=ON \
    -DENABLE_UPNP=ON \
    -DCMAKE_INSTALL_PREFIX=/usr/local</code></pre>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4dd.png" alt="📝" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 4.1 Explicación de las opciones:</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Opción</th><th class="has-text-align-left" data-align="left">Efecto</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><code>-DCMAKE_CXX_FLAGS="..."</code></td><td class="has-text-align-left" data-align="left">Optimizaciones para el procesador de la Pi 5</td></tr><tr><td class="has-text-align-left" data-align="left"><code>-DBUILD_DAEMON=ON</code></td><td class="has-text-align-left" data-align="left">Compila <code>amuled</code> (demonio)</td></tr><tr><td class="has-text-align-left" data-align="left"><code>-DBUILD_REMOTEGUI=ON</code></td><td class="has-text-align-left" data-align="left">Compila <code>amulegui</code> (interfaz remota)</td></tr><tr><td class="has-text-align-left" data-align="left"><code>-DBUILD_AMULECMD=ON</code></td><td class="has-text-align-left" data-align="left">Compila <code>amulecmd</code> (consola)</td></tr><tr><td class="has-text-align-left" data-align="left"><code>-DBUILD_WEBSERVER=ON</code></td><td class="has-text-align-left" data-align="left">Compila <code>amuleweb</code> (interfaz web)</td></tr><tr><td class="has-text-align-left" data-align="left"><code>-DBUILD_MONOLITHIC=OFF</code></td><td class="has-text-align-left" data-align="left">Separa los componentes (necesario para el demonio)</td></tr><tr><td class="has-text-align-left" data-align="left"><code>-DENABLE_MMAP=ON</code></td><td class="has-text-align-left" data-align="left">Mejora el rendimiento de memoria</td></tr><tr><td class="has-text-align-left" data-align="left"><code>-DENABLE_UPNP=ON</code></td><td class="has-text-align-left" data-align="left">Activa UPnP para abrir puertos automáticamente</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f528.png" alt="🔨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 5. Compilación e instalación</h2>



<pre class="wp-block-code"><code># Comienza la compilación con este comando
make -j$(nproc)

# Instalamos con la siguiente instruccion
sudo make install

# Actualiza los enlaces y la caché de las librerías compartidas.
sudo ldconfig</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/23f1.png" alt="⏱" class="wp-smiley" style="height: 1em; max-height: 1em;" /> La compilación tarda unos minutos. <code>-j$(nproc)</code> usa los 4 núcleos de la Raspberry Pi 5.</p>
</blockquote>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2699.png" alt="⚙" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 6. Configuración del demonio</h2>



<h3 class="wp-block-heading">A. Primer arranque (crea la carpeta <code>.aMule</code>)</h3>



<pre class="wp-block-code"><code>/usr/local/bin/amuled</code></pre>



<p class="wp-block-paragraph"><em>(Se cerrará solo. Es normal)</em></p>



<h3 class="wp-block-heading">B. Generar contraseña encriptada (hash MD5)</h3>



<pre class="wp-block-code"><code>echo -n "TuContraseñaSegura" | md5sum</code></pre>



<p class="wp-block-paragraph">Crea un par de contraseñas, las usaremos mas adelante.<br>Copia el resultado (varios caracteres hexadecimales).</p>



<h3 class="wp-block-heading">C. Editar la configuración</h3>



<p class="wp-block-paragraph">Es aquí donde utilizaremos las dos contraseñas creadas, mas la activación de las conexiones externas.</p>



<pre class="wp-block-code"><code>nano ~/.aMule/amule.conf</code></pre>



<p class="wp-block-paragraph">Modifica estas líneas:</p>



<pre class="wp-block-code"><code>AcceptExternalConnections=1
ECPassword=pega_uno_de los_hash_que_copiaste</code></pre>



<p class="wp-block-paragraph">En la sección <code>[WebServer]</code>:</p>



<pre class="wp-block-code"><code>&#91;WebServer]
Enabled=1
Password=pega_el_otro_hash_que_creaste
Port=4711</code></pre>



<p class="wp-block-paragraph">Guarda con <code>Ctrl+O</code>, Enter, y sal con <code>Ctrl+X</code>.</p>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 7. Crear servicio systemd (arranque automático)</h2>



<pre class="wp-block-code"><code>sudo nano /etc/systemd/system/amule.service</code></pre>



<p class="wp-block-paragraph">Pega esto (cambia <code>TU_USUARIO</code>):</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=aMule Master Daemon
After=network.target

&#91;Service]
Type=simple
User=tu_usuario
Group=tu_grupo
ExecStart=/usr/local/bin/amuled
Restart=always
RestartSec=5

&#91;Install]
WantedBy=multi-user.target</code></pre>



<p class="wp-block-paragraph">Activa el servicio:</p>



<pre class="wp-block-code"><code>sudo systemctl daemon-reload
sudo systemctl enable amule.service
sudo systemctl start amule.service
sudo systemctl status amule.service</code></pre>



<p class="wp-block-paragraph">Si ves <code>active (running)</code>, el demonio está funcionando.</p>



<h3 class="wp-block-heading">Acceso desde el navegador</h3>



<p class="wp-block-paragraph">Abre <code>http://localhost:4711</code></p>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9ea.png" alt="🧪" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 9. Comprobación final</h2>



<pre class="wp-block-code"><code># Ver ejecutables instalados
ls -la /usr/local/bin/amule*

# Ver puertos abiertos
sudo netstat -tlnp | grep -E "4711|4712"</code></pre>



<p class="wp-block-paragraph">Deberías ver:</p>



<ul class="wp-block-list">
<li>Puerto <code>4712</code> → <code>amuled</code> (conexión interna con amuleweb/amulegui)</li>



<li>Puerto <code>4711</code> → <code>amuleweb</code> (servidor web)</li>
</ul>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f41b.png" alt="🐛" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 10. Posibles errores y soluciones</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Error</th><th class="has-text-align-left" data-align="left">Solución</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><code>glib-2.0 development headers not found</code></td><td class="has-text-align-left" data-align="left"><code>sudo apt install libglib2.0-dev pkg-config</code></td></tr><tr><td class="has-text-align-left" data-align="left"><code>BUILD_WEBSERVER=OFF</code> al verificar</td><td class="has-text-align-left" data-align="left">Asegúrate de incluir <code>-DBUILD_WEBSERVER=ON</code> en el cmake</td></tr><tr><td class="has-text-align-left" data-align="left"><code>amuleweb: no existe el fichero</code></td><td class="has-text-align-left" data-align="left">Recompila con <code>-DBUILD_WEBSERVER=ON</code></td></tr><tr><td class="has-text-align-left" data-align="left"><code>Boost not found</code></td><td class="has-text-align-left" data-align="left">Añade <code>-DBoost_NO_BOOST_CMAKE=ON</code> al comando cmake</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 10.1 El problema crónico de aMuleWeb: cuando la interfaz remota desaparece</h3>



<p class="wp-block-paragraph">Lamentablemente, aMule arrastra un problema conocido desde hace años: <strong>aMuleWeb se cierra sin previo aviso</strong>, dejándonos sin acceso remoto a nuestras descargas desde fuera de la red local.</p>



<p class="wp-block-paragraph">Se trata de <strong>un fallo intermitente del propio programa</strong> que lleva presente mucho tiempo. No es un caso aislado, sino una anomalía bien documentada.</p>



<h4 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 10.1.1 Diagnóstico rápido</h4>



<p class="wp-block-paragraph">Si notas que aMuleWeb deja de funcionar, comprueba su estado de esta manera:</p>



<pre class="wp-block-preformatted"># Ver si hay proceso de amuleweb<br>ps aux | grep amuleweb | grep -v grep<br><br># Ver qué puertos están escuchando<br>sudo netstat -tlnp | grep 4711</pre>



<p class="wp-block-paragraph">Si no ves nada en el puerto 4711, el problema es que <strong>amuleweb no se ha iniciado</strong>.</p>



<p class="wp-block-paragraph">Revisando los informes de la comunidad y el propio GitHub del proyecto y este error es un clásico:</p>



<ul class="wp-block-list">
<li><strong>Se cierra sin avisar (crashea):</strong> Hay informes de que <code>amuleweb</code> falla inesperadamente, sobre todo cuando la lista de descargas se hace larga o hay muchos elementos para mostrar en la interfaz web .</li>



<li><strong>El demonio (<code>amuled</code>) sigue vivo:</strong> Lo crucial es que <strong><code>amuleweb</code> puede morir, pero <code>amuled</code> (el núcleo que realmente descarga los archivos) sigue funcionando perfectamente</strong> en segundo plano .</li>
</ul>



<p class="wp-block-paragraph">Entonces, ¿cómo solucionarlo?</p>



<h4 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6e0.png" alt="🛠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 10.1.2 Solución práctica para tu Raspberry</h4>



<p class="wp-block-paragraph">Dado que <code>amuleweb</code> es inestable y se cierra solo de vez en cuando , la solución más robusta para un sistema 24/7 es, <strong>un script «vigilante» (watchdog)</strong> que lo reactive automáticamente cuando muera.</p>



<p class="wp-block-paragraph">Aquí tienes la forma más sencilla de hacerlo.</p>



<p class="wp-block-paragraph"><strong>Paso 1: Crear el script vigilante</strong></p>



<p class="wp-block-paragraph">Ve a tu terminal, si estas en el equipo, si no, conéctate por SSH y crea el script:</p>



<pre class="wp-block-code"><code>sudo nano /usr/local/bin/amuleweb-watchdog.sh</code></pre>



<p class="wp-block-paragraph"><strong>Paso 2: Copiar el contenido (más simple y efectivo)</strong></p>



<p class="wp-block-paragraph">Este script es más simple: solo comprueba si el proceso <code>amuleweb</code> existe y, si no, lo arranca.</p>



<pre class="wp-block-code"><code>#!/bin/bash

# Script para vigilar y reiniciar amuleweb si se cierra

if pgrep -x "amuleweb" &gt; /dev/null
then
    # Si está corriendo, no hace nada
    :
else
    # Si no se encuentra, lo registra en el sistema y lo reinicia
    logger "amuleweb-watchdog: amuleweb no encontrado, reiniciando..."
    # Asegúrate de cambiar 'tu_usuario' por el tuyo, ej. 'raspberry'
    sudo -u <mark style="background-color:#7bdcb5" class="has-inline-color">tu_usuario</mark> /usr/local/bin/amuleweb --amule-config-file=/home/<mark style="background-color:#7bdcb5" class="has-inline-color">tu_usuario</mark>/.aMule/amule.conf &amp;
fi</code></pre>



<p class="wp-block-paragraph"><strong>Paso 3: Dar permisos y probar</strong></p>



<pre class="wp-block-code"><code>sudo chmod +x /usr/local/bin/amuleweb-watchdog.sh</code></pre>



<p class="wp-block-paragraph"><strong>Paso 4: Programarlo cada minuto</strong></p>



<p class="wp-block-paragraph">Edita el <code>crontab</code> del usuario <code>root</code> para que vigile todo el tiempo:</p>



<pre class="wp-block-code"><code>sudo crontab -e</code></pre>



<p class="wp-block-paragraph">Añade esta línea al final del archivo:</p>



<pre class="wp-block-code"><code>* * * * * /usr/local/bin/amuleweb-watchdog.sh</code></pre>



<p class="wp-block-paragraph">Con esto, el sistema comprobará cada minuto si <code>amuleweb</code> está vivo y lo levantará automáticamente si se ha cerrado.</p>



<h3 class="wp-block-heading">10.2 Volver a recompilar</h3>



<p class="wp-block-paragraph">Si por algún motivo algo sale mal a la hora de compilar y debes de volver a recompilar, puedes seguir estos pasos</p>



<pre class="wp-block-code"><code># Detener el servicio antes de recompilar
sudo systemctl stop amule.service</code></pre>



<p class="wp-block-paragraph">Ve siguiendo los pasos siguientes uno a uno</p>



<pre class="wp-block-code"><code># muevete a la carpeta que se creó a traves de github
cd ~/amule

# Borra la carpeta build
rm -rf build

#Crea la carpeta build
mkdir build

# muévete a la carpeta build
cd build

# Configurar con todas las opciones explícitas
cmake .. \
    -DCMAKE_CXX_FLAGS="-O3 -march=armv8.2-a+crypto -mtune=cortex-a76 -pipe" \
    -DBUILD_DAEMON=ON \
    -DBUILD_REMOTEGUI=ON \
    -DBUILD_AMULECMD=ON \
    -DBUILD_WEBSERVER=ON \
    -DBUILD_MONOLITHIC=OFF \
    -DENABLE_MMAP=ON \
    -DENABLE_UPNP=ON \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    -DBoost_NO_BOOST_CMAKE=ON \
    -DBoost_USE_STATIC_LIBS=OFF
</code></pre>



<p class="wp-block-paragraph">Cuando termine ejecuta en orden cuando finalice cada uno de los siguientes comandos</p>



<pre class="wp-block-code"><code># Compila el programa (traduce el código fuente a lenguaje máquina).
make -j$(nproc)

# Copia los ejecutables y archivos a las carpetas definitivas del sistema.
sudo make install

# Actualiza la caché de librerías compartidas del sistema.
sudo ldconfig</code></pre>



<p class="wp-block-paragraph">Una vez terminado arrancamos el servicio de nuevo.</p>



<pre class="wp-block-code"><code># Volver a arrancar el servicio con la nueva versión
sudo systemctl start amule.service</code></pre>



<h2 class="wp-block-heading">11. Desinstala aMule</h2>



<p class="wp-block-paragraph">Si no te convence como va tu aMule compilado, siempre lo podrás eliminar de la forma siguiente:</p>



<p class="wp-block-paragraph">Dirigente a la carpeta «builld»</p>



<pre class="wp-block-code"><code>cd ~/amule/build</code></pre>



<p class="wp-block-paragraph">Una vez dentro, mira que archivos hay contenidos en ella. Deberas ver «install_manifest.txt»</p>



<pre class="wp-block-code"><code># Revisa el manifest de instalación (si existe)
cat install_manifest.txt</code></pre>



<p class="wp-block-paragraph">Si ese archivo existe, puedes usarlo para desinstalar automáticamente:</p>



<pre class="wp-block-code"><code>sudo xargs rm -f &lt; install_manifest.txt</code></pre>



<p class="wp-block-paragraph">Un vez ejecutado el comando anterior, la desistalación será instantanea, ni si quiera te enviará un mensaje de que todo está ok </p>



<p class="wp-block-paragraph">Busca posibles restos con:</p>



<pre class="wp-block-code"><code>find /usr/local -name "*amule*" -type f 2>/dev/null</code></pre>



<p class="wp-block-paragraph">No deberá de salir nada a la orden del comando anterior.</p>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Notas importantes</h2>



<ul class="wp-block-list">
<li>Usamos <strong>CMake</strong> porque es el sistema oficial de compilación del proyecto aMule desde 2024.</li>



<li>La compilación con <code>-DBUILD_MONOLITHIC=OFF</code> es necesaria para que <code>amuled</code> funcione correctamente como servicio.</li>



<li>Los puertos <code>4712</code> (EC) y <code>4711</code> (Web) son distintos. No los confundas.</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxete.duckdns.org/%f0%9f%93%a5-compilar-amule-desde-github-rama-master-en-raspberry-pi-5-usando-cmake/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WireGuard en Raspberry PI, VPN casera, segura y gratuita.</title>
		<link>https://linuxete.duckdns.org/wireguard-en-raspberry-pi-vpn-casera-segura-y-gratuita/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wireguard-en-raspberry-pi-vpn-casera-segura-y-gratuita</link>
					<comments>https://linuxete.duckdns.org/wireguard-en-raspberry-pi-vpn-casera-segura-y-gratuita/#respond</comments>
		
		<dc:creator><![CDATA[raspberry]]></dc:creator>
		<pubDate>Sun, 17 May 2026 14:00:14 +0000</pubDate>
				<category><![CDATA[Raspberry PI]]></category>
		<category><![CDATA[redes]]></category>
		<category><![CDATA[Sin categoría]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[servidor VPN]]></category>
		<category><![CDATA[VPN casera]]></category>
		<category><![CDATA[WireGuard]]></category>
		<guid isPermaLink="false">https://linuxete.duckdns.org/?p=4107</guid>

					<description><![CDATA[¿Por qué WireGuard? WireGuard es una VPN moderna, ultrarrápida y muy segura. A diferencia de OpenVPN, es nativa del kernel de Linux (va como parte del sistema, no como un programa aparte), consume muy pocos recursos y se configura en minutos. ¿Para qué querrás una VPN en tu Raspberry Pi? Ventajas de montarla en una [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">¿Por qué WireGuard?</h2>



<p class="wp-block-paragraph">WireGuard es una VPN moderna, ultrarrápida y muy segura. A diferencia de OpenVPN, es <strong>nativa del kernel de Linux</strong> (va como parte del sistema, no como un programa aparte), consume muy pocos recursos y se configura en minutos.</p>



<p class="wp-block-paragraph"><strong>¿Para qué querrás una VPN en tu Raspberry Pi?</strong></p>



<ul class="wp-block-list">
<li>Acceder a tu red local desde cualquier lugar (archivos, impresoras, otros equipos)</li>



<li>Navegar con la IP de tu casa cuando estés fuera (evitar bloqueos geográficos)</li>



<li>Sincronizar contraseñas de forma segura con KeePass + Syncthing (el siguiente tutorial)</li>



<li>Usar WiFi públicas sin miedo a que espíen tu tráfico</li>
</ul>



<p class="wp-block-paragraph"><strong>Ventajas de montarla en una Raspberry Pi:</strong></p>



<ul class="wp-block-list">
<li>Consumo eléctrico ridículo (puede estar 24/7 encendida)</li>



<li>Control total de tus datos (no dependes de servicios de terceros)</li>



<li>Aprendizaje enorme</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Requisitos</h2>



<ul class="wp-block-list">
<li>Una <strong>Raspberry Pi</strong> (cualquier modelo desde la 3B funciona, pero mejor una Pi 4 o 5)</li>



<li><strong>Raspberry Pi OS</strong> instalado y actualizado (puede ser la versión Lite sin escritorio)</li>



<li><strong>DuckDNS</strong> (gratuito) o cualquier servicio de DNS dinámico ( no lo configuramos aquí)</li>



<li>Un puerto abierto en tu router (el 51820 UDP)</li>



<li>Un teléfono Android (para probar el cliente)</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1. Instalación de WireGuard</h2>



<p class="wp-block-paragraph">Conéctate a tu Raspberry Pi por SSH o directamente con teclado y pantalla.</p>



<pre class="wp-block-code"><code>sudo apt update &amp;&amp; sudo apt upgrade -y
sudo apt install wireguard wireguard-tools qrencode iptables nftables -y</code></pre>



<p class="wp-block-paragraph"><strong>Verifica que el módulo del kernel se ha cargado correctamente:</strong></p>



<pre class="wp-block-code"><code>sudo modprobe wireguard
lsmod | grep wireguard</code></pre>



<p class="wp-block-paragraph">Si ves algo como <code>wireguard 131072 0</code>, está todo bien.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2. Generar las claves del servidor</h2>



<p class="wp-block-paragraph">Cada VPN necesita un par de claves (pública y privada) para el servidor y otro par para cada cliente. Empezamos con las del servidor.</p>



<pre class="wp-block-code"><code>sudo mkdir -p /etc/wireguard
cd /etc/wireguard
sudo umask 077
sudo wg genkey | sudo tee private.key
sudo cat private.key | sudo wg pubkey | sudo tee public.key</code></pre>



<p class="wp-block-paragraph"><strong>Comprueba que se han creado los archivos:</strong></p>



<pre class="wp-block-code"><code>sudo ls -la /etc/wireguard/</code></pre>



<p class="wp-block-paragraph">Debes ver <code>private.key</code> y <code>public.key</code>, ambos con permisos <code>-rw-------</code> (600).</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3. Crear la configuración del servidor</h2>



<p class="wp-block-paragraph">Ahora creamos el archivo de configuración que arrancará la VPN.</p>



<pre class="wp-block-code"><code>sudo nano /etc/wireguard/wg0.conf</code></pre>



<p class="wp-block-paragraph">Pega este contenido (cambiando la <code>PrivateKey</code> por la tuya):</p>



<pre class="wp-block-code"><code>&#91;Interface]
PrivateKey = PEGA_AQUÍ_TU_CLAVE_PRIVADA
Address = 10.0.0.1/24
ListenPort = 51820
SaveConfig = false

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE</code></pre>



<p class="wp-block-paragraph"><strong>¿Cómo obtener tu clave privada?</strong></p>



<pre class="wp-block-code"><code>sudo cat /etc/wireguard/private.key</code></pre>



<p class="wp-block-paragraph">Copia el resultado y pégalo donde pone <code>PrivateKey = ...</code></p>



<p class="wp-block-paragraph"><strong>Importante sobre la interfaz de red:</strong></p>



<ul class="wp-block-list">
<li>Si tu Raspberry Pi usa <strong>cable Ethernet</strong>, deja <code>eth0</code></li>



<li>Si usa <strong>WiFi</strong>, cambia <code>eth0</code> por <code>wlan0</code></li>



<li>Si no estás seguro, ejecuta <code>ip route | grep default</code> y mira qué interfaz aparece</li>
</ul>



<p class="wp-block-paragraph">Las líneas <code>PostUp</code> y <code>PostDown</code> son las que permiten que tu móvil tenga acceso a internet a través de la VPN (enmascaramiento NAT). Sin ellas, la VPN conectará pero no habrá internet.</p>



<p class="wp-block-paragraph">Guarda el archivo (<code>Ctrl+O</code>, <code>Enter</code>, <code>Ctrl+X</code>).</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">4. Configurar el sistema para enrutar tráfico</h2>



<p class="wp-block-paragraph">La VPN necesita que el sistema operativo permita reenviar paquetes de una interfaz a otra.</p>



<pre class="wp-block-code"><code>echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p</code></pre>



<p class="wp-block-paragraph">Debes ver <code>net.ipv4.ip_forward = 1</code> en la salida.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">5. Arrancar WireGuard</h2>



<pre class="wp-block-code"><code>sudo chmod 600 /etc/wireguard/*
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0</code></pre>



<p class="wp-block-paragraph"><strong>Verifica que funciona:</strong></p>



<pre class="wp-block-code"><code>sudo wg show</code></pre>



<p class="wp-block-paragraph">Deberías ver algo como:</p>



<pre class="wp-block-code"><code>interface: wg0
  public key: TU_CLAVE_PUBLICA
  private key: (hidden)
  listening port: 51820</code></pre>



<p class="wp-block-paragraph"><strong>Y comprueba que el puerto está escuchando:</strong></p>



<pre class="wp-block-code"><code>sudo ss -tuln | grep 51820</code></pre>



<p class="wp-block-paragraph">Debe aparecer <code>0.0.0.0:51820</code>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">6. Crear la configuración para el móvil (cliente)</h2>



<p class="wp-block-paragraph">Cada dispositivo que se conecte a la VPN necesita su propio par de claves. Vamos a generar las del móvil.</p>



<pre class="wp-block-code"><code>sudo mkdir -p /etc/wireguard/clients
cd /etc/wireguard/clients
sudo umask 077
sudo wg genkey | sudo tee mobile_private.key
sudo cat mobile_private.key | sudo wg pubkey | sudo tee mobile_public.key</code></pre>



<p class="wp-block-paragraph">Ahora creamos el archivo de configuración que importaremos en el móvil.</p>



<pre class="wp-block-code"><code>sudo nano mobile.conf</code></pre>



<p class="wp-block-paragraph">Pega este contenido (cambia solo los campos entre <code>[ ... ]</code>):</p>



<pre class="wp-block-code"><code>&#91;Interface]
PrivateKey = &#91;CLAVE_PRIVADA_DEL_MOVIL]
Address = 10.0.0.2/32
DNS = 8.8.8.8

&#91;Peer]
PublicKey = &#91;CLAVE_PUBLICA_DEL_SERVIDOR]
Endpoint = &#91;TU_DOMINIO_O_IP_PUBLICA]:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25</code></pre>



<p class="wp-block-paragraph"><strong>Rellena cada campo:</strong></p>



<ul class="wp-block-list">
<li><code>[CLAVE_PRIVADA_DEL_MOVIL]</code> → El contenido de <code>sudo cat /etc/wireguard/clients/mobile_private.key</code></li>



<li><code>[CLAVE_PUBLICA_DEL_SERVIDOR]</code> → El contenido de <code>sudo cat /etc/wireguard/public.key</code></li>



<li><code>[TU_DOMINIO_O_IP_PUBLICA]</code> → Tu dominio DuckDNS (ej: <code>tublog.duckdns.org</code>) o tu IP pública si no tienes DNS dinámico</li>
</ul>



<p class="wp-block-paragraph">Guarda el archivo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">7. Añadir el móvil como cliente permitido en el servidor</h2>



<pre class="wp-block-code"><code>MOBILE_PUBKEY=$(sudo cat /etc/wireguard/clients/mobile_public.key)
sudo wg set wg0 peer $MOBILE_PUBKEY allowed-ips 10.0.0.2/32
sudo wg-quick save wg0</code></pre>



<p class="wp-block-paragraph">Verifica que aparece el peer:</p>



<pre class="wp-block-code"><code>sudo wg show</code></pre>



<p class="wp-block-paragraph">Ahora deberías ver una sección <code>peer:</code> adicional con la clave pública del móvil.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">8. Preparar el código QR para el móvil</h2>



<pre class="wp-block-code"><code>sudo cat /etc/wireguard/clients/mobile.conf | qrencode -t ansiutf8</code></pre>



<p class="wp-block-paragraph">Esto mostrará un código QR en la terminal.</p>



<p class="wp-block-paragraph"><strong>En tu Android:</strong></p>



<ol class="wp-block-list">
<li>Instala la app <strong>WireGuard</strong> desde Play Store</li>



<li>Abre la app → Botón <code>+</code> → <strong>Escanear desde código QR</strong></li>



<li>Escanea el código QR de la terminal</li>
</ol>



<p class="wp-block-paragraph">La app importará automáticamente la configuración. Solo tendrás que pulsar el interruptor para conectarte.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">9. Abrir el puerto en el router (imprescindible para acceso remoto)</h2>



<p class="wp-block-paragraph">Este es el único paso que depende de tu router, pero es sencillo.</p>



<p class="wp-block-paragraph"><strong>Primero, averigua la IP local de tu Raspberry Pi:</strong></p>



<pre class="wp-block-code"><code>hostname -I</code></pre>



<p class="wp-block-paragraph">Anota la primera IP (ej: <code>192.168.1.150</code>).</p>



<p class="wp-block-paragraph"><strong>Accede a la web de tu router</strong> (normalmente <code>192.168.1.1</code> o <code>192.168.0.1</code>).</p>



<p class="wp-block-paragraph">Busca la sección <strong>«Reenvío de puertos»</strong> o <strong>«Port Forwarding»</strong> y añade una regla:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Campo</th><th class="has-text-align-left" data-align="left">Valor</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">Nombre</td><td class="has-text-align-left" data-align="left">WireGuard</td></tr><tr><td class="has-text-align-left" data-align="left">Puerto externo</td><td class="has-text-align-left" data-align="left">51820</td></tr><tr><td class="has-text-align-left" data-align="left">Protocolo</td><td class="has-text-align-left" data-align="left"><strong>UDP</strong> (importante, no TCP)</td></tr><tr><td class="has-text-align-left" data-align="left">IP interna</td><td class="has-text-align-left" data-align="left">[LA IP DE TU RASPBERRY PI]</td></tr><tr><td class="has-text-align-left" data-align="left">Puerto interno</td><td class="has-text-align-left" data-align="left">51820</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Guarda los cambios. Si tu router tiene la opción, reinícialo para aplicar la regla.</p>



<p class="wp-block-paragraph"><strong>Si usas DuckDNS:</strong> Asegúrate de que el cliente de actualización está corriendo en tu Raspberry Pi o en el router, para que tu dominio siempre apunte a tu IP pública.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">10. Comprobación final</h2>



<h3 class="wp-block-heading">Prueba dentro de casa (WiFi local)</h3>



<ol class="wp-block-list">
<li>En el móvil, activa WireGuard</li>



<li>Abre el navegador y busca «cuál es mi IP»</li>



<li>Debe mostrar la <strong>IP pública de tu casa</strong> (la de tu router)</li>
</ol>



<h3 class="wp-block-heading">Prueba desde fuera (con datos móviles)</h3>



<ol class="wp-block-list">
<li>Desactiva el WiFi del móvil</li>



<li>Activa WireGuard</li>



<li>Repite la búsqueda de IP</li>



<li>Sigue debiendo mostrar la IP de tu casa</li>
</ol>



<p class="wp-block-paragraph"><strong>Si ves la IP de tu casa, la VPN funciona perfectamente.</strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">11. Posibles errores y soluciones (basados en errores reales)</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Error</th><th class="has-text-align-left" data-align="left">Causa</th><th class="has-text-align-left" data-align="left">Solución</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left"><code>iptables: command not found</code></td><td class="has-text-align-left" data-align="left">El paquete <code>iptables</code> no está instalado</td><td class="has-text-align-left" data-align="left"><code>sudo apt install iptables -y</code></td></tr><tr><td class="has-text-align-left" data-align="left">El móvil conecta pero no tiene internet</td><td class="has-text-align-left" data-align="left">Faltan las reglas <code>PostUp</code> en <code>wg0.conf</code></td><td class="has-text-align-left" data-align="left">Añade las líneas <code>PostUp/PostDown</code> y recarga</td></tr><tr><td class="has-text-align-left" data-align="left"><code>wg-quick up</code> falla con <code>RTNETLINK answers: Operation not supported</code></td><td class="has-text-align-left" data-align="left">El módulo WireGuard no está cargado</td><td class="has-text-align-left" data-align="left"><code>sudo modprobe wireguard</code> y reinicia</td></tr><tr><td class="has-text-align-left" data-align="left">No se puede crear <code>/etc/wireguard</code></td><td class="has-text-align-left" data-align="left">Permisos</td><td class="has-text-align-left" data-align="left">Usa <code>sudo</code> para todos los comandos dentro de ese directorio</td></tr><tr><td class="has-text-align-left" data-align="left">El código QR no se ve bien</td><td class="has-text-align-left" data-align="left">Fuente de la terminal</td><td class="has-text-align-left" data-align="left">Usa una terminal que soporte UTF-8 o importa el archivo <code>.conf</code> manualmente</td></tr><tr><td class="has-text-align-left" data-align="left">La IP del móvil no cambia a la de casa</td><td class="has-text-align-left" data-align="left"><code>AllowedIPs</code> no es <code>0.0.0.0/0</code></td><td class="has-text-align-left" data-align="left">Corrígelo en <code>mobile.conf</code> y vuelve a importar</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">12. Mantenimiento y buenas prácticas</h2>



<ul class="wp-block-list">
<li><strong>Actualiza regularmente:</strong> <code>sudo apt update &amp;&amp; sudo apt upgrade -y</code></li>



<li><strong>Monitorea el servicio:</strong> <code>sudo systemctl status wg-quick@wg0</code></li>



<li><strong>Revoca el acceso a un dispositivo:</strong> Elimina su peer del servidor con <code>sudo wg set wg0 peer [su_clave_publica] remove</code></li>



<li><strong>Copia de seguridad de las claves:</strong> Guarda en un lugar seguro (<code>/etc/wireguard/</code> entero)</li>



<li><strong>Puerto seguro:</strong> El 51820 UDP es el estándar, pero puedes cambiarlo por cualquier otro si quieres algo menos predecible</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">13. ¿Qué viene después?</h2>



<p class="wp-block-paragraph">Con la VPN funcionando, ya puedes:</p>



<ul class="wp-block-list">
<li><strong>Sincronizar contraseñas</strong> entre tu PC con Linux y tu Android usando <strong>KeePassXC + Syncthing</strong> (próximo tutorial)</li>



<li><strong>Acceder a tu red doméstica</strong> desde cualquier lugar (NAS, servidor multimedia, impresora)</li>



<li><strong>Usar Pi-hole</strong> para bloquear anuncios también en tu móvil cuando estás fuera de casa</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Conclusión</h2>



<p class="wp-block-paragraph">Has montado tu propia VPN en una Raspberry Pi sin depender de servicios externos, sin Docker y con software libre. WireGuard es ligero, seguro y una vez configurado, olvidas que está ahí.</p>



<p class="wp-block-paragraph"><strong>¿Te ha servido? ¿Tienes dudas?</strong> Puedes dejar un comentario y te ayudaré (porque yo ya pasé por todos los errores posibles mientras escribía este tutorial).</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><em>Este tutorial está basado en una instalación real en Raspberry Pi 5 con Raspberry Pi OS, sin Docker, y probado con Android 13.</em></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxete.duckdns.org/wireguard-en-raspberry-pi-vpn-casera-segura-y-gratuita/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>El misterio de la pantalla negra en Raspberry Pi 5: ¿Culpa del NVMe?</title>
		<link>https://linuxete.duckdns.org/el-misterio-de-la-pantalla-negra-en-raspberry-pi-5-culpa-del-nvme/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=el-misterio-de-la-pantalla-negra-en-raspberry-pi-5-culpa-del-nvme</link>
					<comments>https://linuxete.duckdns.org/el-misterio-de-la-pantalla-negra-en-raspberry-pi-5-culpa-del-nvme/#respond</comments>
		
		<dc:creator><![CDATA[raspberry]]></dc:creator>
		<pubDate>Sat, 14 Mar 2026 18:47:43 +0000</pubDate>
				<category><![CDATA[Raspberry PI]]></category>
		<category><![CDATA[cmdline.txt]]></category>
		<category><![CDATA[Debian 13]]></category>
		<category><![CDATA[EEPROM]]></category>
		<category><![CDATA[HDMI Fix]]></category>
		<category><![CDATA[lightdm]]></category>
		<category><![CDATA[No signal]]></category>
		<category><![CDATA[NVMe]]></category>
		<category><![CDATA[Pantalla Negra]]></category>
		<category><![CDATA[PCIe Gen 3]]></category>
		<category><![CDATA[Raspberry Pi 5]]></category>
		<category><![CDATA[Raspberry Pi OS]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">https://linuxete.duckdns.org/?p=4047</guid>

					<description><![CDATA[Hasta hace unos días, mi vida tecnológica con la nueva Raspberry Pi 5 era un remanso de paz. Tenía conectado un disco SSD de 2,5 pulgadas y todo funcionaba como la seda. Pero, como nos pasa a todos los que nos gusta «cacharrear», decidí dar el salto a la máxima velocidad y actualicé a un [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Hasta hace unos días, mi vida tecnológica con la nueva <strong>Raspberry Pi 5</strong> era un remanso de paz. Tenía conectado un disco SSD de 2,5 pulgadas y todo funcionaba como la seda. Pero, como nos pasa a todos los que nos gusta «cacharrear», decidí dar el salto a la máxima velocidad y actualicé a un <strong>disco SSD NVMe</strong>. Ahí es donde empezaron los sudores fríos.</p>



<p class="wp-block-paragraph">De repente, cada vez que reiniciaba el sistema, la Pi arrancaba pero con la <strong>pantalla más negra que el porvenir de un zombi</strong>. Al principio, el pánico: pensé que el sistema se colgaba y no arrancaba. Cambié el HAT, probé otro disco NVMe, compré cables HDMI nuevos e incluso reinstalé el sistema operativo varias veces. ¿El resultado? El mismo vacío oscuro.</p>



<p class="wp-block-paragraph">Sin embargo, al entrar por <strong>SSH</strong> desde mi teléfono, descubrí la verdad: la Pi estaba vivita y coleando, con el sistema totalmente cargado y funcionando de fondo. El problema no era que la Pi no arrancara, ¡era que no quería hablar con mi monitor!</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Nota: Para que el sistema arranque de forma normal quita el cable de alimentación y tras 5 segundos vuelve a conectar.</p>
</blockquote>



<h3 class="wp-block-heading">¿Por qué el NVMe «rompe» el vídeo al reiniciar?</h3>



<p class="wp-block-paragraph">Si te está pasando lo mismo, no te vuelvas loco cambiando hardware. La explicación de por qué con una tarjeta SD o un SSD lento todo iba bien y con el NVMe oficial falla, se resume en estos tres factores:</p>



<ul class="wp-block-list">
<li><strong>Tu Raspberry Pi ahora es «demasiado rápida»:</strong> Imagina que el arranque es una conversación. Con la SD, la Pi tardaba 30 segundos; al monitor le daba tiempo a despertarse y tomarse un café. Con el NVMe, el sistema carga en 5 segundos. La Pi lanza la señal de vídeo tan rápido que el monitor aún está «desperezándose» del reinicio. Cuando el monitor quiere mirar, la Pi ya ha dejado de llamar a la puerta y ambos se quedan esperando en silencio.</li>



<li><strong>Interferencias y «ruido» eléctrico:</strong> El bus PCIe donde va tu NVMe funciona a frecuencias altísimas que generan ondas electromagnéticas. Como los puertos micro-HDMI están pegados al conector PCIe en la Pi 5, ese «ruido» puede ensuciar la señal. Si el cable no es de excelente calidad, la Pi no recibe los datos del monitor (EDID) y, por seguridad, apaga la salida.</li>



<li><strong>El reinicio «suave» vs «fuerte»:</strong> Al reiniciar desde el escritorio, el driver de vídeo a veces no se cierra correctamente antes de que el rapidísimo NVMe vuelva a cargar todo. Esto deja a la gráfica en un estado de confusión total.</li>
</ul>



<p class="wp-block-paragraph"><strong>En resumen:</strong> Es como si tu Raspberry Pi fuera ahora un coche de carreras. Arranca tan rápido que sale del garaje antes de que la puerta (tu monitor) termine de abrirse.</p>



<p class="wp-block-paragraph">A continuación, te explico los pasos exactos para decirle a tu Pi: <em>«Espera un segundo antes de salir y, aunque veas la puerta cerrada, empuja, que se abrirá»</em>.</p>



<h3 class="wp-block-heading">El cambio imprescindible (De Wayland a X11)</h3>



<p class="wp-block-paragraph">Por defecto, la Raspberry Pi 5 utiliza <strong>Wayland</strong>. Sin embargo, Wayland todavía tiene problemas para gestionar el «Screen Blanking» (que la pantalla se apague sola tras un tiempo sin uso).</p>



<p class="wp-block-paragraph">Si quieres que tu monitor descanse y que los comandos que vamos a usar funcionen, debemos volver al servidor gráfico <strong>X11</strong>.</p>



<h4 class="wp-block-heading">¿Cómo cambiar a X11?</h4>



<ol start="1" class="wp-block-list">
<li>Abre una terminal y escribe: <code>sudo raspi-config</code></li>



<li>Ve a <strong>6 Advanced Options</strong>.</li>



<li>Busca <strong>A6 Wayland</strong>.</li>



<li>Selecciona <strong>W1 X11</strong> (o el que indique que desactiva Wayland).</li>



<li>Dale a <strong>Finish</strong> y acepta el <strong>Reboot</strong> (reiniciar).</li>
</ol>



<p class="wp-block-paragraph"><em>Ahora que estamos en X11, todos los comandos de ahorro de energía y gestión de pantalla funcionarán como un reloj.</em></p>



<h2 class="wp-block-heading">Parte 1: El «Seguro de Vida» (Configurar SSH)</h2>



<p class="wp-block-paragraph">Antes de meterle mano a la configuración interna, necesitamos una forma de hablar con la Raspberry Pi cuando la pantalla está en negro. Para eso usamos el <strong>SSH (Secure Shell)</strong>. Si puedes entrar por SSH desde tu móvil o tu PC mientras la pantalla está oscura, ¡felicidades!, tu Pi no está muerta, solo está «tímida» con el monitor.</p>



<h3 class="wp-block-heading">1. ¿Cómo saber si el SSH está activo?</h3>



<p class="wp-block-paragraph">Si tienes la suerte de que la pantalla ha encendido o estás configurándola por primera vez, abre una terminal y comprueba el estado del servicio:</p>



<pre class="wp-block-code"><code>sudo systemctl status ssh
</code></pre>



<h4 class="wp-block-heading">Caso A: El servicio funciona correctamente</h4>



<p class="wp-block-paragraph">Si ves un mensaje en verde que dice <strong><code>active (running)</code></strong>, todo está perfecto. Ya puedes acceder remotamente.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Ojo:</strong> En mi caso veréis que uso el puerto <strong>22299</strong>, pero por defecto en vuestra Pi será el <strong>22</strong>.</p>
</blockquote>



<pre class="wp-block-code"><code>● ssh.service - OpenBSD Secure Shell server
     Active: active (running) since Sat 2026-03-14 15:15:56 CET; 3h 28min ago
     ...
     mar 14 15:15:56 pi5-2 sshd&#91;1006]: Server listening on 0.0.0.0 port 22299.
</code></pre>



<h4 class="wp-block-heading">Caso B: El servicio está apagado o muerto</h4>



<p class="wp-block-paragraph">Si por el contrario ves que dice <strong><code>inactive (dead)</code></strong>, significa que estás «ciego» si la pantalla falla. Tienes que activarlo obligatoriamente.</p>



<pre class="wp-block-code"><code>○ ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (...; disabled; ...)
     Active: inactive (dead)
</code></pre>



<h3 class="wp-block-heading">2. Cómo activar e iniciar el SSH</h3>



<p class="wp-block-paragraph">Para que el SSH se encienda solo cada vez que arranques la Pi (muy importante para nuestro problema), ejecuta estos dos comandos:</p>



<p class="wp-block-paragraph"><strong>Primero: Habilitar el inicio automático</strong></p>



<pre class="wp-block-code"><code>sudo systemctl enable ssh</code></pre>



<p class="wp-block-paragraph"><em>Verás que el sistema crea unos «symlinks» (accesos directos internos), eso indica que ahora arrancará siempre con el sistema.</em></p>



<p class="wp-block-paragraph"><strong>Segundo: Arrancar el servicio ahora mismo</strong></p>



<pre class="wp-block-code"><code>sudo systemctl start ssh</code></pre>



<h2 class="wp-block-heading">Parte 2: El diagnóstico definitivo (¿Monitor o Sistema?)</h2>



<p class="wp-block-paragraph">Una vez que tengas SSH, la próxima vez que reinicies y la pantalla se quede <strong>«más negra que el porvenir de un zombi»</strong>, no entres en pánico. Conéctate desde tu móvil y lanza este comando:</p>



<pre class="wp-block-code"><code>kmsprint</code></pre>



<ul class="wp-block-list">
<li><strong>Si ves <code>HDMI-A-1 (connected)</code> </strong>nos confirma que <strong>la Raspberry Pi sí detecta el monitor</strong>, pero la señal de vídeo no se está «dibujando»</li>



<li><strong>Si quieres forzar el encendido desde el móvil</strong>, pega esto en la terminal de tu móvil:</li>
</ul>



<pre class="wp-block-code"><code>export DISPLAY=:0
xset dpms force on</code></pre>



<p class="wp-block-paragraph">Si esto no enciende tu monitor, ejecuta:</p>



<pre class="wp-block-code"><code><code>sudo systemctl restart lightdm</code></code></pre>



<p class="wp-block-paragraph"><em>(Esto cerrará tus apps abiertas, pero debería forzar al monitor a recibir señal).</em></p>



<p class="wp-block-paragraph">En mi caso, reiniciar lightdm encendió mi monitor. </p>



<p class="wp-block-paragraph">El hecho de que al reiniciar <code>lightdm</code> la pantalla se encienda es la <strong>prueba definitiva</strong>: el sistema operativo arranca bien, el hardware funciona y el disco NVMe está perfecto.</p>



<h2 class="wp-block-heading">Parte 3: La Solución Definitiva (La «D» Mágica)</h2>



<p class="wp-block-paragraph">Si has confirmado que por SSH todo funciona pero el HDMI se queda frito, vamos a aplicar la medicina. Editamos el archivo de configuración del arranque:</p>



<pre class="wp-block-code"><code>sudo nano /boot/firmware/cmdline.txt</code></pre>



<p class="wp-block-paragraph">Ve al final de la única línea que hay, añade un espacio y escribe:</p>



<p class="wp-block-paragraph"><code>video=HDMI-A-1:1920x1080@60D</code></p>



<p class="wp-block-paragraph"><strong>¿Por qué la D?</strong> Porque le dice a la Pi: <em>«Envía señal Digital sí o sí, no preguntes al monitor si está listo, ¡dispara!»</em>.</p>



<h3 class="wp-block-heading">Un último ajuste en la EEPROM</h3>



<p class="wp-block-paragraph">Para que el disco NVMe y el vídeo se lleven bien eléctricamente en la Raspberry Pi 5, te recomiendo este cambio final:</p>



<pre class="wp-block-code"><code>sudo rpi-eeprom-config --edit</code></pre>



<p class="wp-block-paragraph">Dentro te encontrarás tres líneas como estas.</p>



<pre class="wp-block-code"><code>BOOT_UART=1
BOOT_ORDER=0xf146
NET_INSTALL_AT_POWER_ON=1</code></pre>



<p class="wp-block-paragraph">Añade estas líneas al final de las existentes:</p>



<ul class="wp-block-list">
<li><code>POWER_OFF_ON_HALT=1</code></li>



<li><code>HDMI_DELAY=1</code></li>
</ul>



<p class="wp-block-paragraph">Cuando lo tengas, guarda los cambios con Ctrl + o y cierra para salir con Crtl + x</p>



<p class="wp-block-paragraph">Entonces se generará la nueva configuración.</p>



<pre class="wp-block-code"><code>raspberry@pi5:~ $ <strong>sudo rpi-eeprom-config --edit</strong>
Updating bootloader EEPROM
 image: /usr/lib/firmware/raspberrypi/bootloader-2712/default/pieeprom-2026-05-26.bin
config_src: blconfig device
config: /tmp/tmp_3tpo_c8/boot.conf
################################################################################
&#91;all]
BOOT_UART=1
BOOT_ORDER=0xf146
NET_INSTALL_AT_POWER_ON=1
POWER_OFF_ON_HALT=1
HDMI_DELAY=1

################################################################################
*** CREATED UPDATE /tmp/tmp_3tpo_c8/pieeprom.upd  ***

Checking flashrom probe
   CURRENT: vie 06 feb 2026 14:31:40 UTC (1770388300)
    UPDATE: mar 26 may 2026 15:01:25 UTC (1779807685)
    BOOTFS: /boot/firmware
'/tmp/tmp.1fcqwNnARo' -> '/boot/firmware/pieeprom.upd'

UPDATING bootloader. This could take up to a minute. Please wait

*** Do not disconnect the power until the update is complete ***

If a problem occurs then the Raspberry Pi Imager may be used to create
a bootloader rescue SD card image which restores the default bootloader image.

flashrom -p linux_spi:dev=/dev/spidev10.0,spispeed=16000 -w /boot/firmware/pieeprom.upd
Verifying update
VERIFY: SUCCESS
UPDATE SUCCESSFUL
raspberry@pi5:~ $ 
</code></pre>



<p class="wp-block-paragraph">Ahora tan solo reinicia el sistema con</p>



<pre class="wp-block-code"><code>sudo reboot</code></pre>



<p class="wp-block-paragraph">Este paso es como ajustar el «reloj interno» y la gestión eléctrica de la placa base de tu Raspberry Pi 5. Es el ajuste que soluciona el conflicto físico entre el disco NVMe y el puerto HDMI.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li><strong><code>POWER_OFF_ON_HALT=1</code></strong>: Fuerza un reinicio eléctrico completo. Evita que el disco «atonté» a la salida de vídeo.</li>



<li><strong><code>HDMI_DELAY=1</code></strong>: Le da un segundo de ventaja al monitor para que esté listo antes de que la Pi empiece a enviar imágenes.</li>
</ul>
</blockquote>



<p class="wp-block-paragraph">¡Y listo! Con esto habrás pasado de tener un pisapapeles caro a una <strong>Raspberry Pi 5 con NVMe</strong> que vuela y que no se achica ante ningún reinicio.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxete.duckdns.org/el-misterio-de-la-pantalla-negra-en-raspberry-pi-5-culpa-del-nvme/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo diagnosticar y optimizar un duro SSD o HDD</title>
		<link>https://linuxete.duckdns.org/como-diagnosticar-y-optimizar-un-ssd-usb-en-raspberry-pi/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=como-diagnosticar-y-optimizar-un-ssd-usb-en-raspberry-pi</link>
					<comments>https://linuxete.duckdns.org/como-diagnosticar-y-optimizar-un-ssd-usb-en-raspberry-pi/#respond</comments>
		
		<dc:creator><![CDATA[raspberry]]></dc:creator>
		<pubDate>Mon, 09 Mar 2026 22:12:12 +0000</pubDate>
				<category><![CDATA[Raspberry PI]]></category>
		<category><![CDATA[hdparm]]></category>
		<category><![CDATA[raspberry-pi]]></category>
		<category><![CDATA[rendimiento-ssd]]></category>
		<category><![CDATA[salud-ssd]]></category>
		<category><![CDATA[smartctl]]></category>
		<category><![CDATA[uasp]]></category>
		<guid isPermaLink="false">https://linuxete.duckdns.org/?p=4000</guid>

					<description><![CDATA[En mi último post hablé de cómo usar una Raspberry Pi Zero para monitorizar un SAI Salicru con NUT y Telegram, evitando esos molestos unsafe shutdowns que tanto dañan los SSD o las SD cards. Todo empezó curioseando en webs de segunda mano. Ya sabéis cómo va: vendedores que aseguran que el disco está en [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En mi último post hablé de cómo usar una Raspberry Pi Zero para monitorizar un SAI Salicru con NUT y Telegram, evitando esos molestos <em>unsafe shutdowns</em> que tanto dañan los SSD o las SD cards.</p>



<p class="wp-block-paragraph">Todo empezó curioseando en webs de segunda mano. Ya sabéis cómo va: vendedores que aseguran que el disco está en perfectas condiciones e incluso adjuntan capturas de pantalla de tests de salud. Pero, ¿os fiáis? Yo prefiero hacer las pruebas por mi cuenta y salir de dudas. En Wallapop, por ejemplo, tienes 48 horas para revisar el producto, así que hay tiempo de sobra para comprobar la verdad.</p>



<p class="wp-block-paragraph">En esta ocasión, voy a testear un <strong>SSD Kingston A400 de 240GB</strong> conectado por USB 3.0 a mi <strong>Raspberry Pi 5</strong>. Mi objetivo: saber si está sano, si es rápido y si está bien configurado.</p>



<p class="wp-block-paragraph">Hoy os cuento el proceso paso a paso: desde identificar el adaptador USB-SATA hasta medir la velocidad real y consultar la salud interna con SMART. Estos comandos son oro puro si usas el SSD para boot, un NAS casero o backups, y quieres exprimir tu Pi sin sorpresas.</p>



<h3 class="wp-block-heading">¿Por qué molestarse en hacer esto?</h3>



<ul class="wp-block-list">
<li><strong>Saber si tu SSD (o HDD) está sano</strong>: Evitas perder datos por fallos silenciosos (bad blocks, sectores reasignados, desgaste excesivo).</li>



<li><strong>Medir rendimiento real</strong>: Muchos enclosures USB baratos limitan a 30-50 MB/s o caen a USB 2.0. Con UASP bien configurado, un SSD SATA puede volar a 300-400 MB/s en Pi 5.</li>



<li><strong>Detectar problemas de hardware</strong>: Chipset malo (Realtek vs ASMedia), alimentación inestable, cables defectuosos o quirks del kernel.</li>



<li><strong>Beneficios prácticos</strong>: Boot mucho más rápido que microSD, menos corrupción de filesystem, alertas tempranas si la vida del SSD baja, y tranquilidad total (sobre todo si usas el Pi 24/7).</li>
</ul>



<h3 class="wp-block-heading">1. Lista todos los dispositivos USB conectados.</h3>



<p class="wp-block-paragraph">En mi caso:</p>



<pre class="wp-block-code"><code>vigilante@raspberrypi:~ $ <strong>lsusb</strong>
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 05e3:0610 Genesys Logic, Inc. Hub
Bus 001 Device 003: ID 04d9:0006 Holtek Semiconductor, Inc. Wired Keyboard (78/79 key) &#91;RPI Wired Keyboard 5]
Bus 001 Device 004: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
<mark style="background-color:#fcb900" class="has-inline-color">Bus 004 Device 002: ID 14b0:0206 StarTech.com Ltd.  SA400S37240G</mark></code></pre>



<p class="wp-block-paragraph"><br>→ Identifica el VID:PID del adaptador (14b0:0206 es StarTech con chipset ASMedia ASM105x, de los mejores). Si ves Realtek (0bda:xxxx), ojo, pueden ser más problemáticos.</p>



<h3 class="wp-block-heading">2. Muestra el árbol USB con drivers y velocidades.</h3>



<pre class="wp-block-code"><code>vigilante@raspberrypi:~ $ <strong>lsusb -t</strong>
/:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci-hcd/2p, 480M
    |__ Port 002: Dev 002, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 001: Dev 003, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 001: Dev 003, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 002: Dev 004, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
/:  Bus 002.Port 001: Dev 001, Class=root_hub, Driver=xhci-hcd/1p, 5000M
/:  Bus 003.Port 001: Dev 001, Class=root_hub, Driver=xhci-hcd/2p, 480M
/:  Bus 004.Port 001: Dev 001, Class=root_hub, Driver=xhci-hcd/1p, 5000M
   <mark style="background-color:#fcb900" class="has-inline-color"> |__ Port 001: Dev 002, If 0, Class=Mass Storage, Driver=uas, 5000M</mark></code></pre>



<p class="wp-block-paragraph"><strong>Velocidades de transferencia:</strong> Al final de cada línea verás algo como <code>5000M</code> (5 Gbps/USB 3.0), <code>480M</code> (480 Mbps/USB 2.0) o incluso <code>10G</code> (USB 3.1 Gen 2).<br><strong>Drivers (Controladores):</strong> Te indica qué driver está gestionando el dispositivo (por ejemplo, <code>usb-storage</code> o el deseado <code>uas</code> para mayor velocidad en SSDs).</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">¡UASP activo! Esto es lo que queremos: bajo uso CPU, mejor rendimiento secuencial. Si ves «usb-storage» en vez de «uas», es más lento y usa más CPU.</p>
</blockquote>



<h3 class="wp-block-heading">3. Identifica el disco.</h3>



<p class="wp-block-paragraph">«Antes de tocar nada, necesitamos saber quién es quién. Usamos <strong>lsblk</strong> para ver de forma clara el modelo y tamaño de nuestros discos, y <strong>fdisk</strong> para confirmar los detalles técnicos y sectores del sistema. Es el primer paso para no equivocarnos de unidad al formatear o testear.»</p>



<p class="wp-block-paragraph"><strong><code>lsblk -o NAME,SIZE,TYPE,MODEL</code> (El DNI del disco)</strong></p>



<p class="wp-block-paragraph"><code>lsblk</code> significa <em>List Block Devices</em>. Es la forma más limpia y moderna de ver qué tienes conectado.</p>



<ul class="wp-block-list">
<li><strong>¿Para qué sirve?</strong> Para identificar rápidamente qué letra tiene tu disco (<code>sda</code>, <code>sdb</code>, etc.) y qué particiones hay dentro.</li>



<li><strong>¿Qué significan las opciones?</strong> Con <code>-o</code> le pedimos que solo nos muestre lo que nos interesa:
<ul class="wp-block-list">
<li><strong>NAME:</strong> El nombre técnico (ej. <code>sda</code>).</li>



<li><strong>SIZE:</strong> Cuánto espacio tiene.</li>



<li><strong>TYPE:</strong> Si es un disco entero (<code>disk</code>) o una partición (<code>part</code>).</li>



<li><strong>MODEL:</strong> La marca y modelo real (aquí es donde verás si tu SSD es un Kingston, un Samsung, etc.).</li>
</ul>
</li>



<li><strong>Ventaja:</strong> No necesita permisos de superusuario (<code>sudo</code>) y la salida es muy fácil de leer.</li>
</ul>



<pre class="wp-block-code"><code>vigilante@raspberrypi:~ $ <strong>lsblk -o NAME,SIZE,TYPE,MODEL</strong>
NAME     SIZE TYPE MODEL
loop0      2G loop 
<mark style="background-color:#fcb900" class="has-inline-color">sda    223,6G disk KINGSTON SA400S37240G</mark>
├─sda1   512M part 
└─sda2 223,1G part 
zram0      2G disk </code></pre>



<p class="wp-block-paragraph"><strong><code>sudo fdisk -l | grep -i disk</code> (La Radiografía técnica)</strong></p>



<p class="wp-block-paragraph"><code>fdisk</code> es una herramienta clásica y potente para manejar tablas de particiones.</p>



<ul class="wp-block-list">
<li><strong>¿Para qué sirve?</strong> Muestra detalles mucho más técnicos que <code>lsblk</code>, como el número exacto de sectores, el identificador del disco y el tamaño en bytes exactos.</li>



<li><strong>¿Por qué usamos el <code>grep -i disk</code>?</strong> Si lanzas <code>sudo fdisk -l</code> a secas, te saldrá una lista larguísima de todas las particiones, sectores de inicio, fin, etc. Al filtrar con <code>grep</code>, le decimos: «Solo enséñame las líneas que resuman la información de los discos físicos».</li>



<li><strong>Ventaja:</strong> Te da el tamaño exacto en bytes (útil para clonar discos) y te confirma si el disco tiene un esquema de particiones válido (GPT o DOS).</li>
</ul>



<pre class="wp-block-code"><code>vigilante@raspberrypi:~ $ <strong>sudo fdisk -l | grep -i disk</strong>
Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram1: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram2: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram3: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram4: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram5: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram6: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram7: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram8: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram9: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram10: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram11: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram12: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram13: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram14: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/ram15: 4 MiB, 4194304 bytes, 8192 sectors
Disk /dev/loop0: 2 GiB, 2147483648 bytes, 4194304 sectors
<mark style="background-color:#fcb900" class="has-inline-color">Disk /dev/sda: 223,57 GiB, 240057409536 bytes, 468862128 sectors
Disk model:  SA400S37240G   
Disklabel type: dos
Disk identifier: 0xc7a2c28e</mark>
Disk /dev/zram0: 2 GiB, 2147483648 bytes, 524288 sectors
</code></pre>



<p class="wp-block-paragraph">Esto confirma que /dev/sda es mi SSD (no la SD de boot ni zram).</p>



<h3 class="wp-block-heading">4<strong>. Instalar herramientas</strong>.</h3>



<pre class="wp-block-code"><code>   sudo apt update
   sudo apt install hdparm smartmontools</code></pre>



<p class="wp-block-paragraph">Las herramientas necesarias para la monitorio son:<br><code><strong>- hdparm</strong></code> para tests de velocidad<br><code><strong>- smartmontools </strong></code>para SMART (salud del disco).</p>



<h3 class="wp-block-heading">5. El Autodiagnóstico: Obligando al SSD a decir la verdad</h3>



<p class="wp-block-paragraph">A veces, un vendedor de segunda mano puede haber «reseteado» los contadores SMART o simplemente el disco aún no ha registrado un fallo que acaba de ocurrir. Para eso usamos el <strong>Short Self-Test</strong>.</p>



<p class="wp-block-paragraph">Ejecuta este comando para iniciar un chequeo instantáneo:</p>



<pre class="wp-block-code"><code>sudo smartctl -t short -d sat /dev/sda</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Nota:</strong> Este comando no te dará el resultado al instante. Solo le da la orden al disco y te devuelve el control de la terminal. Es como pedir cita en el médico: la orden está dada, pero el examen lleva su tiempo (normalmente 1 o 2 minutos).</p>
</blockquote>



<p class="wp-block-paragraph">Este comando es una buena opción para mirar los atributos, porque obliga al disco a trabajar en ese momento. Si hay un fallo físico inminente, el test se detendrá y te avisará. Es la forma más rápida de saber si el SSD que tienes en las manos es fiable.</p>



<p class="wp-block-paragraph"><strong>¿Cómo sé si ha terminado?</strong> Tienes que consultar el log después de que pase ese tiempo usando el comando: </p>



<pre class="wp-block-code"><code><code>sudo smartctl -l selftest -d sat /dev/sda</code></code></pre>



<p class="wp-block-paragraph">Este comando arroja sobre mi disco la siguiente información:</p>



<pre class="wp-block-code"><code>vigilante@raspberrypi:~ $ <strong>sudo smartctl -l selftest -d sat /dev/sda</strong>
smartctl 7.4 2023-08-01 r5530 &#91;aarch64-linux-6.12.62+rpt-rpi-2712] (local build)
Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed without error       00%      9098         -

</code></pre>



<p class="wp-block-paragraph">¿<strong>Cómo leer el log de autodiagnóstico? (Self-test)</strong></p>



<p class="wp-block-paragraph">Esto es lo que debes mirar:</p>



<ul class="wp-block-list">
<li><strong>Status: «Completed without error»</strong>. Esta es la clave. Significa que el disco ha analizado sus componentes internos, la electrónica y la superficie de las celdas de memoria y <strong>no ha encontrado fallos físicos</strong>.</li>



<li><strong>Remaining: «00%»</strong>. Indica que el test ha terminado por completo, si hay otro valor, espera y lanza el comando otra vez para ver si terminó.</li>



<li><strong>LifeTime(hours): «9098»</strong>. Es el momento exacto en la vida del disco en el que se hizo el test.</li>



<li><strong>LBA_of_first_error: «-«</strong>. Si aquí aparece un número, es la dirección del sector donde el disco ha fallado. Al aparecer un guion, confirmamos que el disco está limpio.</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Ese comando tiene dos variantes de test:<br><code><strong>- short</strong></code>: Tarda 1-2 minutos y revisa lo más crítico.<br><code>- <strong>long</strong></code>: Puede tardar 1 hora o más porque lee <strong>cada una</strong> de las celdas del disco. Para una compra de Wallapop, con el <code>short</code> suele ser suficiente, pero si el disco es muy grande y tienes tiempo, el <code>long</code> es la seguridad total.</p>
</blockquote>



<h4 class="wp-block-heading">5.1 Test de velocidad de escritura. (Test de Estrés)</h4>



<p class="wp-block-paragraph"><code>hdparm</code> mide lectura, pero los SSD fallan al <strong>escribir</strong>. Crea un archivo de prueba de 1GB para ver si la velocidad se mantiene estable:</p>



<pre class="wp-block-code"><code>dd if=/dev/zero of=./testfile bs=1G count=1 oflag=dsync</code></pre>



<ul class="wp-block-list">
<li><strong>Resultado OK:</strong> Velocidad constante (ej. 200-350 MB/s para SATA).</li>



<li><strong>Resultado sospechoso:</strong> Si empieza rápido y cae de golpe a <strong>15-20 MB/s</strong>, las celdas están muy castigadas.</li>
</ul>



<p class="wp-block-paragraph">Para mi caso:</p>



<pre class="wp-block-code"><code>vigilante@raspberrypi:~ $ <strong>dd if=/dev/zero of=./testfile bs=1G count=1 oflag=dsync</strong>
1+0 records in
1+0 records out
1073741824 bytes (1,1 GB, 1,0 GiB) copied, 4,03518 s, 266 MB/s</code></pre>



<p class="wp-block-paragraph">Resultado es <strong>excelente! </strong>, esos <strong>266 MB/s</strong> de escritura real (y con el flag <code>dsync</code>, que fuerza a que el dato se escriba físicamente antes de terminar) confirman que tu SSD y tu adaptador USB están trabajando a un nivel de rendimiento altísimo para una Raspberry Pi.</p>



<p class="wp-block-paragraph">Para un SSD SATA conectado por USB en una Raspberry Pi, es prácticamente el límite de lo que el hardware puede dar. Tienes un conjunto de disco y controladora muy sólido.</p>



<h4 class="wp-block-heading">5.2 Test de velocidad de lectura real (sin caché)</h4>



<p class="wp-block-paragraph">Mi resultado:</p>



<pre class="wp-block-code"><code>   vigilante@raspberrypi:~ $ <strong>sudo hdparm -t /dev/sda</strong>

/dev/sda:
 Timing buffered disk reads: 1026 MB in  3.02 seconds = 339.63 MB/sec</code></pre>



<p class="wp-block-paragraph">¡Brutal! para un SSD SATA en USB 3.0 en Pi 5. El Kingston A400 nativo hace ~500 MB/s, pero con overhead USB + enclosure, 340 MB/s es top. Si sale &lt;100 MB/s → problema (cable, chipset, alimentación, o sin UASP).</p>



<h3 class="wp-block-heading">6. ¿Soporta TRIM?</h3>



<p class="wp-block-paragraph">Si compras un pack de SSD + Carcasa USB, necesitas saber si el conjunto permite el comando <strong>TRIM</strong>. </p>



<p class="wp-block-paragraph">El soporte de TRIM depende tanto del disco como del adaptador usb-to-sata. Si uno de ellos no es compatible, el otro tampoco lo será.</p>



<p class="wp-block-paragraph">Compruébalo así:</p>



<pre class="wp-block-code"><code>vigilante@raspberrypi:~ $ <strong>lsblk --discard</strong>
NAME   DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
loop0         0        4K       4G         0
sda           0        0B       0B         0
├─sda1        0        0B       0B         0
└─sda2        0        0B       0B         0
zram0         0       16K       2T         0
</code></pre>



<p class="wp-block-paragraph">Fíjate en las columnas <code>DISC-ALN</code> y <code>DISC-MAX</code>. <strong>Si aparecen ceros</strong>, el adaptador USB no es compatible con TRIM o el SSD es muy antiguo. En una Pi, esto es clave para que el sistema no se degrade.</p>



<p class="wp-block-paragraph">Sin TRIM, la Raspberry Pi no podrá decirle al SSD qué bloques están libres, y con el tiempo el disco se volverá lento como una tortuga.</p>



<h3 class="wp-block-heading">7. Muestra TODA la info SMART.</h3>



<p class="wp-block-paragraph">A veces compras un disco en Aliexpress o en tiendas de segunda mano, te venden un «Samsung 870» metido en una carcasa genérica, pero dentro hay un disco chino de marca blanca.</p>



<p class="wp-block-paragraph">Existe un comando con dos variantes que nos dará una rápida o extensa información del disco</p>



<p class="wp-block-paragraph"><code>sudo smartctl -i -d sat /dev/sda</code> (Información de identidad)</p>



<p class="wp-block-paragraph">La <code>-i</code> viene de <strong>Info</strong>.</p>



<ul class="wp-block-list">
<li><strong>Qué hace:</strong> Solo te dice <strong>qué es</strong> el disco.</li>



<li><strong>Qué verás:</strong> Marca, modelo, número de serie, versión del firmware y si el SMART está activado o no.</li>



<li><strong>Cuándo usarlo:</strong> Cuando solo quieres confirmar que el disco que te han vendido es el modelo real y no un «cambiazo» (lo que hablábamos de Wallapop).</li>
</ul>



<p class="wp-block-paragraph"><code>sudo smartctl -a -d sat /dev/sda</code> (Análisis total)</p>



<p class="wp-block-paragraph">La <code>-a</code> viene de <strong>All</strong> (Todo).</p>



<ul class="wp-block-list">
<li><strong>Qué hace:</strong> Muestra <strong>todo</strong> lo que el disco sabe de sí mismo. Incluye la información de la <code>-i</code>, pero añade lo más importante:
<ul class="wp-block-list">
<li><strong>Atributos SMART:</strong> Los contadores de vida, horas de encendido, errores de lectura y los famosos sectores reasignados (ID 05/196).</li>



<li><strong>Resumen de Salud:</strong> El veredicto «PASSED» o «FAILED».</li>



<li><strong>Estadísticas de temperatura:</strong> Mínimas y máximas históricas.</li>
</ul>
</li>



<li><strong>Cuándo usarlo:</strong> Siempre que quieras diagnosticar o saber si el disco está sano.</li>
</ul>



<p class="wp-block-paragraph">Este comando nos dará un rápido resumen de la identidad real del disco:</p>



<pre class="wp-block-code"><code>vigilante@raspberrypi:~ $ <strong>sudo smartctl -i -d sat /dev/sda</strong>
smartctl 7.4 2023-08-01 r5530 &#91;aarch64-linux-6.12.62+rpt-rpi-2712] (local build)
Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Phison Driven SSDs
Device Model:     <mark style="background-color:#7bdcb5" class="has-inline-color">KINGSTON SA400S37240G</mark>
Serial Number:    60026B7785211E3B
LU WWN Device Id: 5 0026b7 785211e3b
Firmware Version: SBFKB1H5
User Capacity:    240.057.409.536 bytes &#91;240 GB]
Sector Size:      512 bytes logical/physical
Rotation Rate:    Solid State Device
TRIM Command:     Available
Device is:        In smartctl database 7.3/5528
ATA Version is:   ACS-3 T13/2161-D revision 4
SATA Version is:  SATA 3.2, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Fri Mar 13 18:05:54 2026 CET
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
</code></pre>



<p class="wp-block-paragraph">Mira donde pone <strong>Device Model</strong>. Si el vendedor dice que es un Kingston y el comando dice «Netac» o «KingSpec», te están intentando engañar.</p>



<p class="wp-block-paragraph">Si vas a quedar con alguien de Wallapop, llévate tu Raspberry Pi, un PowerBank y estos comandos anotados. En 5 minutos sabrás si el SSD es una ganga o una estafa.</p>



<p class="wp-block-paragraph">Veamos la información completa del disco (salud interna):</p>



<pre class="wp-block-code"><code>vigilante@raspberrypi:~ $ <strong>sudo smartctl -a -d sat /dev/sda</strong>
smartctl 7.4 2023-08-01 r5530 &#91;aarch64-linux-6.12.62+rpt-rpi-2712] (local build)
Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Phison Driven SSDs
Device Model:     KINGSTON SA400S37240G
Serial Number:    60026B7785211E3B
LU WWN Device Id: 5 0026b7 785211e3b
Firmware Version: SBFKB1H5
User Capacity:    240.057.409.536 bytes &#91;240 GB]
Sector Size:      512 bytes logical/physical
Rotation Rate:    Solid State Device
TRIM Command:     Available
Device is:        In smartctl database 7.3/5528
ATA Version is:   ACS-3 T13/2161-D revision 4
SATA Version is:  SATA 3.2, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Mon Mar  9 19:15:15 2026 CET
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: <mark style="background-color:#7bdcb5" class="has-inline-color">PASSED</mark>

General SMART Values:
Offline data collection status:  (0x00)	Offline data collection activity
					was never started.
					Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0)	The previous self-test routine completed
					without error or no self-test has ever 
					been run.
Total time to complete Offline 
data collection: 		(65535) seconds.
Offline data collection
capabilities: 			 (0x11) SMART execute Offline immediate.
					No Auto Offline data collection support.
					Suspend Offline collection upon new
					command.
					No Offline surface scan supported.
					Self-test supported.
					No Conveyance Self-test supported.
					No Selective Self-test supported.
SMART capabilities:            (0x0003)	Saves SMART data before entering
					power-saving mode.
					Supports SMART auto save timer.
Error logging capability:        (0x01)	Error logging supported.
					General Purpose Logging supported.
Short self-test routine 
recommended polling time: 	 (   1) minutes.
Extended self-test routine
recommended polling time: 	 (   2) minutes.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x0032   100   100   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       <mark style="background-color:#7bdcb5" class="has-inline-color">9090</mark>
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       154
148 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       0
149 Unknown_Attribute       0x0000   100   100   000    Old_age   Offline      -       0
167 Write_Protect_Mode      0x0000   100   100   000    Old_age   Offline      -       0
168 SATA_Phy_Error_Count    0x0012   100   100   000    Old_age   Always       -       0
169 Bad_Block_Rate          0x0000   100   100   000    Old_age   Offline      -       17
170 Bad_Blk_Ct_Lat/Erl      0x0000   100   100   010    Old_age   Offline      -       0/12
172 Erase_Fail_Count        0x0032   100   100   000    Old_age   Always       -       0
173 MaxAvgErase_Ct          0x0000   100   100   000    Old_age   Offline      -       67 (Average 51)
181 Program_Fail_Count      0x0032   100   100   000    Old_age   Always       -       0
182 Erase_Fail_Count        0x0000   100   100   000    Old_age   Offline      -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
192 Unsafe_Shutdown_Count   0x0012   100   100   000    Old_age   Always       -       <mark style="background-color:#7bdcb5" class="has-inline-color">149</mark>
194 Temperature_Celsius     0x0022   024   048   000    Old_age   Always       -       <mark style="background-color:#7bdcb5" class="has-inline-color">24</mark> (Min/Max 17/48)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       <mark style="background-color:#7bdcb5" class="has-inline-color">0</mark>
199 SATA_CRC_Error_Count    0x0032   100   100   000    Old_age   Always       -       0
218 CRC_Error_Count         0x0032   100   100   000    Old_age   Always       -       0
231 SSD_Life_Left           0x0000   094   094   000    Old_age   Offline      -       <mark style="background-color:#7bdcb5" class="has-inline-color">94</mark>
233 Flash_Writes_GiB        0x0032   100   100   000    Old_age   Always       -       7476
241 Lifetime_Writes_GiB     0x0032   100   100   000    Old_age   Always       -       <mark style="background-color:#7bdcb5" class="has-inline-color">4094</mark>
242 Lifetime_Reads_GiB      0x0032   100   100   000    Old_age   Always       -       11006
244 Average_Erase_Count     0x0000   100   100   000    Old_age   Offline      -       51
245 Max_Erase_Count         0x0000   100   100   000    Old_age   Offline      -       67
246 Total_Erase_Count       0x0000   100   100   000    Old_age   Offline      -       392144

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
No self-tests have been logged.  &#91;To run self-tests, use: smartctl -t]

Selective Self-tests/Logging not supported

The above only provides legacy SMART information - try 'smartctl -x' for more

</code></pre>



<p class="wp-block-paragraph">Lo más interesante de mi disco</p>



<ul class="wp-block-list">
<li><strong>Overall-health self-assessment test result: PASSED</strong> → Perfecto.</li>



<li>9 &#8211; <strong>Power_On_Hours: 9090</strong> (~1 año encendido).</li>



<li>192 &#8211; <strong>Unsafe_Shutdown_Count: 149</strong> → Apagados bruscos (lo solucioné con el SAI + NUT del post anterior).</li>



<li>196 &#8211; <strong>Reallocated_Event_Count: 0</strong> → Ningún sector malo reasignado.</li>



<li>231 &#8211; <strong>SSD_Life_Left: 94%</strong> → Aún le queda 94% de vida (TBW ~80 TB, yo ~4 TB escritos).</li>



<li>194 &#8211; <strong>Temperature_Celsius: 24 (Max 48)</strong> → Fresco.</li>



<li>169 &#8211; <strong>Bad_Block_Rate : 17</strong> → indica el porcentaje de bloques que salieron defectuosos de fábrica o se han marcado como malos.</li>



<li>241 &#8211; <strong>Lifetime_Writes_GiB: 4094</strong> (~4.1 TB escritos). El bridge USB (StarTech) pasa SMART completo → gran ventaja vs enclosures baratos que lo truncan.</li>
</ul>



<h3 class="wp-block-heading">¿Qué aprendí y recomendaciones?</h3>



<ul class="wp-block-list">
<li>Mi combo <strong>Kingston A400 240GB + enclosure StarTech (ASMedia UAS)</strong> es ganador: rápido, estable, SMART full y salud excelente.</li>



<li>Si usas SSD USB en Pi → <strong>prioriza chipsets ASMedia</strong> (ASM1153/1053), evita Realtek baratos si puedes.</li>



<li>Alimentación: Usa powered hub o fuente externa para HDD/SSD grandes.</li>



<li>Monitorea periódicamente: Pon un cron mensual con <code>smartctl -a</code> y alerta por Telegram si vida &lt;80% o temp &gt;55°C.</li>



<li>Beneficio final: Boot Pi en 10-15s vs 30-60s en microSD, apps más fluidas, menos corrupción, y sabes exactamente cómo está tu hardware.</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> El aviso de «Sectores Reasignados»<br>Dependiendo de la marca de tu SSD, este valor puede llamarse de varias formas. Es el contador de sectores que han muerto y que el disco ha tenido que sustituir por otros de «reserva»:<br><strong>En la mayoría (Samsung, Crucial, etc):</strong> Busca el <strong>ID 05</strong> (<em>Reallocated Sector Count</em>).<br><strong>En discos como el mío (Kingston/Phison):</strong> Busca el <strong>ID 196</strong> (<em>Reallocated Event Count</em>).<br><strong>Lo importante:</strong> En la columna <code>RAW_VALUE</code>, el número debe ser <strong>0</strong>. Si ves un 10, un 50 o un 100, ese disco está empezando a morir físicamente. ¡No lo compres!</li>



<li>El <strong>ID 169 (Bad_Block_Rate)</strong>. Este es otro chivato muy bueno, Mi valor es <code>17</code>. En muchos SSD de gama media/baja, esto indica el porcentaje de bloques que salieron defectuosos de fábrica o se han marcado como malos. Mientras el <strong>ID 196</strong> esté en <strong>0</strong>, el disco ha gestionado bien esos fallos, pero si ese número sube de repente, mala señal.</li>
</ul>



<p class="wp-block-paragraph">Si estás montando un NAS, media center o server casero con Raspberry Pi, <strong>haz estos tests YA</strong>. Te ahorras disgustos y descubres si tu setup vuela o cojea.</p>



<p class="wp-block-paragraph">¿Has probado boot desde SSD USB? ¿Qué velocidades te salen? ¡Cuéntame en comentarios! <br><br>Próximo post: script para alertas automáticas de SMART por Telegram.</p>



<p class="wp-block-paragraph">¡Un saludo, linuxetes! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f527.png" alt="🔧" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxete.duckdns.org/como-diagnosticar-y-optimizar-un-ssd-usb-en-raspberry-pi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo apagar de forma coordinada tus equipos en red.</title>
		<link>https://linuxete.duckdns.org/como-apagar-de-forma-coordinada-tus-equipos-en-red/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=como-apagar-de-forma-coordinada-tus-equipos-en-red</link>
					<comments>https://linuxete.duckdns.org/como-apagar-de-forma-coordinada-tus-equipos-en-red/#respond</comments>
		
		<dc:creator><![CDATA[raspberry]]></dc:creator>
		<pubDate>Mon, 09 Mar 2026 22:06:36 +0000</pubDate>
				<category><![CDATA[Sistema]]></category>
		<category><![CDATA[Bash Scripting]]></category>
		<category><![CDATA[Monitorización SAI]]></category>
		<category><![CDATA[NUT (Network UPS Tools)]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Salicru]]></category>
		<category><![CDATA[Telegram Bot]]></category>
		<guid isPermaLink="false">https://linuxete.duckdns.org/?p=3986</guid>

					<description><![CDATA[En el artículo anterior, Cómo monitorizar un SAI Salicru con Raspberry Pi Zero. logramos que nuestra Raspberry Pi Zero se comunicara con nuestro SAI Salicru y nos avisara por Telegram de cualquier incidencia eléctrica. Pero, ¿qué pasa con el resto de equipos de la casa? Si tienes un PC potente para gaming, un servidor con [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En el artículo anterior, <a href="https://linuxete.duckdns.org/como-monitorizar-un-sai-salicru-con-raspberry-pi-zero/">Cómo monitorizar un SAI Salicru con Raspberry Pi Zero.</a> logramos que nuestra <strong>Raspberry Pi Zero</strong> se comunicara con nuestro SAI Salicru y nos avisara por Telegram de cualquier incidencia eléctrica. Pero, ¿qué pasa con el resto de equipos de la casa? Si tienes un PC potente para gaming, un servidor con un i7 o incluso otra Raspberry Pi 5 realizando tareas críticas, dejarlos a su suerte durante un apagón no es una opción.</p>



<p class="wp-block-paragraph">La verdadera magia de <strong>NUT (Network UPS Tools)</strong> reside en su arquitectura Maestro-Esclavo. En esta guía, vamos a configurar nuestra infraestructura para que la Raspberry Pi Zero actúe como el «cerebro» central (Master). Ella será la encargada de monitorizar el USB del SAI y, en caso de batería baja, enviará una orden de apagado por red a todos los demás equipos (Slaves) de tu hogar.</p>



<p class="wp-block-paragraph">Al finalizar esta configuración, habrás creado una <strong>red de seguridad inteligente</strong> donde:</p>



<ul class="wp-block-list">
<li><strong>La comunicación es total</strong>: Tus PCs con Windows y Linux «escucharán» a la pequeña Pi Zero.</li>



<li><strong>El apagado es elegante</strong>: Cada equipo cerrará sus procesos y protegerá sus discos antes de que el SAI corte la energía.</li>



<li><strong>Tú mantienes el control</strong>: Seguirás recibiendo los reportes detallados en Telegram mientras tus equipos se ponen a salvo automáticamente.</li>
</ul>



<p class="wp-block-paragraph">Prepárate para convertir tu modesta Raspberry Pi Zero en el guardián de toda la electrónica de tu despacho. ¡Vamos a ello!</p>



<h2 class="wp-block-heading">1. Configuración en la Raspberry Pi Zero (El Maestro)</h2>



<p class="wp-block-paragraph">Para expandir tu red de protección y que tu <strong>Raspberry Pi 5</strong> y tus otros PCs (i7, i5) se apaguen de forma coordinada, vamos a configurar una arquitectura <strong>Maestro-Esclavo</strong> (o Primario-Secundario).</p>



<p class="wp-block-paragraph">Tu <strong>Pi Zero</strong> seguirá siendo el «Cerebro» (Master) porque tiene el cable USB, y los demás serán «Clientes» (Slaves) que escuchan por red.</p>



<p class="wp-block-paragraph">Primero debemos autorizar a la Pi Zero a hablar con el resto de la casa.</p>



<h3 class="wp-block-heading">A. Abrir la escucha de red</h3>



<p class="wp-block-paragraph">Edita el archivo de configuración del servidor:</p>



<pre class="wp-block-code"><code><code>sudo nano /etc/nut/upsd.conf</code></code></pre>



<p class="wp-block-paragraph">Sustituye tus líneas <code>LISTEN</code> por esta (es la más compatible):</p>



<pre class="wp-block-code"><code>LISTEN 0.0.0.0 3493</code></pre>



<p class="wp-block-paragraph"><em>Esto permite que la Pi Zero responda tanto a su propio script de Telegram como a los PCs externos.</em></p>



<h3 class="wp-block-heading">B. Crear el usuario para los esclavos</h3>



<p class="wp-block-paragraph">Edita el archivo de usuarios:</p>



<pre class="wp-block-code"><code><code>sudo nano /etc/nut/upsd.users</code></code></pre>



<p class="wp-block-paragraph">Añade este perfil al final (usa una contraseña distinta a la de admin):</p>



<pre class="wp-block-code"><code>&#91;remotemon]
    password = <mark style="background-color:#fcb900" class="has-inline-color">clave_red_segura</mark>
    upsmon slave
</code></pre>



<p class="wp-block-paragraph">Reinicia los servicios para aplicar los cambios:</p>



<pre class="wp-block-code"><code><code>sudo systemctl restart nut-server nut-monitor</code></code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Recuerda poner una IP fija a tu Raspberry pi zero</strong></p>
</blockquote>



<h2 class="wp-block-heading">2. Configuración de NUT Cliente en Debian 13</h2>



<p class="wp-block-paragraph">Con  nuestro servidor NUT funcionando, el siguiente paso es conectar tus PCs «esclavos» para que se apaguen de forma segura cuando la batería del SAI se agote.</p>



<p class="wp-block-paragraph">En <strong>Debian 13</strong>, la instalación estándar de <code>nut-client</code> suele fallar por cambios en el sistema de permisos y rutas de archivos. En esta guía vamos a limpiar los conflictos y aplicar un «parche maestro» para que funcione a la primera.</p>



<p class="wp-block-paragraph">Antes de empezar, debemos asegurarnos de que no existan servicios antiguos o duplicados que bloqueen a <code>nut-monitor</code>. En instalaciones de Debian, a veces aparece un archivo llamado <code>upsmon.service</code> que genera conflictos de prioridad.</p>



<h3 class="wp-block-heading">Limpieza de conflictos previos</h3>



<p class="wp-block-paragraph">Ejecuta estos comandos para limpiar el terreno:</p>



<pre class="wp-block-code"><code># Detenemos y deshabilitamos el servicio antiguo si existe
sudo systemctl stop upsmon.service 2&gt;/dev/null
sudo systemctl disable upsmon.service 2&gt;/dev/null

# Borramos el archivo duplicado para que systemd no se confunda
sudo rm -f /etc/systemd/system/upsmon.service

# Refrescamos la base de datos de servicios
sudo systemctl daemon-reload</code></pre>



<p class="wp-block-paragraph">Un par de aclaraciones.</p>



<ol start="1" class="wp-block-list">
<li><strong><code>nut-monitor.service</code></strong> es el nombre oficial y moderno en Debian 13.</li>



<li><strong><code>upsmon.service</code></strong> es un alias o un residuo de versiones anteriores. Si ambos existen como archivos físicos en <code>/etc/systemd/system/</code>, <code>systemd</code> puede intentar arrancar los dos, chocando al intentar escribir en el mismo archivo de bloqueo (PID), lo que hace que el servicio se apague en milisegundos (el error que te pasaba a ti).</li>
</ol>



<p class="wp-block-paragraph">El siguiente paso es configurar tus otros PCs (esclavos) para que se apaguen de forma segura. En Debian 13, el proceso tiene sus «trucos». Aquí tienes cómo hacerlo funcionar a la primera.</p>



<h3 class="wp-block-heading">Instalación del Cliente</h3>



<p class="wp-block-paragraph">Lo primero es instalar las herramientas necesarias en el PC que queremos proteger:</p>



<pre class="wp-block-code"><code>sudo apt update
sudo apt install nut-client -y</code></pre>



<h3 class="wp-block-heading">Configuración del Modo</h3>



<p class="wp-block-paragraph">Debemos decirle a NUT que este equipo no tiene un SAI conectado por USB, sino que va a escuchar a través de la red.</p>



<p class="wp-block-paragraph">Edita el archivo: <code>sudo nano /etc/nut/nut.conf</code></p>



<p class="wp-block-paragraph">Modifica la línea del modo para que quede exactamente así:</p>



<pre class="wp-block-code"><code>MODE=netclient</code></pre>



<h3 class="wp-block-heading">Configuración del Monitor (<code>upsmon.conf</code>)</h3>



<p class="wp-block-paragraph">Este es el archivo donde ocurre la «magia». Aquí le decimos a qué servidor mirar.</p>



<p class="wp-block-paragraph">Edita el archivo: <code>sudo nano /etc/nut/upsmon.conf</code></p>



<p class="wp-block-paragraph">Añade (o modifica) la línea <code>MONITOR</code> con los datos de tu servidor:</p>



<pre class="wp-block-code"><code>MONITOR salicru@192.168.1.14 1 remotemon <mark style="background-color:#fcb900" class="has-inline-color">clave_red_segura</mark> slave</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Nota:</strong> Sustituye la IP por la de tu servidor NUT y asegúrate de que el usuario (<code>remotemon</code>) y la contraseña coincidan con los del archivo <code>upsd.users</code> del servidor.</p>
</blockquote>



<h3 class="wp-block-heading">El «Parche Maestro» para Debian 13</h3>



<p class="wp-block-paragraph">En Debian 13, el servicio estándar suele fallar debido a un script intermedio (<em>wrapper</em>) y a restricciones de permisos en la carpeta temporal <code>/run/nut</code>. Para solucionarlo, usaremos un <strong>Override</strong> de Systemd.</p>



<p class="wp-block-paragraph"><strong>Paso A: Crear la carpeta de personalización</strong></p>



<pre class="wp-block-code"><code>sudo mkdir -p /etc/systemd/system/nut-monitor.service.d</code></pre>



<p class="wp-block-paragraph"><strong>Paso B: Crear el archivo de corrección</strong></p>



<pre class="wp-block-code"><code>sudo nano /etc/systemd/system/nut-monitor.service.d/override.conf</code></pre>



<p class="wp-block-paragraph"><strong>Paso C: Pegar el siguiente contenido</strong> (esto anula los errores de fábrica y apunta al binario real):</p>



<pre class="wp-block-code"><code>&#91;Service]
ExecStartPre=
ExecStart=
ExecStart=/lib/nut/upsmon -F
RuntimeDirectory=nut
RuntimeDirectoryMode=0755
User=root
Group=nut</code></pre>



<h3 class="wp-block-heading">Aplicar cambios y Arrancar</h3>



<p class="wp-block-paragraph">Ahora solo queda refrescar el sistema y poner en marcha el monitor:</p>



<pre class="wp-block-code"><code>sudo systemctl daemon-reload
sudo systemctl enable nut-monitor
sudo systemctl restart nut-monitor</code></pre>



<h3 class="wp-block-heading">Verificación final</h3>



<p class="wp-block-paragraph">Para estar seguros de que todo funciona, ejecutamos:</p>



<pre class="wp-block-code"><code>sudo systemctl status nut-monitor</code></pre>



<p class="wp-block-paragraph">Si ves un texto en <strong>verde (active/running)</strong>, ¡lo has logrado!</p>



<p class="wp-block-paragraph">También puedes probar la conexión directa con este comando:</p>



<pre class="wp-block-code"><code>upsc salicru@192.168.1.14 ups.status</code></pre>



<p class="wp-block-paragraph">Si responde <strong><code>OL</code></strong>, tu PC está oficialmente bajo la protección del SAI.</p>



<h3 class="wp-block-heading">«Saber más»</h3>



<ul class="wp-block-list">
<li><strong>El Binario Real:</strong> En Debian 13, <code>/usr/sbin/upsmon</code> es solo un script. Al usar <code>/lib/nut/upsmon</code>, evitamos fallos silenciosos.</li>



<li><strong>RuntimeDirectory:</strong> Es la forma moderna de gestionar la carpeta <code>/run/nut</code> sin pelearse con permisos de archivos manuales.</li>



<li><strong>Seguridad:</strong> El uso de <code>override.conf</code> permite que, si actualizas el sistema, tus cambios no se borren.</li>
</ul>



<h2 class="wp-block-heading">3. Configuración en PCs con Windows (i7 / i5)</h2>



<p class="wp-block-paragraph">Si alguno de tus PCs usa Windows, no necesitas scripts complejos:</p>



<ol start="1" class="wp-block-list">
<li><strong>Descarga e instala</strong> <a href="https://www.google.com/search?q=https://github.com/gavandre/WinNUT-Client/releases" target="_blank" rel="noreferrer noopener">WinNUT-Client</a>.</li>



<li><strong>Configura la conexión:</strong>
<ul class="wp-block-list">
<li><strong>UPS Name:</strong> <code>salicru</code></li>



<li><strong>UPS Host:</strong> <code>192.168.1.14</code> (IP de la Pi Zero)</li>



<li><strong>Port:</strong> <code>3493</code></li>



<li><strong>Username:</strong> <code>esclavo</code></li>



<li><strong>Password:</strong> <code><mark style="background-color:#7bdcb5" class="has-inline-color">clave_red_segura</mark></code></li>
</ul>
</li>



<li><strong>Calibración:</strong> En la pestaña «Shutdown», elige cuánto tiempo quieres que pase desde que se corta la luz hasta que el PC se apague.</li>
</ol>



<h2 class="wp-block-heading">¿Cómo funcionará el apagado en cadena?</h2>



<p class="wp-block-paragraph">Es importante entender la jerarquía para que nadie pierda datos:</p>



<ol start="1" class="wp-block-list">
<li><strong>Corte de luz:</strong> La Pi Zero avisa por <strong>Telegram</strong> al instante.</li>



<li><strong>Batería Baja:</strong> Cuando la Pi Zero detecta que queda poca energía, envía la señal de «Pánico» por red a los demás equipos</li>



<li><strong>Apagado de Esclavos:</strong> El resto de equipos reciben la orden y se apagan de inmediato para proteger sus discos.</li>



<li><strong>Apagado del Maestro:</strong> La Pi Zero espera a que los esclavos se desconecten. Una vez sola, inicia su propio apagado.</li>



<li><strong>Corte Total:</strong> En el último segundo, la Pi Zero le dice al Salicru: <em>«Apágate en 30 segundos»</em>.</li>
</ol>



<p class="wp-block-paragraph">Ahora tus equipos están protegidos y más seguros ante la pérdida de datos.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxete.duckdns.org/como-apagar-de-forma-coordinada-tus-equipos-en-red/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo monitorizar un SAI Salicru con Raspberry Pi Zero.</title>
		<link>https://linuxete.duckdns.org/como-monitorizar-un-sai-salicru-con-raspberry-pi-zero/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=como-monitorizar-un-sai-salicru-con-raspberry-pi-zero</link>
					<comments>https://linuxete.duckdns.org/como-monitorizar-un-sai-salicru-con-raspberry-pi-zero/#respond</comments>
		
		<dc:creator><![CDATA[raspberry]]></dc:creator>
		<pubDate>Sat, 07 Mar 2026 21:25:49 +0000</pubDate>
				<category><![CDATA[Sistema]]></category>
		<category><![CDATA[Bash Scripting]]></category>
		<category><![CDATA[Monitorización SAI]]></category>
		<category><![CDATA[NUT (Network UPS Tools)]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Salicru]]></category>
		<category><![CDATA[Telegram Bot]]></category>
		<guid isPermaLink="false">https://linuxete.duckdns.org/?p=3902</guid>

					<description><![CDATA[En cualquier infraestructura doméstica o profesional, el SAI (Sistema de Alimentación Ininterrumpida) es el guardián silencioso que protege nuestros equipos. Sin embargo, un SAI solo es realmente útil si sabemos exactamente qué está pasando con él en tiempo real. En este artículo, vamos a configurar un sistema de alertas avanzado utilizando una Raspberry Pi y [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En cualquier infraestructura doméstica o profesional, el <strong>SAI (Sistema de Alimentación Ininterrumpida)</strong> es el guardián silencioso que protege nuestros equipos. Sin embargo, un SAI solo es realmente útil si sabemos exactamente qué está pasando con él en tiempo real.</p>



<p class="wp-block-paragraph">En este artículo, vamos a configurar un sistema de alertas avanzado utilizando una <strong>Raspberry Pi</strong> y el software <strong>NUT (Network UPS Tools)</strong> para convertir un SAI Salicru convencional en un dispositivo inteligente y conectado.</p>



<p class="wp-block-paragraph">El objetivo es automatizar el control total de nuestra energía mediante un <strong>Bot de Telegram</strong> que nos mantendrá informados con mensajes detallados y visuales. Al finalizar este tutorial, tu sistema será capaz de:</p>



<ul class="wp-block-list">
<li><strong>Notificar cortes y restablecimientos</strong> de corriente de forma instantánea.</li>



<li><strong>Enviar reportes detallados</strong> con voltajes de entrada, salida y estado de la batería.</li>



<li><strong>Gestionar estados críticos</strong> como el nivel de batería bajo o la necesidad de sustitución de celdas (<code>REPLBATT</code>).</li>



<li><strong>Proteger tu hardware</strong>, avisándote justo antes de que la Raspberry Pi realice un apagado controlado para evitar daños en la tarjeta SD.</li>
</ul>



<p class="wp-block-paragraph">Todo esto mediante un script optimizado que garantiza que la información que recibes en tu móvil es <strong>veraz y estable</strong>, permitiéndote tomar decisiones informadas estés donde estés.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Sistema</h2>



<p class="wp-block-paragraph">Como sistema operativo voy utilizar Rasbperry Pi OS lite 64bits, basado en Debian 13. El usuario del sistema será <code><strong>nut</strong></code> y el host será <code><strong>zero</strong></code>.</p>



<h2 class="wp-block-heading">Materiales necesarios</h2>



<ul class="wp-block-list">
<li><a href="https://www.tiendatec.es/raspberry-pi/gama-raspberry-pi/1735-raspberry-pi-zero-2-w.html">RASPBERRY PI ZERO 2W &#8211; 2WH (Versión: W (WiFi))</a></li>



<li><a href="https://www.amazon.es/Salicru-SPS-1200-Soho-Sistema-alimentaci%C3%B3n-ininterrumpida/dp/B079FX7WR7?th=1">Un SAI Salicru con puerto USB (Serie SOHO+ o similar).</a></li>



<li><a href="https://www.tiendatec.es/raspberry-pi/accesorios/1298-cable-otg-micro-usb-m-usb-a-h-negro-8472496017336.html">CABLE OTG MICROUSB/M USB-A/H NEGRO</a></li>



<li><a href="https://www.tiendatec.es/raspberry-pi/raspberry-pi-alimentacion/1734-alimentador-oficial-raspberry-pi-micro-usb-5-1v-2-5a-12-75w-5056561801315.html">ALIMENTADOR OFICIAL RASPBERRY PI MICRO-USB 5,1V 2,5A 12,75W</a></li>



<li><a href="https://www.tiendatec.es/raspberry-pi/cajas/678-caja-oficial-raspberry-pi-zero-8406780080003.html">CAJA OFICIAL RASPBERRY PI ZERO</a></li>



<li><a href="https://www.tiendatec.es/maker-zone/cables/1998-cable-usb-a-a-usb-b-m-m-azul-30cm-8472496023658.html">CABLE USB-A A USB-B M/M AZUL 30CM</a></li>
</ul>



<h2 class="wp-block-heading">Instalación de NUT</h2>



<p class="wp-block-paragraph">Actualizamos la lista de repositorios e instalamos los paquetes oportunos.</p>



<pre class="wp-block-code"><code>sudo apt update &amp;&amp; sudo apt install nut nut-client nut-server curl bc -y</code></pre>



<h2 class="wp-block-heading">Configuración del hardware.</h2>



<p class="wp-block-paragraph">Según el modelo de SAI, <code>nut</code> puede manejar distintos tipos de driver. Antes de configurar el archivo <code>ups.conf</code> conecta el cable USB de la PI al  SAI y ejecuta este comando:</p>



<pre class="wp-block-code"><code>sudo nut-scanner -U</code></pre>



<p class="wp-block-paragraph">Este comando escaneará los buses USB y te dirá exactamente qué driver recomienda NUT para tu dispositivo específico.</p>



<pre class="wp-block-code"><code>nut@zero:~ $ <strong>sudo nut-scanner -U</strong>
Cannot load SNMP library (libnetsnmp.so.40) : file not found. SNMP search disabled.
Cannot load XML library (libneon.so.27) : file not found. XML search disabled.
Cannot load AVAHI library (libavahi-client.so.3) : file not found. AVAHI search disabled.
Cannot load IPMI library (libfreeipmi.so.17) : file not found. IPMI search disabled.
Scanning USB bus.
&#91;nutdev1]
	driver = "<mark style="background-color:#fcb900" class="has-inline-color">nutdrv_qx</mark>"
	port = "auto"
	vendorid = "0665"
	productid = "5161"
	product = "USB to Serial"
	vendor = "Cypress Semiconductor"
	bus = "001"
	device = "002"
	busport = "001"
	###NOTMATCHED-YET###bcdDevice = "0002"</code></pre>



<p class="wp-block-paragraph">Observa que el driver recomendado es «<code>nutdrv_qx</code>«.</p>



<h3 class="wp-block-heading">Archivos de configuración de NUT</h3>



<p class="wp-block-paragraph">Define el driver, editando el siguiente archivo.<code> </code></p>



<pre class="wp-block-code"><code>sudo nano /etc/nut/ups.conf</code></pre>



<p class="wp-block-paragraph">Al comienzo del archivo, pega lo siguiente.</p>



<pre class="wp-block-code"><code>&#91;salicru]
    driver = nutdrv_qx
    port = auto
    vendorid = 0665
    productid = 5161
    vendor = "Cypress Semiconductor"
    product = "USB to Serial"
    desc = "Salicru SOHO 2000"</code></pre>



<p class="wp-block-paragraph">En ese mismo archivo busca la línea <code>maxretry = 3</code> comentala y déjala así.</p>



<pre class="wp-block-code"><code>#maxretry = 3</code></pre>



<p class="wp-block-paragraph">Guarda con <code>Crtl + o</code> y cierra con <code>Crtl + x</code></p>



<p class="wp-block-paragraph">Configura el modo editando el siguiente archivo.</p>



<pre class="wp-block-code"><code>sudo nano /etc/nut/nut.conf </code></pre>



<p class="wp-block-paragraph">Busca la línea MODE, cambia la línea a standalone.</p>



<pre class="wp-block-code"><code><code>MODE=standalone</code></code></pre>



<h3 class="wp-block-heading">Configurar el acceso (upsd.conf)</h3>



<p class="wp-block-paragraph">Una vez que el driver está leyendo los datos del USB, necesitamos que el «servidor de NUT» (<code>upsd</code>) recoja esa información y la deje disponible para resto de equipos y otros programas (como nuestro script de Telegram o el comando <code>upsc</code>) puedan consultarla.</p>



<p class="wp-block-paragraph">Para ello, editamos el archivo de configuración del demonio:</p>



<pre class="wp-block-code"><code>sudo nano /etc/nut/upsd.conf</code></pre>



<p class="wp-block-paragraph">Este archivo suele tener lineas que apuntan al localhost como las que vemos a continuación.</p>



<pre class="wp-block-code"><code>LISTEN 127.0.0.1 3493
LISTEN ::1 3493</code></pre>



<p class="wp-block-paragraph">Si las tienes, borralas y deja solo una línea <code>LISTEN</code> tal y como queda en la siguiente instrucción.</p>



<pre class="wp-block-code"><code>LISTEN 0.0.0.0 3493</code></pre>



<p class="wp-block-paragraph">El <code>0.0.0.0</code> sirve para que los demás equipos vean a la Pi Zero.</p>



<p class="wp-block-paragraph">«Por seguridad, NUT viene configurado para ser &#8216;tímido&#8217; (127.0.0.1) y solo hablar consigo mismo. Al cambiarlo a <code>0.0.0.0</code>, convertimos a nuestra Raspberry Pi Zero en un <strong>Faro de Energía</strong>: ahora cualquier equipo de nuestra red local puede ver el estado del SAI y saber cuándo debe ponerse a salvo.»</p>



<h4 class="wp-block-heading">¿Qué hace exactamente <code>LISTEN 0.0.0.0</code>?</h4>



<p class="wp-block-paragraph">Cuando configuras <code>LISTEN 0.0.0.0</code> en el archivo <code>upsd.conf</code> de la <strong>Pi Zero</strong>, le estás diciendo al servidor NUT: <em>«No te escondas; acepta preguntas de cualquier dirección IP que llegue a esta Raspberry»</em>.</p>



<ul class="wp-block-list">
<li><strong>Sin el 0.0.0.0 (solo con 127.0.0.1):</strong> La Pi Zero está «sorda» a lo que venga de fuera. Tus equipos intentarán llamarla por red, pero ella no responderá porque solo escucha sus propios pensamientos internos (localhost).</li>



<li><strong>Con el 0.0.0.0:</strong> La Pi Zero abre sus «oídos» a toda la red local. Ahora, cuando el i7 pregunte: <em>«¿Cómo va la batería?»</em>, la Pi Zero podrá escucharlo y responderle con los datos del Salicru.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading">¿Cómo «ve» la Pi Zero a los demás?</h4>



<p class="wp-block-paragraph">Curiosamente, la Pi Zero <strong>no necesita «ver» activamente</strong> a los demás equipos para protegerlos. Funciona al revés:</p>



<ol start="1" class="wp-block-list">
<li>La Pi Zero (Maestro) simplemente publica la información del SAI en la red.</li>



<li>Los demás equipos (Esclavos como la Pi 5 o el i7) se conectan a ella constantemente para «leer» esa información.</li>



<li>En el momento en que la Pi Zero detecta batería baja, cambia su estado a <code>FSD</code> (Forced Shutdown).</li>



<li>Los esclavos, que están vigilando ese estado cada pocos segundos, ven el cambio y deciden apagarse por su cuenta.</li>
</ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Configurar <code>0.0.0.0</code> es como abrir la ventanilla de información de la Pi Zero al resto de la casa. Permite que tus PCs potentes se conviertan en «clientes» que consultan el estado del SAI a través de la red WiFi o Ethernet.</p>
</blockquote>



<h4 class="wp-block-heading">¿<code>127.0.0.1</code> vs <code>0.0.0.0</code>? Entendiendo la «Escucha» de Red</h4>



<p class="wp-block-paragraph">Para que tu estrategia de apagado coordinado funcione, es vital entender qué dirección IP debe usar el servidor NUT. Aquí tienes la comparativa de lo que sucede en tu Raspberry Pi Zero:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td>Configuración (<code>LISTEN</code>)</td><td>Alcance</td><td>Seguridad</td><td>¿Cuándo usarla?</td></tr></thead><tbody><tr><td><strong><code>127.0.0.1</code></strong> (Localhost)</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f512.png" alt="🔒" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Solo Interno</strong>. La Pi Zero solo se habla a sí misma.</td><td>Máxima. Nadie fuera de la Pi puede ver los datos.</td><td>Cuando solo quieres recibir avisos por Telegram desde esa Raspberry.</td></tr><tr><td><strong><code>0.0.0.0</code></strong> (Todas las IPs)</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f30d.png" alt="🌍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Toda la Red</strong>. La Pi Zero se vuelve visible para el i7, la Pi 5 y el resto de PCs.</td><td>Media. Requiere usar contraseñas en <code>upsd.users</code>.</td><td><strong>Obligatorio</strong> para apagar otros equipos de casa por red.</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Crear la regla de permisos (udev)</h2>



<p class="wp-block-paragraph">La regla de <strong>udev</strong> es la forma que tiene Linux (en este caso tu Raspberry Pi con Debian) de gestionar los dispositivos que conectas físicamente a los puertos.</p>



<p class="wp-block-paragraph">Para crear la regla, abre el editor nano con el siguiente comando.</p>



<pre class="wp-block-code"><code>sudo nano /etc/udev/rules.d/99-nut-ups.rules</code></pre>



<p class="wp-block-paragraph">Pega dentro esta línea exactamente:</p>



<pre class="wp-block-code"><code>SUBSYSTEM=="usb", ATTR{idVendor}=="0665", ATTR{idProduct}=="5161", MODE="0660", GROUP="nut"</code></pre>



<p class="wp-block-paragraph"><em>(Guarda con <code>Ctrl+O</code>, <code>Enter</code> y sal con <code>Ctrl+X</code>)</em>. </p>



<p class="wp-block-paragraph">Los valores de la regla, los vimos cuando ejecutamos el comando <code>nut-scanner -U</code> de donde extraemos los valores  idVendor y idProduct.</p>



<p class="wp-block-paragraph">Aplicamos la regla con:</p>



<pre class="wp-block-code"><code>sudo udevadm control --reload-rules &amp;&amp; sudo udevadm trigger</code></pre>



<p class="wp-block-paragraph">Como Linux es un sistema multiusuario y seguro, por defecto no permite que cualquier programa (como el software de NUT) «hable» directamente con un hardware USB a menos que seas el administrador (<code>root</code>). La regla de udev que creamos sirve para decirle al sistema: <em>«Cuando veas este SAI de Salicru, dáselo al grupo &#8216;nut&#8217; para que pueda leer sus datos»</em>.</p>



<h3 class="wp-block-heading">Anatomía de la regla</h3>



<p class="wp-block-paragraph">La línea que pusimos en <code>/etc/udev/rules.d/99-nut-ups.rules</code> se desglosa así:</p>



<p class="wp-block-paragraph"><code>SUBSYSTEM=="usb", ATTR{idVendor}=="0665", ATTR{idProduct}=="5161", MODE="0660", GROUP="nut"</code></p>



<ul class="wp-block-list">
<li><strong><code>SUBSYSTEM=="usb"</code></strong>: Le dice a Linux que solo mire en los puertos USB.</li>



<li><strong><code>ATTR{idVendor}=="0665"</code></strong>: «Busca al fabricante 0665».</li>



<li><strong><code>ATTR{idProduct}=="5161"</code></strong>: «Y que el producto sea el 5161».</li>



<li><strong><code>MODE="0660"</code></strong>: Esto define los permisos de archivos de Linux. <code>0660</code> significa que el dueño y el grupo pueden <strong>leer y escribir</strong>, pero el resto del mundo no puede hacer nada.</li>



<li><strong><code>GROUP="nut"</code></strong>: Aquí está la magia. Le asigna la propiedad del puerto al grupo <code>nut</code>. Como el software de monitorización corre bajo el usuario <code>nut</code>, ahora ya tiene «llave» para entrar al puerto USB.</li>
</ul>



<h3 class="wp-block-heading">¿Por qué es necesaria en la Raspberry Pi?</h3>



<p class="wp-block-paragraph">Sin esta regla, cuando el driver <code>nutdrv_qx</code> intenta preguntar al SAI «¿cuánta batería te queda?», el sistema operativo le responde: <strong>«Acceso denegado»</strong>.</p>



<p class="wp-block-paragraph">Si esta regla no está o está mal aplicada, te saldrá el error <code>insufficient permissions</code>. Al añadir la regla, el permiso se vuelve automático: cada vez que arranques la Raspberry o reconectes el USB, Linux aplicará estas instrucciones al instante.</p>



<h2 class="wp-block-heading">Sincronizar los servicios</h2>



<p class="wp-block-paragraph">Ejecuta esto para limpiar y arrancar de forma oficial:</p>



<pre class="wp-block-code"><code>sudo systemctl stop nut-monitor nut-server
sudo rm -f /run/nut/*.pid
sudo systemctl start nut-server
sudo systemctl start nut-monitor</code></pre>



<h3 class="wp-block-heading">Comprobar la comunicación</h3>



<p class="wp-block-paragraph">Ahora, espera unos 5 segundos y lanza:</p>



<pre class="wp-block-code"><code>upsc salicru@localhost</code></pre>



<p class="wp-block-paragraph">El comando nos <strong>muestra en tiempo real la información detallada, el estado y las variables del Sistema de Alimentación Ininterrumpida (SAI/UPS)</strong>que está gestionado localmente mediante la herramienta NUT (Network UPS Tools)</p>



<pre class="wp-block-code"><code>nut@zero:~ $ <strong>upsc salicru@localhost</strong>
Init SSL without certificate database
battery.voltage: 27.4
device.type: ups
driver.debug: 0
driver.flag.allow_killpower: 0
driver.name: nutdrv_qx
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.product: USB to Serial
driver.parameter.productid: 5161
driver.parameter.synchronous: auto
driver.parameter.vendor: Cypress Semiconductor
driver.parameter.vendorid: 0665
driver.state: updateinfo
driver.version: 2.8.1
driver.version.data: Q1 0.08
driver.version.internal: 0.36
driver.version.usb: libusb-1.0.28 (API: 0x100010a)
input.frequency: 49.8
input.voltage: 235.2
input.voltage.fault: 235.2
output.voltage: 231.3
ups.beeper.status: enabled
ups.delay.shutdown: 30
ups.delay.start: 180
ups.load: 0
ups.productid: 5161
ups.status: OL
ups.temperature: 25.0
ups.type: offline / line interactive
ups.vendorid: 0665
nut@zero:~ $</code></pre>



<h3 class="wp-block-heading">Puerto de escucha</h3>



<p class="wp-block-paragraph">Como dato interesante, comprueba si el puerto 3493 que configuramos anteriormente, está a la escucha</p>



<pre class="wp-block-code"><code>nut@zero:~ $ <strong>ss -ltn | grep 3493</strong>
LISTEN 0      16           0.0.0.0:3493      0.0.0.0:*  </code></pre>



<p class="wp-block-paragraph">Las líneas <code>LISTEN</code>, indican que la Raspberry ya tiene la oreja puesta y está lista para informar sobre el estado del Salicru.</p>



<h3 class="wp-block-heading">Procesos</h3>



<p class="wp-block-paragraph">Puedes escribir <code>upsutil salicru@localhost</code> o simplemente ver el estado del servicio:</p>



<p class="wp-block-paragraph">Para verificar si el monitor (<code>upsmon</code>) está funcionando correctamente en tu Raspberry Pi, usa estos comandos:</p>



<pre class="wp-block-code"><code>nut@zero:~ $ <strong>ps aux | grep upsmon</strong>
root        6906  0.0  0.6   7304  2688 ?        Ss   10:05   0:00 /lib/nut/upsmon -F
nut         6907  0.0  1.2  10236  5120 ?        S    10:05   0:03 /lib/nut/upsmon -F
nut         9598  0.0  0.4   8804  2064 pts/0    S+   21:39   0:00 grep --color=auto upsmon
nut@zero:~ $ </code></pre>



<p class="wp-block-paragraph">Deberías ver 3 procesos: uno que corre como <code>root</code> (el que tiene permiso para apagar la Pi) el otro como el usuario <code>nut</code> y el otro es simplemente el comando que acabamos de escribir.</p>



<h3 class="wp-block-heading">Comprobar el estado del servicio.</h3>



<p class="wp-block-paragraph">Ejecuta el comando <strong>sudo systemctl status nut-monitor</strong></p>



<pre class="wp-block-code"><code>nut@zero:~ $ <strong>sudo systemctl status nut-monitor</strong>
● nut-monitor.service - Network UPS Tools - power device monitor and shutdown controller
     Loaded: loaded (/usr/lib/systemd/system/nut-monitor.service; enabled; preset: enabled)
     Active: <mark style="background-color:rgba(0, 0, 0, 0);color:#00d084" class="has-inline-color"><strong>active (running)</strong></mark> since Sat 2026-03-07 22:12:57 CET; 12h ago
 Invocation: 95d0260bee1c4eca9ad4a618365a8a2c
    Process: 1091 ExecStartPre=/usr/bin/systemd-tmpfiles --create /usr/lib/tmpfiles.d/nut-common-tmpfiles.conf (code=exited, status=0/SUCCESS)
   Main PID: 1093 (upsmon)
      Tasks: 2 (limit: 176)
        CPU: 3.333s
     CGroup: /system.slice/nut-monitor.service
             ├─1093 /lib/nut/upsmon -F
             └─1098 /lib/nut/upsmon -F

mar 07 22:12:57 zero systemd&#91;1]: Starting nut-monitor.service - Network UPS Tools - power device monitor and shutdown controller...
mar 07 22:12:57 zero systemd&#91;1]: Started nut-monitor.service - Network UPS Tools - power device monitor and shutdown controller.
mar 07 22:12:57 zero nut-monitor&#91;1093]: fopen /run/nut/upsmon.pid: No such file or directory
mar 07 22:12:57 zero nut-monitor&#91;1093]: Could not find PID file to see if previous upsmon instance is already running!
mar 07 22:12:57 zero nut-monitor&#91;1093]: UPS: salicru@localhost (primary) (power value 1)
mar 07 22:12:57 zero nut-monitor&#91;1093]: Using power down flag file /etc/killpower
mar 07 22:12:57 zero nut-monitor&#91;1098]: Init SSL without certificate database
mar 07 22:12:57 zero nut-monitor&#91;1098]: upsnotify: notify about state 2 with libsystemd: was requested, but not running as a service unit now, will not spam more about it
mar 07 22:12:57 zero nut-monitor&#91;1098]: upsnotify: failed to notify about state 2: no notification tech defined, will not spam more about it
mar 07 22:12:57 zero nut-monitor&#91;1098]: upsnotify: logged the systemd watchdog situation once, will not spam more about it
nut@zero:~ $ 
</code></pre>



<p class="wp-block-paragraph">Si aparece en verde (<strong>active (running)</strong>), el vigilante está despierto.</p>



<h3 class="wp-block-heading">Configurando los avisos por terminal.</h3>



<pre class="wp-block-code"><code>sudo nano /etc/nut/upsmon.conf</code></pre>



<p class="wp-block-paragraph">Pega el siguiente texto debajo </p>



<pre class="wp-block-code"><code># Banderas para ejecutar el comando (EXEC)
NOTIFYFLAG ONLINE   SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT   SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT  SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT SYSLOG+WALL+EXEC</code></pre>



<p class="wp-block-paragraph">Reinicia el servicio con:</p>



<pre class="wp-block-code"><code>sudo systemctl stop nut-monitor nut-server</code></pre>



<p class="wp-block-paragraph">Esto dará avisos en la terminal de tu raspberry, pero no lo hará si estas accediendo por ssh.</p>



<h2 class="wp-block-heading">Cómo configurar el apagado automático (upsmon)</h2>



<p class="wp-block-paragraph">Como nuestra <strong>Raspberry Pi Zero 2W</strong> está conectada al Salicru, vamos a configurar el sistema para que se apague de forma segura.</p>



<h3 class="wp-block-heading">Configurar el usuario</h3>



<p class="wp-block-paragraph">Debemos de tener un par de  usuarios configurados para la gestión del SAI, que será el usurario administrador [monuser] y el usuario de los equipos remotos que será [remotemon]</p>



<p class="wp-block-paragraph">Edita el archivo de usuarios de NUT:</p>



<pre class="wp-block-code"><code>sudo nano /etc/nut/upsd.users</code></pre>



<p class="wp-block-paragraph">Añade esto al final:</p>



<pre class="wp-block-code"><code>&#91;monuser]
    password = <mark style="background-color:#7bdcb5" class="has-inline-color">mi_password_segura</mark>
    upsmon master</code></pre>



<p class="wp-block-paragraph">Si quieres, puedes dar a [monuser] privilegios de administrador así:</p>



<pre class="wp-block-code"><code>&#91;monuser]
    password = <mark style="background-color:#7bdcb5" class="has-inline-color">mi_password_segura</mark>
    upsmon master
    actions = SET
    instcmds = ALL</code></pre>



<p class="wp-block-paragraph">Para dar privilegios de administrador a un usuario, tan solo agrégale las directrices <code>actions</code> e <code>instcmds</code></p>



<p class="wp-block-paragraph">Para el usuario remoto, añade este perfil al final (usa una contraseña distinta a la de admin):</p>



<pre class="wp-block-code"><code>&#91;remotemon]
    password = <mark style="background-color:#fcb900" class="has-inline-color">clave_red_segura</mark>
    upsmon slave</code></pre>



<h3 class="wp-block-heading">Configurar el monitor</h3>



<p class="wp-block-paragraph">Edita el archivo del monitor:</p>



<pre class="wp-block-code"><code>sudo nano /etc/nut/upsmon.conf</code></pre>



<p class="wp-block-paragraph">Busca la sección <code>MONITOR</code> y asegúrate de que quede así:</p>



<pre class="wp-block-code"><code>MONITOR salicru@localhost 1 monuser <mark style="background-color:#7bdcb5" class="has-inline-color">mi_password_segura</mark> master
SHUTDOWNCMD "/sbin/shutdown -h now"
POWERDOWNFLAG /etc/killpower
</code></pre>



<h3 class="wp-block-heading">Activar el servicio</h3>



<p class="wp-block-paragraph">Reinicia todo para que los cambios tengan efecto:</p>



<pre class="wp-block-code"><code>sudo systemctl restart nut-monitor</code></pre>



<h3 class="wp-block-heading">¿Qué pasará ahora cuando se corte la luz?</h3>



<p class="wp-block-paragraph">Si el SAI se apaga <em>antes</em> de que la Raspberry complete su apagado, podrías tener el mismo problema que con un corte normal de luz, archivos corruptos en la MicroSD. Este sistema está diseñado con una <strong>secuencia de retardo</strong> muy específica para evitar esto, El Retardo (Delay). Cuando la Raspberry envía la orden de «Kill Power», no le está diciendo al SAI <em>«Apágate ya»</em>, sino <em>«Apágate dentro de <strong>X</strong> segundos»</em>.</p>



<p class="wp-block-paragraph">Si te fijas en los datos de tu <code>upsc salicru@localhost</code>, hay una línea clave:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong><code>ups.delay.shutdown: 30</code></strong></p>
</blockquote>



<p class="wp-block-paragraph">Esto significa que cuando la Raspberry envía la orden final, el SAI Salicru inicia una cuenta atrás interna de <strong>30 segundos</strong>.</p>



<h3 class="wp-block-heading">La Secuencia Cronológica</h3>



<p class="wp-block-paragraph">Para que veas que es seguro, este es el orden real de los eventos:</p>



<ol start="1" class="wp-block-list">
<li><strong>Raspberry detecta Batería Baja:</strong> Inicia su propio proceso de apagado (<code>SHUTDOWNCMD</code>).</li>



<li><strong>Cierre de Servicios:</strong> Debian detiene bases de datos, logs y procesos. La tarjeta SD deja de escribir datos.</li>



<li><strong>Script Final de NUT:</strong> Justo en el último segundo del apagado (cuando el sistema ya está en modo «solo lectura»), se ejecuta la orden de «Kill Power» hacia el SAI.</li>



<li><strong>SAI recibe la orden:</strong> El Salicru empieza su cuenta atrás de <strong>30 segundos</strong>.</li>



<li><strong>Raspberry muere:</strong> La Pi termina de apagarse por completo en 2 o 3 segundos más.</li>



<li><strong>El SAI se apaga:</strong> 27 segundos después de que la Pi ya esté totalmente «muerta», el SAI corta la energía.</li>
</ol>



<h3 class="wp-block-heading">¿Por qué es necesario que el SAI se apague?</h3>



<p class="wp-block-paragraph">Imagina que <strong>no</strong> enviamos el «Kill Power»:</p>



<ul class="wp-block-list">
<li>La Raspberry se apaga y se queda esperando.</li>



<li>El SAI se queda encendido con batería hasta que se agote al 0%.</li>



<li>Vuelve la luz de la calle.</li>



<li><strong>Problema:</strong> Como el SAI nunca llegó a cortarle la corriente a la Raspberry (porque se quedó en un estado de «espera» con la batería agotada pero sin apagar el circuito), la Raspberry <strong>no detectará que ha vuelto la energía</strong> y no arrancará sola. Se quedará apagada hasta que alguien vaya físicamente a desenchufarla y enchufarla.</li>
</ul>



<h3 class="wp-block-heading">Resumen de seguridad</h3>



<p class="wp-block-paragraph">Con el valor de <strong>30 segundos</strong> que tiene tu Salicru de fábrica:</p>



<ul class="wp-block-list">
<li>La Raspberry tiene tiempo de sobra (le sobran unos 25 segundos) para terminar de cerrarlo todo antes de que el SAI corte el flujo eléctrico.</li>



<li>Es un método estándar y muy seguro.</li>
</ul>



<p class="wp-block-paragraph"><strong>Un detalle importante:</strong> En las Raspberry Pi, para que el ciclo de «vuelva la luz y se encienda sola» funcione perfecto, asegúrate de que el SAI esté configurado para rearmarse automáticamente (cosa que los Salicru SOHO+ hacen por defecto).</p>



<p class="wp-block-paragraph">Para estar seguro de que la Raspberry <strong>sabe</strong> que es la jefa del apagado (modo <code>master</code>), ejecuta:</p>



<pre class="wp-block-code"><code>upsc salicru@localhost ups.delay.shutdown</code></pre>



<p class="wp-block-paragraph">Si te responde <code>30</code>, significa que todo está listo para que, en caso de emergencia, la Pi le ordene al Salicru esperar 30 segundos antes de cortar la energía, dándole tiempo a la MicroSD para cerrarse a salvo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">¿Cómo saber si realmente se apagará? (Simulación segura)</h3>



<p class="wp-block-paragraph">Si quieres estar 100% seguro de que la configuración es correcta sin apagar la Raspberry de golpe, puedes mirar el log del sistema:</p>



<pre class="wp-block-code"><code>sudo journalctl -f -u nut-monitor -u nut-server</code></pre>



<p class="wp-block-paragraph">Si ahora mismo desenchufas el SAI de la pared, Verás en el log <code>UPS salicru@localhost on battery</code>.</p>



<pre class="wp-block-code"><code>nut@zero:~ $ <strong>sudo journalctl -f -u nut-monitor -u nut-server</strong>
mar 07 18:05:06 zero nut-server&#91;7408]: Instant command: upsmon@::1 did test.battery.start.quick on salicru (tracking ID: disabled)
mar 07 18:05:06 zero upsd&#91;7408]: Instant command: upsmon@::1 did test.battery.start.quick on salicru (tracking ID: disabled)
mar 07 19:24:09 zero nut-server&#91;7408]: Instant command: upsmon@::1 did test.battery.start.quick on salicru (tracking ID: disabled)
mar 07 19:24:09 zero upsd&#91;7408]: Instant command: upsmon@::1 did test.battery.start.quick on salicru (tracking ID: disabled)
mar 07 19:27:08 zero nut-server&#91;7408]: Instant command: upsmon@::1 did test.battery.start.quick on salicru (tracking ID: disabled)
mar 07 19:27:08 zero upsd&#91;7408]: Instant command: upsmon@::1 did test.battery.start.quick on salicru (tracking ID: disabled)
mar 07 20:05:29 zero nut-monitor&#91;6907]: UPS salicru@localhost <mark style="background-color:#7bdcb5" class="has-inline-color">on battery</mark>
mar 07 20:05:45 zero nut-monitor&#91;9348]: Network UPS Tools upsmon 2.8.1</code></pre>



<p class="wp-block-paragraph">Si miras en <code>upsc salicru@localhost</code> verás que cambia a <code>status: OB</code>.</p>



<pre class="wp-block-code"><code>nut@zero:~ $ <strong>upsc salicru@localhost</strong>
Init SSL without certificate database
battery.voltage: 26.9
device.type: ups
driver.debug: 0
driver.flag.allow_killpower: 0
driver.name: nutdrv_qx
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.product: USB to Serial
driver.parameter.productid: 5161
driver.parameter.synchronous: auto
driver.parameter.vendor: Cypress Semiconductor
driver.parameter.vendorid: 0665
driver.state: quiet
driver.version: 2.8.1
driver.version.data: Q1 0.08
driver.version.internal: 0.36
driver.version.usb: libusb-1.0.28 (API: 0x100010a)
input.frequency: 50.0
input.voltage: 9.6
input.voltage.fault: 9.6
output.voltage: 227.4
ups.beeper.status: enabled
ups.delay.shutdown: 30
ups.delay.start: 180
ups.load: 0
ups.productid: 5161
<mark style="background-color:#7bdcb5" class="has-inline-color">ups.status: OB</mark>
ups.temperature: 25.0
ups.type: offline / line interactive
ups.vendorid: 0665
</code></pre>



<p class="wp-block-paragraph"><strong>Lo más importante:</strong></p>



<p class="wp-block-paragraph">Como el modelo SOHO+ 2000, tiene mucha autonomía para una Raspberry Pi Zero 2W (que consume casi nada). No esperes a que llegue a <code>Low Battery</code> (batería baja) de forma real porque podría tardar horas.</p>



<p class="wp-block-paragraph">Si en algún momento quieres probar que el apagado funciona de verdad, el comando es:</p>



<pre class="wp-block-code"><code>sudo upsmon -c fsd</code></pre>



<p class="wp-block-paragraph"><em>(Esto significa «Forced Shutdown» y simula que la batería se ha agotado, iniciando el proceso de apagado de seguridad inmediatamente).</em></p>



<p class="wp-block-paragraph">¡Ya está todo listo y protegido! Tu Raspberry Pi ahora sobrevivirá a los cortes de luz sin corromper la tarjeta SD.</p>



<h2 class="wp-block-heading">El script de alertas para Telegram</h2>



<p class="wp-block-paragraph">Creamos el script que enviará los mensajes: </p>



<pre class="wp-block-code"><code><code>sudo nano /usr/local/bin/nut-telegram.sh</code></code></pre>



<p class="wp-block-paragraph">Copia y pega el siguiente script. No olvides reemplazar «tu_token» y «tu_id» por los tuyos propios</p>



<pre class="wp-block-code"><code>#!/bin/bash

# Configuración del Bot de Telegram
TOKEN="<mark style="background-color:#7bdcb5" class="has-inline-color">tu_token</mark>"
CHAT_ID="<mark style="background-color:#7bdcb5" class="has-inline-color">tu_id</mark>"
export LC_ALL=C

# Función interna para leer los sensores (Lógica estable)
capturar() {
    BATERIA_V=$(upsc salicru@localhost battery.voltage 2&gt;/dev/null || echo "0.0")
    VOLTAJE_IN=$(upsc salicru@localhost input.voltage 2&gt;/dev/null || echo "0.0")
    VOLTAJE_OUT=$(upsc salicru@localhost output.voltage 2&gt;/dev/null || echo "0.0")
    CARGA_SAI=$(upsc salicru@localhost ups.load 2&gt;/dev/null || echo "0")
    ESTADO_SAI=$(upsc salicru@localhost ups.status 2&gt;/dev/null || echo "N/A")
}

case "$1" in
    *"on battery"*)
        ICONO="&#x1f6a8;"
        TITULO="CORTE DE SUMINISTRO"
        
        # BUCLE DE ESPERA: No envía hasta que la entrada sea &lt; 50V real
        intentos=0
        capturar
        while &#91;&#91; "${VOLTAJE_IN%.*}" -gt 50 ]] &amp;&amp; &#91;&#91; $intentos -lt 12 ]]; do
            sleep 5
            capturar
            ((intentos++))
        done

        # --- DIAGNÓSTICO DE SALUD AL CORTE ---
        V_INT=${BATERIA_V%.*}
        if &#91; "$V_INT" -lt 24 ]; then
            DETALLE="¡OJO! Las baterías están muy bajas ($BATERIA_V V). Salud crítica, considera cambiarlas."
        else
            DETALLE="El SAI está operando con baterías. Salud química OK ($BATERIA_V V)."
        fi
        ;;

    *"on line power"*)
        ICONO="&#x2705;"
        TITULO="CORRIENTE RESTABLECIDA"
        DETALLE="El sistema vuelve a la red eléctrica."

        # BUCLE DE ESPERA: No envía hasta que la entrada sea &gt; 200V real
        intentos=0
        capturar
        while &#91;&#91; "${VOLTAJE_IN%.*}" -lt 200 ]] &amp;&amp; &#91;&#91; $intentos -lt 12 ]]; do
            sleep 5
            capturar
            ((intentos++))
        done
        ;;

    *"low battery"*)
        ICONO="&#x26a0;"
        TITULO="BATERIA CRITICA"
        DETALLE="Nivel muy bajo. El apagado es inminente."
        capturar
        ;;

    *"SHUTDOWN"*)
        ICONO="&#x1f480;"
        TITULO="APAGADO DE EMERGENCIA"
        DETALLE="La Raspberry se apaga para proteger la SD."
        capturar
        ;;

    *"REPLBATT"*)
        ICONO="&#x1f6e0;"
        TITULO="FALLO DE BATERIA"
        DETALLE="Es necesario sustituir las baterías del Salicru."
        capturar
        ;;

    *)
        ICONO="&#x2139;"
        TITULO="NOTIFICACION SAI"
        DETALLE="$1"
        capturar
        ;;
esac

# Mensaje final con los iconos: &#x1f50c; y &#x26a1;
CUERPO="$ICONO *$TITULO* $ICONO
------------------------------------
&#x1f4dd; $DETALLE

&#x1f50b; *Bateria:* $BATERIA_V V
&#x1f50c; *Entrada:* $VOLTAJE_IN V
&#x26a1; *Salida:* $VOLTAJE_OUT V
&#x1f4ca; *Carga SAI:* $CARGA_SAI%
&#x1f4c8; *Estado:* $ESTADO_SAI"

# Envío a Telegram
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
     --data-urlencode "chat_id=$CHAT_ID" \
     --data-urlencode "text=$CUERPO" \
     --data-urlencode "parse_mode=Markdown" &gt; /dev/null 2&gt;&amp;1</code></pre>



<p class="wp-block-paragraph"><strong>Importante:</strong> Dale permisos de ejecución con:</p>



<pre class="wp-block-code"><code><code>sudo chmod 755 /usr/local/bin/nut-telegram.sh</code></code></pre>



<p class="wp-block-paragraph">y haz que el dueño sea el usuario de nut: </p>



<pre class="wp-block-code"><code><code>sudo chown nut:nut /usr/local/bin/nut-telegram.sh</code></code></pre>



<h3 class="wp-block-heading">Configurando los avisos por telegram</h3>



<p class="wp-block-paragraph">Volvemos a configurar las flags para los avisos por telegram, por lo que volvemos a entrar al archivo upsmon.conf</p>



<pre class="wp-block-code"><code> sudo nano /etc/nut/upsmon.conf</code></pre>



<p class="wp-block-paragraph">Copia encima o debajo de las anteriores notificaciones</p>



<pre class="wp-block-code"><code># Comando externo para notificaciones
NOTIFYCMD "/usr/local/bin/nut-telegram.sh"

# Definición de mensajes que activan el script
NOTIFYMSG ONLINE    "UPS salicru@localhost on line power"
NOTIFYMSG ONBATT    "UPS salicru@localhost on battery"
NOTIFYMSG LOWBATT   "UPS salicru@localhost low battery"
NOTIFYMSG SHUTDOWN  "SHUTDOWN"
NOTIFYMSG REPLBATT  "REPLBATT"</code></pre>



<p class="wp-block-paragraph">Reinicia el servicio</p>



<pre class="wp-block-code"><code>sudo systemctl restart nut-monitor</code></pre>



<p class="wp-block-paragraph">Haz una prueba manual con:</p>



<pre class="wp-block-code"><code>sudo -u nut /usr/local/bin/nut-telegram.sh "Prueba manual"</code></pre>



<h2 class="wp-block-heading">Test</h2>



<p class="wp-block-paragraph">Podemos listar los comandos que puede realizar nuestro salicru.</p>



<pre class="wp-block-code"><code>nut@zero:~ $ <strong>upscmd -l salicru</strong>
Instant commands supported on UPS &#91;salicru]:

beeper.toggle - Toggle the UPS beeper
driver.killpower - Tell the driver daemon to initiate UPS shutdown; should be unlocked with driver.flag.allow_killpower option or variable setting
driver.reload - Reload running driver configuration from the file system (only works for changes in some options)
driver.reload-or-error - Reload running driver configuration from the file system (only works for changes in some options); return an error if something changed and could not be applied live (so the caller can restart it with new options)
driver.reload-or-exit - Reload running driver configuration from the file system (only works for changes in some options); exit the running driver if something changed and could not be applied live (so service management framework can restart it with new options)
load.off - Turn off the load immediately
load.on - Turn on the load immediately
shutdown.return - Turn off the load and return when power is back
shutdown.stayoff - Turn off the load and remain off
shutdown.stop - Stop a shutdown in progress
test.battery.start - Start a battery test
test.battery.start.deep - Start a deep battery test
test.battery.start.quick - Start a quick battery test
test.battery.stop - Stop the battery test</code></pre>



<p class="wp-block-paragraph">De la lista podemos ejecutar <code>test.battery.start.quick </code>que lo único que hace es pasar al estado <code>OL CAL</code> y hacer un test del sistema para el chequeo interno del SAI pero no hará como su nombre indica, ningún test de las baterías.</p>



<pre class="wp-block-code"><code>nut@zero:~ $ upscmd -u upsmon -p <mark style="background-color:#7bdcb5" class="has-inline-color">tu_contresña_segura</mark> salicru test.battery.start.quick
OK</code></pre>



<p class="wp-block-paragraph">Mientras se realiza el test, puedes comprobar el voltage de la batería en tiempo real con este comando, que se mantendrá inmutable ya que el el sistema se mantiene todo el tiempo OnLine.</p>



<pre class="wp-block-code"><code>while true; do upsc salicru@localhost battery.voltage; sleep 1; done</code></pre>



<h2 class="wp-block-heading">Mantenimiento Preventivo Mensual</h2>



<p class="wp-block-paragraph">«Investigando a fondo con la consola de NUT, descubrimos que el Salicru SOHO+ protege sus baterías. Aunque veas comandos como <code>test.battery.start.deep</code>, el SAI los ignora para evitar descargas innecesarias. El único comando que acepta es el <code>quick</code>, que activa el modo <strong>OL CAL</strong> (Calibración Online). Este modo es genial para verificar que los relés y el inversor funcionan, pero <strong>no estresa la batería</strong>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Conclusión:</strong> Para saber la salud real de tus baterías en este modelo, el &#8216;Test del Tirón&#8217; (desenchufar 10 segundos) sigue siendo el único modo. Mi script de Telegram te avisará al instante de cuánto cae el voltaje en ese momento y en que estado se encuentran las baterías.»</p>
</blockquote>



<p class="wp-block-paragraph">Si el driver <code>nutdrv_qx</code> solo nos permite el <code>OL CAL</code>, vamos a convertir ese «estiramiento» en nuestro test mensual. Aunque no descargue la batería, es vital porque <strong>obliga a los relés físicos a moverse</strong>. Un SAI que nunca hace un test puede acabar con los relés «pegados» por el calor y el desuso, y el día que se vaya la luz de verdad, no conmutará.</p>



<h3 class="wp-block-heading"><strong>Script de «Mantenimiento Preventivo de Relés e Inversor»</strong>.</h3>



<p class="wp-block-paragraph">Abre una terminal y ejecuta el siguiente comando para crear nuestro archivo de mantenimiento</p>



<pre class="wp-block-code"><code>sudo nano /usr/local/bin/mantenimiento-sai.sh</code></pre>



<p class="wp-block-paragraph">Pega el siguente texto, no olvides de introducir «tu_token_de_telegram» «tu_id_de_chat» y «tu_contraseña_segura»</p>



<pre class="wp-block-code"><code>#!/bin/bash

# --- CONFIGURACIÓN ---
TOKEN="<mark style="background-color:#7bdcb5" class="has-inline-color">TU_TOKEN_DE_TELEGRAM</mark>"
ID="<mark style="background-color:#7bdcb5" class="has-inline-color">TU_ID_DE_CHAT</mark>"
UPS="salicru"
USUARIO="upsmon"
CLAVE="<mark style="background-color:#7bdcb5" class="has-inline-color">tu_contraseña_segura</mark>"

# 1. Inicio del mantenimiento
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" -d "chat_id=$ID&amp;text=&#x2699; *Mantenimiento Mensual:* Iniciando test de relés en $UPS..."

# 2. Lanzar el Quick Test (Modo CAL)
upscmd -u $USUARIO -p $CLAVE $UPS test.battery.start.quick &gt; /dev/null
sleep 2

# 3. Verificamos si el SAI ha entrado en modo calibración
STATUS=$(upsc $UPS ups.status)

if &#91;&#91; "$STATUS" == *"CAL"* ]]; then
    # Esperamos a que termine (vimos que dura unos 9-10 seg)
    sleep 10
    FINAL_STATUS=$(upsc $UPS ups.status)
    if &#91;&#91; "$FINAL_STATUS" == "OL" ]]; then
        MSG="&#x2705; *TEST OK*: Los relés han conmutado y el inversor ha arrancado correctamente. El sistema de emergencia está operativo."
    else
        MSG="&#x26a0; *AVISO*: El test ha terminado pero el estado es $FINAL_STATUS. Revisar manualmente."
    fi
else
    MSG="&#x274c; *ERROR*: El SAI ha ignorado la orden de test. Es posible que necesite un reinicio del servicio NUT."
fi

# 4. Enviar resultado
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" -d "chat_id=$ID&amp;parse_mode=Markdown&amp;text=$MSG"
</code></pre>



<p class="wp-block-paragraph">Este script hará el test aceptado por el Salicru, verificará que el estado pase por <code>OL CAL</code> y te informará de que la electrónica de conmutación sigue viva.</p>



<h3 class="wp-block-heading">La automatización (Cron)</h3>



<p class="wp-block-paragraph">Para que se haga solo una vez al mes (por ejemplo, el día 1 a las 10:00), añade esto a tu <code>sudo crontab -e</code>:</p>



<pre class="wp-block-code"><code>00 10 1 * * /usr/local/bin/mantenimiento-sai.sh</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">«¿Por qué automatizar un test que no descarga la batería?»</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Muchos usuarios cometen el error de no tocar su SAI hasta que se va la luz. El problema es que los relés son piezas mecánicas que pueden fallar por falta de uso. Mi script mensual fuerza al Salicru a entrar en modo <strong>OL CAL</strong>. Aunque no descargue la batería, este proceso hace que los relés &#8216;hagan ejercicio&#8217; y que el inversor se autochequee. Es la garantía de que, cuando llegue el apagón real, la parte mecánica del SAI no estará agarrotada.</em></p>
</blockquote>



<h3 class="wp-block-heading">Tabla de Salud de la Batería (Sistema de 24V)</h3>



<p class="wp-block-paragraph">«Una vez que recibas la notificación en tu móvil, ¿cómo saber si esos voltios son buenos o malos? He preparado esta tabla de referencia para que sepas cuándo es el momento de sacar la cartera y comprar repuestos:»</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td>Voltaje en Batería</td><td>Estado de Salud</td><td>Significado Técnico</td><td>Acción</td></tr></thead><tbody><tr><td><strong>&gt; 27.0 V</strong></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Excelente</strong></td><td>Carga completa en flotación.</td><td>Ninguna.</td></tr><tr><td><strong>24.5 V &#8211; 26.5 V</strong></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Normal</strong></td><td>Funcionamiento correcto bajo carga.</td><td>Uso habitual.</td></tr><tr><td><strong>23.5 V &#8211; 24.4 V</strong></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Aviso / Débil</strong></td><td>La batería empieza a perder capacidad química.</td><td>Planificar cambio a medio plazo.</td></tr><tr><td><strong>&lt; 23.5 V</strong></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6a8.png" alt="🚨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Crítico</strong></td><td>Agotamiento inminente o celdas dañadas.</td><td><strong>Cambio urgente</strong>. Riesgo de apagón repentino.</td></tr></tbody></table></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxete.duckdns.org/como-monitorizar-un-sai-salicru-con-raspberry-pi-zero/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Compilar aMule desde GitHub (Rama Master) en Raspberry Pi</title>
		<link>https://linuxete.duckdns.org/compilar-amule-desde-github-rama-master-en-raspberry-pi/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=compilar-amule-desde-github-rama-master-en-raspberry-pi</link>
					<comments>https://linuxete.duckdns.org/compilar-amule-desde-github-rama-master-en-raspberry-pi/#respond</comments>
		
		<dc:creator><![CDATA[raspberry]]></dc:creator>
		<pubDate>Sat, 14 Feb 2026 21:31:24 +0000</pubDate>
				<category><![CDATA[amule]]></category>
		<category><![CDATA[P2P]]></category>
		<category><![CDATA[amuled]]></category>
		<category><![CDATA[Compilación]]></category>
		<category><![CDATA[Debian 13]]></category>
		<category><![CDATA[Raspberry Pi 5]]></category>
		<category><![CDATA[SSD]]></category>
		<category><![CDATA[Systemd]]></category>
		<category><![CDATA[Tutorial Linux]]></category>
		<guid isPermaLink="false">https://linuxete.duckdns.org/?p=3846</guid>

					<description><![CDATA[Existe una nueva versión de este documento, mas moderna y actualizada aqui «Instalar aMule desde GitHub no solo sirve para tener nuevas funciones, si no, para asegurar que el programa sea totalmente compatible con el hardware y software moderno. Obtenemos un binario que aprovecha los 64 bits de la Raspberry Pi, ya que desde 2021, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-medium-font-size wp-block-paragraph"><mark style="background-color:rgba(0, 0, 0, 0);color:#cf2e2e" class="has-inline-color">Existe una nueva versión de este documento, mas moderna y actualizada <a href="https://linuxete.duckdns.org/%f0%9f%93%a5-compilar-amule-desde-github-rama-master-en-raspberry-pi-5-usando-cmake/">aqui</a></mark></p>
</blockquote>



<p class="wp-block-paragraph">«Instalar aMule desde GitHub no solo sirve para tener nuevas funciones, si no, para asegurar que el programa sea <strong>totalmente compatible con el hardware y software moderno</strong>. Obtenemos un binario que aprovecha los 64 bits de la Raspberry Pi, ya que desde 2021, el código está «congelado».</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Ramas de desarrollo.</h2>



<p class="wp-block-paragraph">A la hora de compilar debes saber que existen varias ramas de desarrollo. Para entenderlo fácil, imagina que el desarrollo de un programa en GitHub es como un <strong>árbol</strong> del cual parten distintas ramas, y de nosotros depende elegir la rama que se ajuste a nuestras necesidades.</p>



<p class="wp-block-paragraph">De las ramas disponibles, la rama <strong><code>master</code></strong> (o a veces llamada <code>main</code>) es la que ocupa nuestra atención, es donde los desarrolladores van subiendo todos los parches modernos para hacerlo compatible con el compilador actual (<code>gcc</code>) y las nuevas librerías (<code>wxWidgets 3.2</code>).</p>



<p class="wp-block-paragraph">Otras ramas son las <code>Tags</code> y los <code>Branches</code> de desarollo.</p>



<p class="wp-block-paragraph">En esta tabla a modo de resumen, te muestro los tres tipos de «versiones» disponibles:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Tipo</strong></td><td><strong>Qué es</strong></td><td><strong>¿Cuándo elegirla?</strong></td></tr></thead><tbody><tr><td><strong>Master (Branch)</strong></td><td>El tronco principal. Tiene lo último de lo último.</td><td><strong>Nuestra elección.</strong> Es la más compatible con sistemas modernos.</td></tr><tr><td><strong>Tags (Etiquetas)</strong></td><td>Son «fotos» fijas del código en un momento concreto (ej. v2.3.3).</td><td>Solo si usas un sistema operativo viejo que coincida con la fecha de esa versión.</td></tr><tr><td><strong>Branches de desarrollo</strong></td><td>Ramas paralelas donde se prueban cosas experimentales (ej. <code>fix-webserver</code>).</td><td>Solo si eres desarrollador y quieres probar una función específica que aún no está terminada.</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>«Usamos la rama <strong>Master</strong> porque es la versión &#8216;viva&#8217; del código. Mientras que las versiones descargables (estables) se quedan congeladas en el tiempo, la rama Master recibe actualizaciones constantes que permiten que aMule se compile sin errores en sistemas de vanguardia como Debian 13.»</em></p>
</blockquote>



<h2 class="wp-block-heading">Desactiva Wayland</h2>



<p class="wp-block-paragraph">Tu <strong>Raspberry Pi 5</strong> con Debian 13 usa por defecto <strong>Wayland</strong> como servidor gráfico. Sin embargo, <strong>aMule</strong> utiliza la librería <strong>wxWidgets</strong> (wxGTK).</p>



<p class="wp-block-paragraph">Aunque wxWidgets ha mejorado mucho, su implementación para Wayland todavía tiene problemas graves con los menús contextuales y las barras de herramientas en aplicaciones que no han sido actualizadas internamente. Al forzar <strong>X11</strong>, el sistema utiliza una capa de compatibilidad (XWayland) que dibuja las ventanas de la forma «clásica», permitiendo que los menús aparezcan donde deben.</p>



<h3 class="wp-block-heading">Sigue estos pasos en tu Raspberry Pi OS</h3>



<p class="wp-block-paragraph">Si usas la imagen oficial de Raspberry Pi, hay una herramienta integrada que gestiona esto sin tocar código:</p>



<ol start="1" class="wp-block-list">
<li>Abre la terminal y escribe: <code>sudo raspi-config</code></li>



<li>Ve a <strong>Advanced Options</strong> (Opciones avanzadas).</li>



<li>Busca la opción <strong>Wayland</strong>.</li>



<li>Selecciona <strong>X11</strong> (o «Disable Wayland»).</li>



<li>Finaliza y <strong>reinicia</strong>.</li>
</ol>



<h2 class="wp-block-heading">1. Limpieza de Instalaciones Previas</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Utiliza este punto, si ya tenías aMule instalado y por ende, un servicio systemd de control. Si no es así, pasa al punto 2.</p>
</blockquote>



<p class="wp-block-paragraph">Si ya usabas aMule o bien tenías algún servicio de systemd corriendo para su gestion, debemos eliminar todo rastro para evitar conflictos con versiones antiguas de los repositorios.</p>



<p class="wp-block-paragraph">Comprueba si ya tienes un servicio activo con <code>systemctl list-units --all | grep -i amule</code></p>



<pre class="wp-block-code"><code><strong>systemctl list-units --all | grep -i amule</strong>
  <mark style="background-color:rgba(0, 0, 0, 0);color:#cf2e2e" class="has-inline-color">amule.service</mark><mark style="background-color:rgba(0, 0, 0, 0);color:#7bdcb5" class="has-inline-color"> </mark>                                                                                                                                                                       loaded    active   running   aMule Master Daemon
</code></pre>



<p class="wp-block-paragraph">Esto arroja que tengo un servicio llamado <code>amule.service</code> y debo detenerlo con este comando:</p>



<pre class="wp-block-code"><code>sudo systemctl stop amule.service</code></pre>



<p class="wp-block-paragraph">Una vez detenido el servicio, desinstalamos todo lo relacionado con aMule</p>



<pre id="block-2cb1bd22-d0e4-477c-aeb5-ded12e160709" class="wp-block-preformatted">sudo apt purge amule amule-daemon amule-utils-gui amule-utils amule-common</pre>



<p class="wp-block-paragraph">Y por último eliminamos todos los restos que dependen de la mula.</p>



<pre class="wp-block-code"><code>sudo apt autoremove --purge</code></pre>



<h2 class="wp-block-heading">2. Instalación de Dependencias de Compilación</h2>



<p class="wp-block-paragraph">Necesitamos el conjunto de herramientas de desarrollo y las librerías necesarias para el GUI remoto y el demonio:</p>



<pre class="wp-block-code"><code>sudo apt update</code></pre>



<p class="wp-block-paragraph">Instala el compilador y demás librerías. Copia y pega todo ese bloque en la terminal y dale a Enter.</p>



<pre class="wp-block-code"><code>
sudo apt install -y libboost-all-dev git build-essential autoconf automake libtool \
libwxgtk3.2-dev libcryptsetup-dev libcurl4-openssl-dev libgd-dev \
libgeoip-dev libupnp-dev libboost-dev binutils-dev zlib1g-dev \
libcrypto++-dev libreadline-dev gettext autopoint
</code></pre>



<h2 class="wp-block-heading">3. Obtención y Preparación del Código (Master)</h2>



<p class="wp-block-paragraph">Clonamos directamente la rama de desarrollo para asegurar que los parches estén aplicados:</p>



<p class="wp-block-paragraph">Nos situamos en el directorio principal con:</p>



<pre class="wp-block-code"><code>cd ~</code></pre>



<p class="wp-block-paragraph">Descargamos el directorio completo desde GitHub</p>



<pre id="block-cb6aed43-81ff-4077-b91a-d2069335ac15" class="wp-block-preformatted">git clone https://github.com/amule-project/amule.git</pre>



<p class="wp-block-paragraph">El código anterior nos genera un directorio llamado amule, en el cual nos debemos situar con el comando:</p>



<pre class="wp-block-code"><code> cd amule</code></pre>



<p class="wp-block-paragraph">Elegimos la rama principal de desarrollo (main)</p>



<pre class="wp-block-code"><code>git checkout master</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Con <code>git checkout master</code>, le decimos a nuestra Raspberry: <em>«No me des lo que se publicó hace años, dame lo que los desarrolladores tienen en su mesa de trabajo hoy mismo»</em>.</p>
</blockquote>



<p class="wp-block-paragraph">Preparamos el código fuente antes de la compilacion para permitir al software compilarse específicamente en tu máquina</p>



<pre class="wp-block-code"><code>./autogen.sh</code></pre>



<p class="wp-block-paragraph">El siguiente comando no es necesario usarlo, sirve para «volver al estado de fábrica» cuando ya has intentado compilar antes y la carpeta se ha llenado de archivos basura (objetos .o, ejecutables a medio hacer, scripts generados por ./autogen.sh). Se debería usar antes de ./autogen.sh para así una vez ejecutado, se vuelvan a crear los nuevos archivos de compilación.</p>



<pre class="wp-block-code"><code>git clean -fxd       # Limpieza total del árbol de archivos</code></pre>



<h2 class="wp-block-heading">4. Configuración del Demonio y Utilidades</h2>



<p class="wp-block-paragraph">A continuación te presento dos tipos de configuraciones, ya sea para Raspberry Pi 4 o Raspberry Pi 5 y así obtener la configuración del demonio (<code>amuled</code>), la interfaz gráfica remota (<code>amule-gui</code>) y las herramientas de consola:</p>



<p class="wp-block-paragraph">«El comando <code>./configure</code> es el cerebro del proceso. Se encarga de comprobar que tu Raspberry Pi tiene todas las librerías instaladas y utiliza nuestras instrucciones personalizadas para crear un plan de construcción (Makefile) optimizado para nuestro SSD y procesador.»</p>



<p class="wp-block-paragraph">Copia esto tal cual y lo pegas en tu terminal.</p>



<p class="wp-block-paragraph">Para Raspberry Pi 4 (Cortex-A72)</p>



<pre class="wp-block-code"><code>CXXFLAGS="-O3 -march=armv8-a+crc+simd -mtune=cortex-a72" ./configure \
    --enable-amule-daemon \
    --enable-amule-gui \
    --enable-amulecmd \
    --enable-webserver \
    --enable-cas \
    --enable-alcc \
    --disable-monolithic \
    --with-denoise-level=0 \
    --enable-optimize \
    --enable-mmap \
    --disable-debug
    --with-boost
</code></pre>



<p class="wp-block-paragraph">Para Raspberry Pi 5 (Cortex-A76)</p>



<pre class="wp-block-code"><code>CXXFLAGS="-O3 -march=armv8.2-a+crypto -mtune=cortex-a76" \
./configure \
    --enable-amule-daemon \
    --enable-amule-gui \
    --enable-amulecmd \
    --enable-webserver \
    --enable-cas \
    --enable-alcc \
    --disable-monolithic \
    --with-denoise-level=0 \
    --enable-optimize \
    --enable-mmap \
    --disable-debug \
    --with-boost</code></pre>



<p class="wp-block-paragraph">Si <code>./configure</code> falla con «Boost not found», prueba:<br><br><code>--with-boost=/usr --with-boost-libdir=/usr/lib/aarch64-linux-gnu --with-boost-includedir=/usr/include</code></p>



<p class="wp-block-paragraph">Se ha incluido <code>--enable-optimize</code> para que la Raspberry Pi  exprima su procesador y <code>--disable-monolithic</code> para separar el demonio de la interfaz.</p>



<h2 class="wp-block-heading">5. Compilación Potente e Instalación</h2>



<p class="wp-block-paragraph">Aprovechamos los 4 núcleos de la Pi 4. Al estar en SSD, este proceso es significativamente más rápido:</p>



<pre class="wp-block-code"><code>make -j$(nproc)</code></pre>



<p class="wp-block-paragraph"><code>make -j$(nproc)</code> (La Construcción)</p>



<p class="wp-block-paragraph">Este es el comando que hace el trabajo pesado.</p>



<ul class="wp-block-list">
<li><strong>¿Qué hace?</strong>: Lee un archivo llamado <code>Makefile</code> (que se generó al ejecutar el <code>./configure</code>) y empieza a llamar al compilador para transformar cada archivo de código <code>.cpp</code> en archivos binarios de lenguaje máquina.</li>



<li><strong>El parámetro <code>--j$(nproc)</code></strong>: Es vital en la Raspberry Pi 4. Le dice al sistema: «<em>Usamos <code>$(nproc)</code> para que el sistema detecte automáticamente los 4 núcleos de la Pi 4 o Pi 5</em> «. Sin el <code>-j$(nproc)</code>, solo usaría uno y la compilación de aMule tardaría 4 veces más.</li>



<li><strong>Resultado</strong>: Al terminar, tendrás el programa «construido» dentro de la carpeta donde estás, pero aún no está instalado en el sistema.</li>
</ul>



<pre class="wp-block-code"><code>sudo make install</code></pre>



<p class="wp-block-paragraph"><code>sudo make install</code> (La Mudanza)</p>



<p class="wp-block-paragraph">Una vez que el programa está construido, hay que poner cada pieza en su sitio definitivo.</p>



<ul class="wp-block-list">
<li><strong>¿Qué hace?</strong>: Copia los ejecutables (como <code>amuled</code>, <code>amulegui</code>) y los archivos de ayuda/traducciones a las carpetas protegidas del sistema operativo.</li>



<li><strong>¿A dónde van?</strong>: En tu caso, los mueve a <code>/usr/local/bin/</code>.</li>



<li><strong>¿Por qué <code>sudo</code>?</strong>: Porque para escribir archivos en las carpetas del sistema (<code>/usr/local/</code>) necesitas permisos de administrador (SuperUser DO).</li>
</ul>



<pre class="wp-block-code"><code>sudo ldconfig</code></pre>



<p class="wp-block-paragraph"><code>sudo ldconfig</code> (El Registro)</p>



<p class="wp-block-paragraph">Este es el paso que mucha gente olvida y que causa errores de «librería no encontrada».</p>



<ul class="wp-block-list">
<li><strong>¿Qué hace?</strong>: Actualiza los enlaces y la caché de las librerías compartidas.</li>



<li><strong>¿Por qué es necesario?</strong>: aMule utiliza muchas piezas externas (como <code>wxWidgets</code> o <code>Crypto++</code>). Al instalar versiones nuevas, el sistema necesita «indexarlas» en una base de datos interna (<code>/etc/ld.so.cache</code>).</li>



<li><strong>En resumen</strong>: Le dice al sistema operativo: «¡Oye! Acabamos de instalar programas y librerías nuevas en <code>/usr/local/lib</code>. Asegúrate de que todos los procesos sepan dónde encontrarlas ahora mismo».</li>
</ul>



<h2 class="wp-block-heading">6. Configuración de Acceso y Directorios</h2>



<h3 class="wp-block-heading">A. Primer arranque</h3>



<p class="wp-block-paragraph">Para que todo funcione, tienes que «despertar» al demonio.</p>



<p class="wp-block-paragraph">En una terminal escribe:</p>



<pre class="wp-block-code"><code>amuled</code></pre>



<p class="wp-block-paragraph">Esto creará la carpeta <code>~/.aMule</code>.</p>



<p class="wp-block-paragraph">Es muy posible que en la primera vez que el programa se ejecute, este se cierre automáticamente, ¡Tranquilo! es totalmente normal. La primera vez que ejecutas aMule, crea la carpeta de configuración, pero se cierra inmediatamente porque <strong>un demonio sin «mando a distancia» no sirve para nada</strong>.</p>



<p class="wp-block-paragraph">El error te está diciendo literalmente: <em>«Si no puedo conectarme con el exterior, no tengo forma de que me des órdenes»</em>.</p>



<h3 class="wp-block-heading">B. Generar una contraseña segura</h3>



<p class="wp-block-paragraph">Las contraseñas del archivo <strong>amule.conf</strong> son encriptadas y no se pueden escribir directamente. Por ejemplo para usar la contraseña &lt;<strong>BurritoSabanero</strong>&gt; habrá que encriptarla para que sea válida y se pueda usar.</p>



<p class="wp-block-paragraph">Primero, genera el código (hash) de tu contraseña. Cambia <code>tu_contraseña_aquí</code> por la que quieras:</p>



<pre class="wp-block-code"><code>echo -n "tu_contraseña_aquí" | md5sum</code></pre>



<p class="wp-block-paragraph">Por ejemplo:</p>



<pre class="wp-block-code"><code>echo -n "BurritoSabanero" | md5sum</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">No olvides entrecomillar la palabra elegida como contraseña.</p>
</blockquote>



<p class="wp-block-paragraph">Esto nos dará como resultado la contraseña encriptada siguiente:</p>



<pre class="wp-block-code"><code>0d545153bf7b94d6094a01f5f925163b  -</code></pre>



<h3 class="wp-block-heading">C. Editar el archivo de configuración</h3>



<p class="wp-block-paragraph">Ahora vamos a decirle a aMule que acepte conexiones y a ponerle esa contraseña. Abre el editor:</p>



<pre class="wp-block-code"><code>nano ~/.aMule/amule.conf</code></pre>



<p class="wp-block-paragraph">Busca las líneas que dicen, <strong>ECPassword</strong> y <strong><code>AcceptExternalConnections</code></strong> y déjalas así:</p>



<ul class="wp-block-list">
<li><strong><code>AcceptExternalConnections=1</code></strong> (Cambia el 0 por el 1)</li>



<li><strong><code>ECPassword=la_contraseña_que_generaste</code></strong> (Pega aquí el hash MD5)</li>
</ul>



<h3 class="wp-block-heading">D. Activar la Interfaz Web.</h3>



<p class="wp-block-paragraph">Como has instalado <code>amule-utils</code>, también tienes <strong><code>amuleweb</code></strong>. Si lo activas, podrás gestionar las descargas escribiendo la IP de tu Raspberry en el navegador de tu móvil o tablet (ej: <code>http://192.168.1.50:24711</code>).</p>



<p class="wp-block-paragraph">Busca también la sección [WebServer] y cambia lo siguiente.</p>



<ul class="wp-block-list">
<li><strong><code>Enabled=1</code></strong></li>



<li><strong><code>Password=la_contraseña_que_generaste</code></strong> (Puedes usar la misma o generar otra distinta)</li>
</ul>



<h3 class="wp-block-heading">E. Prueba de fuego</h3>



<p class="wp-block-paragraph">Guarda los cambios con <code>Ctrl+O</code>, pulsa <code>Enter</code> y sal con <code>Ctrl+X</code>.</p>



<p class="wp-block-paragraph">Ahora vuelve a lanzar el demonio:</p>



<pre class="wp-block-code"><code>amuled -f</code></pre>



<p class="wp-block-paragraph">Si todo ha ido bien, esta vez <strong>no se cerrará</strong>. Se quedará funcionando.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Tip de experto:</strong> Como <code>amuled</code> se queda bloqueando la terminal, lo ideal es lanzarlo en segundo plano para que libere la terminal y asi puedas seguir usandola. Esto se logran usando el modificador <code>-f</code> al final del comando.</p>
</blockquote>



<h3 class="wp-block-heading">F.Configuración aMule</h3>



<p class="wp-block-paragraph">Para modificar la configuración de amuled, asegurate que el demonio no se está ejecutando.</p>



<pre class="wp-block-code"><code>killall amuled</code></pre>



<p class="wp-block-paragraph">Con el demonio fuera de juego, podemos editar nuestras preferencias en el archivo de configuración de amule.</p>



<pre class="wp-block-code"><code>nano /home/usuario/.aMule/amule.conf</code></pre>



<p class="wp-block-paragraph">La siguiente configuración es una copia de mi archivo <strong>amule.conf</strong>. Si quieres puedes usarlo copiarlo y adaptarlo a tus necesidades. Yo he modificado las líneas que están resaltadas en verde con respecto al archivo original.</p>



<pre class="wp-block-code"><code>&#91;eMule]
AppVersion=2.3.3
<mark>Nick=Usuario_de_aMule</mark>
QueueSizePref=50
<mark>MaxUpload=5000</mark>
<mark>MaxDownload=19375</mark>
<mark>SlotAllocation=20</mark>
<mark>Port=24662</mark>
<mark>UDPPort=24672</mark>
UDPEnable=1
Address=
Autoconnect=1
<mark>MaxSourcesPerFile=300</mark>
MaxConnections=300
MaxConnectionsPerFiveSeconds=20
RemoveDeadServer=1
DeadServerRetry=3
ServerKeepAliveTimeout=0
Reconnect=1
Scoresystem=1
Serverlist=1
AddServerListFromServer=0
AddServerListFromClient=0
SafeServerConnect=0
AutoConnectStaticOnly=0
UPnPEnabled=0
UPnPTCPPort=50000
SmartIdCheck=1
ConnectToKad=1
ConnectToED2K=1
TempDir=/home/<mark>tu_usuario</mark>/.aMule/Temp
IncomingDir=/home/<mark>tu_usuario</mark>/.aMule/Incoming
ICH=1
AICHTrust=0
CheckDiskspace=1
MinFreeDiskSpace=1
AddNewFilesPaused=0
PreviewPrio=0
ManualHighPrio=0
StartNextFile=0
StartNextFileSameCat=0
StartNextFileAlpha=0
FileBufferSizePref=100
DAPPref=1
UAPPref=1
AllocateFullFile=0
OSDirectory=/home/tu_usuario/.aMule/
OnlineSignature=0
OnlineSignatureUpdate=5
EnableTrayIcon=0
MinToTray=0
Notifications=0
ConfirmExit=1
StartupMinimized=0
3DDepth=10
ToolTipDelay=1
ShowOverhead=0
ShowInfoOnCatTabs=1
VerticalToolbar=0
<mark>GeoIPEnabled=0</mark>
ShowVersionOnTitle=0
VideoPlayer=
StatGraphsInterval=3
statsInterval=30
DownloadCapacity=300
UploadCapacity=100
StatsAverageMinutes=5
VariousStatisticsMaxValue=100
SeeShare=2
FilterLanIPs=1
ParanoidFiltering=1
IPFilterAutoLoad=1
<mark>IPFilterURL=http://upd.emule-security.org/ipfilter.zip</mark>
FilterLevel=127
IPFilterSystem=0
FilterMessages=1
FilterAllMessages=0
MessagesFromFriendsOnly=0
MessageFromValidSourcesOnly=1
FilterWordMessages=0
MessageFilter=
ShowMessagesInLog=1
FilterComments=0
CommentFilter=
ShareHiddenFiles=1
AutoSortDownloads=0
NewVersionCheck=0
AdvancedSpamFilter=1
MessageUseCaptchas=1
Language=
SplitterbarPosition=75
YourHostname=
DateTimeFormat=%A, %x, %X
AllcatType=0
ShowAllNotCats=0
SmartIdState=1
DropSlowSources=0
<mark>KadNodesUrl=http://upd.emule-security.org/nodes.dat</mark>
<mark>Ed2kServersUrl=http://emule-security.org/serverlist/server.met</mark>
ShowRatesOnTitle=0
GeoLiteCountryUpdateUrl=http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
StatsServerName=Shorty's ED2K stats
StatsServerURL=http://ed2k.shortypower.dyndns.org/?hash=
CreateSparseFiles=1
&#91;Browser]
OpenPageInTab=1
CustomBrowserString=
&#91;Proxy]
ProxyEnableProxy=0
ProxyType=0
ProxyName=
ProxyPort=1080
ProxyEnablePassword=0
ProxyUser=
ProxyPassword=
&#91;ExternalConnect]
UseSrcSeeds=0
<mark>AcceptExternalConnections=1</mark>
ECAddress=
ECPort=4712
<mark>ECPassword=0d545153bf7b94d6094a01f5f925163b</mark>
UPnPECEnabled=0
ShowProgressBar=1
ShowPercent=1
UseSecIdent=1
IpFilterClients=1
IpFilterServers=1
TransmitOnlyUploadingClients=0
&#91;WebServer]
Enabled=1
<mark>Password=0d545153bf7b94d6094a01f5f925163b</mark>
PasswordLow=
<mark>Port=24711</mark>
WebUPnPTCPPort=50001
UPnPWebServerEnabled=0
UseGzip=1
UseLowRightsUser=0
PageRefreshTime=120
Template=default
Path=amuleweb
&#91;GUI]
HideOnClose=0
&#91;Razor_Preferences]
FastED2KLinksHandler=1
&#91;SkinGUIOptions]
Skin=
&#91;Statistics]
MaxClientVersions=0
&#91;Obfuscation]
IsClientCryptLayerSupported=1
IsCryptLayerRequested=1
IsClientCryptLayerRequired=0
CryptoPaddingLenght=254
CryptoKadUDPKey=1686729473
&#91;PowerManagement]
PreventSleepWhileDownloading=0
&#91;UserEvents]
&#91;UserEvents/DownloadCompleted]
CoreEnabled=0
CoreCommand=
GUIEnabled=0
GUICommand=
&#91;UserEvents/NewChatSession]
CoreEnabled=0
CoreCommand=
GUIEnabled=0
GUICommand=
&#91;UserEvents/OutOfDiskSpace]
CoreEnabled=0
CoreCommand=
GUIEnabled=0
GUICommand=
&#91;UserEvents/ErrorOnCompletion]
CoreEnabled=0
CoreCommand=
GUIEnabled=0
GUICommand=
&#91;HTTPDownload]
URL_1=http://upd.emule-security.org/ipfilter.zip
URL_2=http://emule-security.org/serverlist/server.met
URL_5=http://upd.emule-security.org/nodes.dat
URL_3=http://emule-security.org/serverlist/server.met

</code></pre>



<p class="wp-block-paragraph">Descripción de los puntos más importantes de la configuración de aMule.</p>



<h4 class="wp-block-heading">Parámetros Críticos de Configuración (<code>amule.conf</code>)</h4>



<ul class="wp-block-list">
<li><strong><code>Nick</code></strong>: Es tu nombre de usuario en la red. Aunque no afecta a la velocidad, sirve para identificarte en las colas de otros usuarios.</li>



<li><strong><code>MaxDownload=19375</code></strong>: Define el límite máximo de descarga (en este caso, unos 150 Mbps). Permite que aMule use el ancho de banda necesario sin saturar la CPU de la Raspberry.</li>



<li><strong><code>MaxUpload=5000</code></strong>: Define la velocidad de subida. Es vital ser generoso (5 MB/s); en la red eD2k, cuanto más subes, más créditos ganas y más rápido descargas de los demás.</li>



<li>Slot Allocation=20 : determina <strong>cuánta velocidad de subida le das a cada persona</strong> que se descarga algo de ti. Con 5000 de subida total, estás abriendo <strong>250 slots simultáneos</strong>. Vas a ganar créditos con 250 personas a la vez, lo que te garantiza descargar a máxima velocidad en tiempo récord.</li>



<li><strong><code>Port=24662</code> (TCP)</strong>: Es el puerto que usa el programa para recibir datos. Debe estar abierto en tu router hacia la IP de la Raspberry para evitar la «ID Baja».</li>



<li><strong><code>UDPPort=24672</code> (UDP)</strong>: Puerto para la red Kad y búsquedas. También debe estar abierto en el router para que la red funcione al 100%.</li>



<li><strong><code>MaxSourcesPerFile=300</code></strong>: El número máximo de fuentes que el programa buscará por cada archivo. Un valor de 300 es el punto de equilibrio ideal para la Raspberry Pi 4.</li>



<li><strong><code>MaxConnections=300</code></strong>: Límite de conexiones totales simultáneas. Mantenerlo en 300 evita que la Raspberry se bloquee por exceso de hilos de red abiertos. Si se sube mucho (ej. 500 o más), la Pi suele dar errores de red (<code>epoll</code>).</li>



<li><strong><code>MaxConnectionsPerFiveSeconds=20</code></strong>: Controla cuántas conexiones nuevas se intentan cada 5 segundos. Un valor bajo (20) evita que el router colapse al arrancar el programa.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading">Mantenimiento y Rendimiento del Sistema</h4>



<ul class="wp-block-list">
<li><strong><code>FileBufferSizePref=100</code></strong>: Define el tamaño del búfer en RAM antes de escribir en el disco. Un valor alto (100% o más) reduce el número de escrituras constantes, protegiendo la salud de la tarjeta MicroSD.</li>



<li><strong><code>AllocateFullFile=0</code></strong>: Si está en <code>1</code>, reserva todo el espacio del archivo al empezar. En la Raspberry es mejor dejarlo en <code>0</code> para que no se congele el sistema al intentar crear archivos muy grandes de golpe.</li>



<li><strong><code>SmartIdState=1</code></strong>: Ayuda a recuperar la ID Alta (flechas verdes) si sufres un micro-corte de internet, siempre que los puertos del router estén bien configurados.</li>



<li><strong><code>Serverlist=1</code></strong>: Indica al programa que actualice la lista de servidores conocidos cada vez que se inicia.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h4 class="wp-block-heading">Rutas y Seguridad</h4>



<ul class="wp-block-list">
<li><strong><code>IncomingDir</code> y <code>TempDir</code></strong>: Son las carpetas donde se guardan las descargas finalizadas y los archivos temporales. En una Raspberry, si puedes usar un SSD o disco externo, cambia estas rutas para evitar desgastar la tarjeta SD.</li>



<li><strong><code>IPFilterURL</code></strong>: La dirección para descargar el filtro de IPs (ej: <code>http://upd.emule-security.org/ipfilter.zip</code>). Es fundamental para bloquear servidores falsos y clientes espía automáticamente.</li>



<li><strong><code>Ed2kServersUrl</code></strong>: Dirección para descargar una lista de servidores fiables (ej: <code>http://upd.emule-security.org/server.met</code>). Garantiza que siempre conectes a servidores reales y seguros.</li>
</ul>



<p class="wp-block-paragraph"></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">7. El paso final: ¿Quieres que aMule arranque solo?</h2>



<p class="wp-block-paragraph">Para que tu Raspberry Pi sea un servidor de descargas profesional, lo ideal es crear un servicio en <code>systemd</code>. Esto hará que <code>amuled</code> se inicie automáticamente cada vez que enciendas la Pi sin necesidad de abrir una terminal.</p>



<p class="wp-block-paragraph">En tu terminal homologada ejecuta este comando:</p>



<p class="wp-block-paragraph">Copia y pega el contenido a tu archivo, no olvides sustituir «tu_usuario» y «tu_grupo» por los tuyos propios. </p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=aMule Master Daemon
After=network.target

&#91;Service]
Type=simple
User=tu_usuario
Group=tu_grupo
ExecStart=/usr/local/bin/amuled
Restart=always
RestartSec=5

&#91;Install]
WantedBy=multi-user.target</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Guarda con Crtl + o  y sal con Crtl + x </p>



<p class="wp-block-paragraph">Ahora sigue estos pasos para que el sistema reconozca la nueva configuración sin errores:</p>



<ol start="1" class="wp-block-list">
<li><strong>Recarga la configuración</strong>: <br><code>sudo systemctl daemon-reload</code> <br>(Esto es vital cada vez que editas un archivo <code>.service</code>).</li>



<li><strong>Activa el servicio con:</strong><br><code>sudo systemctl enable amule.service</code></li>



<li><strong>Inicia el servicio:</strong><br><code>sudo systemctl start amule.service</code></li>



<li><strong>Comprueba que vive</strong>:<br><code>sudo systemctl status amule.service</code></li>
</ol>



<ul class="wp-block-list">
<li>Sólo en caso de fallo, si nesitas revivir o reiniciar el servicio puedes usar el comando:<br><code>sudo systemctl restart amule.service</code></li>
</ul>



<p class="wp-block-paragraph">«Al compilar nosotros mismos, el sistema no sabe cómo arrancar el programa automáticamente. Creamos este archivo en <code>/etc/systemd/system/</code> para que la Raspberry Pi sepa que el &#8216;cerebro&#8217; de las descargas debe estar siempre vivo, incluso si hay un corte de luz y el SSD se reinicia.»</p>



<h2 class="wp-block-heading"><strong>Notas y advertencias</strong></h2>



<ul class="wp-block-list">
<li>Con &#8211;with-boost se usa Boost.Asio para networking → evita bugs de wxNet/epoll en ARM/Pi 5.</li>



<li>Si usas conexiones altas (&gt;300), el bug epoll puede volver; baja a 200-300 como workaround.</li>



<li>Como asunto relevantes: <a href="https://github.com/amule-project/amule/issues/171" target="_blank" rel="noreferrer noopener">https://github.com/amule-project/amule/issues/171</a> (donde recomiendan &#8211;with-boost explícitamente).</li>
</ul>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxete.duckdns.org/compilar-amule-desde-github-rama-master-en-raspberry-pi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo recibir notificaciones de aMule en Telegram</title>
		<link>https://linuxete.duckdns.org/como-recibir-notificaciones-de-amule-en-telegram/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=como-recibir-notificaciones-de-amule-en-telegram</link>
					<comments>https://linuxete.duckdns.org/como-recibir-notificaciones-de-amule-en-telegram/#respond</comments>
		
		<dc:creator><![CDATA[raspberry]]></dc:creator>
		<pubDate>Sun, 08 Feb 2026 22:29:10 +0000</pubDate>
				<category><![CDATA[amule]]></category>
		<category><![CDATA[amule 2.3.3]]></category>
		<category><![CDATA[amule.conf]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Bot]]></category>
		<category><![CDATA[Descargas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Notificaciones]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Raspberry Pi 4]]></category>
		<category><![CDATA[Raspberry Pi 5]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[Telegram]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">https://linuxete.duckdns.org/?p=3826</guid>

					<description><![CDATA[Si eres de la vieja escuela, que aún disfruta con aMule, sabrás que no hay nada más frustrante que estar mirando la pantalla esperando a que termine esa descarga de pocas fuentes, que lleva semanas o el algún caso meses, esperando a finalizar. ¿No sería maravilloso que la «Mula» te enviara un mensaje al móvil [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Si eres de la vieja escuela, que aún disfruta con <strong>aMule</strong>, sabrás que no hay nada más frustrante que estar mirando la pantalla esperando a que termine esa descarga de pocas fuentes, que lleva semanas o el algún caso meses, esperando a  finalizar. ¿No sería maravilloso que la «Mula» te enviara un mensaje al móvil cuando termina? <br>Aquí os comparto este tutorial definitivo, y digo <strong>definitivo</strong> porque hemos peleado con todos los errores posibles: nombres de archivos con comillas, tamaños en bytes ilegibles y mensajes que nunca llegaban. La mayoría de los scripts que circulan por internet fallan porque aMule se vuelve loco con los espacios y los símbolos (como el apóstrofo de <em>Don&#8217;t</em>) y acaba enviando mensajes vacíos o bloqueando el sistema.</p>



<p class="wp-block-paragraph">Vamos a usar un script «inteligente» que recoge todo lo que aMule escupe, calcula los Megabytes y lo envía a Telegram usando un formato que <strong>nunca falla</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Paso 1: Configurar aMule</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>¡OJO!</strong> Antes de editar, detén aMule</p>
</blockquote>



<pre class="wp-block-code"><code><code>sudo systemctl stop amule</code></code></pre>



<p class="wp-block-paragraph">Vamos a decirle a aMule que ejecute nuestro script. Para ello, debemos editar el archivo <code>amule.conf</code>.</p>



<pre class="wp-block-code"><code>nano ~/.aMule/amule.conf</code></pre>



<p class="wp-block-paragraph">Busca la sección <code>[UserEvents/DownloadCompleted]</code> y déjala exactamente así:</p>



<pre class="wp-block-code"><code>CoreEnabled=1
CoreCommand=/home/<mark style="background-color:#7bdcb5" class="has-inline-color">tu_usuario</mark>/notificar_amule.sh %NAME %SIZE</code></pre>



<p class="wp-block-paragraph">Sustituye tu_usuario por el tuyo propio.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Paso 2: Crear el Script</h3>



<p class="wp-block-paragraph">Crea el archivo de tu script, sustituyendo tu_usuario por el tuyo propio:</p>



<pre class="wp-block-code"><code><code>nano /home/<mark style="background-color:#7bdcb5" class="has-inline-color">tu_usuario</mark>/notificar_amule.sh </code></code></pre>



<p class="wp-block-paragraph">y pega este código (sustituye tu Token y tu ID de Chat):</p>



<pre class="wp-block-code"><code>#!/bin/bash

# --- CONFIGURACION DEL BOT ---
TOKEN="<mark style="background-color:#7bdcb5" class="has-inline-color">TU_TOKEN_AQUI</mark>"
ID_CHAT="<mark style="background-color:#7bdcb5" class="has-inline-color">TU_ID_AQUI</mark>"

# 1. Recogemos todo lo que mande aMule de golpe
TODO="$*"

# 2. Extraemos el tamaño (el último número de la frase)
BYTES=$(echo "$TODO" | grep -oP '\d+$')

# 3. Limpiamos el nombre (quitamos el número del final)
NOMBRE=$(echo "$TODO" | sed 's/&#91;0-9]*$//')

# 4. Calculamos los MB y sacamos la fecha de la Raspberry
TAMANO_MB=$((BYTES / 1048576))
FECHA=$(date +"%d/%m/%Y a las %H:%M")

# 5. El Mensaje (con emoticonos para darle estilo)
MENSAJE="&#x2705; DESCARGA COMPLETADA
----------------------------------
&#x1f3b5; Archivo: $NOMBRE
&#x2696; Tamaño: $TAMANO_MB MB
&#x1f552; Finalizado: $FECHA
&#x1f967; Servidor: Raspberry Pi
----------------------------------"

# 6. Envío blindado con urlencode (evita que el mensaje se corte)
/usr/bin/curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
     --data-urlencode "chat_id=$ID_CHAT" \
     --data-urlencode "text=$MENSAJE" &gt; /dev/null
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Paso 3: Permisos y Arranque</h3>



<p class="wp-block-paragraph">Para que esto funcione, dale permiso de ejecución al script:</p>



<pre class="wp-block-code"><code><code>chmod +x /home/<mark style="background-color:#7bdcb5" class="has-inline-color">tu_usuario</mark>/notificar_amule.sh</code></code></pre>



<p class="wp-block-paragraph">Ahora, arranca aMule de nuevo:</p>



<pre class="wp-block-code"><code><code>sudo systemctl restart amule</code></code></pre>



<p class="wp-block-paragraph">¡Y listo! A partir de ahora, cada vez que la Mula termine su trabajo, recibirás un «ping» en tu Telegram con toda la información. ¡A disfrutar de la descarga!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://linuxete.duckdns.org/como-recibir-notificaciones-de-amule-en-telegram/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
