<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tutoriales on Marco Antonio Blanco</title><link>https://marcoantonioblanco.es/categories/tutoriales/</link><description>Recent content in Tutoriales on Marco Antonio Blanco</description><generator>Hugo -- gohugo.io</generator><language>es-es</language><copyright>Marco Antonio Blanco</copyright><lastBuildDate>Wed, 22 Oct 2014 16:45:33 +0000</lastBuildDate><atom:link href="https://marcoantonioblanco.es/categories/tutoriales/index.xml" rel="self" type="application/rss+xml"/><item><title>Nos quedamos sin Adobe Reader en Linux, ¿y ahora qué?</title><link>https://marcoantonioblanco.es/2014/10/nos-quedamos-sin-adobe-reader-en-linux-y-ahora-que/</link><pubDate>Wed, 22 Oct 2014 16:45:33 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/10/nos-quedamos-sin-adobe-reader-en-linux-y-ahora-que/</guid><description>&lt;p&gt;El pasado mes de Septiembre, Adobe nos dio la &amp;ldquo;mala&amp;rdquo; noticia de que &lt;a class="link" href="https://web.archive.org/web/20141022/http://linuxg.net/adobe-will-no-longer-release-adobe-reader-for-linux-however-adobe-reader-is-still-installable-on-ubuntu-and-debian/" target="_blank" rel="noopener"&#10; &gt;Linux dejaba de ser una de las plataformas en las que su lector de PDF Reader tuviese soporte&lt;/a&gt;. Y lo digo entre comillas porque en el fondo no es tan mala noticia. De hecho, que Adobe elimine una herramienta privativa, sobrecargada y con tantos problemas de seguridad es en realidad una gran noticia para los usuarios Linux. Sobre todo si tenemos en cuenta que contamos con muy buenas alternativas libres como oKular (KDE) o Evince (GNOME).&lt;/p&gt;&#10;&lt;p&gt;Es cierto que ninguna de estas opciones cubren el 100% de las capacidades de Reader, como las animaciones o los modelos 3D empotrados, pero eran precisamente estas complejidades las que hacían de Reader una herramienta pesada e insegura. Aún así, hay una característica por la que sí echaríamos de menos a Reader: los formularios. Desgraciadamente, en España se realizan muchísimos trámites administrativos a través de plataformas telemáticas basadas, entre otras cosas, en documentos PDF empotrados en el navegador en los que hay que rellenar una serie de campos. Si Adobe abandona a los usuarios de Linux, ¿qué hacemos ahora para tener acceso a estos servicios públicos a los que tenemos derecho?&lt;/p&gt;&#10;&lt;p&gt;Afortunadamente, existe una solución basada en software libre sencilla de echar a andar. Consiste en utilizar el &lt;em&gt;plugin&lt;/em&gt; MozPlugger para Firefox y combinarlo con Evince, que ofrece un mejor soporte de los formularios PDF que oKular, de forma que los documentos PDF aparezcan empotrados cuando así lo requiera un sitio web. Como es habitual, daré las instrucciones para Debian y derivadas, aunque son fácilmente adaptables a cualquier otra distribución Linux.&lt;/p&gt;&#10;&lt;p&gt;Empezamos instalando el software que necesitamos, es decir, MozPlugger y Evince. En el caso de Squeeze, Jessie y posteriores, ambos paquetes se encuentran en los repositorios oficiales:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install mozplugger evince&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Leyendo lista de paquetes... Hecho&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Creando árbol de dependencias&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sin embargo, en el caso de Wheezy, la actual estable, no contamos con un paquete oficial, así que tendremos que descargarnos la &lt;a class="link" href="https://packages.debian.org/squeeze/mozplugger" target="_blank" rel="noopener"&#10; &gt;versión para Squeeze&lt;/a&gt; de nuestra arquitectura e instalarla a mano, lo cual funciona sin problemas.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# dpkg -i mozplugger_1.14.1-1_amd64.deb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Seleccionando el paquete mozplugger previamente no seleccionado.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(Leyendo la base de datos ...)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Desempaquetando mozplugger (de mozplugger_1.14.1-1_amd64.deb) ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Configurando mozplugger (1.14.1-1) ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Una vez instalados los paquetes necesarios, procedemos a configurar mozplugger para que utilice Evince como su lector de PDF por predeterminado, que dependen de la versión de Debian que tengamos instalada.&lt;/p&gt;&#10;&lt;p&gt;En Jessie o posteriores editamos el fichero &lt;code&gt;/etc/mozpluggerrc.d/62-documents.conf&lt;/code&gt; y buscamos la sección que se refiere a los documentos PDF:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;application/pdf:pdf:PDF file&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;application/x-pdf:pdf:PDF file&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;text/pdf:pdf:PDF file&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;text/x-pdf:pdf:PDF file&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ACROREAD()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; repeat noisy swallow(Xpdf) fill needs_xembed: xpdf -g +9000+9000 &amp;#34;$file&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; repeat noisy swallow(okular) fill needs_xembed: okular &amp;#34;$file&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; repeat noisy swallow(epdfview) fill needs_xembed: epdfview &amp;#34;$file&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; GV()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; repeat noisy swallow(evince) fill needs_xembed: evince &amp;#34;$file&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Entonces insertamos en primera posición una nueva línea referente a Evince para que así se convierta en el lector PDF empotrado predeterminado:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;application/pdf:pdf:PDF file&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;application/x-pdf:pdf:PDF file&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;text/pdf:pdf:PDF file&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;text/x-pdf:pdf:PDF file&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; repeat noisy swallow(evince) fill: evince &amp;#34;$file&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ACROREAD()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; repeat noisy swallow(Xpdf) fill needs_xembed: xpdf -g +9000+9000 &amp;#34;$file&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; repeat noisy swallow(okular) fill needs_xembed: okular &amp;#34;$file&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; repeat noisy swallow(epdfview) fill needs_xembed: epdfview &amp;#34;$file&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; GV()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; repeat noisy swallow(evince) fill needs_xembed: evince &amp;#34;$file&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finalmente tenemos que ejecutar un script que traslada los cambios realizados al fichero principal de configuración en &lt;code&gt;/etc/mozpluggerrc&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# /usr/sbin/update-mozpluggerrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Purging current configuration...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Generating mozpluggerrc...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Merging /etc/mozpluggerrc.d/20-header.conf ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Merging /etc/mozpluggerrc.d/40-global_defs.conf ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Merging /etc/mozpluggerrc.d/60-video.conf ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Merging /etc/mozpluggerrc.d/61-audio.conf ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Merging /etc/mozpluggerrc.d/62-documents.conf ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Done.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En el caso de Wheezy y Squeeze lo único que hay que hacer es editar directamente el fichero &lt;code&gt;/etc/mozpluggerrc&lt;/code&gt; según las instrucciones anteriores.&lt;/p&gt;&#10;&lt;p&gt;Ahora iniciamos Firefox (si ya lo teníamos abierto será necesario cerrarlo y abrirlo de nuevo) y configuramos las opciones de visualización de PDF. En el menú de Firefox, elegimos la opción de Preferencias y seleccionamos la sección de Aplicaciones. En el cuadro de búsqueda introducimos la cadena &amp;ldquo;pdf&amp;rdquo; y elegimos &amp;ldquo;mozplugger&amp;rdquo; en el desplegable. Tras pulsar en el botón &amp;ldquo;Cerrar&amp;rdquo;, ya tendremos activo Evince como visor PDF empotrado predeterminado. Para hacer pruebas, podemos elegir cualquier documento PDF que incluya formularios.&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://marcoantonioblanco.es/images/wp/2014/10/pref_firefox.jpg" &gt;&lt;img alt="preferencias firefox" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://marcoantonioblanco.es/images/wp/2014/10/pref_firefox-300x236.jpg"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Cambiando el lector de PDF predeterminado en Firefox&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Los usuarios de otros navegadores se habrán dado cuenta que esta solución sólo funciona con Firefox y navegadores compatibles con el API de &lt;em&gt;plugins&lt;/em&gt; de Netscape. De hecho, Chrome sustituyó su mecanismo de conexión de &lt;em&gt;plugins&lt;/em&gt; hace unas pocas versiones, lo que impide que sus usuarios disfruten no sólo de MozPlugger, sino de otras tecnologías como Java. En este caso, la única solución posible es utilizar Firefox para esos sitios web en los que sea necesario utilizar formularios PDF empotrados.&lt;/p&gt;&#10;&lt;p&gt;Para finalizar debo advertir que el soporte de los formularios PDF de Evince no es perfecto y que es muy probable que tarde o temprano nos encontremos con un documento que no podamos rellenar, pero menos da una piedra. Espero que probéis esta receta y que compartáis vuestras impresiones.&lt;/p&gt;&#10;</description></item><item><title>Obteniendo informacion del sistema desde consola e IRC con inxi</title><link>https://marcoantonioblanco.es/2014/10/obteniendo-informacion-del-sistema-desde-consola-e-irc-con-inxi/</link><pubDate>Wed, 08 Oct 2014 10:33:55 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/10/obteniendo-informacion-del-sistema-desde-consola-e-irc-con-inxi/</guid><description>&lt;p&gt;No hace mucho publiqué una serie de artículos sobre &lt;a class="link" href="https://marcoantonioblanco.es/2013/07/comprobando-el-hardware-de-un-servidor-linux-sin-abrirlo-hwinfo-i/" &gt;cómo obtener información del hardware de un sistema Linux&lt;/a&gt; en producción sin necesidad de pararlo. Recientemente me he topado con otra herramienta que nos sirve para esta tarea: &lt;a class="link" href="https://code.google.com/p/inxi/" target="_blank" rel="noopener"&#10; &gt;inxi&lt;/a&gt;, un &lt;em&gt;script&lt;/em&gt; que recaba información completa sobre el hardware y el software más importante de un sistema y lo muestra en consola o, si así lo configuramos, a través de IRC.&lt;/p&gt;&#10;&lt;p&gt;La instalación de inxi es muy sencilla y en su web oficial se encuentran las &lt;a class="link" href="https://code.google.com/p/inxi/wiki/Installation" target="_blank" rel="noopener"&#10; &gt;instrucciones&lt;/a&gt; para las distribuciones Linux más populares, si no se encuentra instalado ya de serie como es el caso de Linux Mint y otras.&lt;/p&gt;&#10;&lt;p&gt;Para su instalación en Debian, tendremos que seguir pasos diferentes dependiendo de la versión que tengamos instalada. Si usamos Jessie o posterior, tenemos un paquete a nuestra disposición en los repositorios oficiales, por lo que bastará con el siguiente comando:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install inxi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sin embargo, en el caso de Wheezy (la actual versión estable), hay que descargarse el paquete e instalarlo a mano. Primero, accedemos al &lt;a class="link" href="https://packages.debian.org/jessie/all/inxi/download" target="_blank" rel="noopener"&#10; &gt;repositorio de inxi en Jessie&lt;/a&gt; y nos lo descargamos del servidor que queramos. Después, instalaremos con este comando:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# dpkg -i inxi_2.1.28-1_all.deb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La forma más sencilla y directa de utilizar inxi es invocarlo directamente sin parámetro alguno:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# inxi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CPU~Dual core AMD A6-5400K APU with Radeon HD Graphics (-MCP-) clocked at Min:1400.000Mhz Max:3600.000Mhz Kernel~3.16-0.bpo.2-amd64 x86_64 Up~16:29 Mem~1798.6/7406.1MB HDD~4000.8GB(19.8% used) Procs~190 Client~Shell inxi~2.1.28&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La salida de inxi por defecto es a color, por lo que si nos resulta molesto podemos o bien cambiar el esquema de color utilizado con el parámetro &lt;code&gt;-c&lt;/code&gt;, que admite un número de 0 a 32, donde 0 lo desactiva completamente. El otro parámetro genérico es -v, que aumenta el nivel de detalle de la salida de inxi según el valor que le indiquemos entre 0 (mínimo) y 7.&lt;/p&gt;&#10;&lt;p&gt;El resto de parámetros están dedicados a obtener información específica sobre componentes hardware concretos, lo que podemos consultar en el manual electrónico (&lt;code&gt;man inxi&lt;/code&gt;) de inxi. Por ejemplo, si queremos información sin color sobre la CPU y la tarjeta gráfica:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# inxi -C -G -c0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CPU: Dual core AMD A6-5400K APU with Radeon HD Graphics (-MCP-) cache: 2048 KB &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Clock Speeds: 1: 1900 MHz 2: 1400 MHz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Graphics: Card: Advanced Micro Devices [AMD] ATI Device 9991&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Display Server: N/A driver: N/A tty size: 177x25 Advanced Data: N/A for root out of X&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En cuanto al uso de inxi a través de IRC, basta con que lo integremos con nuestro cliente IRC favorito y recibiremos la información de nuestros sistema a través suyo. En el &lt;a class="link" href="https://code.google.com/p/inxi/wiki/inxi_usage" target="_blank" rel="noopener"&#10; &gt;wiki oficial del proyecto&lt;/a&gt; se habla de los clientes IRC más populares. Por ejemplo, para integrar inxi con Konversation en KDE4:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ln -s /usr/local/bin/inxi /usr/share/kde4/apps/konversation/scripts/inxi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En el poco tiempo que llevo probándolo, inxi me está resultando muy útil y es más que probable que termine definitivamente formando parte de mi &amp;ldquo;caja de herramientas&amp;rdquo; de administración de sistemas. Si lo probáis, no dudéis en compartir vuestra experiencia con inxi.&lt;/p&gt;&#10;</description></item><item><title>Cómo resolver el bug de BASH en Debian</title><link>https://marcoantonioblanco.es/2014/10/como-resolver-el-bug-de-bash-en-debian/</link><pubDate>Wed, 01 Oct 2014 16:23:56 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/10/como-resolver-el-bug-de-bash-en-debian/</guid><description>&lt;p&gt;La noticia más destacada de la semana pasada (yo diría que de los últimos meses) es sin duda la del &lt;a class="link" href="http://www.securitybydefault.com/2014/09/grave-vulnerabilidad-en-bash-y-otros.html" target="_blank" rel="noopener"&#10; &gt;infame &lt;em&gt;bug&lt;/em&gt; de BASH&lt;/a&gt; (también conocido como &lt;em&gt;Shell Shock&lt;/em&gt;), que permite comprometer remotamente sistemas que tengan instalado este popular intérprete de comandos, como Linux, Unix o Mac OS. Se trata sin duda de una de las vulnerabilidades de mayor impacto en Internet de los últimos años (con el permiso de &lt;em&gt;Heartbleed&lt;/em&gt;), tanto por su facilidad de explotación como por su propagación por la Red. Por ello, los administradores de sistemas hemos tenido que ponernos las pilas y parchear rápidamente los sistemas a nuestro cargo para mitigar las posibles consecuencias del bug. Como en Activa Sistemas tenemos a Debian como plataforma favorita, nuestros esfuerzos se han dirigido a resolver &lt;em&gt;Shell Shock&lt;/em&gt; en dicha distribución Linux, esfuerzos que queremos compartir con nuestros lectores.&lt;/p&gt;&#10;&lt;p&gt;La metodología a seguir para parchear el &lt;em&gt;bug&lt;/em&gt; es la misma independientemente de la versión de Debian de cada servidor, que consiste en instalar una versión actualizada de BASH que no contenga el &lt;em&gt;bug&lt;/em&gt;, pero el camino para llegar a dichos paquetes actualizados sí que depende de la versión de Debian. Veamos qué hacer en cada caso:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Wheezy y posteriores: En el caso de la versión estable y las versiones en desarrollo e inestable basta con actualizar la base de datos de paquetes desde los repositorios oficiales:&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;y, o bien actualizar todo el sistema:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get upgrade&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;o bien instalar sólo BASH:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Squeeze: A la anterior versión estable se le otorgó el &lt;a class="link" href="https://www.debian.org/News/2014/20140424" target="_blank" rel="noopener"&#10; &gt;soporte extendido (LTS: &lt;em&gt;Long Term Support&lt;/em&gt;) en Abril de 2014&lt;/a&gt;, lo que supone que recibirá actualizaciones de paquetes hasta Febrero de 2016. Esto implica que BASH tiene una actualización para Squeeze en los repositorios LTS. Por lo tanto, lo primero es añadirlos a nuestro sistema, para lo cual tenemos que incluir la siguiente línea en el fichero &lt;code&gt;/etc/apt/sources.list&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;deb http://http.debian.net/debian/ squeeze-lts main contrib non-free&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A continuación seguimos los pasos para Wheezy y tendremos BASH actualizado en Squeeze.&lt;/p&gt;&#10;&lt;p&gt;Lenny y anteriores: En el caso de que tengamos instalada en algún servidor una versión de Debian más antigua que Squeeze (por ejemplo, el típico caso de una máquina virtual instalada expresamente para dar soporte a una aplicación anticuada pero en uso), la única opción que tenemos es la de construir un &lt;em&gt;backport&lt;/em&gt; del paquete de BASH para Wheezy. Esto consiste en descargar el paquete fuente y recompilarlo en una versión de Debian idéntica a la que tenemos en el servidor de destino. &lt;code&gt; &lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Como se puede imaginar, esta operación no está al alcance de cualquiera, ya que implica tener experiencia en la compilación de código fuente y la construcción de paquetes de software. Por eso, hemos construido nuestros propios backports de BASH para Lenny y los hemos puesto a disposición de todo aquél interesado para que los utilicen para actualizar sus sistemas antiguos. Eso sí, los paquetes se ofrecen sin ningún tipo de garantía, por lo que recomendamos su instalación previa en un sistema de prueba antes de proceder al servidor en producción.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Al igual que en el caso de Squeeze, sólo hay que &lt;a class="link" href="http://labs.activasistemas.com/debian-act/lenny/" target="_blank" rel="noopener"&#10; &gt;añadir el repositorio al sistema&lt;/a&gt; y proceder a la instalación del paquete actualizado.&lt;/p&gt;&#10;&lt;p&gt;Sólo queda comprobar si realmente la actualización ha surtido efecto. Para ello, ejecutamos el siguiente comando en una consola:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# env x=&amp;#39;() { :;}; echo vulnerable&amp;#39; bash -c &amp;#39;echo this is a test&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si no se imprime en pantalla la palabra &lt;code&gt;vulnerable&lt;/code&gt;, entonces hemos conseguido parchear el &lt;em&gt;bug&lt;/em&gt; de BASH y estaremos a salvo, al menos hasta que se descubra otro ;)&lt;/p&gt;&#10;</description></item><item><title>Monitorix, un sencillo sistema de monitorización para servidores Linux</title><link>https://marcoantonioblanco.es/2014/07/monitorix-un-sencillo-sistema-de-monitorizacion-para-servidores-linux/</link><pubDate>Fri, 11 Jul 2014 12:47:08 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/07/monitorix-un-sencillo-sistema-de-monitorizacion-para-servidores-linux/</guid><description>&lt;p&gt;Hace algunos años escribí un artículo sobre la &lt;a class="link" href="https://marcoantonioblanco.es/2009/01/la-necesidad-de-monitorizar-un-sistema-informatico/" &gt;necesidad de monitorizar los sistemas informáticos&lt;/a&gt; a nuestro cargo, en el que comentaba que la tarea de implantar un sistema de monitorización no era tan difícil como exigente. Pues bien, existe un software que no sólo es muy fácil de instalar sino que permite elegir el nivel de exigencia que queramos tanto para nosotros como administradores como para el propio software.&lt;/p&gt;&#10;&lt;p&gt;El software en cuestión se llama &lt;a class="link" href="http://www.monitorix.org" target="_blank" rel="noopener"&#10; &gt;Monitorix&lt;/a&gt;, lo desarrolla &lt;a class="link" href="mailto:jordi@fibranet.cat" &gt;Jordi Sanfeliu&lt;/a&gt; en el lenguaje Perl, es de licencia libre y está disponible para Linux y FreeBSD. Su objetivo es ofrecer un panel de control sencillo, personalizable a través de un único fichero de configuración en texto plano (en algunas distros existe un fichero extra, como veremos más adelante), que permita realizar un detallado seguimiento mediante completas gráficas a los parámetros y servicios del sistema que más nos interesen. Monitorix no sólo nos habla del uso de la CPU, la RAM, la red o el almacenamiento local, sino que está preparado para mantenernos informados del rendimiento de servidores tan populares como Apache o MySQL. Y todo, insisto, a través de gráficas muy completas y a la vez sencillas de interpretar.&lt;/p&gt;&#10;&lt;p&gt;Todo el acceso a Monitorix se realiza a través de navegador web, ya que se invoca a través de un CGI que incluye su propio servidor web (se puede integrar con uno ya existente en el sistema) y que consulta las bases de datos generadas por un demonio que está periódicamente recopilando la información que nos interese.&lt;/p&gt;&#10;&lt;p&gt;Para ello, Monitorix utiliza bases de datos Round Robin (RRD) como &lt;em&gt;backend&lt;/em&gt; para el almacenamiento de los datos recogidos. Esto le permite mantener un histórico del comportamiento del sistema y nos ofrece la posibilidad de consultar la información tanto en tiempo real como del periodo de tiempo que queramos.&lt;/p&gt;&#10;&lt;p&gt;Otra característica muy interesante de Monitorix es que se puede configurar una instancia a través de la cual accedamos a todas las demás instaladas en los sistemas monitorizados. De esta forma sólo necesitamos un panel de control para acceder a toda la información de nuestros sistemas. Para ello hay que activar en la configuración de Monitorix el modo &lt;em&gt;multihost&lt;/em&gt; en el nodo central e indicarle cuales son los otros sistemas a monitorizar a través suyo. La activación de esta característica es muy sencilla y se detalla claramente en la &lt;a class="link" href="http://www.monitorix.org/faq.html#Q112" target="_blank" rel="noopener"&#10; &gt;FAQ del proyecto&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Antes de proceder a explicar cómo instalar Monitorix en Debian, debo aclarar que tenemos dos opciones: instalación manual e instalación mediante repositorio. Qué opción nos interesa más es algo que debemos elegir cada uno en base a nuestras circunstancias particulares, aunque por mi parte tengo claro que para hacer una prueba me quedo con la manual, mientras que para instalar definitivamente no hay nada mejor que usar un repositorio.&lt;/p&gt;&#10;&lt;h5 id="instalación-a-mano"&gt;Instalación a mano&#10;&lt;/h5&gt;&lt;p&gt;Empezamos comprobando cuál es la última versión disponible en &lt;a class="link" href="http://www.monitorix.org/downloads.html" target="_blank" rel="noopener"&#10; &gt;http://www.monitorix.org/downloads.html&lt;/a&gt; y procedemos a la instalación del paquete, sustituyendo &lt;code&gt;(version)&lt;/code&gt; por el número que hemos visto en la web de descarga.&lt;/p&gt;&#10;&lt;p&gt;Primero descargamos el paquete:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# wget http://www.monitorix.org/monitorix_(version)-izzy1_all.deb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A continuación instalamos software de apoyo:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install rrdtool perl libwww-perl libmailtools-perl libmime-lite-perl librrds-perl libdbi-perl libxml-simple-perl libhttp-server-simple-perl libconfig-general-perl libio-socket-ssl-perl&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ahora instalamos el paquete descargado de Monitorix:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# dpkg -i monitorix_(version)-izzy1_all.deb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Y le decimos al sistema que resuelva cualquier depedencia incmplida que pueda haber surgido:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get -f install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="instalación-mediante-repositorio"&gt;Instalación mediante repositorio&#10;&lt;/h5&gt;&lt;p&gt;En este caso comenzamos editando la lista de repositorios de nuestra Debian en &lt;code&gt;/etc/apt/sources.list&lt;/code&gt; y añadimos el repositorio &lt;code&gt;deb http://apt.izzysoft.de/ubuntu generic universe&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Después añadimos la firma de dicho repositorio importando su clave GPG al sistema:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# wget -O - http://apt.izzysoft.de/izzysoft.asc 2&amp;gt;/dev/null | apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finalmente actualizamos los repositorios e instalamos el paquete:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get update &amp;amp;&amp;amp; apt-get install monitorix&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="configuración-y-puesta-en-marcha"&gt;Configuración y puesta en marcha&#10;&lt;/h5&gt;&lt;p&gt;En Debian, configuramos Monitorix a través del fichero &lt;code&gt;/etc/monitorix/conf.d/00-debian.conf&lt;/code&gt;, que sustituye la configuración presente en el fichero principal &lt;code&gt;/etc/monitorix/monitorix.conf&lt;/code&gt;, de forma que no tengamos que tocarlo y así la actualización entre versiones sea más sencilla.&lt;/p&gt;&#10;&lt;p&gt;Dado que Monitorix trabaja sobre los registros del sistema, en este fichero comprobamos que sus caminos son correctos. Asimismo, en la sección &lt;code&gt;&amp;lt;graph_enable&amp;gt;&lt;/code&gt; podemos habilitar y deshabilitar lo que queramos monitorizar. Finalmente, cada parámetro del sistema o servicio a monitorizar tiene su propia sección en la que podemos personalizar su comportamiento.&lt;/p&gt;&#10;&lt;p&gt;Tras cualquier cambio en la configuración, basta con reiniciar el servicio para activarlo:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# /etc/init.d/monitorix restart&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El servidor web que incluye Monitorix es accesible a través del puerto 8080 (también configurable). Para acceder al recién instalado panel de control, abrimos un navegador y apuntamos a &lt;code&gt;http://&amp;lt;IP&amp;gt;:8080/monitorix/&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Con esto tendremos instalado un potente sistema de monitorización, con información directa y sencilla de interpretar y con un bajo impacto en el sistema.&lt;/p&gt;&#10;&lt;p&gt;Espero haberos animado a probar Monitorix. A cambio espero vuestros comentarios.&lt;/p&gt;&#10;</description></item><item><title>Acceso SSH sin contraseña a servidores Linux</title><link>https://marcoantonioblanco.es/2014/06/acceso-ssh-sin-contrasena-a-servidores-linux/</link><pubDate>Mon, 30 Jun 2014 12:16:47 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/06/acceso-ssh-sin-contrasena-a-servidores-linux/</guid><description>&lt;p&gt;Existen numerosos escenarios en los que es necesario automatizar tareas entre dos servidores Linux, como por ejemplo cuando queremos enviar código desde un servidor de desarrollo a otro de demo a través del cuál nuestros clientes van a revisar el trabajo desarrollado hasta el momento. Para ello lo mejor es utilizar el protocolo SSH, que permite no sólo crear sesiones interactivas sino también enviar ficheros y ejecutar comandos remotamente de una forma segura frente a terceros malintencionados. Sin embargo, SSH exige algún tipo de autentificación para acceder al servidor remoto, bien mediante contraseña bien mediante certificados. Lo habitual (por sencillo) es utilizar contraseñas, lo que convertiría cada conexión en algo tedioso al tener que autentificarse cada vez. Por ello, voy a contaros cómo generar una relación de confianza entre dos máquinas Linux para que se puedan automatizar tareas a través de SSH sin el uso de contraseñas.&lt;/p&gt;&#10;&lt;p&gt;Lo primero que hay que hacer es que ambas máquinas cuenten con soporte SSH. Aunque sólo es necesario el servicio en la máquina remota y lo normal en las distribuciones Linux más populares es que el cliente y el servidor se encuentren en paquetes diferentes, es muy útil contar con ambos en toda máquina que caiga bajo nuestra administración, así que procederemos a instalar los dos. En Debian por ejemplo existe un metapaquete que hace eso precisamente:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install ssh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En Linux, el servicio SSH más popular y soportado es OpenSSH, que es justo el que se acaba de instalar en ambas máquinas.&lt;/p&gt;&#10;&lt;p&gt;A partir de este momento, llamaremos al servidor cliente S1 y al servidor remoto S2. A continuación, accedemos a S1 como el usuario para el que queremos crear la relación de confianza (usuario1) y generamos las claves de autentificación, sin introducir una frase de paso (passphrase):&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usuario1@S1:~&amp;gt; ssh-keygen -t rsa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Generating public/private rsa key pair.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enter file in which to save the key (/home/usuario1/.ssh/id_rsa):&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Created directory &amp;#39;/home/usuario1/.ssh&amp;#39;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enter passphrase (empty for no passphrase):&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enter same passphrase again:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Your identification has been saved in /home/usuario1/.ssh/id_rsa.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Your public key has been saved in /home/usuario1/.ssh/id_rsa.pub.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The key fingerprint is:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;15:7d:0a:de:d8:a2:06:5f:4f:15:92:3b:14:1e:26:60 usuario1@S1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ahora mediante &lt;code&gt;ssh&lt;/code&gt; vamos a crear el directorio &lt;code&gt;~/.ssh&lt;/code&gt; como usuario2 en S2. El directorio puede ya existir, lo que no supone ningún problema:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usuario1@S1:~&amp;gt; ssh usuario2@S2 mkdir -p .ssh usuario2@S2&amp;#39;s password:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finalmente añadimos la nueva clave pública de usuario1 al fichero &lt;code&gt;.ssh/authorized_keys&lt;/code&gt; (o &lt;code&gt;.ssh/authorized_keys2&lt;/code&gt; según la versión del servidor SSH) de usuario2 en S2 e introducimos la contraseña de usuario2 por última vez:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usuario1@S1:~&amp;gt; cat .ssh/id_rsa.pub | ssh usuario2@S2 &amp;#39;cat &amp;gt;&amp;gt; .ssh/authorized_keys&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usuario2@S2&amp;#39;s password: &#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Desde este momento, ya es posible acceder a S2 como usuario2 desde S1 como usuario1 sin utilizar contraseña:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usuario1@S1:~&amp;gt; ssh usuario2@S2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usuario2@S2:~&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ya podemos incorporar a nuestros &lt;em&gt;scripts&lt;/em&gt; los comandos de SSH (y otras herramientas que hagan uso de SSH, como &lt;code&gt;rsync&lt;/code&gt;) para que las tareas que hayamos automatizado funcionen sin interrupción por el sistema de autentificación.&lt;/p&gt;&#10;&lt;p&gt;Sobra decir que esto NUNCA se debe hacer para el usuario &lt;code&gt;root&lt;/code&gt;, ya que si cae una máquina en manos malintencionadas, se produce un efecto dominó con el resto de servidores con los que tenga una relación de confianza mediante SSH sin contraseña. De hecho, NUNCA se debería tener activo el acceso a &lt;code&gt;root&lt;/code&gt; mediante SSH. Para ello, lo mejor es utilizar certificados, que es algo que veremos en un futuro artículo.&lt;/p&gt;&#10;&lt;p&gt;Espero que esta receta os sea de utilidad en vuestras tareas diarias de administración.&lt;/p&gt;&#10;</description></item><item><title>Gestión dinámica del rendimiento de CPUs bajo Linux</title><link>https://marcoantonioblanco.es/2014/05/gestion-dinamica-del-rendimiento-de-cpus-bajo-linux/</link><pubDate>Fri, 30 May 2014 11:43:57 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/05/gestion-dinamica-del-rendimiento-de-cpus-bajo-linux/</guid><description>&lt;p&gt;Esta semana hemos tenido la enorme suerte de poder impartir un &lt;a class="link" href="https://web.archive.org/web/20140530/http://www.activasistemas.com/Noticia.70&amp;#43;M566f1a0ae53.0.html" target="_blank" rel="noopener"&#10; &gt;seminario sobre seguridad para menores en Internet&lt;/a&gt; en el &lt;a class="link" href="http://www.colegioceusevilla.es/" target="_blank" rel="noopener"&#10; &gt;Colegio CEU San Pablo de Sevilla&lt;/a&gt;. Para ilustrar de forma práctica los conocimientos adquiridos en la sesión, instalamos una pequeña red formada por portátiles de un perfil antiguo (Intel Pentium M 1,6 GHz, 512MB RAM) en los que tenemos instalado Debian Linux con el escritorio XFCE (una pequeña maravilla que saca todo el jugo a equipos poco potentes).&lt;/p&gt;&#10;&lt;p&gt;Aparte de utilizar un escritorio ligero, es posible obtener el máximo rendimiento posible a portátiles tan antiguos gracias al &lt;a class="link" href="http://en.wikipedia.org/wiki/Dynamic_frequency_scaling" target="_blank" rel="noopener"&#10; &gt;escalado dinámico de la frecuencia de la CPU&lt;/a&gt;, una técnica que permite equilibrar el consumo de energía frente a la frecuencia del procesador según las necesidades del usuario. En Linux, esta gestión se realiza a través de los &lt;em&gt;CPU governors&lt;/em&gt;, unos esquemas que indican al núcleo cómo debe llevar a cabo estos ajustes. En este artículo vamos a ver cómo realizar nosotros mismos esta gestión dinámica de la frecuencia de nuestras CPUs, que podemos aplicar a cualquier tipo de sistema, no sólo en portátiles.&lt;/p&gt;&#10;&lt;p&gt;Como es habitual en el resto de mis artículos, la plataforma Linux de referencia es Debian. Aún así, lo que cuento en las siguientes líneas se puede hacer igual o muy parecido en otras distribuciones populares. Evidentemente, vamos a trabajar directamente con el hardware, así que sólo el superusuario tiene los privilegios necesarios para lo que vamos a ver a continuación.&lt;/p&gt;&#10;&lt;p&gt;En primer lugar, hay que activar el soporte de la gestión dinámica de la frecuencia de la CPU. Para ello, si no lo está ya, instalamos el software necesario:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install cpufrequtils&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Leyendo lista de paquetes... Hecho&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Creando árbol de dependencias &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Leyendo la información de estado... Hecho&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Se instalarán los siguientes paquetes extras:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libcpufreq0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Se instalarán los siguientes paquetes NUEVOS:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cpufrequtils libcpufreq0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Seleccionando el paquete libcpufreq0 previamente no seleccionado.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(Leyendo la base de datos ... 254034 ficheros o directorios instalados actualmente.)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Desempaquetando libcpufreq0 (de .../libcpufreq0_008-1_amd64.deb) ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Seleccionando el paquete cpufrequtils previamente no seleccionado.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Desempaquetando cpufrequtils (de .../cpufrequtils_008-1_amd64.deb) ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Procesando disparadores para man-db ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Configurando libcpufreq0 (008-1) ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Configurando cpufrequtils (008-1) ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ ok ] Loading cpufreq kernel modules...done (powernow-k8).&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ ok ] CPUFreq Utilities: Setting ondemand CPUFreq governor...CPU0...CPU1...done.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Como vemos en el ejemplo, la plataforma hardware que uso en el ejemplo tiene la arquitectura AMD64 y cuenta con dos procesadores (realmente es sólo uno pero con dos núcleos), que son detectados automáticamente al terminar la instalación del software.&lt;/p&gt;&#10;&lt;p&gt;Toda la gestión ser realiza a través del directorio &lt;code&gt;/sys/devices/system/cpu/cpuX/cpufreq&lt;/code&gt;, donde X es el número de orden la CPU que queremos gestionar. Veamos lo que nos encontramos para el primer procesador:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cd /sys/devices/system/cpu/cpu0/cpufreq&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ls -l&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;total 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-r--r--r-- 1 root root 4096 may 30 affected_cpus&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-r--r--r-- 1 root root 4096 may 30 bios_limit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-r-------- 1 root root 4096 may 30 cpuinfo_cur_freq&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-r--r--r-- 1 root root 4096 may 30 cpuinfo_max_freq&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-r--r--r-- 1 root root 4096 may 30 cpuinfo_min_freq&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-r--r--r-- 1 root root 4096 may 30 cpuinfo_transition_latency&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-r--r--r-- 1 root root 4096 may 30 related_cpus&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-r--r--r-- 1 root root 4096 may 30 scaling_available_frequencies&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-r--r--r-- 1 root root 4096 may 30 scaling_available_governors&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-r--r--r-- 1 root root 4096 may 30 scaling_cur_freq&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-r--r--r-- 1 root root 4096 may 30 scaling_driver&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- 1 root root 4096 may 29 scaling_governor&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- 1 root root 4096 may 30 scaling_max_freq&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- 1 root root 4096 may 30 scaling_min_freq&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- 1 root root 4096 may 30 scaling_setspeed&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x 2 root root 0 may 30 stats&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Se puede apreciar que, excepto &lt;code&gt;stats&lt;/code&gt; que es un directorio, el resto de contenido son ficheros que se pueden consultar y modificar para realizar la gestión dinámica de la frecuencia. Veamos qué &lt;em&gt;governors&lt;/em&gt; tenemos disponibles, cuál es el que está actualmente configurado y activo en este procesador y cuál es su frecuencia actual (en Hz):&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cat scaling_available_governors&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;userspace powersave conservative ondemand performance &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cat scaling_governor&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ondemand&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cat cpuinfo_cur_freq&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1000000&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Es decir, que el procesador está configurado para que modifique su frecuencia de forma dinámica según las necesidades del sistema en cada momento (el &lt;em&gt;governor&lt;/em&gt; &lt;code&gt;ondemand&lt;/code&gt;). Muy parecido es el &lt;em&gt;governor&lt;/em&gt; &lt;code&gt;conservative&lt;/code&gt;, que cambia la frecuencia de forma más gradual en vez de saltar directamente a la velocidad de CPU necesaria, lo que lo hace más idóneo para sistemas alimentados por batería. Los &lt;em&gt;governors&lt;/em&gt; &lt;code&gt;performance&lt;/code&gt; y &lt;code&gt;powersave&lt;/code&gt; configuran la CPU a la máxima y mínima frecuencia de forma estática, respectivamente, y el &lt;em&gt;governor&lt;/em&gt; &lt;code&gt;userspace&lt;/code&gt; permite que los usuarios y procesos con privilegios de superusuario puedan modificar dinámicamente la velocidad del procesador.&lt;/p&gt;&#10;&lt;p&gt;Supongamos que queremos utilizar el &lt;em&gt;governor&lt;/em&gt; &lt;code&gt;performance&lt;/code&gt;. Nada más sencillo:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# echo performance &amp;gt; scaling_governor&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cat scaling_governor&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;performance&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cat cpuinfo_cur_freq&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2200000&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ya tenemos la CPU a pleno rendimiento (y gastando más energía, claro).&lt;/p&gt;&#10;&lt;p&gt;En el directorio &lt;code&gt;/sys/devices/system/cpu/cpuX/cpufreq&lt;/code&gt; tenemos más ficheros para consultar más datos sobre nuestras CPUs y alterar su comportamiento, pero también podemos hacerlo a través de una sencilla herramienta de línea de comandos:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cpufreq-info&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Report errors and bugs to cpufreq@vger.kernel.org, please.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;analyzing CPU 0:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; driver: powernow-k8&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CPUs which run at the same hardware frequency: 0 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CPUs which need to have their frequency coordinated by software: 0 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; maximum transition latency: 109 us.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hardware limits: 1000 MHz - 2.20 GHz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; available frequency steps: 2.20 GHz, 2.00 GHz, 1.80 GHz, 1000 MHz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; available cpufreq governors: userspace, powersave, conservative, ondemand, performance&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; current policy: frequency should be within 1000 MHz and 2.20 GHz.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; The governor &amp;#34;performance&amp;#34; may decide which speed to use&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; within this range.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; current CPU frequency is 2.20 GHz (asserted by call to hardware).&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cpufreq stats: 2.20 GHz:18,75%, 2.00 GHz:2,63%, 1.80 GHz:15,07%, 1000 MHz:63,55% (3424)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;analyzing CPU 1:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; driver: powernow-k8&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CPUs which run at the same hardware frequency: 0 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CPUs which need to have their frequency coordinated by software: 0 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; maximum transition latency: 109 us.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hardware limits: 1000 MHz - 2.20 GHz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; available frequency steps: 2.20 GHz, 2.00 GHz, 1.80 GHz, 1000 MHz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; available cpufreq governors: userspace, powersave, conservative, ondemand, performance&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; current policy: frequency should be within 1000 MHz and 2.20 GHz.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; The governor &amp;#34;performance&amp;#34; may decide which speed to use&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; within this range.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; current CPU frequency is 2.20 GHz (asserted by call to hardware).&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cpufreq stats: 2.20 GHz:18,75%, 2.00 GHz:2,63%, 1.80 GHz:15,07%, 1000 MHz:63,55% (3424)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mediante &lt;code&gt;cpufreq-info -h&lt;/code&gt; podemos consultar la lista de parámetros disponibles para poder elegir la información concreta que queremos obtener en cada momento. También contamos con las utilidades &lt;code&gt;cpufreq-set&lt;/code&gt; para modificar el comportamiento de la CPU y &lt;code&gt;cpufreq-aperf&lt;/code&gt; para calcular la frecuencia media en un periodo de tiempo (atención: no todas las CPUs admiten esta consulta). Ambas herramientas admiten el parámetro &lt;code&gt;-h&lt;/code&gt; para obtener la lista de opciones que ofrecen.&lt;/p&gt;&#10;&lt;p&gt;Sin embargo, todos los cambios que hagamos se pierden en el momento en que reiniciemos el equipo. Por tanto hay que utilizar un mecanismo que nos permita mantener nuestras modificaciones entre reinicios. Si sólo queremos establecer un governor concreto, basta con que lo especifiquemos en el fichero &lt;code&gt;/etc/default/cpufrequtils&lt;/code&gt; (si no existe, lo creamos) insertando el siguiente contenido:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GOVERNOR=&amp;#34;performance&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si queremos modificar otros parámetros de la CPU, como la frecuencia de inicio, es necesario instalar el paquete &lt;code&gt;sysfsutils&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install sysfsutils&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Leyendo lista de paquetes... Hecho&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Creando árbol de dependencias &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Leyendo la información de estado... Hecho&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Se instalarán los siguientes paquetes extras:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libsysfs2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Se instalarán los siguientes paquetes NUEVOS:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libsysfs2 sysfsutils&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Seleccionando el paquete libsysfs2:amd64 previamente no seleccionado.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(Leyendo la base de datos ... 254004 ficheros o directorios instalados actualmente.)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Desempaquetando libsysfs2:amd64 (de .../libsysfs2_2.1.0+repack-2_amd64.deb) ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Seleccionando el paquete sysfsutils previamente no seleccionado.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Desempaquetando sysfsutils (de .../sysfsutils_2.1.0+repack-2_amd64.deb) ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Procesando disparadores para man-db ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Configurando libsysfs2:amd64 (2.1.0+repack-2) ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Configurando sysfsutils (2.1.0+repack-2) ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ ok ] Setting sysfs variables....&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;y modificar el fichero &lt;code&gt;/etc/sysfs.conf&lt;/code&gt; adecuadamente. Dicho fichero incluye suficientes ejemplos como para que sea sencilla la tarea de incluir nuestras propias modificaciones. Tras guardar los cambios, los activamos con &lt;code&gt;/etc/init.d/sysfsutils start&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;En definitiva, gracias a los &lt;em&gt;governors&lt;/em&gt; los administradores de sistemas Linux contamos con una herramienta potente y flexible para optimizar el rendimiento de uno de nuestros recursos más preciados: las CPUs de los sistemas a nuestros cargo.&lt;/p&gt;&#10;</description></item><item><title>Fail2ban, protección frente a ataques de fuerza bruta a servidores</title><link>https://marcoantonioblanco.es/2014/05/fail2ban-proteccion-frente-a-ataques-de-fuerza-bruta-a-servidores/</link><pubDate>Mon, 05 May 2014 14:08:04 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/05/fail2ban-proteccion-frente-a-ataques-de-fuerza-bruta-a-servidores/</guid><description>&lt;p&gt;Dentro de las preocupaciones que tenemos los que gestionamos servidores que ofrecen servicios a través de Internet destaca sin duda su seguridad a la vez que aseguramos su funcionamiento continuo. Uno de los ataques más recurrentes y habituales que sufren estos servidores es el de fuerza bruta, que consiste en la prueba sistemática y continua de un servicio hasta que se descubre una vulnerabilidad o hasta que se consigue que el servicio (en algunos casos incluso el propio servidor) deje de funcionar. Ante este tipo de ataques se utiliza una medida sencilla y efectiva, como es la utilización de algún sistema de control o filtrado de paquetes (por ejemplo, el conocido &lt;a class="link" href="https://es.wikipedia.org/wiki/TCP_Wrapper" target="_blank" rel="noopener"&#10; &gt;TCP Wrapper&lt;/a&gt; o el no menos popular &lt;a class="link" href="http://www.netfilter.org/" target="_blank" rel="noopener"&#10; &gt;iptables&lt;/a&gt;, el cortafuegos del núcleo de Linux). A través de alguna de estas herramientas podemos bloquear las direcciones IP de las que proceden los ataques. Sin embargo, son muchos los servicios a controlar y las IPs a bloquear al cabo de un tiempo. Afortunadamente, contamos con una gran herramienta que permite la automatización de esta línea de defensa: &lt;a class="link" href="http://www.fail2ban.org" target="_blank" rel="noopener"&#10; &gt;Fail2ban&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Se trata de un sistema de prevención de intrusiones que funciona no sólo en Linux sino en cualquier sistema POSIX que incluya un interfaz a un sistema de control de paquetes como los que he comentado antes, lo que quiere decir que funciona en otros sistemas como FreeBSD y Mac OS X. Además, como está escrito en Python, bastaría desplegar el código fuente y ejecutarlo para &amp;ldquo;echarlo a andar&amp;rdquo;. Sin embargo, es mucho mejor y más sencillo instalarlo a través de los repositorios oficiales de nuestra distribución Linux de elección.&lt;/p&gt;&#10;&lt;p&gt;En el caso de Debian, basta con:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install fail2ban&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mientras que en el caso de Red Hat y sus derivativas se instala con:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# yum install fail2ban&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Fail2ban funciona monitorizando los ficheros de registro del sistema en busca de entradas concretas y actuando en consecuencia a través de la ejecución de scripts que llevan a cabo las acciones deseadas por el administrador. Por ejemplo, si se detectan demasiados intentos erróneos de acceso al servidor FTP, se puede bloquear la IP desde la que se han realizado y enviar un email al administrador notificando el evento. Este bloqueo se realiza habitualmente mediante la adición de reglas en el cortafuegos y/o al fichero &lt;code&gt;hosts.deny&lt;/code&gt; de TCP Wrapper. Además, se le puede indicar a Fail2ban que desbloquee la IP tras cierto periodo de tiempo, lo que nos sirve para evitar que conexiones legítimas (imaginemos un cliente de correo reinstalado al que se le introduce mal la contraseña del usuario) queden bloqueadas definitivamente. Generalmente, basta un bloqueo temporal para detener un ataque de fuerza bruta. Por defecto, 3 intentos fallidos (parámetro &lt;code&gt;maxretry&lt;/code&gt;) en los últimos 10 minutos (parámetro &lt;code&gt;findtime&lt;/code&gt;) provocan que una IP sea bloqueada otros 10 minutos (parámetro &lt;code&gt;bantime&lt;/code&gt;).&lt;/p&gt;&#10;&lt;p&gt;Una vez instalado, Fail2ban nos ofrece una serie de configuraciones estándares para los servicios más habituales (apache, postfix, ssh, etc.), por lo que sólo tenemos que editar el fichero &lt;code&gt;/etc/fail2ban/jail.conf&lt;/code&gt; y activar los filtros que nos convengan (basta con cambiar &lt;code&gt;enabled = false&lt;/code&gt; por &lt;code&gt;enabled = true&lt;/code&gt; en el filtro correspondiente). Estos filtros se definen a mediante expresiones regulares Python y se almacenan en ficheros dentro del directorio &lt;code&gt;/etc/fail2ban/filter.d&lt;/code&gt;, por lo que es relativamente sencillo crear nuevos y adaptar los existentes. De igual modo, las acciones se guardan en el directorio &lt;code&gt;/etc/fail2ban/action.d&lt;/code&gt;, en un formato propio de Fail2ban (muy sencillo) a través del cual se especifican los comandos a ejecutar y otros parámetros necesarios para un correcto funcionamiento de cada acción. Por cierto, a la combinación de un filtro y una acción se le conoce con el nombre de &amp;ldquo;jail&amp;rdquo; (cárcel). De ahí el nombre del fichero de activación de filtros.&lt;/p&gt;&#10;&lt;p&gt;Cada vez que realicemos un cambio en los ficheros de configuración de Fail2ban es necesario reiniciarlo, como es habitual en cualquier servicio:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# service fail2ban restart&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Desgraciadamente, no hay sistema perfecto y Fail2ban presenta dos importantes carencias: no protege ante ataques distribuidos y no incluye soporte IPv6. Aún así, Fail2ban supone una gran ayuda y una línea más en la defensa de nuestros servidores expuestos en Internet.&lt;/p&gt;&#10;</description></item><item><title>Conversión de máquinas virtuales VMWare a Xen</title><link>https://marcoantonioblanco.es/2014/04/conversion-de-maquinas-virtuales-vmware-a-xen/</link><pubDate>Tue, 08 Apr 2014 10:56:48 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/04/conversion-de-maquinas-virtuales-vmware-a-xen/</guid><description>&lt;p&gt;A la hora de implantar una nueva aplicación de servidor es imprescindible realizar un detallado estudio de la misma que incluya entre otras cosas pruebas de funcionamiento y requerimientos técnicos. En estos casos lo habitual es generar un entorno &lt;em&gt;sandbox&lt;/em&gt; en el que instalar la aplicación y llevar a cabo el estudio sin miedo a &amp;ldquo;estropear nada&amp;rdquo;. Sin duda, la mejor opción para obtener un entorno aséptico es el uso de la virtualización.&lt;/p&gt;&#10;&lt;p&gt;De hecho, es muy habitual que los proveedores de las aplicaciones ofrezcan máquinas virtuales preinstaladas para que sólo tengamos que lanzarlas y realizar el estudio. Sin embargo, la mayoría de dichas VM de prueba están basadas en VMWare debido a la popularidad que éste tiene en entornos corporativos. Personalmente, prefiero utilizar &lt;a class="link" href="http://www.xenproject.org/" target="_blank" rel="noopener"&#10; &gt;Xen&lt;/a&gt; como solución de virtualización en servidores porque, aparte de que es software de licencia libre, ofrece un impresionante conjunto de funcionalidades y capacidades que nos permiten virtualizar prácticamente cualquier sistema operativo bajo cualquier circunstancia técnica.&lt;/p&gt;&#10;&lt;p&gt;La escasa disponibilidad de VM de prueba en formato Xen no me ha impedido utilizarlas, ya que lo que hago es traducirlas desde el formato de VMWare. La receta que sigo para ello es lo que quiero compartir en el artículo de hoy. Antes de nada, debo apuntar que sólo he migrado VMs basadas en Linux. Si alguien necesita hacerlo con VMs basadas en Windows (le deseo suerte), un buen punto de partida previo es &lt;a class="link" href="http://support.microsoft.com/kb/314082" target="_blank" rel="noopener"&#10; &gt;éste artículo de Microsoft&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Para ello, vamos a necesitar tener instalado el paquete &lt;code&gt;qemu&lt;/code&gt; en nuestro servidor. En Debian es tan sencillo como:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install qemu&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lo siguiente es comprobar el formato concreto de la imagen de la VM origen (&lt;code&gt;vmdk&lt;/code&gt; o &lt;code&gt;raw&lt;/code&gt;), cuyo fichero tiene extensión &lt;code&gt;vmdk&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# qemu-img info Test1.vmdk&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;image: Test1.vmdk&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;file format: vmdk&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;virtual size: 82G (88081432576 bytes)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;disk size: 2.0G&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En este caso el formato de la imagen es el nativo de VMWare, así que debemos proceder a su conversión.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;qemu-img convert Test1.vmdk -O raw Test1.img&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Veamos un ejemplo con una imagen en formato &lt;code&gt;raw&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# qemu-img info Test2.vmdk&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;file format: raw&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;virtual size: 82G (88081432576 bytes)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;disk size: 2.0G&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En este caso, basta con que renombremos la extensión a &lt;code&gt;img&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# mv Test2.vmdk Test2.img&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ahora toca guardar la imagen en su directorio correspondiente:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# mkdir -p /home/xen/domains/test1/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# mv Test1.img /home/xen/domains/test1/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para terminar, tenemos que generar el fichero de configuración de la nueva VM, que guardaremos en &lt;code&gt;/etc/xen&lt;/code&gt;. En nuestro ejemplo, el fichero se llamará &lt;code&gt;/etc/xen/Test1.cfg&lt;/code&gt; y tendrá el siguiente contenido:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;disk = [ &amp;#39;file:/home/xen/domains/test1/Test1.img,xvda,w&amp;#39; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Las imágenes VMWare suelen venir acompañadas de un fichero con extensión &lt;code&gt;vmx&lt;/code&gt;, que contiene información sobre el hardware virtualizado de la VM. Suele ser muy interesante consultarlo y copiar a la configuración de la máquina Xen aquellas características que nos puedan ser de utilidad. En nuestro ejemplo, nos encontramos lo siguiente:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# less Test1.vmx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;memsize = &amp;#34;2048&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;numvcpus = &amp;#34;2&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Y lo trasladamos al fichero Test1.cfg de Xen así:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;memory = &amp;#39;2048&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vcpus = &amp;#39;2&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Estamos preparados para arrancar la nueva máquina Xen:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# xm create -c Test1.cfg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Using config file &amp;#34;/etc/xen/Test1.cfg&amp;#34;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Started domain Test1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En caso de que todo vaya bien, podemos incluir en el fichero de configuración más información, como el nombre de la máquina, la configuración de red o el comportamiento de la VM ante el cierre del sistema:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;name = &amp;#39;test1.ejemplo.com&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vif = [ &amp;#39;ip=192.168.10.55&amp;#39; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;on_poweroff = &amp;#39;destroy&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;on_reboot = &amp;#39;restart&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;on_crash = &amp;#39;restart&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Por último, una vez estemos satisfechos con el resultado, deberíamos incorporar esta nueva máquina a la gestión de dominios de Xen:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# xm new Test1.cfg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Using config file &amp;#34;Test1.cfg&amp;#34;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un último apunte antes de terminar. A veces nos podemos encontrar con imágenes VMWare que están divididas en varios ficheros. En ese caso procederemos a convertir cada fichero antes de unirlos en una sola imagen Xen final. Por ejemplo:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ls&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Test3-s001.vmdk Test3-s004.vmdk Test3.vmdk&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Test3-s002.vmdk Test3-s005.vmdk Test3.vmx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Test3-s003.vmdk Test3-s006.vmdk &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# for i in `ls *[0-9].vmdk`; do qemu-img convert $i -O raw ${i/vmdk/raw} ; done&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cat *.raw &amp;gt;&amp;gt; Test3.img&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Espero que esta receta os sea de utilidad a la hora de probar nuevas aplicaciones y servicios para vuestros servidores. Espero vuestros comentarios.&lt;/p&gt;&#10;</description></item><item><title>Optimización del tamaño de ficheros PDF en Linux</title><link>https://marcoantonioblanco.es/2014/03/optimizacion-del-tamano-de-ficheros-pdf-en-linux/</link><pubDate>Fri, 14 Mar 2014 13:09:19 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/03/optimizacion-del-tamano-de-ficheros-pdf-en-linux/</guid><description>&lt;p&gt;Este artículo va a ser más corto de lo habitual ya que lo voy a dedicar a un truco que he descubierto después de mucho investigar cómo conseguir que mis PDFs pesen menos con herramientas de Linux. Vaya por delante que no se trata de una receta mágica que reduce el tamaño de los ficheros sin coste a cambio, ya que la única forma de hacerlo es disminuyendo la calidad del contenido (similar a cuando aumentamos la compresión en un JPG).&lt;/p&gt;&#10;&lt;p&gt;Antes de dar con este truco he probado con numerosas herramientas populares en Linux, como ImageMagick o PDFtk, y con diversos servicios online de conversión, como &lt;a class="link" href="http://compress.smallpdf.com/" target="_blank" rel="noopener"&#10; &gt;Compress PDF&lt;/a&gt;, pero el mejor resultado me lo ha dado sin duda el venerable y fiable Ghostscript. Para quien no lo conozca a estas alturas, Ghostscript es un renderizador software de ficheros PostScript y PDF que se encuentra presente en los sistemas Unix desde finales de los 80.&lt;/p&gt;&#10;&lt;p&gt;Evidentemente, antes de proceder a utilizar Ghostscript es necesario tenerlo instalado en nuestro Linux, aunque lo habitual es que venga de serie. En el caso de Debian, es tan sencillo como:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install ghostscript&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ya podemos proceder a utilizarlo siempre que queramos y sin necesidad de privilegios de administrador, ya que al fin y al cabo se trata de una herramienta para usuarios. Eso sí, hay que utilizarlo desde la línea de comandos, así que tendremos que abrir una consola de texto desde el menú de nuestro escritorio gráfico.&lt;/p&gt;&#10;&lt;p&gt;Llegó el momento de compartir el truco. La línea de comandos a utilizar para optimizar el tamaño de un PDF es la siguiente:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gs -dSAFER -dBATCH -dNOPA#USE -q -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pdfwrite -dPDFSETTINGS=&amp;#34;perfil_pdf&amp;#34; -sOutputFile=&amp;#34;fichero_optimizado&amp;#34; &amp;#34;fichero_original&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ghostscript necesita de tres parámetros personalizables para trabajar según nuestras necesidades. El primero es &lt;code&gt;&amp;quot;perfil_pdf&amp;quot;&lt;/code&gt;, que indicará un perfil de calidad predefinida. De menor a mayor calidad, los valores de &lt;code&gt;&amp;quot;perfil_pdf&amp;quot;&lt;/code&gt; son screen, default, ebook, printer y prepress. El segundo parámetro es &lt;code&gt;&amp;quot;fichero_optimizado&amp;quot;&lt;/code&gt; y se trata del nombre (podemos incluir también el camino) del fichero resultado una vez reducido su tamaño. Por último, tenemos &lt;code&gt;&amp;quot;fichero_original&amp;quot;&lt;/code&gt;, que evidentemente es el nombre (también se puede indicar el camino) del fichero PDF que queremos optimizar.&lt;/p&gt;&#10;&lt;p&gt;Con esto podemos conseguir resultados espectaculares, como un caso en el que he conseguido reducir un PDF de 62Mb a sólo 5MB con el perfil &amp;ldquo;ebook&amp;rdquo; y apenas pérdida de calidad. Sin embargo, cada fichero PDF es un mundo (no es lo mismo un fichero sólo de texto que otro que incluya una buena carga gráfica) y nos podemos encontrar casos en los que incluso aumente de peso. Todo es cuestión de probar.&lt;/p&gt;&#10;&lt;p&gt;Antes de terminar, un comentario sobre los conversores online. No soy muy partidarios de ellos porque suelen tener límites en el tamaño del PDF a optimizar, te insertan una marca de agua y nadie te asegura la confidencialidad del fichero subido. Pero también es cierto que te pueden sacar de un apuro en un momento de urgencia. Todo es valorar las ventajas y los inconvenientes.&lt;/p&gt;&#10;&lt;p&gt;Espero que este truco os sea de utilidad (al final me ha quedado un artículo largo&amp;hellip;).&lt;/p&gt;&#10;</description></item><item><title>Virtualización en escritorios (y IV): KVM/QEMU</title><link>https://marcoantonioblanco.es/2014/03/virtualizacion-en-escritorios-y-iv-kvmqemu/</link><pubDate>Fri, 07 Mar 2014 13:12:02 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/03/virtualizacion-en-escritorios-y-iv-kvmqemu/</guid><description>&lt;p&gt;Hace tiempo que tenía pendiente terminar esta serie de artículos dedicados a la virtualización en escritorios y como en el artículo anterior mencionaba esta técnica como una herramienta útil en el proceso de migración de un sistema informático a Linux, la ocasión era inmejorable para publicar unas líneas sobre una solución 100% libre y que viene de serie en el propio núcleo de Linux: KVM&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="http://www.linux-kvm.org/" target="_blank" rel="noopener"&#10; &gt;KVM&lt;/a&gt; son las siglas de &lt;em&gt;Kernel-based Virtual Machine&lt;/em&gt; y se trata de un módulo del núcleo de Linux que permite a un programa de usuario utilizar las capacidades de virtualización por hardware que incluyen diversos procesadores. En resumen, KVM convierte el núcleo de Linux en un hipervisor. Actualmente, KVM soporta los procesadores Intel y AMD más recientes (a través de un segundo módulo especializado del núcleo), así como una serie de plataformas menos populares en nuestros escritorios, como PowerPC, S/390 y ARM. Se incluyó por primera vez en el núcleo de Linux en la versión 2.6.20, publicada en Febrero de 2007.&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://marcoantonioblanco.es/images/wp/2014/03/kvm-qemu.jpg" &gt;&lt;img alt="KVM y QEMU emulando varias sistemas" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://marcoantonioblanco.es/images/wp/2014/03/kvm-qemu-300x187.jpg"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;KVM y QEMU emulando varios sistemas&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;A través de KVM es posible ejecutar múltiples máquinas virtuales corriendo imágenes sin necesidad de adaptación de &lt;a class="link" href="http://www.linux-kvm.org/page/Guest_Support_Status" target="_blank" rel="noopener"&#10; &gt;numerosos sistemas operativos&lt;/a&gt;, incluyendo Linux, Windows, BSD, Solaris y Android. De este modo, cada máquina virtual cuenta con su propio hardware virtualizado: disco, red, vídeo, audio, etc.&lt;/p&gt;&#10;&lt;p&gt;Sin embargo, KVM no realiza ningún tipo de emulación, por lo que es necesario un interfaz en espacio de usuario que permita la creación y uso de las máquinas virtuales. La mejor opción en este sentido es &lt;a class="link" href="http://qemu.org/" target="_blank" rel="noopener"&#10; &gt;QEMU&lt;/a&gt;, un emulador y virtualizador de máquinas genérico de licencia libre.&lt;/p&gt;&#10;&lt;p&gt;Cuando se utiliza junto con KVM, QEMU consigue un rendimiento cercano al nativo a través de la ejecución del código de la máquina virtual en el procesador de la máquina física. Así, es incluso posible ejecutar Mac OS X con una versión especialmente modificada de QEMU. Como curiosidad, añadiré que QEMU es compatible con otras soluciones de virtualización, como Xen&lt;/p&gt;&#10;&lt;p&gt;La puesta en marcha de la pareja KVM/QEMU es muy sencilla en Debian. En primer lugar procedemos a la instalación de las herramientas de espacio de usuario, ya que como he comentado antes el soporte de virtualización KVM ya viene de serie con el núcleo de Linux:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install qemu-kvm libvirt-bin&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En este momento ya tendríamos instalado QEMU listo para su uso con KVM, aunque sólo a través de herramientas de línea de comandos. Si queremos un buen interfaz gráfico de gestión, algo muy recomendable en el manejo de máquinas virtuales en un escritorio, mi recomendación es instalar &lt;a class="link" href="http://freecode.com/projects/aqemu" target="_blank" rel="noopener"&#10; &gt;AQEMU&lt;/a&gt;, que nos ofrece un interfaz muy al estilo de Virtualbox:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install aqemu&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class="link" href="https://marcoantonioblanco.es/images/wp/2014/03/aqemu.jpg" &gt;&lt;img alt="aqemu" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://marcoantonioblanco.es/images/wp/2014/03/aqemu-300x282.jpg"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Ventana principal de AQEMU&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;La primera vez que ejecutamos AQEMU nos presentará en pantalla un asistente de configuración, cuyo primer paso es elegir el idioma del interfaz (desgraciadamente no tenemos el Español como opción). En el segundo paso se nos pregunta por el directorio en el que residirán las máquinas virtuales (podemos dejar el valor por defecto a menos que se trate de un sistema de ficheros remoto o removible), si queremos utilizar el modo &amp;ldquo;Gestor de dispositivos&amp;rdquo; (recomiendo su activación) y queremos experimentar con un visor VNC empotrado en la ventana principal de AQEMU (aquí recomiendo que no, es demasiado inestable aún).&lt;/p&gt;&#10;&lt;p&gt;El siguiente paso nos pregunta por los &amp;ldquo;emuladores&amp;rdquo; que tenemos instalados. Pulsamos en &amp;ldquo;Search&amp;rdquo; y AQEMU buscará (y encontrará) las herramientas de KVM y QEMU. Si estamos de acuerdo con el resultado, continuamos con el siguiente paso en el que se va a configurar QEMU. Pues bien, lo mejor es dejarlo todo en sus valores por defecto y finalizar el asistente, con lo que se nos presentará la venta principal de AQEMU. Si queremos ejecutar de nuevo el asistente, tenemos la opción en el menú &amp;ldquo;File&amp;rdquo;, al igual que podemos cambiar la configuración directamente a través de las opciones &amp;ldquo;General Settings&amp;rdquo; y &amp;ldquo;Advanced Settings&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://marcoantonioblanco.es/images/wp/2014/03/aqemu2.jpg" &gt;&lt;img alt="AQEMU y los 3 sistemas más populares" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://marcoantonioblanco.es/images/wp/2014/03/aqemu2-300x282.jpg"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;AQEMU y los 3 sistemas más populares&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Ahora es cuestión de utilizar el asistente de creación de máquinas virtuales (segundo icono por la izquierda en la barra de herramientas) para generar la primera. Cuando se nos pregunte qué emulador vamos a utilizar, probaremos primero con KVM. Si hay problemas de compatibilidad, entonces probamos de nuevo con QEMU.&lt;/p&gt;&#10;&lt;p&gt;Con esto tendremos KVM a pleno rendimiento (nuna mejor dicho) en nuestro escritorio. Como se puede ver, se trata de una solución relativamente sencilla de instalar y utilizar y que además es libre. En su contra tiene que QEMU ofrece pocos drivers de dispositivos multimedia y que no incluye aun soporte para el modelo de arranque UEFI. Aún así, se trata de una opción muy a considerar cuando necesitemos virtualizar sistemas para utilizarlos en nuestros escritorios. Espero que la probéis y compartáis vuestras experiencias.&lt;/p&gt;&#10;</description></item><item><title>Cómo migrar a Linux tras el fin del soporte de Windows XP</title><link>https://marcoantonioblanco.es/2014/02/como-migrar-a-linux-tras-el-fin-del-soporte-de-windows-xp/</link><pubDate>Thu, 27 Feb 2014 13:24:57 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/02/como-migrar-a-linux-tras-el-fin-del-soporte-de-windows-xp/</guid><description>&lt;p&gt;Nos encontramos a poco más de un mes para que Microsoft finalice el soporte activo del venerable Windows XP. La solución que se propone desde Redmond es, evidentemente, migrar a una versión superior de su sistema operativo. Sin embargo, el cambio no es tan sencillo ni tan falto de obstáculos como Microsoft pretende. Tanto Windows 7 como 8.1 tienen requerimientos hardware superiores y presentan incompatibilidades con programas y periféricos que funcionan bien en XP, por no hablar de los cambios en el paradigma de escritorio que presenta la última versión de Windows. Ante este panorama, es el momento de plantearse seriamente una &lt;a class="link" href="https://web.archive.org/web/20140227/http://www.activasistemas.com/Migracion-de-servidores-y-puestos-de-trabajo-a-Linux.214.0.html" target="_blank" rel="noopener"&#10; &gt;migración a un entorno basado en Linux y software libre&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://marcoantonioblanco.es/images/actsys/fileadmin/media/pics/red_local_peq.jpg"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Un sistema informático tipo&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Como en cualquier cambio en un sistema informático, es crucial realizar una cuidadosa planificación del proceso que contemple fases y tiempos de realización, donde se tengan en cuenta aspectos tan importantes como la futura organización de la red, el software a utilizar, la formación de los usuarios y el soporte posventa. en este articulo voy a centrarme en las dos primeras cuestiones.&lt;/p&gt;&#10;&lt;p&gt;Respecto a la organización de la red, podemos aprovechar la migración para implantar un modelo centralizado de gestión de usuarios (OpenLDAP) y sistemas de ficheros (NFS, Samba). Este modelo nos ofrece la máxima flexibilidad (es muy fácil añadir nuevos elementos a la red, sea cual sea el sistema operativo que corran), el mejor rendimiento y los menores costes de mantenimiento.&lt;/p&gt;&#10;&lt;p&gt;Una vez centralizada la gestión del sistema informático, Linux nos ofrece varias posibilidades interesantes, compatibles entre sí y combinables en un mismo ecosistema, para la gestión de las estaciones de trabajo. Contamos por supuesto con el modelo clásico (&lt;em&gt;fat client&lt;/em&gt;), en el que el sistema operativo y las aplicaciones se instalan en la propia estación. Si reducimos los requerimientos de mantenimiento a la vez que aumentamos la dependencia de la red y los servidores, tenemos los puestos de trabajo sin disco duro (&lt;em&gt;diskless clients&lt;/em&gt;) que arrancan el sistema operativo por red pero siguen utilizando los recursos locales (CPU, RAM, etc.) para la ejecución de las aplicaciones de usuario. Si damos un paso en este sentido, nos encontramos con los clientes ligeros (&lt;em&gt;thin clients&lt;/em&gt;) que funcionan como una simple ventana a las capacidades de los servidores centrales. Linux cuenta con soporte de serie para este último modelo a través del proyecto LTPS.&lt;/p&gt;&#10;&lt;p&gt;La elección del modelo adecuado dependerá de las necesidades del usuario, de las características del hardware de los puestos de trabajo y de la cuantía de la inversión que estemos dispuestos a llevar a cabo. En cualquier caso, una vez centralizada la gestión de la red (algo indispensable en cualquier sistema informático) cambiar de un modelo a otro es relativamente sencillo.&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Intranet" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://marcoantonioblanco.es/images/actsys/fileadmin/media/pics/h5slider_peq.png"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Intranet en pleno funcionamiento&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;En cuanto a la migración de las aplicaciones de usuario, Linux ofrece numerosas alternativas nativas al software habitual en una red Windows. Incluso podemos plantearnos migrar algunas de estas aplicaciones a formato web, como por ejemplo el correo electrónico, la agenda de direcciones y el calendario a una &lt;a class="link" href="https://web.archive.org/web/20140227/http://www.activasistemas.com/Intranets.202.0.html" target="_blank" rel="noopener"&#10; &gt;completa intranet&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Puede darse el caso de que no encontremos una alternativa satisfactoria en Linux a una aplicación imprescindible. Se me vienen a la cabeza ejemplos como el de un diseñador que necesite de Photoshop porque necesita funcionalidades que GIMP no ofrezca o el de la típica aplicación de gestión a medida que se encuentra en la empresa desde los tiempos de Windows 95. En ese caso Linux nos ofrece tres opciones que permiten integrar la aplicación en la nueva infraestructura basada en software libre: WINE, virtualización y acceso remoto.&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://marcoantonioblanco.es/images/wp/2009/02/playonlinux1.png" &gt;&lt;img alt="Lista de programas Windows instalados" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://marcoantonioblanco.es/images/wp/2009/02/playonlinux1.png"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Lista de programas Windows instalados&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;WINE es lo que podríamos llamar un &amp;ldquo;emulador de Windows&amp;rdquo; (aunque técnicamente es una implementación de las funciones de Windows) que permite ejecutar en Linux software nativo de Windows. Con un desarrollo de más de 15 años a sus espaldas, sus responsables han llegado a recrear fallos específicos de Windows de los que depende el funcionamiento de muchas aplicaciones. Dado que WINE viene de serie en las distribuciones Linux actuales y que la lista de programas compatibles es muy extensa, es sin duda la primera opción a probar al integrar aplicaciones Windows en una red Linux.&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://marcoantonioblanco.es/images/wp/2013/01/virtualbox1.png" &gt;&lt;img alt="Virtualizando con Virtualbox" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://marcoantonioblanco.es/images/wp/2013/01/virtualbox1.png"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Virtualizando con Virtualbox&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;En el caso de que WINE no nos sirva, tenemos la posibilidad de acomodar la aplicación &amp;ldquo;rebelde&amp;rdquo; en una máquina virtual en la que aprovechemos alguna de esas licencias de Windows XP que en breve dejarán de sernos útiles. Para ello tenemos &lt;a class="link" href="https://marcoantonioblanco.es/2012/12/virtualizacion-en-escritorios-i-casos-de-uso/" &gt;entornos de virtualización&lt;/a&gt; tan completos como QEMU o Virtualbox, que nos van a ofrecer una capacidad tan interesante como la de aislar XP de forma que nunca se comunique con el mundo exterior ahora que su soporte finaliza, minimizando el riesgo de que un malware lo alcance. Además, podemos generar imagenes periódicas de la máquina virtual (VM), de forma que si finalmente se infecta podamos volver atrás a un estado limpio conocido.&lt;/p&gt;&#10;&lt;p&gt;Si necesitamos que más de un usuario tenga acceso a la VM, tenemos restricciones de licencia o la aplicación es muy cara, podemos optar por el acceso remoto a la misma. Bien a través del protocolo RDP que Windows XP ofrece de forma nativa o bien a través de un servidor VNC (de licencia libre), los usuarios podrán acceder al escritorio XP virtualizado y utilizar la aplicación desde sus escritorios Linux, dentro de las limitaciones de licencia de la propia aplicación.&lt;/p&gt;&#10;&lt;p&gt;En definitiva, con una buena planificación y unos objetivos claros y definidos, una migración a Linux no es tan complicada y traumática como podría parecer. Quedan pocos días para que Windows XP se despida de nosotros y es el momento de decidirse a dar el salto a Linux y el Software Libre. Algunos de nuestros clientes lo han hecho ya, ¿por qué no tú?&lt;/p&gt;&#10;</description></item><item><title>Cómo recuperar ficheros de discos defectuosos bajo Linux</title><link>https://marcoantonioblanco.es/2014/02/como-recuperar-ficheros-de-discos-defectuosos-bajo-linux/</link><pubDate>Thu, 20 Feb 2014 14:38:50 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/02/como-recuperar-ficheros-de-discos-defectuosos-bajo-linux/</guid><description>&lt;p&gt;En un artículo anterior describía unos procedimientos para &lt;a class="link" href="https://marcoantonioblanco.es/2013/11/comprobando-la-salud-de-los-discos-duros-en-un-sistema-linux/" &gt;comprobar la salud de los discos duros de un sistema Linux&lt;/a&gt;. El objetivo de dicho artículo era descubrir si los discos presentaban algún tipo de problema físico, recomendando su sustitución lo antes posible. Sin embargo, ¿qué hacemos si queremos recuperar ficheros que tienen partes de los mismos residiendo en sectores defectuosos? Veámoslo, teniendo en cuenta que la información que se encuentre en dichos sectores tiene una alta probabilidad de ser irrecuperable. En este caso, al menos podemos intentar recuperar el contenido accesible, que podemos editar a posteriori.&lt;/p&gt;&#10;&lt;p&gt;El método consiste en realizar una copia del fichero con tolerancia a fallos, de forma que cuando se produzca un error de lectura el procedimiento siga adelante y recupere al final la información que sí ha podido leer sin problemas. Para ello contamos con una herramienta clásica de UNIX, el comando &lt;code&gt;dd&lt;/code&gt;, tan útil como peligroso si no lo utilizamos bien.&lt;/p&gt;&#10;&lt;p&gt;En el caso que nos ocupa, tendremos que indicarle a dd el fichero a recuperar, el destino en el que guardaremos el contenido recuperado y que debe realizar la copia con tolerancia a errores de lectura. El comando completo, que hay que ejecutar como &lt;code&gt;root&lt;/code&gt;, sería el siguiente:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# dd if=/home/usuario/fichero of=/media/usbdrive/fichero_limpio conv=noerror,sync&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Como se puede ver, la salida se realiza en un dispositivo diferente al disco defectuoso (por ejemplo, un &lt;em&gt;pendrive&lt;/em&gt;) para evitar males mayores.&lt;/p&gt;&#10;&lt;p&gt;Una vez terminada la copia, sólo resta desechar el disco y sustituirlo por otro en buenas condiciones. POr cierto, debido a los errores de lectura, la copia con &lt;code&gt;dd&lt;/code&gt; puede tardar bastante tiempo en llevarse a cabo, sobre todo dependiendo del tamaño del fichero original y de la cantidad de sectores defectuosos por los que hay que pasar. En definitiva, que hay que armarse de paciencia.&lt;/p&gt;&#10;&lt;p&gt;Si no queremos deshacernos del disco problemático (por ejemplo, forma parte de un RAID, no tenemos recambio a mano o simplemente lo queremos reutilizar), existe una opción que hay que utilizar como último recurso, ya que se trata de un procedimiento que elimina la información del sector y que tiene un alto grado de riesgo destructivo para todo el sistema de ficheros. Se trata de forzar la relocalización dinámica de sectores defectuosos, algo que los discos suelen llevar a cabo de forma automática por su cuenta pero que en esta ocasión vamos a obligarle a hacer.&lt;/p&gt;&#10;&lt;p&gt;Para ello contamos con la herramienta &lt;code&gt;hdparm&lt;/code&gt;, la cual ya mencionamos en el artículo anterior. Pero antes de comenzar con la relocalización, comprobaremos si el disco ya ha reasignado sectores en el pasado. Hay que tener en cuenta que cada disco duro ofrece un número máximo de sectores de reserva y que si se ha agotado este procedimiento será inútil. El comando es el siguiente:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# smartctl -a /dev/sda | grep -i reallocated&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail Always - 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si nos fijamos en el último dato, vemos que está a cero, lo que indica que nunca se han relocalizado sectores en el disco. En el ejemplo del artículo anterior, la cuenta estaba en 10640, una mala noticia sin duda.&lt;/p&gt;&#10;&lt;p&gt;El siguiente paso es confirmar que el supuesto sector defectuoso tiene realmente problemas de lectura. Siguiendo en el ejemplo del otro artículo, el comando es como sigue:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# hdparm --read-sector 2307480536 /dev/sda&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;reading sector 2307480536: FAILED: Input/output error&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Efectivamente, el sector es defectuoso, así que podemos proceder a relocalizarlo:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# hdparm --write-sector 2307480536 /dev/sda&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Use of --write-sector is VERY DANGEROUS.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;You are trying to deliberately overwrite a low-level sector on the media&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This is a BAD idea, and can easily result in total data loss.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please supply the --yes-i-know-what-i-am-doing flag if you really want this.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Program aborted.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# hdparm --write-sector 2307480536 --yes-i-know-what-i-am-doing /dev/sda&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda: re-writing sector 2307480536: succeeded&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Como comentaba más arriba, &lt;code&gt;hdparm&lt;/code&gt; nos avisa de que se trata de una operación peligrosa porque estamos escribiendo en el disco duro a bajo nivel saltándonos los mecanismos estándares de escritura de bloques del sistema de ficheros residente.&lt;/p&gt;&#10;&lt;p&gt;Si la operación anterior tiene éxito, podemos comprobar el resultado:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# hdparm --read-sector 2307480536 /dev/sda&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;reading sector 2307480536: succeeded&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0000 0000 0000 0000 0000 0000 0000 0000&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(siguen muchas líneas con ceros a continuación)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# smartctl -a /dev/sda | grep -i reallocated&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail Always - 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vemos que el sector vuelve a estar disponible para su uso y que la cuenta de sectores relocalizados ha aumentado en uno.&lt;/p&gt;&#10;&lt;p&gt;Ahora sólo es cuestión de decidir si seguimos con el disco adelante, lo reutilizamos para datos menos importantes o lo tiramos a la basura directamente.&lt;/p&gt;&#10;</description></item><item><title>Comprobando la salud de los discos duros en un sistema Linux</title><link>https://marcoantonioblanco.es/2013/11/comprobando-la-salud-de-los-discos-duros-en-un-sistema-linux/</link><pubDate>Fri, 22 Nov 2013 13:13:29 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/11/comprobando-la-salud-de-los-discos-duros-en-un-sistema-linux/</guid><description>&lt;p&gt;En los últimos meses nos hemos visto en la tesitura de tener que sustituir discos duros defectuosos en diversos servidores cuyo mantenimiento caen bajo nuestra responsabilidad, algunos con acceso local y otros sólo con acceso remoto por encontrarse geográficamente en otros países. Afortunadamente todos esos servidores corren Linux, lo que facilita enormemente la tarea de detectar fallos en discos duros, proceder a su parada y sustituirlos por otros nuevos, integrándolos transparentemente en el RAID que solemos implementar en nuestros servidores.&lt;/p&gt;&#10;&lt;p&gt;¿Cómo se detecta que un disco es defectuoso? La primera pista nos la va a dar un cambio drástico en el servidor: bajada de rendimiento, problemas de acceso a ficheros, servicios caídos, etc. Es en ese momento cuando debemos pasar a comprobar la salud de los discos duros del sistema y descubrir cuál (o cuales) es el que tiene problemas.&lt;/p&gt;&#10;&lt;p&gt;La forma más directa y sencilla de comprobar si un disco duro está teniendo problemas es consultar el registro de los mensajes del núcleo con el comando &lt;code&gt;dmesg&lt;/code&gt;. Ahí buscaremos referencias a errores de acceso a disco, problemas en las operaciones de lectura/escritura, menciones a relocalización de sectores, etc.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# dmesg | less&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ata2.00: failed command: READ FPDMA QUEUED&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ata2.00: cmd 60/08:00:d8:5b:89/00:00:89:00:00/40 tag 0 ncq 4096 in&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; res 41/40:08:d8:5b:89/00:00:89:00:00/00 Emask 0x409 (media error)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ata2.00: status: { DRDY ERR }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ata2.00: error: { UNC }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sd 1:0:0:0: [sdb] Unhandled sense code&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sd 1:0:0:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sd 1:0:0:0: [sdb] Sense Key : Medium Error [current] [descriptor]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sd 1:0:0:0: [sdb] Add. Sense: Unrecovered read error - auto reallocate failed&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sd 1:0:0:0: [sdb] CDB: Read(10): 28 00 89 89 5b d8 00 00 08 00&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;end_request: I/O error, dev sdb, sector 2307480536&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En el ejemplo vemos que el disco problemático es &lt;code&gt;sdb&lt;/code&gt;. Igualmente sencillo es comprobar si se ha caído algún disco del RAID del servidor:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cat /proc/mdstat &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Personalities : [raid1] &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;md3 : active raid1 sda4[2] sdb4[1](F)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1839220031 blocks super 1.2 [2/1] [U_]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;De nuevo comprobamos que &lt;code&gt;sdb&lt;/code&gt; es el culpable. Sin embargo, al tratarse de servidores, la forma más adecuada de detectar fallos en los discos es mediante la prevención a través de un &lt;a class="link" href="https://marcoantonioblanco.es/2009/01/la-necesidad-de-monitorizar-un-sistema-informatico/" &gt;sistema de monitorización&lt;/a&gt; al que incorporemos los controles necesarios, normalmente basados en la tecnología &lt;a class="link" href="http://es.wikipedia.org/wiki/S.M.A.R.T." target="_blank" rel="noopener"&#10; &gt;S.M.A.R.T.&lt;/a&gt; que se encuentra presente en los discos duros desde hace ya muchos años.&lt;/p&gt;&#10;&lt;p&gt;El soporte S.M.A.R.T. en Linux se consigue a través del paquete &lt;code&gt;smartmontools&lt;/code&gt;, que permite controlar y monitorizar sistemas de almacenamiento utilizando dicha tecnología. De hecho, se incluye un demonio que nos avisa inmediatamente si se producen errores en alguno de los discos monitorizados.&lt;/p&gt;&#10;&lt;p&gt;Una vez identificado el disco defectuoso procedemos a comprobar su salud mediante &lt;code&gt;smartctl&lt;/code&gt;, una herramienta de línea de comandos incluida en &lt;code&gt;smartmontools&lt;/code&gt;. Con esta utilidad podremos no sólo obtener detallada información sobre el disco, sino además llevar a cabo completos tests que nos mostrarán si es defectuoso y cuál es el defecto concreto. Veamos unos ejemplos.&lt;/p&gt;&#10;&lt;p&gt;Para obtener información sobre un disco tenemos a nuestra disposición varios parámetros. Si queremos información sobre el hardware:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# smartctl -i /dev/sdb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;=== START OF INFORMATION SECTION ===&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device Model: ST...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Serial Number: W...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Firmware Version: C...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User Capacity: 3,000,592,982,016 bytes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device is: Not in smartctl database [for details use: -P showall]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ATA Version is: 8&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ATA Standard is: ATA-8-ACS revision 4&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Local Time is: Fri Nov 22 12:33:54 2013 CET&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMART support is: Available - device has SMART capability.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMART support is: Enabled&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Podemos ampliar estos datos con la información SMART del disco duro con el parámetro &lt;code&gt;-a&lt;/code&gt;. Si en cambio usamos &lt;code&gt;-x&lt;/code&gt;, la salida del comando incluirá la información que no proviene de SMART.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# smartctl -a /dev/sdb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;=== START OF INFORMATION SECTION ===&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;=== START OF READ SMART DATA SECTION ===&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMART overall-health self-assessment test result: PASSED&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;General SMART Values:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Offline data collection status: (0x00) Offline data collection activity&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; was never started.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Auto Offline Data Collection: Disabled.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Self-test execution status: ( 121) The previous self-test completed having&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; the read element of the test failed.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMART Attributes Data Structure revision number: 10&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Vendor Specific SMART Attributes with Thresholds:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1 Raw_Read_Error_Rate 0x000f 107 098 006 Pre-fail Always - 186855524&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 3 Spin_Up_Time 0x0003 093 093 000 Pre-fail Always - 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 4 Start_Stop_Count 0x0032 100 100 020 Old_age Always - 8&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 5 Reallocated_Sector_Ct 0x0033 092 092 036 Pre-fail Always - 10640&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 7 Seek_Error_Rate 0x000f 083 060 030 Pre-fail Always - 219208774&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si alguno de los anteriores comandos falla, podemos añadir el parámetro &lt;code&gt;-T permissive&lt;/code&gt; (e incluso &lt;code&gt;-T verypermissive&lt;/code&gt;) para intentar que &lt;code&gt;smartctl&lt;/code&gt; ignore los errores que pueda y obtenga toda la información posible del disco.&lt;/p&gt;&#10;&lt;p&gt;Pasemos a lo realmente interesante: la realización de tests en los discos duros. La primera y más sencilla opción que tenemos a nuestra disposición es el parámetro &lt;code&gt;-H&lt;/code&gt;, que nos informa de la salud SMART del disco.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# smartctl -H /dev/sdb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;=== START OF READ SMART DATA SECTION ===&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMART overall-health self-assessment test result: PASSED&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esta opción sólo indica que la salud es mala cuando el disco ya ha fallado o va a fallar en las próximas 24 horas. Podemos ver en el ejemplo que, a pesar de que &lt;code&gt;sdb&lt;/code&gt; es defectuoso, se nos informa de que la salud SMART del disco es buena.&lt;/p&gt;&#10;&lt;p&gt;Para detectar el problema del disco en detalle contamos con el parámetro &lt;code&gt;-t&lt;/code&gt;, que a su vez admite un argumento que indica el tipo de test a realizar: &lt;code&gt;offline&lt;/code&gt;, &lt;code&gt;short&lt;/code&gt;, &lt;code&gt;long&lt;/code&gt; y &lt;code&gt;conveyance&lt;/code&gt;. Todas estas pruebas se pueden realizar con el sistema en producción, a menos que usemos el parámetro &lt;code&gt;-C&lt;/code&gt;, que las ejecuta en modo cautivo (no tiene efecto en tests de tipo &lt;code&gt;offline&lt;/code&gt;). Este modo sirve para realizar las pruebas más rápidamente y tiene especial utilidad cuando la máxima prioridad es comprobar la salud del disco. La explicación en detalle de cada uno de estos tests se encuentra en el manual electrónico de &lt;code&gt;smartctl&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Excepto en el mencionado modo cautivo, los tests se realizan en segundo plano, por lo que no obtenemos ninguna información por pantalla a menos que la pidamos explícitamente con el parámetro &lt;code&gt;-l selftest&lt;/code&gt;. Dado que esto sólo nos muestra un instante del progreso del test, es interesante combinarlo con el comando &lt;code&gt;watch&lt;/code&gt;, que por defecto realiza la tarea que le asignemos cada dos segundos. Veamos un ejemplo:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# smartctl -t short /dev/sdb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sending command: &amp;#34;Execute SMART Short self-test routine immediately in off-line mode&amp;#34;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Drive command &amp;#34;Execute SMART Short self-test routine immediately in off-line mode&amp;#34; successful.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Testing has begun.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please wait 1 minutes for test to complete.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Test will complete after ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Use smartctl -X to abort test.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# watch smartctl -l selftest /dev/sdb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Every 2,0s: smartctl -l selftest /dev/sdb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;=== START OF READ SMART DATA SECTION ===&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMART Self-test log structure revision number 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 1 Short offline Completed: read failure 90% 15073 2307480536&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;¡Eureka, hemos encontrado el defecto del disco sospechoso! Se trata de un error de lectura en al menos un sector del disco, siendo el primero detectado el especificado en la salida de &lt;code&gt;smartctl&lt;/code&gt;. Ahora sólo queda cambiarlo por uno nuevo y llevar el defectuoso al fabricante a que nos lo cambie (si está en garantía, claro). Por cierto, en el ejemplo vemos cómo se nos informa de que podemos abortar cualquier test con &lt;code&gt;smartctl -X&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Como curiosidad, si necesitamos conocer el modelo y número de serie del disco para el trámite con el fabricante, podemos obtenerlos con este sencillo comando (además de con &lt;code&gt;smartctl -i&lt;/code&gt;):&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# hdparm -i /dev/sdb | grep SerialNo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Model=ST..., FwRev=C..., SerialNo=W...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;¡Suerte con los discos duros!&lt;/p&gt;&#10;</description></item><item><title>Comprobando el hardware de un servidor Linux sin abrirlo: pequeñas utilidades de línea de comandos (y IV)</title><link>https://marcoantonioblanco.es/2013/10/comprobando-el-hardware-de-un-servidor-linux-sin-abrirlo-pequenas-utilidades-de-linea-de-comandos-y-iv/</link><pubDate>Tue, 22 Oct 2013 10:36:53 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/10/comprobando-el-hardware-de-un-servidor-linux-sin-abrirlo-pequenas-utilidades-de-linea-de-comandos-y-iv/</guid><description>&lt;p&gt;Para terminar esta serie de artículos sobre herramientas software para conocer el hardware de un servidor que esté en producción sin pararlo ni abrirlo, quiero dedicar este artículo a enumerar una serie de sencillas utilidades de línea de comandos que sólo hacen una tarea pero la hacen de una manera muy especializada y eficiente, lo que las convierten en realmente útiles para el administrador de sistemas.&lt;/p&gt;&#10;&lt;h2 id="lspci"&gt;lspci&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;lspci&lt;/code&gt; es una herramienta que lista todos los dispositivos PCI presentes en el sistema.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# lspci&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:00.0 Host bridge: Intel Corporation Device 0150 (rev 09)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:01.0 PCI bridge: Intel Corporation Device 0151 (rev 09)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:02.0 VGA compatible controller: Intel Corporation Device 0162 (rev 09)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:14.0 USB Controller: Intel Corporation Device 1e31 (rev 04)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:16.0 Communication controller: Intel Corporation Device 1e3a (rev 04)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:1a.0 USB Controller: Intel Corporation Device 1e2d (rev 04)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:1c.0 PCI bridge: Intel Corporation Device 1e10 (rev c4)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:1c.4 PCI bridge: Intel Corporation Device 1e18 (rev c4)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:1d.0 USB Controller: Intel Corporation Device 1e26 (rev 04)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:1f.0 ISA bridge: Intel Corporation Device 1e4a (rev 04)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:1f.2 SATA controller: Intel Corporation Device 1e02 (rev 04)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:1f.3 SMBus: Intel Corporation Device 1e22 (rev 04)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 09)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gracias a la gran cantidad de parámetros que admite, podemos controlar el nivel de detalle y la forma de presentar la información que nos devuelve &lt;code&gt;lspci&lt;/code&gt;. Por ejemplo, &lt;code&gt;-k&lt;/code&gt; nos indica el módulo del kernel que gestiona cada dispositivo, &lt;code&gt;-t&lt;/code&gt; nos muestra los dispositivos en un árbol, &lt;code&gt;-m&lt;/code&gt; saca la información en un formato fácilmente analizable por scripts y &lt;code&gt;-v&lt;/code&gt; nos da información detallada sobre cada dispositivo (podemos poner hasta tres v para aumentar el nivel de detalle).&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# lspci -k&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:00.0 Host bridge: Intel Corporation Device 0150 (rev 09)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Subsystem: ASUSTeK Computer Inc. Device 84ca&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Kernel driver in use: agpgart-intel&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:01.0 PCI bridge: Intel Corporation Device 0151 (rev 09)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Kernel driver in use: pcieport&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:02.0 VGA compatible controller: Intel Corporation Device 0162 (rev 09)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Subsystem: ASUSTeK Computer Inc. Device 84ca&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:14.0 USB Controller: Intel Corporation Device 1e31 (rev 04)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Subsystem: ASUSTeK Computer Inc. Device 84ca&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Kernel driver in use: xhci_hcd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00:16.0 Communication controller: Intel Corporation Device 1e3a (rev 04)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Subsystem: ASUSTeK Computer Inc. Device 84ca&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# lspci -t&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-[0000:00]-+-00.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-01.0-[01]--&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-02.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-14.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-16.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-1a.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-1c.0-[02]--&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-1c.4-[03]----00.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-1d.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-1f.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-1f.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;\-1f.3&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="lsusb"&gt;lsusb&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;lsusb&lt;/code&gt; realiza un trabajo similar pero con el subsistema USB y los dispositivos conectados.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# lsusb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Bus 002 Device 002: ID 046d:c50e Logitech, Inc. Cordless Mouse Receiver&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;lsusb&lt;/code&gt; cuenta con un menor número de parámetros que modifican su salida pero son igualmente útiles. Por ejemplo, &lt;code&gt;-t&lt;/code&gt; nos muestra los dispositivos en un árbol, &lt;code&gt;-v&lt;/code&gt; nos da información detallada y &lt;code&gt;-s&lt;/code&gt; y &lt;code&gt;-d&lt;/code&gt; muestran sólo los dispositivos especificados por bus y dispositivo o por identificador de fabricante, respectivamente.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# lsusb -d 046d:c50e -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Bus 002 Device 002: ID 046d:c50e Logitech, Inc. Cordless Mouse Receiver&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device Descriptor:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bLength 18&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bDescriptorType 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bcdUSB 1.10&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bDeviceClass 0 (Defined at Interface level)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bDeviceSubClass 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bDeviceProtocol 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bMaxPacketSize0 8&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;idVendor 0x046d Logitech, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;idProduct 0xc50e Cordless Mouse Receiver&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ethtool"&gt;ethtool&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;ethtool&lt;/code&gt; sirve para mostrar o cambiar la configuración de los interfaces de red. Esta herramienta necesita de al menos un argumento para trabajar (el interfaz de red a consultar) y de parámetros que indiquen qué información requerimos.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ethtool eth0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Settings for eth0:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Supported ports: [ MII ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Supported link modes: 10baseT/Half 10baseT/Full&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;100baseT/Half 100baseT/Full&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1000baseT/Full&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Supported pause frame use: No&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Supports auto-negotiation: Yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Advertised link modes: 10baseT/Half 10baseT/Full&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;100baseT/Half 100baseT/Full&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1000baseT/Full&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Advertised pause frame use: No&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Advertised auto-negotiation: Yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Speed: 1000Mb/s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Duplex: Full&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Port: MII&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PHYAD: 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Transceiver: external&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Auto-negotiation: on&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Supports Wake-on: g&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Wake-on: d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Link detected: yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ethtool -i eth0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;driver: forcedeth&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;version: 0.64&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;firmware-version:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bus-info: 0000:00:08.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;supports-statistics: yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;supports-test: yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;supports-eeprom-access: no&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;supports-register-dump: yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;supports-priv-flags: no&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ethtool -S eth0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NIC statistics:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tx_bytes: 266807800&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tx_zero_rexmt: 333342&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tx_one_rexmt: 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tx_many_rexmt: 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tx_late_collision: 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ethtool -t eth0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The test result is PASS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The test extra info:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;link (online/offline) 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;register (offline) 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;interrupt (offline) 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;loopback (offline) 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="dmesg"&gt;dmesg&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;dmesg&lt;/code&gt; es un comando que nos muestra el contenido del registro del núcleo, lo que implica que al comienzo se encuentra toda la información relativa a la detección del hardware. Personalmente recomiendo su invocación de la siguiente manera para no mostrar las marcas de tiempo del núcleo y paginar la exhaustiva información que se nos va a mostrar en pantalla:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# dmesg -t | less&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Initializing cgroup subsys cpuset&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Initializing cgroup subsys cpu&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Linux version 3.9-0.bpo.1-amd64 (debian-kernel@lists.debian.org) (gcc version 4.7.2 (Debian 4.7.2-5) ) #1 SMP Debian 3.9.6-1~bpo70+1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Command line: BOOT_IMAGE=/boot/vmlinuz-3.9-0.bpo.1-amd64&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;e820: BIOS-provided physical RAM map:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BIOS-e820: [mem 0x0000000000000000-0x000000000009f7ff] usable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NX (Execute Disable) protection: active&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMBIOS 2.3 present.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DMI: /M55S-S3, BIOS FB 01/10/2007&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No AGP bridge found&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ACPI: RSDP 00000000000f6260 00014 (v00 GBT )&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ACPI: RSDT 00000000cfff3000 00038 (v01 GBT NVDAACPI 42302E31 NVDA 01010101)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ehci_hcd: USB 2.0 &amp;#39;Enhanced&amp;#39; Host Controller (EHCI) Driver&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;forcedeth: Reverse Engineered nForce ethernet driver. Version 0.64.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ehci-pci: EHCI PCI platform driver&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ACPI: PCI Interrupt Link [APCH] enabled at IRQ 21&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;forcedeth 0000:00:08.0: setting latency timer to 64&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;forcedeth 0000:00:08.0: ifname eth0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="proc"&gt;/proc&#10;&lt;/h2&gt;&lt;p&gt;Para terminar el artículo, quiero hablar de &lt;code&gt;/proc&lt;/code&gt;, que no es una herramienta en sí, sino el sistema de ficheros a través del cual se puede interactuar con el núcleo en vivo. Por tanto, podemos utilizar los comandos habituales tanto para consultar información como para modificarla al vuelo. Veamos varios ejemplos de uso de &lt;code&gt;/proc&lt;/code&gt; para conocer el hardware del sistema.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cat /proc/cpuinfo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;processor : 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vendor_id : GenuineIntel&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cpu family : 6&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;model : 58&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;model name : Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;stepping : 9&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;microcode : 0x12&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cpu MHz : 1600.000&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cache size : 8192 KB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;physical id : 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;siblings : 2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;core id : 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cpu cores : 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apicid : 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;initial apicid : 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fpu : yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fpu_exception : yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cpuid level : 13&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wp : yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;flags : fpu de tsc msr pae cx8 apic sep cmov pat clflush acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good nopl nonstop_tsc pni pclmulqdq est ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes avx f16c rdrand hypervisor lahf_lm ida arat epb xsaveopt pln pts dtherm fsgsbase smep erms&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bogomips : 6800.20&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;clflush size : 64&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cache_alignment : 64&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;address sizes : 36 bits physical, 48 bits virtual&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;power management:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cat /proc/meminfo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MemTotal: 19554776 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MemFree: 156468 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Buffers: 239696 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cached: 18424088 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SwapCached: 5088 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Active: 9483528 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Inactive: 9367064 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Active(anon): 152516 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Inactive(anon): 34384 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Active(file): 9331012 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Inactive(file): 9332680 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Unevictable: 20 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mlocked: 20 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SwapTotal: 33553332 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SwapFree: 33537992 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cat /proc/partitions&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;major minor #blocks name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2 0 4 fd0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;11 0 1048575 sr0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;8 0 156289847 sda&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;8 1 1951744 sda1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;8 2 97655808 sda2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;8 3 56680448 sda3&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusión"&gt;Conclusión&#10;&lt;/h2&gt;&lt;p&gt;Existen muchas más herramientas, como &lt;code&gt;free&lt;/code&gt;, &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;uname&lt;/code&gt;, &lt;code&gt;lsmod&lt;/code&gt;, &lt;code&gt;fdisk&lt;/code&gt;, etc. La lista es sencillamente interminable. Basta con hacer una sencilla búsqueda por Internet para encontrar pequeñas joyas como las que he comentado en este artículo, consultar su manual y añadirlas a nuestra &amp;ldquo;caja de herramientas&amp;rdquo; particular.&lt;/p&gt;&#10;&lt;p&gt;Con esta serie de artículos espero haber facilitado un poquito el día a día a mis colegas administradores de sistemas. Espero vuestros comentarios.&lt;/p&gt;&#10;</description></item><item><title>Comprobando el hardware de un servidor Linux sin abrirlo: OCS Inventory (III)</title><link>https://marcoantonioblanco.es/2013/09/comprobando-el-hardware-de-un-servidor-linux-sin-abrirlo-ocs-inventory-iii/</link><pubDate>Thu, 19 Sep 2013 13:58:58 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/09/comprobando-el-hardware-de-un-servidor-linux-sin-abrirlo-ocs-inventory-iii/</guid><description>&lt;p&gt;Las herramientas de las que he hablado hasta ahora en esta serie de artículos eran utilidades de línea de comandos dirigidas a descubrir de forma puntual qué hardware tiene un sistema en producción sin pararlo. Si lo que buscamos es algo más complejo más allá de una simple consulta de vez en cuando, que nos permita elaborar y mantener el inventario hardware y software de los sistemas a nuestro cargo, una gran opción es sin duda &lt;a class="link" href="http://www.ocsinventory-ng.org" target="_blank" rel="noopener"&#10; &gt;OCS Inventory&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Se trata de un completo entorno de gestión (de licencia libre) de los activos TIC de cualquier organización. Cuando se publicó por primera vez en 2001, OCS Inventory permitía la creación automatizada del inventario del hardware. A día de hoy ha &lt;a class="link" href="https://web.archive.org/web/20130919/http://www.ocsinventory-ng.org/en/about/features/" target="_blank" rel="noopener"&#10; &gt;evolucionado&lt;/a&gt; tanto que inventaria también el software, realiza escaneos de red e incluso permite la instalación distribuida de software. También incluye un sistema de &lt;em&gt;plugins&lt;/em&gt; que permite ampliar las capacidades de serie de OCS Inventory. Aunque la &lt;a class="link" href="https://web.archive.org/web/20130919/http://www.ocsinventory-ng.org/en/download/plugins.html" target="_blank" rel="noopener"&#10; &gt;lista de &lt;em&gt;plugins&lt;/em&gt; disponibles&lt;/a&gt; no es muy extensa, ofrece la suficiente utilidad como para tenerlos en cuenta.&lt;/p&gt;&#10;&lt;p&gt;OCS Inventory se compone de tres elementos: un servidor, los agentes y las herramientas de distribución de software. El servidor es el elemento principal del entorno, gestionando la información y poniéndola a disposición de los administradores del sistema. Existen versiones tanto para Linux (y otros Unix) como para Windows.&lt;/p&gt;&#10;&lt;p&gt;Sin embargo, el servidor no serviría de nada sin los agentes, pequeños componentes software que se instalan en los dispositivos que queremos inventariar y gestionar a través del servidor y que nutren a éste con toda la información que puedan descubrir sobre el sistema en el que están instalados. Por la naturaleza de su función, en el caso de los agentes existen versiones para todos los sistema operativos más populares, incluyendo los de los smartphones y tablets (excepto iOS).&lt;/p&gt;&#10;&lt;p&gt;Por último se encuentran las herramientas de distribución de software, con versiones para Linux, Windows y MacOS, que permiten de una manera sencilla la instalación remota y controlada de programas en equipos que corran dichos sistemas operativos. Es sin duda una gran ayuda para los administradores de redes y una de las capacidades más celebradas de OCS Inventory.&lt;/p&gt;&#10;&lt;p&gt;Su instalación es realmente sencilla. Basta con dirigirnos a la &lt;a class="link" href="https://web.archive.org/web/20130919/http://www.ocsinventory-ng.org/en/download/" target="_blank" rel="noopener"&#10; &gt;sección de descargas&lt;/a&gt; de la web oficial y obtener las versiones adecuadas a los sistemas que vamos a gestionar. Sin embargo, lo más sencillo para instalar un servidor OCS Inventory es utilizar una distribución Linux en cuyos repositorios esté disponible.&lt;/p&gt;&#10;&lt;p&gt;Por ejemplo, en Debian empezaríamos con el servidor:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install ocsinventory-server&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;y seguiríamos con la consola de administración, que se puede instalar en el mismo equipo que el servidor o en otro de nuestra elección:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install ocsinventory-reports&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si accedemos mediante navegador a &lt;code&gt;http://servidor_consola_admon/ocsreports&lt;/code&gt; , podremos proceder a configurar la consola de administración, indicando entre otras cosas dónde se encuentra el servidor de OCS Inventory.&lt;/p&gt;&#10;&lt;p&gt;Sólo restaría instalar los agentes en los equipos a monitorizar. En el caso de Debian sería así:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install ocsinventory-agent&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Durante la instalación debemos elegir &lt;code&gt;http&lt;/code&gt; como método para generar el inventario e introducir el nombre o dirección IP del servidor OCS cuando se nos solicite.&lt;/p&gt;&#10;&lt;p&gt;Con esto OCS empezará de inmediato a escanear nuestra red y a recibir todo tipo de datos sobre la configuración de nuestros sistemas. Esta información se muestra poco después en la consola de administración. A partir de ese momento, OCS se encarga de mantener actualizada la información mediante escaneos periódicos, cuya frecuencia podemos configurar.&lt;/p&gt;&#10;&lt;p&gt;En definitiva, OCS Inventory se convierte en un importante aliado para los administradores de sistemas en sus tareas diarias. Es sencillo de instalar y a cambio ofrece un gran valor. Evidentemente no está pensado para consultas puntuales de información, ya que para ello están los comandos revisados en los artículos anteriores, pero sin duda OCS no debería faltar en ninguna red gestionada por buenos profesionales.&lt;/p&gt;&#10;</description></item><item><title>Móntate tu propio servidor de música doméstico con Raspberry Pi, Icecast2 y MPD</title><link>https://marcoantonioblanco.es/2013/08/montate-tu-propio-servidor-de-musica-domestico-con-raspberry-pi-icecast2-y-mpd/</link><pubDate>Mon, 19 Aug 2013 12:58:41 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/08/montate-tu-propio-servidor-de-musica-domestico-con-raspberry-pi-icecast2-y-mpd/</guid><description>&lt;p&gt;El propósito principal cuando adquirí mi Raspberry Pi era convertirlo en un completo centro multimedia, un anhelo de muchos años que gracias al Pi he podido satisfacer a bajo coste. Por eso elegí &lt;a class="link" href="http://www.xbian.org/" target="_blank" rel="noopener"&#10; &gt;Xbian&lt;/a&gt; como la distribución a instalar, ya que no sólo está especializada en ofrecer una gran experiencia con XBMC (sin duda el mejor &lt;em&gt;media center&lt;/em&gt; libre) sino que permite evolucionar la plataforma a nuestro gusto gracias a que está basada en Debian.&lt;/p&gt;&#10;&lt;p&gt;Así, he podido cumplir la semana pasada con otro de mis objetivos con mi Pi: montar mi propia radio doméstica y poder escuchar música en cualquier parte de mi casa, todo ello con software libre y sin tener que realizar una fuerte inversión (¿he oído Sonos?).&lt;/p&gt;&#10;&lt;p&gt;Para ello vamos a utilizar dos componentes software que como ya he dicho son de licencia libre y que son fácilmente instalables en Debian. Por un lado se encuentra &lt;a class="link" href="http://www.icecast.org" target="_blank" rel="noopener"&#10; &gt;Icecast2&lt;/a&gt;, un servidor de streaming de audio que soporta el protocolo SHOUTcast y que es capaz de recibir flujos de música desde diversos tipos de fuentes, incluyendo retransmisiones en vivo que nosotros mismos emitamos o servicios populares como Spotify. Por otro lado tenemos a &lt;a class="link" href="http://www.musicpd.org/" target="_blank" rel="noopener"&#10; &gt;MPD&lt;/a&gt;, un reproductor de música en modo servidor.&lt;/p&gt;&#10;&lt;p&gt;El objetivo por tanto es configurar MPD para que reproduzca los ficheros de audio de un directorio concreto, envíe dicha reproducción a Icecast2 y que éste se encargue de generar un &lt;em&gt;streaming&lt;/em&gt; de audio en nuestra red doméstica al que podremos acceder desde cualquier cliente compatible con el protocolo SHOUTcast, incluyendo &lt;em&gt;smartphones&lt;/em&gt; via WiFi..&lt;/p&gt;&#10;&lt;p&gt;La instalación del software en Xbian (y cualquier otra derivación de Debian) es muy sencilla:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install mpd mpc icecast2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Como se puede ver, aprovechamos la instalación de software para incluir MPC, un cliente de línea de comandos para controlar todos los aspectos de la ejecución de MPD, desde la gestión de listas de reproducción hasta la duración del fundido entre canciones. Para conocer todas las posibilidades de MPC, nada mejor que consultar su manual electrónico:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# man mpc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Durante la instalación de Icecast2 se nos preguntará por un nombre de servidor y por una serie de contraseñas para ciertos usuarios y operaciones: &lt;code&gt;source&lt;/code&gt; (acceso de las fuentes de audio), &lt;code&gt;relay&lt;/code&gt; (acceso de la replicación de &lt;em&gt;streams&lt;/em&gt; desde otros servidores) y &lt;code&gt;admin&lt;/code&gt; (acceso de administración de Icecast2). La fortaleza de estas contraseñas queda a nuestra discreción, pero en este momento la que más nos interesa es la de &lt;code&gt;source&lt;/code&gt;, ya que es la que va a utilizar MPD para enviarle la reproducción de ficheros de audio a Icecast2.&lt;/p&gt;&#10;&lt;p&gt;Para nuestro propósito, con esto ya está listo Icecast2. Si queremos modificar más aspectos de su configuración o simplemente rehacerla (por ejemplo, cambiar una contraseña), basta con que editemos el fichero &lt;code&gt;/etc/icecast2/icecast.xml&lt;/code&gt; y procedamos a reiniciar el servidor:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# /etc/init.d/icecast2 restart&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Es el turno de configurar MPD, el cual seguramente habrá mostrado un aviso al finalizar la instalación y haberse iniciado:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;listen: bind to &amp;#39;[::1]:6600&amp;#39; failed: Failed to create socket: Address family not supported by protocol (continuing anyway, because binding to &amp;#39;127.0.0.1:6600&amp;#39; succeeded)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No debemos preocuparnos ya que este mensaje significa que no tenemos activo IPv6 en nuestro Pi, lo cual no impide que MPD se haya iniciado y esté en pleno funcionamiento. De todas formas, si queremos activar el soporte IPv6 en nuestra Xbian, basta con incluir la cadena &lt;code&gt;ipv6&lt;/code&gt; en &lt;code&gt;/etc/modules&lt;/code&gt;. También podemos probar a cargar el módulo a mano desde la línea de comandos:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# modprobe ipv6&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La configuración de MPD es algo mas compleja, ya que tendremos que indicarle tanto la fuente de ficheros de audio como el destino de su reproducción (en nuestro caso, el servidor Icecast2). Para ello tendremos que editar el fichero &lt;code&gt;/etc/mpd.conf&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Por defecto, la fuente de ficheros (indicada por la variable &lt;code&gt;music_directory&lt;/code&gt;) apunta al directorio &lt;code&gt;/var/lib/mpd/music&lt;/code&gt;. Mi recomendación es dejarla tal como está y crear enlaces simbólicos dentro de dicho directorio que apunten a los directorios en los que tengamos nuestros ficheros de música, aunque se trate de dispositivos removibles (como discos USB).&lt;/p&gt;&#10;&lt;p&gt;Lo siguiente es configurar el destino de la reproducción, Para ello comentaremos todas las secciones &lt;code&gt;audio_output&lt;/code&gt; e incluiremos la siguiente:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;audio_output {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; type &amp;#34;shout&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name &amp;#34;Mi radio domestica&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; description &amp;#34;Stream MPD desde mi Raspberry Pi&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; host &amp;#34;localhost&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; port &amp;#34;8000&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mount &amp;#34;/mpd&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; password &amp;#34;contraseña_source_de_icecast2&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bitrate &amp;#34;128&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; format &amp;#34;44100:16:2&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; encoding &amp;#34;mp3&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En este ejemplo, estamos indicándole a MPD que envíe la reproducción de ficheros al servidor Icecast2 que está escuchando en el puerto 8000 de la misma plataforma (nuestro Pi), utilizando &lt;code&gt;/mpd&lt;/code&gt; como punto de montaje (más sobre esto a continuación). Dicha reproducción se codificará al vuelo en formato mp3 a 44100Hz, 16 bits, 2 canales y un bitrate de 128k. Aquí el parámetro realmente importante es &lt;code&gt;password&lt;/code&gt;, en el que indicaremos entre comillas la contraseña que usamos para el usuario &lt;code&gt;source&lt;/code&gt; de Icecast2.&lt;/p&gt;&#10;&lt;p&gt;Además habilitaremos la siguiente sección &lt;code&gt;audio_output&lt;/code&gt;, con al finalidad de que MPD arranque de todas formas aunque el servidor Icecast2 no esté disponible:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;audio_output {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; type &amp;#34;null&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name &amp;#34;My Null Output&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Terminamos la configuración de Icecast2 modificando la variable &lt;code&gt;bind_to_address&lt;/code&gt;, a la que asignaremos el valor &lt;code&gt;localhost&lt;/code&gt;. Tras guardar los cambios, sólo queda reiniciar ambos servidores:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# /etc/init.d/icecast2 restart&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Restarting icecast2: Starting icecast2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Detaching from the console&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;icecast2.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# /etc/init.d/mpd restart&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ ok ] Stopping Music Player Daemon: mpd.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[ ok ] Starting Music Player Daemon: mpd.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ahora vamos a comprobar que MPD está en correcto funcionamiento:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# mpc outputs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Output 1 (Mi radio domestica) is enabled&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Output 2 (My Null Output) is enabled&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si alguna de las salidas apareciera deshabilitada, bastaría con ejecutar el siguiente comando:&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;# mpc enable&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Vamos a alimentar nuestro servidor MPD con música. Lo más sencillo es utilizar MPC para esta tarea.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# mpc update --wait (escanea el directorio de ficheros de audio)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# mpc ls | mpc add (añade las canciones encontradas a la lista de reproducción por defecto)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# mpc playlist (muestra el contenido de la lista de reproducción que acabamos de crear)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# mpc play (comienza la reproducción)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Podemos seguir &amp;ldquo;jugando&amp;rdquo; con MPC a través de comandos como &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;random&lt;/code&gt;, &lt;code&gt;repeat&lt;/code&gt;, &lt;code&gt;crossfade&lt;/code&gt;, &lt;code&gt;shuffle&lt;/code&gt;, etc., pudiendo utilizar MPC desde otro ordenador con sólo incluir el parámetro &lt;code&gt;-h&lt;/code&gt; junto con la IP del Pi. Las posibilidades son muchas para que la reproducción quede a nuestro gusto. Además, MPD va a recordar el estado en el que lo hayamos dejado, por lo que aunque reiniciemos el Pi, MPD continuará la reproducción por donde la dejamos.&lt;/p&gt;&#10;&lt;p&gt;Es el momento de conectarnos a Icecast2 con un cliente compatible. En &lt;a class="link" href="https://web.archive.org/web/20130819/http://www.icecast.org/3rdparty.php" target="_blank" rel="noopener"&#10; &gt;http://www.icecast.org/3rdparty.php&lt;/a&gt; tenemos una lista completa tanto de clientes de control (para sustituir a MPC) como de reproductores compatibles. Para escuchar nuestra recién instalada radio doméstica, tenemos que indicarle al reproductor que se conecte a la URL &lt;code&gt;http://ip_raspberry_pi:8000/mpd.m3u&lt;/code&gt;. Como vemos, el punto de montaje definido antes se utiliza en la URL para acceder a nuestra radio, que se está transmitiendo por nuestra red doméstica y a la que puede tener acceso cualquier dispositivo conectado a la misma, desde ordenadores hasta altavoces inalámbricos, pasando por &lt;em&gt;tablets&lt;/em&gt; y &lt;em&gt;smartphones&lt;/em&gt;.&lt;/p&gt;&#10;&lt;p&gt;A partir de aquí las posibilidades son infinitas. Por ejemplo, podemos conectar flujos de terceros (con software como &lt;a class="link" href="http://darkice.org/" target="_blank" rel="noopener"&#10; &gt;DarkIce&lt;/a&gt;), replicar esta instalación en nuestra empresa para implantar un hilo musical a bajo coste o utilizar un servidor virtual en Internet para tener nuestra radio disponible en cualquier sitio (imaginad conectar nuestra radio privada al equipo de audio de nuestro coche mediante el Bluetooth de nuestro &lt;em&gt;smartphone&lt;/em&gt;).&lt;/p&gt;&#10;&lt;p&gt;Espero que lo probéis y que compartáis vuestras experiencias y otras ideas que se os ocurran para mejorar esta receta.&lt;/p&gt;&#10;</description></item><item><title>Comprobando el hardware de un servidor Linux sin abrirlo: dmidecode (II)</title><link>https://marcoantonioblanco.es/2013/08/comprobando-el-hardware-de-un-servidor-linux-sin-abrirlo-dmidecode-ii/</link><pubDate>Fri, 09 Aug 2013 12:17:56 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/08/comprobando-el-hardware-de-un-servidor-linux-sin-abrirlo-dmidecode-ii/</guid><description>&lt;p&gt;La segunda herramienta que nos va a permitir conocer la configuración del hardware de un sistema en producción sin tener que pararlo ni abrirlo es &lt;code&gt;dmidecode&lt;/code&gt;. Al igual que &lt;code&gt;hwinfo&lt;/code&gt;, se trata de una utilidad de línea de comandos. Sin embargo, en vez de sondear el hardware, &lt;code&gt;dmidecode&lt;/code&gt; analiza la información almacenada en la BIOS en las tablas DMI y la muestra en pantalla.&lt;/p&gt;&#10;&lt;p&gt;Para instalar &lt;code&gt;dmidecode&lt;/code&gt; en un sistema Debian, basta con seguir el procedimiento habitual:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install dmidecode&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La forma de utilizar &lt;code&gt;dmidecode&lt;/code&gt; es muy sencilla y similar a la de &lt;code&gt;hwinfo&lt;/code&gt;, es decir, invocamos el comando junto con un argumento que nos permitirá obtener la información concreta deseada. Evidentemente, si ejecutamos dmidecode sin argumentos, obtendremos toda la información disponible:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# dmidecode&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMBIOS 2.7 present.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;109 structures occupying 3956 bytes.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Table at 0x000EB6C0.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Handle 0x0000, DMI type 0, 24 bytes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BIOS Information&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Vendor: American Megatrends Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Version: 0915&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Release Date: 07/27/2012&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Address: 0xF0000&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Runtime Size: 64 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ROM Size: 8192 kB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Characteristics:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; PCI is supported&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; BIOS is upgradeable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;dmidecode&lt;/code&gt; tiene dos parámetros para seleccionar la información a mostrar, &lt;code&gt;--string&lt;/code&gt; y &lt;code&gt;--type&lt;/code&gt;. El primero obtiene el valor de la cadena DMI indicado por la palabra clave que hay especificar. Por ejemplo, para conocer la marca del procesador:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# dmidecode --string processor-manufacturer&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Intel&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Al contrario que &lt;code&gt;hwinfo&lt;/code&gt;, sólo podemos utilizar un valor a la vez. La lista de palabras clave admitidas se puede consultar en el manual electrónico de &lt;code&gt;dmidecode&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# man dmidecode&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El parámetro &lt;code&gt;--type&lt;/code&gt; muestra las entradas en la BIOS del tipo que especifiquemos, donde el tipo es o bien un número (pudiendo indicar más de uno separados por comas) o bien una palabra clave (de una lista que es distinta a la utilizada por &lt;code&gt;--string&lt;/code&gt;). Por ejemplo, para conocer información sobre el sistema y la placa base:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# dmidecode --type 1,2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMBIOS 2.7 present.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Handle 0x0001, DMI type 1, 27 bytes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;System Information&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Manufacturer: System manufacturer&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Product Name: System Product Name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Version: System Version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Serial Number: System Serial Number&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; UUID: XXX&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Wake-up Type: Power Switch&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SKU Number: SKU&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Handle 0x0002, DMI type 2, 15 bytes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Base Board Information&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Manufacturer: ASUSTeK COMPUTER INC.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Product Name: P8H77-M PRO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Version: Rev X.0x&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Serial Number: XXX&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Features:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Board is a hosting board&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Board is replaceable&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Chassis Handle: 0x0003&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Type: Motherboard&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Contained Object Handles: 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Y para saber más sobre el chasis del servidor:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# dmidecode --type chassis&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMBIOS 2.7 present.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Handle 0x0003, DMI type 3, 22 bytes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Chassis Information&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Manufacturer: Chassis Manufacture&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Type: Desktop&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Lock: Not Present&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Version: Chassis Version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Serial Number: Chassis Serial Number&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Asset Tag: Asset-1234567890&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Boot-up State: Safe&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Power Supply State: Safe&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Thermal State: Safe&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Security Status: None&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; OEM Information: 0x00000000&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Height: Unspecified&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Number Of Power Cords: 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Contained Elements: 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Al igual que antes, la lista de tipos numéricos y palabras clave admitidas se puede consultar en el manual electrónico de &lt;code&gt;dmidecode&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Como curiosidad, el paquete &lt;code&gt;dmidecode&lt;/code&gt; incluye otras herramientas, destacando &lt;code&gt;biosdecode&lt;/code&gt;, que analiza la memoria de la BIOS y muestra las estructuras de las que tiene conocimiento.&lt;/p&gt;&#10;&lt;p&gt;Para terminar dos advertencias. La primera es que &lt;code&gt;dmidecode&lt;/code&gt; sólo muestra lo que la BIOS conoce, por lo que si se trata de un sistema de esos en los que la BIOS es muy espartana, es posible que no obtengamos todo lo que queremos conocer (típico de un sistema de marca). La segunda es que hay que tener cuidado al utilizarlo en un sistema en producción (aunque este sea su objetivo). Todo lo que suponga sondear el hardware está sujeto a una probabilidad (mínima) de provocar problemas en la plataforma y su caída.&lt;/p&gt;&#10;</description></item><item><title>Comprobando el hardware de un servidor Linux sin abrirlo: hwinfo (I)</title><link>https://marcoantonioblanco.es/2013/07/comprobando-el-hardware-de-un-servidor-linux-sin-abrirlo-hwinfo-i/</link><pubDate>Mon, 08 Jul 2013 13:43:00 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/07/comprobando-el-hardware-de-un-servidor-linux-sin-abrirlo-hwinfo-i/</guid><description>&lt;p&gt;Existen situaciones en las que es necesario conocer en detalle el hardware del que se compone un servidor del que no tenemos información pero que está en producción y que por tanto no se puede detener para abrirlo y ver sus &amp;ldquo;tripas&amp;rdquo;. Un caso muy típico es cuando es necesario ampliar la memoria RAM y no sabemos ni qué tipo admite su placa base ni cuantas ranuras están ya ocupadas. Si se trata de un servidor basado en Linux, tenemos varias herramientas a nuestra disposición para esta tarea. La primera de la que voy a hablar, por su sencillez de uso, es &lt;code&gt;hwinfo&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Se trata de una utilidad de línea de comandos que es necesario ejecutar como administrador ya que de otra forma no tendremos los privilegios necesarios para acceder a la información del hardware. Para instalarlo en Debian basta con ejecutar:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install hwinfo&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si se invoca directamente &lt;code&gt;hwinfo&lt;/code&gt; sin ningún parámetro, veremos como se pone inmediatamente a detectar el hardware del servidor, tras lo cual muestra en pantalla un informe completo sobre el mismo. Como esta información suele ser muy extensa, lo más apropiado es redirigir la salida estándar a un fichero:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# hwinfo &amp;gt; /tmp/$(date +%Y%m%d)-$(hostname)-hardware.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;De este modo obtendremos un fichero de texto plano que contiene el informe detallado del hardware del sistema y cuyo nombre está compuesto por la fecha y el nombre del servidor. Para consultarlo, podemos abrirlo así:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# less /tmp/20130708-servidor-hardware.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El informe por defecto es como digo muy extenso, por lo que también podemos optar por su versión resumida:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# hwinfo --short&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cpu: &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Intel(R) Core(TM)2 Duo CPU T7250 @ 2.00GHz, 2000 MHz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Intel(R) Core(TM)2 Duo CPU T7250 @ 2.00GHz, 800 MHz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;keyboard:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /dev/input/event14 USB Keykoard&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /dev/input/event0 AT Translated Set 2 keyboard&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mouse:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /dev/input/mice Pixart Imaging USB Optical Mouse&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /dev/input/mice SynPS/2 Synaptics TouchPad&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;graphics card:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; nVidia GeForce 8600M GT&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En el caso de que sólo nos interese conocer los detalles de ciertos componentes hardware, podemos restringir la consulta mediante el uso de una serie de palabras clave cuyo listado podemos obtener en el manual electrónico mediante el comando &lt;code&gt;man hwinfo&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Por ejemplo, si quiero conocer información sobre el procesador:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# hwinfo --cpu&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;01: None 00.0: 10103 CPU &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [Created at cpu.304]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Hardware Class: cpu&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Arch: Intel&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Vendor: &amp;#34;GenuineIntel&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Model: 6.15.13 &amp;#34;Intel(R) Core(TM)2 Duo CPU T7250 @ 2.00GHz&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Y si quiero detalles sobre la RAM:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# hwinfo --mem&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1: None 00.0: 10102 Main Memory &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [Created at memory.61]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Hardware Class: memory&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Model: &amp;#34;Main Memory&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Memory Range: 0x00000000-0xbe053fff (rw)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Memory Size: 3 GB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Config Status: cfg=new, avail=yes, need=no, active=unknown&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Estos parámetros se pueden combinar en un sólo comando e incluso con &lt;code&gt;--short&lt;/code&gt; para obtener un informe resumido:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# hwinfo --short --cpu --network&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cpu: &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Intel(R) Core(TM)2 Duo CPU T7250 @ 2.00GHz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Intel(R) Core(TM)2 Duo CPU T7250 @ 2.00GHz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;network:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; wlan0 Dell Wireless 1390 WLAN Mini-Card&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; eth0 Broadcom BCM4401-B0 100Base-TX&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En todo el tiempo que llevo usándolo, &lt;code&gt;hwinfo&lt;/code&gt; se ha mostrado muy estable y nunca ha producido problemas en los sistemas en los que lo he ejecutado. Sin embargo, si sospechamos que algún componente hardware pueda estar defectuoso, considero una temeridad utilizar una herramienta como &lt;code&gt;hwinfo&lt;/code&gt;, ya que podríamos provocar un &amp;ldquo;kernel panic&amp;rdquo; y la más que probable caída del servidor.&lt;/p&gt;&#10;&lt;p&gt;Según consta en el manual de &lt;code&gt;hwinfo&lt;/code&gt;, tiene un problema: no es capaz de detectar todo el hardware. Por eso, lo complementaremos en futuros artículos con otras herramientas igualmente interesantes.&lt;/p&gt;&#10;</description></item><item><title>MultiCD, integración de varias ISOs en un pendrive USB</title><link>https://marcoantonioblanco.es/2013/06/multicd-integracion-de-varias-isos-en-un-pendrive-usb/</link><pubDate>Fri, 21 Jun 2013 11:12:14 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/06/multicd-integracion-de-varias-isos-en-un-pendrive-usb/</guid><description>&lt;p&gt;En el &lt;a class="link" href="https://marcoantonioblanco.es/2013/04/unetbootin-creando-dispositivos-usb-en-vivo-desde-imagenes-iso/" &gt;artículo sobre Unetbootin&lt;/a&gt; comenté que su mayor carencia era que sólo podía grabar una única imagen ISO en el dispositivo USB. Dada la gran utilidad que tendría el poder integrar varias imagenes en un único &lt;em&gt;pendrive&lt;/em&gt;, he estado buscando una herramienta que lo permitiese hasta que he dado con &lt;a class="link" href="http://multicd.tuxfamily.org/" target="_blank" rel="noopener"&#10; &gt;MultiCD&lt;/a&gt;, la cual sin ser perfecta cumple con creces con este objetivo.&lt;/p&gt;&#10;&lt;p&gt;MultiCD es un &lt;em&gt;shell script&lt;/em&gt; (por lo tanto, sólo sirve para Linux) con un funcionamiento muy sencillo: lee cada ISO que queramos integrar, construye el menú principal que nos permitirá acceder a cada imagen y finalmente genera una nueva ISO con toda la información anterior. Ya es cuestión nuestra el volcarla al &lt;em&gt;pendrive&lt;/em&gt;, pero para ello recomiendo el mismo mecanismo que en el caso de la &lt;a class="link" href="https://marcoantonioblanco.es/2013/03/instalacion-de-distros-en-raspberry-pi/" &gt;instalación de distros en Raspberry Pi&lt;/a&gt;. Evidentemente, podemos también quemarla en un CD o DVD, dependiendo del tamaño final resultante.&lt;/p&gt;&#10;&lt;p&gt;Su instalación es muy sencilla. Basta con acceder al enlace de descarga en GitHub que figura en la web oficial de MultiCD (el enlace a tuxfamily.org no funciona) y pulsar en el botón que aparece en la columna de la derecha con la leyenda &amp;ldquo;Download ZIP&amp;rdquo;. Una vez terminada la descarga, descomprimimos en un directorio de nuestra elección y nos aseguramos que el &lt;em&gt;script&lt;/em&gt; principal tiene los permisos de ejecución adecuados.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# chmod 755 multicd.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ahora basta con copiar o enlazar las imágenes ISO a integrar al directorio de instalación de MultiCD y ejecutar el &lt;em&gt;script&lt;/em&gt;.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ./multicd.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Antes de proceder a ejecutar el script por primera vez debemos asegurarnos de que contamos con los paquetes &lt;code&gt;mkisofs&lt;/code&gt; o &lt;code&gt;genisoimage&lt;/code&gt; para la generación de la ISO final.&lt;/p&gt;&#10;&lt;p&gt;La ejecución de MultiCD la podemos hacer tanto como usuario root como usuario estándar, ya que el script se encarga de utilizar las herramientas adecuadas en cada caso. Mi recomendación es probar primero como usuario no privilegiado y pasar a root únicamente si no nos queda más remedio.&lt;/p&gt;&#10;&lt;p&gt;MultiCD sólo es capaz de integrar aquellas ISO para las que tiene un &lt;em&gt;plugin&lt;/em&gt; preparado a tal efecto (cada &lt;em&gt;plugin&lt;/em&gt; es igualmente un &lt;em&gt;shell script&lt;/em&gt; que se encarga de gestionar las particularidades de cada imagen), pero la lista de ellos es enorme y cubre las necesidades de prácticamente cualquier usuario. Esta lista se puede consultar en la web de MultiCD, pero incluso hay ISOs soportadas que no aparecen en la misma, por lo que la mejor manera de saber qué está soportado es consultar el listado de &lt;em&gt;scripts&lt;/em&gt; del directorio &lt;code&gt;plugins&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Si al ejecutar MultiCD no se incluye alguna de las imágenes seleccionadas, sólo tenemos que consultar en la lista de ISOs de la web cómo espera MultiCD que se llame dicha imagen y renombrarla adecuadamente.&lt;/p&gt;&#10;&lt;p&gt;Desgraciadamente, en mis pruebas he descubierto que muchos de ellos no están actualizados para reconocer las últimas versiones de la ISO correspondiente (como es el caso del utilísimo Ultimate Boot CD o del apreciado Kaspersky Rescue Disk), lo que disminuye la utilidad de MultiCD. Aún así, me he construido un pendrive de lo más interesante con las siguientes imagenes:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;NetbootCD (instalación por red de las distribuciones Linux más populares)&lt;/li&gt;&#10;&lt;li&gt;SuperGrubDisk2 (inicio de sistemas Linux con arranque defectuoso)&lt;/li&gt;&#10;&lt;li&gt;Rescatux (reparación del arranque de sistemas Linux)&lt;/li&gt;&#10;&lt;li&gt;System Rescue CD (Linux en vivo para el mantenimiento de sistemas)&lt;/li&gt;&#10;&lt;li&gt;Clonezilla (clonación de sistemas)&lt;/li&gt;&#10;&lt;li&gt;AVG Antivirus&lt;/li&gt;&#10;&lt;li&gt;Memtest86+ (comprobación de RAM; incluido de serie)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;En definitiva, MultiCD es una herramienta muy útil para los que nos dedicamos a la gestión de sistemas informáticos. Os animo a probarla y a que compartáis vuestras impresiones.&lt;/p&gt;&#10;</description></item><item><title>Instalar KDE 4.10 en Debian Wheezy</title><link>https://marcoantonioblanco.es/2013/06/instalar-kde-4-10-en-debian-wheezy/</link><pubDate>Mon, 03 Jun 2013 19:30:21 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/06/instalar-kde-4-10-en-debian-wheezy/</guid><description>&lt;p&gt;Soy usuario del escritorio KDE desde prácticamente los inicios del proyecto. Considero que es un gran entorno de trabajo, usable y que potencia la productividad. Pero también soy un convencido de Debian como sistema operativo, lo que significa que debo conformarme con versiones de KDE relativamente antiguas. Aunque entiendo y comparto la filosofía de Debian en el tema del software incluido en cada edición de la distro, estoy en desacuerdo con que piezas de software tan importantes como el escritorio no reciban actualizaciones más a menudo, ya que condenan al usuario a no disfrutar de las continuas mejoras que el equipo KDE incluye en cada nueva iteración.&lt;/p&gt;&#10;&lt;p&gt;Dado que Debian Wheezy ha salido con KDE 4.8 (con un año de antigüedad), fue para mí una gran noticia descubrir a través del blog &lt;a class="link" href="http://diariodebian.wordpress.com/" target="_blank" rel="noopener"&#10; &gt;Diariodebian&lt;/a&gt; una forma de &lt;a class="link" href="http://diariodebian.wordpress.com/2013/03/28/instalar-kde-4-10-en-debian-sid-y-testing/" target="_blank" rel="noopener"&#10; &gt;instalar KDE 4.10&lt;/a&gt; en la reciente edición estable de Debian. Sin embargo, las instrucciones del artículo no me han funcionado bien del todo, así que he creado mi propio recetario para conseguir que KDE 4.10 se instale y funcione correctamente en mi Debian 7.0. Eso sí, estas instrucciones sólo sirven para la arquitectura amd64.&lt;/p&gt;&#10;&lt;p&gt;El truco de este recetario consiste en utilizar los paquetes de KDE 4.10 que ZevenOs Neptune incluye en sus repositorios. Se trata de una distro basada en Debian Wheezy, por lo que sus paquetes deberían ser compatibles. De ahí que podamos echar mano de su KDE 4.10 para nuestra Debian 7.0. Asimismo, advierto que estas instrucciones son para realizarlas como administrador del sistema (&lt;em&gt;root&lt;/em&gt;) desde la línea de comandos. Aquellos que prefieran los entornos gráficos, pueden sustituir algunos de estos pasos con su gestor de software favorito.&lt;/p&gt;&#10;&lt;p&gt;El primer paso consiste en añadir los repositorios correspondientes de ZevenOs Neptune al fichero &lt;code&gt;/etc/apt/sources.list&lt;/code&gt;, donde se almacena la lista de repositorios desde los que instalamos el software de nuestro sistema. Abrimos el fichero con nuestro editor de elección y añadimos las siguientes líneas:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ZevenOs Neptune (KDE 4.10)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;deb http://proindi.de/zevenos/neptune/repo/ sid main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;deb http://proindi.de/zevenos/neptune/kde-repo/ sid main&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;tras lo cual actualizamos la base de datos de paquetes:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ahora, dependiendo del estado de nuestra Debian, tomaremos un camino u otro. En el caso de que no tengamos KDE instalado previamente, procederemos con su instalación desde cero:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get install kde-full kde-l10n-es&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;con lo que instalaremos KDE 4.10 al completo junto con el soporte para el idioma español. Si en nuestro caso es que ya tenemos una versión anterior de KDE instalada, procederemos a actualizarla de la siguiente manera:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get dist-upgrade&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En ambos casos, la instalación se nos va a quejar de que la firma de ciertos paquetes (los de ZevenOs Neptune) es desconocida para el sistema. Esto se debe a que efectivamente no hemos instalado dicha firma, pero por más que la he buscado no la he encontrado, así que tendremos que contestar &amp;ldquo;sí&amp;rdquo; a la pregunta de si se continúa con la instalación.&lt;/p&gt;&#10;&lt;p&gt;Ya sólo queda reiniciar el PC, tras lo que debería presentarsenos la pantalla de bienvenida de KDM, el gestor de acceso de KDE, lo que significa que podemos empezar a disfrutar de la versión 4.10 de este estupendo escritorio.&lt;/p&gt;&#10;&lt;p&gt;En el artículo original se recomienda la instalación de unos paquetes que aseguran una homogeneidad visual entre las aplicaciones ejecutadas bajo KDE independientemente de si se han desarrollado con GTK o Qt, algo con lo que estoy totalmente de acuerdo:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get install gtk3-engines-oxygen gtk2-engines-oxygen&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Eso es todo. Espero que probéis KDE 4.10 y me contéis qué tal os ha ido.&lt;/p&gt;&#10;</description></item><item><title>UNetbootin, creando dispositivos USB en vivo desde imagenes ISO</title><link>https://marcoantonioblanco.es/2013/04/unetbootin-creando-dispositivos-usb-en-vivo-desde-imagenes-iso/</link><pubDate>Mon, 08 Apr 2013 10:30:51 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/04/unetbootin-creando-dispositivos-usb-en-vivo-desde-imagenes-iso/</guid><description>&lt;p&gt;Mientras escribía el &lt;a class="link" href="https://marcoantonioblanco.es/2013/03/berryboot-multiples-distros-para-raspberry-pi-en-una-sola-tarjeta-sd/" &gt;artículo anterior sobre Berryboot&lt;/a&gt;, se me vino a la cabeza otra herramienta que tiene algún punto en común con ella: &lt;a class="link" href="http://unetbootin.sourceforge.net" target="_blank" rel="noopener"&#10; &gt;UNetbootin&lt;/a&gt;. Se trata de una sencilla aplicación que permite crear dispositivos USB en vivo a partir de imágenes ISO de distribuciones Linux y otras herramientas autoarrancables desde una unidad óptica. Al igual que Berryboot, UNetbootin nos permite elegir de una lista predefinida qué distro queremos en nuestro &lt;em&gt;pendrive&lt;/em&gt;, tras lo cual procederá a descargarsela e instalarla en el dispositivo USB. Aquí acaban las similitudes con Berryboot, ya que los objetivos, finalidad, plataforma hardware y formas de trabajar de ambas herramientas son diferentes (por ejemplo, UNetbootin sólo permite una distro por dispositivo, al contrario que Berryboot).&lt;/p&gt;&#10;&lt;p&gt;La forma de trabajar con UNetbootin es muy sencilla. Basta con dirigirnos a su &lt;a class="link" href="http://unetbootin.sourceforge.net" target="_blank" rel="noopener"&#10; &gt;web oficial&lt;/a&gt; y descargarnos el binario correspondiente a nuestro sistema operativo (existen versiones para Linux, Windows y MacOSX). Antes de proceder a ejecutarlo debemos haber conectado y montado el dispositivo USB de destino. Una nota de seguridad: aunque se trata de software libre y nos lo estamos bajando de una web de confianza como Sourceforge, se trata de la descarga de un binario y no está de más que tenga cuidado extra, sobre todo teniendo en cuenta que se trata de un software que exige permisos de administrador para su funcionamiento.&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://marcoantonioblanco.es/images/wp/2013/04/unetbootin.png" &gt;&lt;img alt="unetbootin" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://marcoantonioblanco.es/images/wp/2013/04/unetbootin-300x226.png"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;UNetbootin recién iniciado&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;La ventana de UNetbootin nos muestra dos opciones: o bien elegimos la imagen a instalar del desplegable superior (donde descubriremos una &lt;a class="link" href="http://unetbootin.sourceforge.net/#features" target="_blank" rel="noopener"&#10; &gt;lista impresionante de posibilidades&lt;/a&gt;) o bien proveemos nuestra propia imagen ISO (si a alguien se le ocurre probar cosas &amp;ldquo;diferentes&amp;rdquo;, como una versión de Windows, y tiene éxito que por favor nos lo haga saber en los comentarios). En cualquier caso, una vez realizada la selección, debemos elegir la unidad de destino del desplegable inferior. Aquí, como he comentado en artículos anteriores, debemos tener especial cuidado ya que se trata de una herramienta destructiva por naturaleza y podemos dañar el contenido de otros dispositivos si no ponemos atención (de hecho, UNetbootin nos deja incluso elegir discos duros). Finalmente, sólo queda pulsar en el botón de &amp;ldquo;Aceptar&amp;rdquo; y esperar a que acabe el proceso.&lt;/p&gt;&#10;&lt;p&gt;Una de las mayores ventajas de UNetbootin (aparte del ahorro en CDs y DVDs) es que nos permite trabajar de forma sencilla con equipos que carecen de unidad óptica, como es el caso de los netbooks. De este modo es posible probar e instalar una distro Linux o realizar tareas de mantenimiento con algunas de las herramientas de diagnóstico y detección de antivirus que UNetbootin permite utilizar. Sin duda, se trata de una utilidad de gran valor.&lt;/p&gt;&#10;</description></item><item><title>Berryboot, múltiples distros para Raspberry Pi en una sola tarjeta SD</title><link>https://marcoantonioblanco.es/2013/03/berryboot-multiples-distros-para-raspberry-pi-en-una-sola-tarjeta-sd/</link><pubDate>Thu, 14 Mar 2013 11:42:32 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/03/berryboot-multiples-distros-para-raspberry-pi-en-una-sola-tarjeta-sd/</guid><description>&lt;p&gt;Siguiendo con el tema del &lt;a class="link" href="https://marcoantonioblanco.es/2013/03/instalacion-de-distros-en-raspberry-pi/" &gt;artículo anterior&lt;/a&gt;, existe una herramienta muy interesante que permite instalar varias distribuciones para Raspberry Pi en la misma tarjeta SD, algo muy útil si estamos cortos de tarjetas. El proyecto se llama &lt;a class="link" href="http://www.berryterminal.com/doku.php/berryboot" target="_blank" rel="noopener"&#10; &gt;BerryBoot&lt;/a&gt; y su instalación y uso son muy sencillos como vamos a ver a continuación.&lt;/p&gt;&#10;&lt;p&gt;Lo primero es como siempre descargarnos el software de la página oficial. A continuación lo descomprimimos y procedemos a instalarlo en nuestra tarjeta SD tal y como describí en el artículo anterior. Una vez lista la tarjeta, la insertamos en el RPi y lo arrancamos. Una vez iniciado, BerryBoot arrancará un instalador que dará formato a la tarjeta SD y nos presentará en pantalla un menú desde el que podremos elegir las distros que queramos instalar desde Internet. Evidentemente, cuando el asistente nos pregunte, le indicaremos la tarjeta como medio de instalación.&lt;/p&gt;&#10;&lt;p&gt;Cuando hayamos terminado la instalación de las distros que nos interesan y arranquemos de nuevo el RPi, nos encontraremos un menú de inicio que nos permitirá elegir la distro que queramos iniciar en ese momento. Esto obviamente nos obliga a tener un teclado y un ratón conectados al RPi, pero es el precio a pagar para poder tener varias distros en una misma tarjeta y poder probarlas.&lt;/p&gt;&#10;&lt;p&gt;Es posible añadir otras distros que BerryBoot no conozca al menú de arranque y, aunque se trata de un proceso complejo, basta con seguir paso a paso el recetario que aparece en la página oficial para personalizar nuestra tarjeta SD.&lt;/p&gt;&#10;&lt;p&gt;Para terminar, quiero hacer hincapié en que debemos contar con una tarjeta SD con suficiente espacio para todas las distros que queramos instalar. Esto podrá parecer evidente, pero es muy fácil que no caigamos en la cuenta y si no lo planificamos previamente al final tendremos que repetir el proceso desde el principio. Lo suyo es contar con una tarjeta de 32GB, pero si no es posible 16GB se me antojan como el mínimo imprescindible.&lt;/p&gt;&#10;&lt;p&gt;Espero vuestro comentarios sobre vuestra experiencia con BerryBoot.&lt;/p&gt;&#10;</description></item><item><title>Instalación de distros en Raspberry Pi</title><link>https://marcoantonioblanco.es/2013/03/instalacion-de-distros-en-raspberry-pi/</link><pubDate>Tue, 05 Mar 2013 13:40:17 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/03/instalacion-de-distros-en-raspberry-pi/</guid><description>&lt;p&gt;Desde que tengo mi &lt;a class="link" href="http://www.raspberrypi.org/" target="_blank" rel="noopener"&#10; &gt;Raspberry Pi&lt;/a&gt; no he dejado de probar distintas aplicaciones, con mayor o menor éxito dependiendo del grado de madurez del proyecto, demostrando lo útil que es el dispositivo gracias a su diseño y bajo coste. Hasta ahora, la distribución para RPi que más me ha gustado y que más utilizo es XBian, gracias a la cual mi RPi se ha convertido en un potente y completo centro multimedia. De hecho, me estoy planteando comprarme otro RPi para seguir probando cosas e inventando nuevos proyectos. Tras esta experiencia, quiero comentar en este artículo como instalar cualquier distribución para RPi sin problemas.&lt;/p&gt;&#10;&lt;p&gt;Lo primero que tenemos que hacer es descargarnos la imagen de la distro a instalar, la cual tendrá la extensión .img y estará comprimida para facilitar su descarga. A continuación descomprimimos la imagen y procedemos a volcarla a la tarjeta SD que introduciremos en el RPi. Para ello vamos a utilizar el comando &lt;code&gt;dd&lt;/code&gt;, que sirve para copiar información desde una fuente a un destino byte a byte. Dado que en Linux todo es un fichero, la potencia de &lt;code&gt;dd&lt;/code&gt; es tremenda, ya que nos va a permitir volcar el contenido de la imagen de una distro a un dispositivo extraíble como es la tarjeta SD.&lt;/p&gt;&#10;&lt;p&gt;Sin embargo, parafraseando el conocido anuncio, esta potencia sin control es muy peligrosa y podemos convertir a &lt;code&gt;dd&lt;/code&gt; en una herramienta destructiva si no elegimos bien el destino del comando. Así que antes de volcar vamos a ver cómo elegir adecuadamente el dispositivo que representa a nuestra tarjeta SD.&lt;/p&gt;&#10;&lt;p&gt;Antes de seguir, debo comentar que cada proyecto RPi tiene unos requerimientos mínimos de espacio, por lo que la tarjeta SD que elijamos debe cubrir dicha cantidad. No todos las distros tienen las mismas necesidades, e incluso nos las podemos encontrar que les basta con 1GB, pero lo habitual es irnos a 8GB o más. Asimismo, es importante elegir una clase elevada de tarjeta, preferiblemente clase 10, ya que eso nos asegura una transferencia de datos mínima y un rendimiento adecuado en el RPi. Hay &lt;a class="link" href="http://en.wikipedia.org/wiki/SDHC#Speed_Class_Rating" target="_blank" rel="noopener"&#10; &gt;más información&lt;/a&gt; a este respecto en la Wikipedia.&lt;/p&gt;&#10;&lt;p&gt;Con la tarjeta sin insertar, ejecutamos el siguiente comando:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cat /proc/partitions&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;lo que nos dará un resultado similar a éste:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;major minor #blocks name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 8 0 156289847 sda&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 8 1 1951744 sda1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 8 2 97655808 sda2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 8 3 56680448 sda3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 11 0 1048575 sr0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lo que hemos hecho es preguntarle directamente al núcleo de Linux por los dispositivos de almacenamiento y sus particiones que el sistema operativo haya detectado. Aunque existen otros métodos (por ejemplo, usando el comando &lt;code&gt;fdisk -l&lt;/code&gt;), éste es sin duda el más fiable. En el ejemplo, tenemos un disco duro (&lt;code&gt;sda&lt;/code&gt;) con tres particiones y una unidad óptica (&lt;code&gt;sr0&lt;/code&gt;).&lt;/p&gt;&#10;&lt;p&gt;Ahora insertamos la tarjeta SD en nuestro ordenador y consultamos de nuevo al núcleo por los dispositivos y sus particiones, con lo que obtendremos algo tal que así:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;major minor #blocks name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 8 0 156289847 sda&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 8 1 1951744 sda1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 8 2 97655808 sda2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 8 3 56680448 sda3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 11 0 1048575 sr0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 8 64 975360 sde&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 8 65 975295 sde1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Como vemos, existe una diferencia clara: ahora existe un dispositivo nuevo (&lt;code&gt;sde&lt;/code&gt;) con una partición. Pues bien, ése es el que representa a nuestra tarjeta SD y el que debemos usar en el comando &lt;code&gt;dd&lt;/code&gt;. Por cierto, en vez de &lt;code&gt;sde&lt;/code&gt; el sistema podrá elegir &lt;code&gt;sdb&lt;/code&gt;, &lt;code&gt;sdc&lt;/code&gt;, etc, según la disponibilidad de identificadores de dispositivos. En mi caso, al usar un lector multitarjeta, es lógico que el sistema me haya asignado &lt;code&gt;sde&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;En el caso de que nuestro Linux haya montado automáticamente la tarjeta SD debemos proceder previamente a desmontarla desde el propio entorno gráfico. Una vez lista la tarjeta, ejecutamos el siguiente comando:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# dd if=distro.img of=/dev/sde&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A partir de este momento, el sistema se pondrá a volcar el contenido de la imagen de la distro para RPi en nuestra tarjeta SD. En el parámetro &lt;code&gt;if&lt;/code&gt; indicamos el fichero de la imagen y en el parámetro &lt;code&gt;of&lt;/code&gt; el dispositivo de la tarjeta SD. Aquí se puede apreciar el peligro de &lt;code&gt;dd&lt;/code&gt; si indicamos incorrectamente el dispositivo de salida. ¿Qué ocurriría si pongo &lt;code&gt;sda&lt;/code&gt; en vez de &lt;code&gt;sde&lt;/code&gt;? Pues que más que probablemente destruya mi sistema operativo. Por eso, hay que revisar concienzudamente el comando dd antes de ejecutarlo para estar seguros de que no cometemos un grave error.&lt;/p&gt;&#10;&lt;p&gt;Una vez terminado &lt;code&gt;dd&lt;/code&gt;, forzamos el vaciado de los buffers intermedios con este comando:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# sync&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;y ya podemos extraer la tarjeta SD de nuestro ordenador, insertarla en el RPi y probar la distro.&lt;/p&gt;&#10;&lt;p&gt;Con estas instrucciones sólo queda elegir la &lt;a class="link" href="http://elinux.org/RPi_Distributions" target="_blank" rel="noopener"&#10; &gt;distro que queremos probar&lt;/a&gt;, ya sea de propósito general como Raspbian o especializada como XBian (centro multimedia), PiMame (emulador arcade) o IPFire (cortafuegos). Espero vuestras experiencias con Raspberry Pi y algunos de estos proyectos.&lt;/p&gt;&#10;</description></item><item><title>Desura, la alternativa a Steam</title><link>https://marcoantonioblanco.es/2013/02/desura-la-alternativa-a-steam/</link><pubDate>Tue, 26 Feb 2013 19:11:44 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/02/desura-la-alternativa-a-steam/</guid><description>&lt;p&gt;Tras dedicar el anterior artículo a &lt;a class="link" href="https://marcoantonioblanco.es/2013/02/instalando-steam-en-debian-wheezy/" &gt;Steam y su instalación en Debian Wheezy&lt;/a&gt; me dí cuenta de que a &lt;a class="link" href="http://www.desura.com/" target="_blank" rel="noopener"&#10; &gt;Desura&lt;/a&gt; sólo le había dedicado una breve mención en &lt;a class="link" href="https://marcoantonioblanco.es/2012/04/habemus-mercado-de-juegos-para-linux/" &gt;otro artículo dedicado al renacimiento del mercado de juegos para Linux&lt;/a&gt;. Para los que no sepan lo que es, se trata de una plataforma de distribución digital de juegos creada en 2009 por un grupo de desarrolladores australianos.&lt;/p&gt;&#10;&lt;p&gt;Aunque no es exclusiva de Linux, Desura facilita enormemente la adquisición y gestión de juegos en formato digital, eliminando muchos de los problemas que los usuarios noveles se encuentran a la hora de instalar programas en Linux que no están integrados en sus respectivas plataformas de gestión de software. Dado que Desura ha sido la pionera en la distribución digital de juegos comerciales en Linux y lleva por tanto más tiempo disponible que Steam en el sistema del pingüino, es de recibo que dedique un artículo a hablar de sus bondades y de cómo instalarlo en Linux.&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://marcoantonioblanco.es/images/wp/2012/04/Desura-Linux-Client.png" &gt;&lt;img alt="Desura en acción" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://marcoantonioblanco.es/images/wp/2012/04/Desura-Linux-Client-300x216.png"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Desura en acción&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;En cuanto a funcionalidad, Desura ofrece lo mismo que Steam (o debería decirlo al revés, ya que éste es el novato en Linux): un entorno de comercio electrónico, un sistema de gestión de software, una comunidad de usuarios y una plataforma para desarrolladores. Sin embargo, aquí acaban las similitudes. Desura tiene una serie de ventajas sobre Steam que lo convierten en un serio competidor para la plataforma de Valve y en mi primera elección como plataforma comercial de juegos.&lt;/p&gt;&#10;&lt;p&gt;1. Versión para 64 bits. Desura cuenta con versiones tanto para 32 como para 64 bits, lo que implica un óptimo rendimiento de la plataforma y permite utilizar versiones de los juegos propios de la arquitectura de la distro que tengamos instalada. Steam sólo cuenta con una versión para 32 bits, lo que obliga a utilizar versiones de 32 bits de ciertas librerías del sistema y a duplicar el espacio ocupado por las mismas, aparte de un inferior rendimiento general del entorno.&lt;/p&gt;&#10;&lt;p&gt;2. Instalación sencilla en cualquier distribución Linux moderna. Mientras que Steam sólo está disponible de serie para las últimas ediciones de Ubuntu (aunque se puede instalar en otras distribuciones a través de ciertas triquiñuelas), Desura es un paquete que sólo depende de sí mismo para funcionar, lo que permite su instalación (que además es muy sencilla como veremos a continuación) en cualquier plataforma Linux relativamente reciente (de unos años para acá).&lt;/p&gt;&#10;&lt;p&gt;3. Demos. Desura incluye demos en algunos de los títulos de su catálogo, lo que permite la prueba antes de comprar los juegos y nos habilita para invertir nuestro dinero de la mejor manera posible.&lt;/p&gt;&#10;&lt;p&gt;4. Juegos libres y freeware. Además de juegos comerciales, Desura ofrece la posibilidad de instalar y jugar tanto a algunos títulos libres como a juegos comerciales gratuitos. Así, no es necesario gastarse un euro para disfrutar de Desura. A día de hoy, Steam sólo ofrece un título gratuito.&lt;/p&gt;&#10;&lt;p&gt;5. Mods gratuitos. Finalmente, en lo que a tipos de software se refiere, Desura ofrece también &lt;em&gt;mods&lt;/em&gt;, es decir, modificaciones de títulos existentes que amplían la experiencia de juego. Además, todos son gratis.&lt;/p&gt;&#10;&lt;p&gt;6. Actualización y reparación de juegos. Cuando se publica una nueva versión de un juego de nuestra lista, Desura nos avisa y nos permite actualizarlo con un sólo click. Igualmente, si un juego no funciona adecuadamente, Desura nos permite reparar su instalación, ofreciéndonos varias opciones dependiendo del problema.&lt;/p&gt;&#10;&lt;p&gt;7. Enorme catálogo de juegos. Esta ventaja es evidentemente fruto de que Steam acaba de aterrizar en Linux, pero Valve va a tener que trabajar muy duro para acercarse a la gran oferta actual de Desura, algo a lo que no es ajena la incorporación de juegos libres y mods a su catálogo.&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://marcoantonioblanco.es/images/wp/2013/02/desura-dlc.png" &gt;&lt;img alt="Web oficial de Desura" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://marcoantonioblanco.es/images/wp/2013/02/desura-dlc-300x285.png"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Web oficial de Desura&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Sin embargo, no todo es tan bonito ni tan perfecto en Desura. Por mi parte puedo afirmar que sufre de cierta inestabilidad que hace que se cierre inesperadamente en plena instalación, actualización o reparación de juegos. No es algo grave, ya que basta con abrir de nuevo Desura, pero si bastante molesto por lo recurrente del problema. Espero que lo resuelvan antes o después.&lt;/p&gt;&#10;&lt;p&gt;Para instalarlo basta con descargarnos el software de la &lt;a class="link" href="https://web.archive.org/web/20130226/http://www.desura.com/install" target="_blank" rel="noopener"&#10; &gt;web oficial de Desura&lt;/a&gt;, que se encargará de detectar la arquitectura de nuestra distribución, 32 ó 64 bits, y ofrecernos la descarga adecuada. El paquete viene en formato .tar.gz, por lo que procederemos a copiarlo a un directorio temporal de nuestra elección y a descomprimirlo allí. Por cierto, no es necesario realizar estar operaciones como administrador del sistema, por lo que podemos instalar Desura como nuestro usuario estándar (algo recomendable por otro lado).&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cp desura-x86_64.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# tar xzvf desura-x86_64.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ahora sólo queda iniciar el ejecutable que incluye el paquete y Desura se pondrá a continuación a descargar el resto de los ficheros necesarios para funcionar, tras lo cual se inicia el entorno en sí mismo. Esto además instalará un icono de arranque en nuestro escritorio y en nuestro menús.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ./desura&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lo primero que se muestra en pantalla es el formulario de autentificación. Si no contamos con usuario en Desura, es el momento de crearnos uno. A continuación entramos en la plataforma y ¡a disfrutar de juegos de calidad para Linux! Espero vuestras experiencias.&lt;/p&gt;&#10;</description></item><item><title>Instalando Steam en Debian Wheezy</title><link>https://marcoantonioblanco.es/2013/02/instalando-steam-en-debian-wheezy/</link><pubDate>Tue, 19 Feb 2013 11:12:20 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/02/instalando-steam-en-debian-wheezy/</guid><description>&lt;p&gt;La noticia más destacada de la semana pasada en el mundo Linux fue sin duda la de la publicación de la primera versión estable del cliente de Steam (la popular plataforma de distribución digital de juegos de Valve) para el sistema del pingüino. A pesar de que sólo existe versión para las últimas ediciones de Ubuntu, es posible instalarlo en Debian Wheezy (no es posible en Squeeze por la falta de algunas librerías) con algún que otro truco. Yo hace tiempo que me instalé la beta y lo cierto es que es un gusto disfrutar de mis juegos (por ejemplo, los de los Humble Bundle) cómodamente a través de un completo interfaz como Steam.&lt;/p&gt;&#10;&lt;p&gt;De las distintas opciones que he probado para instalar Steam en mi Wheezy, hay una que me ha funcionado sin problemas y que voy a comentar a continuación. Pero antes, si como yo utilizamos un sistema de 64 bits, es imprescindible activar antes el soporte multiarquitectura, ya que Steam sólo está disponible para 32 bits. Como siempre, estas instrucciones hay que llevarlas a cabo como administrador del sistema.&lt;/p&gt;&#10;&lt;p&gt;Los comandos para activar la arquitectura i386 en un sistema amd64 son los siguientes:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# dpkg --add-architecture i386&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para instalar Steam vamos a utilizar un &lt;a class="link" href="http://steamcommunity.com/app/221410/discussions/0/882965118613928324/" target="_blank" rel="noopener"&#10; &gt;tutorial&lt;/a&gt; preparado por un usuario llamado Cyb.org, en el que utiliza tanto un par de &lt;em&gt;scripts&lt;/em&gt; preparados por él mismo como otro desarrollado por un usuario llamado Kano. Sin embargo el tutorial es algo confuso e incompleto en alguno de sus pasos, así que trataré de que el procedimiento quede lo más claro posible.&lt;/p&gt;&#10;&lt;p&gt;Empezaremos descargando el &lt;em&gt;script&lt;/em&gt; de Kano así:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# wget http://kanotix.com/files/fix/install-steam-wheezy.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A continuación le daremos permisos de ejecución:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# chmod 755 install-steam-wheezy.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Y procedemos a ejecutarlo, lo que terminará con la instalación de un cliente Steam adaptado a nuestra Debian:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ./install-steam-wheezy.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Los siguientes pasos hay que llevarlos a cabo como nuestro usuario del sistema. Antes de cerrar la sesión de administrador, procederemos a dar permisos a nuestro usuario en el sistema de gestión de permisos &lt;code&gt;sudo&lt;/code&gt;. Para ello, ejecutamos el comando &lt;code&gt;visudo&lt;/code&gt; y añadimos en el editor que se abre a continuación la siguiente línea:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nombre_usuario ALL=(ALL:ALL) ALL&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esta línea sólo nos hará falta hasta que terminemos la instalación. A cotinuación nos salimos de la sesión de administrador y, como nuestro usuario estándar del sistema, nos descargamos el siguiente &lt;em&gt;script&lt;/em&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget http://dl.dropbox.com/u/29081229/Steam/debian_install.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le damos también permisos de ejecución como antes y lo ejecutamos. Con esto ya estará lista una versión más moderna de la librería libc6 de la que viene en Wheezy y que es necesaria para Steam. Sólo queda descargarse el script que nos va a permitir ejecutar Steam sin problemas:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget http://dl.dropbox.com/u/29081229/Steam/debian_steam.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Igualmente, le damos permisos de ejecución y lo arrancamos, con lo que el cliente Steam se iniciará, se autoactualizará y terminará pidiendo nuestro usuario y contraseña en el sistema de Valve. Una vez comprobado que todo está bien, no debemos olvidar que hay que eliminar de &lt;code&gt;sudo&lt;/code&gt; la línea que insertamos antes. Sólo quedaría crearnos un icono en nuestro escritorio o en nuestro menús que invocara Steam a través del último script descargado. Hay que recordar que no debemos utilizar el icono que el propio Steam nos instala, ya que no funcionará.&lt;/p&gt;&#10;&lt;p&gt;Personalmente me encontré con un error en el propio Steam al iniciarlo por primera vez, en el que se quejaba de que no encontraba la librería steamui.so. Realmente el problema era que no contaba con todas las librerías i386 necesarias, así que me bastó con instalar el paquete &lt;code&gt;ia32-libs&lt;/code&gt; para resolver el problema.&lt;/p&gt;&#10;&lt;p&gt;A pesar del tutorial, reconozco que se trata de un proceso complejo. Lo suyo sería que Valve publicara una versión para Debian, pero ya que no es así al menos este tutorial nos asegura el poder disfrutar de buenos juegos en nuestro Linux. ¡A pasarlo bien!&lt;/p&gt;&#10;</description></item><item><title>Virtualización en escritorios (III): VMWare</title><link>https://marcoantonioblanco.es/2013/02/virtualizacion-en-escritorios-iii-vmware/</link><pubDate>Tue, 12 Feb 2013 10:43:31 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/02/virtualizacion-en-escritorios-iii-vmware/</guid><description>&lt;p&gt;Continuamos con la serie de artículos dedicada a la virtualización en escritorios con el repaso a otra de las soluciones más populares del mercado. En esta ocasión se trata de VMWare, uno de los pioneros en esto de la virtualización de sistemas, siendo al igual que Virtualbox una de las opciones más sencillas de instalar y utilizar, aunque con el inconveniente de que se trata de una solución completamente privativa con versiones tanto de pago como gratuitas.&lt;/p&gt;&#10;&lt;p&gt;VMWare fue desarrollado por VMware Inc., que presentó al público en Mayo de 1999 un producto para escritorios, VMWare Workstation. Posteriormente entró en 2001 en el mercado de servidores con VMware GSX Server y VMware ESX Server. En 2004, la empresa se convirtió en filial de EMC Corporation.&lt;/p&gt;&#10;&lt;p&gt;Los productos de VMWare se ejecutan sobre Linux, Windows y Mac OS X sobre procesadores Intel, y es capaz de alojar a una gran cantidad de sistemas virtualizados. En el ámbito que nos ocupa, el de los escritorios, VMWare ofrece un producto gratuito llamado VMWare Player, que no solo ejecuta máquinas virtuales sino que también es capaz de crearlas. Su instalación es tan sencilla como &lt;a class="link" href="http://www.vmware.com/go/downloadplayer" target="_blank" rel="noopener"&#10; &gt;descargarse de la web oficial el instalador&lt;/a&gt; correspondiente al sistema operativo anfitrión de nuestra elección y proceder a su ejecución. En el caso de Debian, es más que interesante seguir las &lt;a class="link" href="http://wiki.debian.org/VMware#VMWare_Player_4_and_VMWare_Workstation_8" target="_blank" rel="noopener"&#10; &gt;instrucciones&lt;/a&gt; del wiki oficial del proyecto.&lt;/p&gt;&#10;&lt;p&gt;La existencia de una versión gratuita para escritorios convierte a VMWare en una opción muy asequible para los usuarios incluso de entornos corporativos, ya que su licencia así lo permite. Además, el formato que utiliza para los discos virtuales es gestionable incluso desde herramientas de licencia libre. Por último, existen numerosas máquinas virtuales con aplicaciones instaladas disponibles para su descarga en Internet, lo que hace ganar puntos a VMWare como opción interesante para nuestros escritorios.&lt;/p&gt;&#10;&lt;p&gt;VMWare basa su funcionamiento en la virtualización parcial del hardware, es decir, emula ciertas partes de la plataforma hardware sobre la que corre el sistema huésped, como el adaptador de vídeo, la tarjeta de red y los controladores de disco, mientras que pasa directamente al hardware real las llamadas a ciertos componentes, como los dispositivos USB, serie y paralelo. Esto implica una alta portabilidad entre anfitriones, siendo posible pausar una VM en un sistema, copiarla a otro y seguir allí su ejecución como si nada hubiese pasado. Asimismo, el rendimiento es generalmente superior al de soluciones de virtualización completa, aunque esto depende del uso que se le dé a la virtualización.&lt;/p&gt;&#10;&lt;p&gt;Al igual que en el caso de Virtualbox, quiero daros un consejo a la hora de crear nuevas máquinas virtuales. Cuando tengamos que crear el almacenamiento de la VM y se nos pregunte por el tipo de asignación del espacio, debemos asegurarnos de que sea dinámico y no fijo, de forma que no perdamos en el disco físico todo el espacio reservado para la VM mientras no esté en uso.&lt;/p&gt;&#10;&lt;p&gt;A pesar de las virtudes de VMWare y de tratarse de un producto robusto y estable con numerosas posibilidades, para mí chirría el hecho de que se trata de un producto privativo, por lo que prefiero otras soluciones que son tan completas como VMWare pero de licencia libre como KVM, que revisaremos en un artículo próximo. En cualquier caso, espero vuestras experiencias con VMWare.&lt;/p&gt;&#10;</description></item><item><title>Conversion de videos a HTML5 en Debian Wheezy</title><link>https://marcoantonioblanco.es/2013/01/conversion-de-videos-a-html5-en-debian-wheezy/</link><pubDate>Mon, 28 Jan 2013 11:28:44 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/01/conversion-de-videos-a-html5-en-debian-wheezy/</guid><description>&lt;p&gt;Estamos actualmente inmersos en un proyecto web consistente en la migración del actual motor al gestor de contenidos TYPO3. Se trata de una web con una importante carga de vídeos (unos 5 GB), los cuales están codificados como DivX, con la consiguiente complicación a la hora de asegurarse de que se visualizan correctamente en todas las plataformas de navegación actuales. Dado que existen algunas en las que esto ya no es posible (sobre todo en tablets y &lt;em&gt;smartphones&lt;/em&gt;), la solución que planteamos era tirar de estándar y convertir toda la base audiovisual a HTML5, lo cual no es la panacea como comentaré más adelante, pero que al menos nos asegura que los vídeos podrán visualizarse adecuadamente de aquí a unos años.&lt;/p&gt;&#10;&lt;p&gt;Como estamos hablando de más de 150 vídeos, es evidente que la conversión no se podía hacer a mano, así que buscando por Google me encontré en un blog con &lt;a class="link" href="http://sandalov.org/blog/1184/" target="_blank" rel="noopener"&#10; &gt;una solución que podía automatizar el proceso&lt;/a&gt;, basada en la herramienta de línea de comandos &lt;em&gt;ffmpeg&lt;/em&gt;, una verdadera navaja suiza para la codificación y conversión de material audiovisual.&lt;/p&gt;&#10;&lt;p&gt;Se trata de un &lt;em&gt;script&lt;/em&gt; para Linux que toma como parámetro de entrada el vídeo a convertir y que produce como salida tres versiones del vídeo (una por cada codec soportado por la etiqueta &lt;code&gt;video&lt;/code&gt;), una captura de pantalla en JPG para el parámetro &lt;code&gt;poster&lt;/code&gt; y un pequeño código HTML para visualizarlo todo (que en TYPO3 no es necesario pero que no viene mal para otras situaciones). Sin embargo, el script no funcionaba bien del todo por varios motivos: algunos parámetros de invocación de &lt;em&gt;ffmpeg&lt;/em&gt; estaban obsoletos, la visualización de los vídeos en las plataforma móviles de Apple no es correcta (como bien apuntaban en los comentarios del blog) y la generación del HTML para la visualización no funcionaba. Así que me puse manos a la obra y resolví los tres problemas (del segundo ya tenía la solución en los comentarios, como ya he dicho), obteniendo este script:&lt;/p&gt;&#10;&lt;p&gt;{code type=php}&lt;br&gt;&#10;#!/bin/bash&lt;/p&gt;&#10;&lt;p&gt;if [[ $1 ]]&lt;br&gt;&#10;then&lt;br&gt;&#10;filename=$(basename &amp;ldquo;$1&amp;rdquo;)&lt;br&gt;&#10;filename=${filename%.*}&lt;br&gt;&#10;directory=$(dirname &amp;ldquo;$1&amp;rdquo;)&lt;/p&gt;&#10;&lt;p&gt;duration=$(ffmpeg -i &amp;ldquo;$1&amp;rdquo; 2&amp;gt;&amp;amp;1 | grep Duration | awk &amp;lsquo;{print $2}&amp;rsquo; | tr -d ,)&lt;br&gt;&#10;minutes=${duration%:*}&lt;br&gt;&#10;hours=${minutes%:*}&lt;br&gt;&#10;minutes=${minutes##*:}&lt;br&gt;&#10;seconds=${duration##*:}&lt;br&gt;&#10;seconds=${seconds%.*}&lt;/p&gt;&#10;&lt;p&gt;hours=$((hours*3600))&lt;br&gt;&#10;minutes=$((minutes*60))&lt;/p&gt;&#10;&lt;p&gt;total=$(expr $hours + $minutes + $seconds)&lt;br&gt;&#10;number=$RANDOM&lt;br&gt;&#10;let &amp;ldquo;number %= $total&amp;rdquo;&lt;/p&gt;&#10;&lt;p&gt;echo &amp;ldquo;Generating thumbnail&amp;rdquo;&lt;br&gt;&#10;ffmpeg -i &amp;ldquo;$1&amp;rdquo; -filter:v yadif -an -ss $number -t 00:00:01 -r 1 -y -vcodec mjpeg -f mjpeg &amp;ldquo;$directory/$filename.jpg&amp;rdquo; 2&amp;gt;&amp;amp;1&lt;br&gt;&#10;echo &amp;ldquo;Converting $filename to ogv&amp;rdquo;&lt;br&gt;&#10;ffmpeg -i &amp;ldquo;$1&amp;rdquo; -acodec libvorbis -ac 2 -ab 96k -ar 44100 -b:v 345k &amp;ldquo;$directory/$filename.ogv&amp;rdquo;&lt;br&gt;&#10;echo &amp;ldquo;Finished ogv&amp;rdquo;&lt;/p&gt;&#10;&lt;p&gt;echo &amp;ldquo;Converting $filename to webm&amp;rdquo;&lt;br&gt;&#10;ffmpeg -i &amp;ldquo;$1&amp;rdquo; -acodec libvorbis -ac 2 -ab 96k -ar 44100 -b:v 345k &amp;ldquo;$directory/$filename.webm&amp;rdquo;&lt;br&gt;&#10;echo &amp;ldquo;Finished webm&amp;rdquo;&lt;/p&gt;&#10;&lt;p&gt;echo &amp;ldquo;Converting $filename to h264&amp;rdquo;&lt;br&gt;&#10;ffmpeg -i &amp;ldquo;$1&amp;rdquo; -acodec aac -ab 160000 -vcodec libx264 -vpre ipod640 -b:v 345k -threads 0 -pix_fmt yuv420p -f mp4 -strict -2 &amp;ldquo;$directory/$filename.mp4&amp;rdquo;&lt;br&gt;&#10;echo &amp;ldquo;Finished h264&amp;rdquo;&lt;/p&gt;&#10;&lt;p&gt;echo &amp;ldquo;Writing HTML&amp;hellip;&amp;rdquo;&lt;/p&gt;&#10;&lt;p&gt;echo &amp;quot;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34; &amp;gt; &amp;#34;$directory/$filename.html&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; echo &amp;#34; &amp;#34; &amp;gt;&amp;gt; &amp;#34;$directory/$filename.html&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; echo &amp;#34; &amp;#34; &amp;gt;&amp;gt; &amp;#34;$directory/$filename.html&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; echo &amp;#34; &amp;#34; &amp;gt;&amp;gt; &amp;#34;$directory/$filename.html&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; echo &amp;#34; Sorry, your browser does not support HTML5 video&amp;#34; &amp;gt;&amp;gt; &amp;#34;$directory/$filename.html&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; echo &amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;quot; &amp;gt;&amp;gt; &amp;ldquo;$directory/$filename.html&amp;rdquo;&lt;/p&gt;&#10;&lt;p&gt;echo &amp;ldquo;All Done!&amp;rdquo;&lt;br&gt;&#10;else&lt;br&gt;&#10;echo &amp;ldquo;Usage: [filename]&amp;rdquo;&lt;br&gt;&#10;fi&lt;/p&gt;&#10;&lt;p&gt;{/code}&lt;/p&gt;&#10;&lt;p&gt;Basta con copiarlo y guardarlo en un fichero al que daremos un nombre descriptivo (por ejemplo, &lt;code&gt;convertHTML5&lt;/code&gt;) y que deberemos almacenar en una ruta dentro de nuestro camino de ejecución. Personalmente, sugiero &lt;code&gt;/usr/local/bin&lt;/code&gt; en base a las recomendaciones del estándar Linux para los sistemas de ficheros. Antes de proceder a su ejecución, debemos asegurarnos de que el &lt;em&gt;script&lt;/em&gt; tiene los permisos adecuados:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# chmod 755 /usr/local/bin/convertHTML5&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Igualmente, debemos asegurarnos de que las herramientas de apoyo que el script necesita están instaladas en nuestro sistema. En el caso de Debian, necesitamos al menos tener instalada Wheezy para asegurarnos de que las versiones de dichas herramientas son lo suficientemente actuales para que hagan su trabajo adecuadamente. Para ello además deberemos incluir el repositorio Debian Multimedia en nuestra lista en &lt;code&gt;/etc/apt/sources.list&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;deb http://oktan.ls.fi.upm.es/debian-multimedia/ wheezy main non-free&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tras actualizar la base de datos de paquetes:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;procedemos a instalar los paquetes necesarios:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install ffmpeg x264 yasm lame libvpx1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ya podemos proceder a convertir automáticamente todos nuestros vídeos, para lo cual lanzaremos un pequeño bucle:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# for i in *.{avi,AVI}; do convertHTML5 $i; done&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si tenemos vídeos en otros formatos diferentes a DivX, como WMV, MPG o MOV, basta con que añadamos sus extensiones a la lista dentro de las llaves en el bucle. &lt;em&gt;ffmpeg&lt;/em&gt; es lo suficientemente inteligente para detectar el formato de entrada y actuar en consecuencia.&lt;/p&gt;&#10;&lt;p&gt;Como decía más arriba, este &lt;em&gt;script&lt;/em&gt; da como salida tres versiones del vídeo original, uno en cada uno de los formatos (MP4, WEBM, OGV) que soporta la etiqueta &lt;code&gt;video&lt;/code&gt; de HTML5. El motivo es que la conocida guerra de codecs se saldó con que cada navegador y plataforma soporta un formato diferente, lo que obliga a mantener una versión de cada uno para que todos los usuarios puedan disfrutar del material audiovisual sin importar cómo se conectan al sitio web. Lo único que ha provocado esta falta de entendimiento es que los desarrolladores tenemos que sufrir esta pesadilla y al menos duplicar el espacio dedicado a los audios y vídeos que queramos servir a través de HTML5. Entiendo que es muy positivo sustituir a Flash de una vez por todas, pero no a cualquier precio. De ahí mi comentario inicial de que esta solución no es precisamente una panacea.&lt;/p&gt;&#10;&lt;p&gt;En cualquier caso, este script nos está siendo de gran utilidad y por eso lo compartimos, esperando que también sea útil a nuestros lectores. Espero vuestros comentarios y posibles mejoras que se os puedan ocurrir.&lt;/p&gt;&#10;</description></item><item><title>Virtualización en escritorios (II): Virtualbox</title><link>https://marcoantonioblanco.es/2013/01/virtualizacion-en-escritorios-ii-virtualbox/</link><pubDate>Fri, 18 Jan 2013 11:10:58 +0000</pubDate><guid>https://marcoantonioblanco.es/2013/01/virtualizacion-en-escritorios-ii-virtualbox/</guid><description>&lt;p&gt;Tras la presentación de lo que es la virtualización de sistemas, sus ventajas y los casos de uso más habituales, voy seguir esta serie de artículos dedicada a la virtualización en escritorios con el repaso a las soluciones más populares existentes en el mercado. Para ello, empezaré con Virtualbox, una de las opciones más sencillas de instalar y utilizar.&lt;/p&gt;&#10;&lt;p&gt;Virtualbox fue originalmente desarrollado por la empresa alemana innotek GmbH, que lo vendió en 2008 a Sun Microsystems, terminando en manos de Oracle con el resto de activos de Sun (como Java, MYSQL, Solaris, etc.) cuando se produjo la famosa adquisición. Se ejecuta en los sistemas operativos más populares y en otros minoritarios, como el propio Solaris o FreeBSD, y es capaz de alojar a una ingente cantidad de sistemas virtualizados, incluyendo OS/2. Su instalación es tan sencilla como descargarse de la web oficial el instalador correspondiente al sistema operativo anfitrión de nuestra elección y proceder a su ejecución, tras lo cual hay que proceder también a descargar e instalar el &amp;ldquo;VirtualBox extension pack&amp;rdquo;, que amplía las posibilidades del paquete original con soporte USB 2.0, RDP y arranque PXE. Sin embargo, en el caso de Debian es aún más sencillo como veremos más adelante.&lt;/p&gt;&#10;&lt;p&gt;La existencia del &amp;ldquo;VirtualBox extension pack&amp;rdquo; se debe a la especial licencia del software. En la actualidad, el núcleo de Virtualbox se distribuye bajo la licencia libre GPLv2, mientras que las características extendidas antes mencionadas sólo están accesibles mediante una licencia privativa para uso y evaluación personal. Esto convierte a Virtualbox en una opción muy asequible para usuarios domésticos y en entornos educativos, pero pierde enteros en entornos corporativos frente a soluciones completamente libres y, en lo referente a costes de licencias, gratuitas.&lt;/p&gt;&#10;&lt;p&gt;Virtualbox basa su funcionamiento en la virtualización completa (&lt;em&gt;full virtualization&lt;/em&gt;), es decir, en la emulación al 100% de la plataforma hardware sobre la que corre el sistema huésped, de forma que éste nunca accede directamente a los recursos del hardware del anfitrión. Así, es posible instalar prácticamente cualquier sistema operativo sin modificar ni adaptar al entorno virtualizado, a cambio de una apreciable pérdida de rendimiento por la emulación por software del hardware. Sin embargo, los desarrolladores de Virtualbox han hecho un buen trabajo intentando que dicha pérdidad de rendimiento no sea tan grande, sobre todo gracias al uso del soporte de virtualización en hardware que los procesadores modernos traen de serie.&lt;/p&gt;&#10;&lt;p&gt;Como comentaba antes, la instalación en Debian es aún más sencilla que en otros sistemas gracias al uso de repositorios. Aunque Virtualbox está disponible en los repos oficiales, yo prefiero utilizar los que Oracle pone a disposición de los usuarios ya que así nos aseguramos tener siempre acceso a la última versión disponible. De hecho, a la hora de escribir este artículo, he comprobado que en Debian tenemos la versión 4.1, mientras que en el repositorio de Oracle contamos con la 4.2, publicada en Septiembre de 2012.&lt;/p&gt;&#10;&lt;p&gt;Empezamos por tanto la instalación añadiendo el repositorio oficial de Oracle a nuestra lista, bien a través del Centro de Software o bien editando directamente el fichero &lt;code&gt;/etc/apt/sources.list&lt;/code&gt;, operaciones que sólo podemos realizar como administradores del sistema. Utilizaremos esta línea si usamos Squeeze:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;deb http://download.virtualbox.org/virtualbox/debian squeeze contrib&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;o bien ésta otra si usamos Wheezy:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;deb http://download.virtualbox.org/virtualbox/debian wheezy contrib&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ahora actualizamos la base de datos de paquetes:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Y procedemos a instalar Virtualbox:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install virtualbox-4.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sólo queda darle permisos de acceso a Virtualbox a aquellos usuarios del sistema anfitrión que queramos. Para ello, basta con añadirlos al grupo de usuarios &lt;code&gt;vboxusers&lt;/code&gt;, de forma que Virtualbox pueda ejecutarse con pleno acceso a los recursos que necesita cuando es invocado por dichos usuarios. Por ejemplo, si queremos darle permiso al usuario &lt;code&gt;marco&lt;/code&gt;, lanzamos el siguiente comando:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# adduser marco vboxusers&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Listo. Ahora invocamos Virtualbox desde el icono que se ha debido instalar en nuestros menús y debería aparecer una pantalla como ésta:&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://marcoantonioblanco.es/images/wp/2013/01/virtualbox2.png" &gt;&lt;img alt="Virtualbox recién instalado" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://marcoantonioblanco.es/images/wp/2013/01/virtualbox2-300x227.png"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Virtualbox recién instalado&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;En el caso de que la licencia nos lo permita, podemos proceder entonces a instalar el &amp;ldquo;extension pack&amp;rdquo;, que descargaremos previamente de la &lt;a class="link" href="https://www.virtualbox.org/wiki/Downloads" target="_blank" rel="noopener"&#10; &gt;página de descargas de Virtualbox&lt;/a&gt; (una única descarga para todas las plataformas). Una vez hayamos cerrado Virtualbox, procedemos a la instalación del paquete como administradores con este comando:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-4.2.6-82870.vbox-extpack&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alguien me dirá que es más sencillo hacer un simple doble click sobre el fichero del paquete o instalarlo a través del menú de preferencias del propio Virtualbox (y no les falta razón), pero de este modo sólo se instala para el usuario que está instalando el paquete y no para todos los del sistema anfitrión. Además, desde línea de comandos tendremos acceso a cualquier error que se produzca y, aunque parezca increible, podremos actualizar el paquete, algo que no parece posible desde los otros métodos si no desinstalamos primero el existente.&lt;/p&gt;&#10;&lt;p&gt;Sólo queda crear nuestras propias máquinas virtuales a través del sencillo asistente que Virtualbox ofrece al pulsar el botón &amp;ldquo;Nueva&amp;rdquo; y personalizarlas a través del botón &amp;ldquo;Configurar&amp;rdquo;, como se puede ver en la siguiente pantalla:&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://marcoantonioblanco.es/images/wp/2013/01/virtualbox1.png" &gt;&lt;img alt="virtualbox1" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://marcoantonioblanco.es/images/wp/2013/01/virtualbox1-300x227.png"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Virtualbox con una VM creada&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Como se puede apreciar en el pantallazo, tengo una máquina virtual (VM) ya creada basada en Debian y que tengo suspendida en plena ejecución, de forma que cuando la inicie seguirá corriendo por donde iba cuando se detuvo.&lt;/p&gt;&#10;&lt;p&gt;Un consejo a la hora de crear nuevas máquinas virtuales. El asistente nos preguntará por el almacenamiento de la VM, que debería ser en un fichero alojado en un dispositivo local (trabajar con VMs en red supone una enorme pérdida de rendimiento). Cuando nos pregunte por el tipo de asignación del espacio, debemos asegurarnos de que sea dinámico y no fijo, de forma que no perdamos en el disco físico todo el espacio reservado para la VM mientras no esté en uso.&lt;/p&gt;&#10;&lt;p&gt;Si además nos aseguramos de que en la configuración de cada VM estén activas las extensiones de virtualización del procesador, tendremos un sistema de virtualización completo y lleno de posibilidades para nuestro escritorio. Espero vuestras experiencias con Virtualbox.&lt;/p&gt;&#10;</description></item><item><title>Probando el rendimiento de discos duros bajo Linux</title><link>https://marcoantonioblanco.es/2012/12/probando-el-rendimiento-de-discos-duros-bajo-linux/</link><pubDate>Fri, 21 Dec 2012 13:59:21 +0000</pubDate><guid>https://marcoantonioblanco.es/2012/12/probando-el-rendimiento-de-discos-duros-bajo-linux/</guid><description>&lt;p&gt;A principios de 2012 le compré un nuevo disco duro a mi portátil con el único propósito de ampliar el escaso espacio libre que me quedaba en el antiguo. Por cierto, utilicé Clonezilla para la operación de copiar todas la información desde el disco original al nuevo y, mientras que mi sistema Linux salió andando sin problemas, tuve que dedicar varias horas a reparar la licencia de Windows Vista que aún conservo (ya que la pagué con el portátil, me la quedé).&lt;/p&gt;&#10;&lt;p&gt;Aunque el tener el doble de espacio es una gozada (pasé de 250 a 500GB), surgió un problema que no me esperaba: el rendimiento del portátil cayó notablemente, lo que en principio era achacable al acceso al nuevo disco. Así que para comprobar la validez de dicha sospecha, esta misma semana he realizado una serie de pruebas al nuevo disco desde Linux. Todas estas pruebas tuve que realizarlas como administrador del sistema ya que de otra forma no tendría los privilegios suficientes para acceder a los recursos necesarios para llevarlas a cabo de manera correcta.&lt;/p&gt;&#10;&lt;p&gt;Lo primero que hice fue comprobar el rendimiento del disco a nivel de hardware con el comando &lt;code&gt;hdparm&lt;/code&gt;, una herramienta muy completa que permite realizar una gestión completa de nuestros discos duros. Como tal, es igualmente útil como peligrosa para nuestros datos si no la usamos bien.&lt;/p&gt;&#10;&lt;p&gt;En el caso que nos ocupa, utilicé dos parámetros simultáneamente para medir el rendimiento del nuevo disco. &lt;code&gt;t&lt;/code&gt; nos devuelve la transferencia de datos directa (&lt;em&gt;buffered&lt;/em&gt;) y &lt;code&gt;T&lt;/code&gt; nos ofrece la transferencia de datos a través de caché (&lt;em&gt;cached&lt;/em&gt;). Al combinar ambos parámetros en el mismo comando, se ponderan entre sí y nos ofrecen unos resultados más acordes con la realidad de nuestro dispositivo. Estos fueron mis resultados:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# hdparm -tT /dev/sda&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev/sda:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Timing cached reads: 2234 MB in 2.00 seconds = 1094.17 MB/sec&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Timing buffered disk reads: 220 MB in 3.00 seconds = 71.56 MB/sec&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Este comando hay que repetirlo tres veces para estar seguros de que los datos son estables y, por lo tanto, fiables. Comparando el resultado de las lecturas directas a disco con las especificaciones del fabricante (que hay que recordar que se obtienen en laboratorio en condiciones ideales y que por lo tanto hay que ponderar a la hora de hacer comparaciones con valores obtenidos en situaciones reales), descubrí que las primeras con aproximadamente un 50% de las segundas, lo que concuerda con lo que suele ser habitual. De hecho, hice pruebas con el disco antiguo y tuve resultados similares. Probé también con mi nuevo PC de sobremesa y más de lo mismo. Así que tocaba descartar problemas en el hardware.&lt;/p&gt;&#10;&lt;p&gt;El siguiente paso era comprobar el comportamiento de la E/S del disco bajo ciertas cargas, lo cual se puede simular con la herramienta &lt;code&gt;fio&lt;/code&gt;. Mientras que &lt;code&gt;hdparm&lt;/code&gt; suele venir de serie en cualquier distribución Linux, no es así el caso de &lt;code&gt;fio&lt;/code&gt;, que se instala en Debian tan sencillo como así:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install fio&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El mejor escenario para comprobar el rendimiento de un disco es cuando se producen numerosos accesos aleatorios. Para ello, generé un fichero de simulación como el siguiente, en el que se transfieren 256 MB de datos:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cat test.fio &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[random-read]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rw=randread&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;size=256m&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;directory=/tmp/test&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A continuación, creé el directorio de pruebas:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# mkdir /tmp/test&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;e invoqué &lt;code&gt;fio&lt;/code&gt; de la siguiente manera:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# fio test.fio&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esto genera gran cantidad de información, pero lo suficientemente clara como para darme cuenta de que el problema no estaba en la E/S del nuevo disco duro.&lt;/p&gt;&#10;&lt;p&gt;El último sospechoso era el sistema de ficheros. Estando seguro de que no tenía ningún fallo estructural (de eso se encarga el propio sistema de ficheros, &lt;code&gt;ext3&lt;/code&gt; en mi caso), pasé a comprobar el rendimiento del sistema de ficheros con la herramienta &lt;code&gt;bonnie++&lt;/code&gt;, que nos ofrece completos (y complejos) informes con resultados.&lt;/p&gt;&#10;&lt;p&gt;Al igual que &lt;code&gt;fio&lt;/code&gt;, &lt;code&gt;bonnie++&lt;/code&gt; no viene de serie en Linux, así que en Debian lo instalamos así:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install bonnie++&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para utilizar &lt;code&gt;bonnie++&lt;/code&gt;, necesitamos indicarle un directorio en el que pueda escribir sin problemas para poder hacer sus pruebas, así que como quería probar la partición en la que reside el sistema operativo, aproveché el directorio creado anteriormente en &lt;code&gt;/tmp&lt;/code&gt; para ello.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# bonnie++ -u root -d /tmp/test&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Al igual que con &lt;code&gt;fio&lt;/code&gt;, con &lt;code&gt;bonnie++&lt;/code&gt; se obtiene gran cantidad de datos, que de nuevo fueron negativos a la hora de encontrar el culpable del bajo rendimiento del portátil. Tendré que buscar en otro sitio (¿poca RAM? ¿las exigencias de KDE? ¿un nuevo kernel?).&lt;/p&gt;&#10;&lt;p&gt;PD: Por cierto, para saber cómo se llama nuestro disco duro y nuestros sistemas de ficheros en nuestra instalación de Linux, basta con invocar el comando &lt;code&gt;df -h&lt;/code&gt;.&lt;/p&gt;&#10;</description></item><item><title>Back In Time, copias de seguridad personales para escritorios Linux</title><link>https://marcoantonioblanco.es/2012/11/back-in-time-copias-de-seguridad-personales-para-escritorios-linux/</link><pubDate>Mon, 26 Nov 2012 09:41:56 +0000</pubDate><guid>https://marcoantonioblanco.es/2012/11/back-in-time-copias-de-seguridad-personales-para-escritorios-linux/</guid><description>&lt;p&gt;Hace algún tiempo un conocido mío usuario de Mac me &amp;ldquo;vaciló&amp;rdquo; con Time Machine (creo que se llama así), un software que automáticamente guarda copias de seguridad con los cambios realizados desde la salvaguarda anterior (lo que se conoce como copia incremental). Al realizarse de forma transparente para el usuario y ser la recuperación de ficheros muy sencilla, se trata de una herramienta muy útil e indispensable en cualquier escritorio moderno. Siendo los linuxeros como somos, hubiera sido muy raro que no contáramos con nuestra propia alternativa, así que busqué y no tardé en encontrar nuestra propia &amp;ldquo;cápsula del tiempo&amp;rdquo;: &lt;a class="link" href="https://launchpad.net/backintime" target="_blank" rel="noopener"&#10; &gt;Back In Time&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Back In Time es, como ya he dicho, una herramienta de copia de seguridad dirigida a los escritorios Linux (aunque se puede utilizar en servidores, existen herramientas más especializadas para dichos entornos como &lt;a class="link" href="http://www.bacula.org" target="_blank" rel="noopener"&#10; &gt;Bacula&lt;/a&gt;) que permite realizar copias incrementales de forma sencilla y transparente para el usuario. Como es habitual en Linux, cuenta con una utilidad de línea de comandos que es la que realiza todo el trabajo de gestión de las copias y un cliente gráfico (realmente dos, uno para KDE y otro para GNOME) que hace las veces de interfaz para el usuario.&lt;/p&gt;&#10;&lt;p&gt;Su instalación en Debian no puede ser más sencilla, basta con elegir el cliente y ejecutar el comando correspondiente. En el caso del cliente KDE:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install backintime-kde&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si preferimos el cliente GNOME:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install backintime-gnome&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En ambos casos, se instalará automáticamente la herramienta de línea de comandos.&lt;/p&gt;&#10;&lt;p&gt;Lo siguiente es configurar adecuadamente Back In Time. Para ello, arrancamos el cliente gráfico y pulsamos sobre el icono de la llave inglesa para modificar nuestras preferencias. Realmente sólo es necesario especificar tres cosas: dónde guardar las copias, qué queremos salvaguardar y cual será nuestra frecuencia de copia (puede ser manual, en el arranque del equipo o cada cierto periodo de tiempo). Tan sencillo como esto. Existen además numerosas opciones que nos permitirán personalizar aún más nuestras copias de seguridad, como el purgado automático de copias antiguas o si se desea continuar con la copia aunque se hayan producido errores, pero para salir andando y contar con un sistema robusto y estable de copias de seguridad sólo hacen falta los tres parámetros mencionados.&lt;/p&gt;&#10;&lt;p&gt;No debemos olvidar que, en caso de problemas o de mal funcionamiento del cliente gráfico, contamos con la herramienta de línea de comandos (que es quien realmente hace el trabajo). Una vez me dejó de funcionar el cliente KDE tras una actualización y pude seguir con mis copias sin problemas hasta que se arregló el cliente gráfico gracias a la línea de comandos. Es cierto que es algo más difícil de utilizar, pero al ser capaz de actuar en base a nuestra configuración de Back In Time, basta con lanzar la herramienta y ella solita se encarga de todo.&lt;/p&gt;&#10;&lt;p&gt;Un truco final. Podemos mejorar nuestro sistema de copias de seguridad basado en Back In time si lo integramos con algún servicio basado en la nube, como Dropbox, Google Drive, Wuala o el basado en software libre &lt;a class="link" href="https://web.archive.org/web/20121126/http://www.activasistemas.com/ownCloud.196.0.html" target="_blank" rel="noopener"&#10; &gt;ownCloud&lt;/a&gt;. Para ello, sólo tenemos que indicarle a Back In Time que el directorio en el que queremos almacenar las copias de seguridad esté dentro de los directorios a sincronizar del servicio en la nube de nuestra elección. Con esto tendremos un sistema de &lt;em&gt;backups&lt;/em&gt; personales a prueba de bombas (o casi).&lt;/p&gt;&#10;</description></item><item><title>NUT, el sistema de gestión de SAIs para Linux</title><link>https://marcoantonioblanco.es/2012/11/nut-el-sistema-de-gestion-de-sais-para-linux/</link><pubDate>Fri, 09 Nov 2012 11:30:17 +0000</pubDate><guid>https://marcoantonioblanco.es/2012/11/nut-el-sistema-de-gestion-de-sais-para-linux/</guid><description>&lt;p&gt;Otra cosa que quería hacer con mi nuevo PC doméstico es la de conectarle mi antiguo SAI (que tenía guardado desde que se me ocurrió pasarme a un portátil, algo que mi espalda me ha &amp;ldquo;agradecido&amp;rdquo; enormemente) y, aprovechando que tiene una conexión USB, gestionarlo desde el propio PC. Esto es algo que en Activa Sistemas solemos hacer en las implantaciones de servidores pero que curiosamente no he hecho nunca para un equipo de sobremesa. Para esta tarea tenemos en Linux una completísima herramienta de línea de comandos llamada &lt;a class="link" href="http://www.networkupstools.org/" target="_blank" rel="noopener"&#10; &gt;NUT&lt;/a&gt; que permite conocer el estado del SAI e informarnos de los posibles eventos que puedan ocurrir, como un corte de suministro eléctrico.&lt;/p&gt;&#10;&lt;p&gt;Poner en marcha NUT es realmente sencillo, estando la única dificultad en la elección del driver para controlar el modelo de SAI concreto que tengamos. En Debian, instalar NUT es tan sencillo como utilizar el siguiente comando como administrador:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install nut&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lo siguiente es editar una serie de ficheros de configuración, que se encuentran en &lt;code&gt;/etc/nut&lt;/code&gt;, para personalizar el funcionamiento de NUT y adaptarlo a nuestras necesidades. El primero de estos ficheros es &lt;code&gt;nut.conf&lt;/code&gt;, donde asignaremos el valor &lt;code&gt;standalone&lt;/code&gt; a la variable &lt;code&gt;MODE&lt;/code&gt; para indicar a NUT que se trata de un SAI local e independiente de red.&lt;/p&gt;&#10;&lt;p&gt;El siguiente fichero es &lt;code&gt;ups.conf&lt;/code&gt;, en el que tendremos que elegir el driver adecuado para controlar nuestro modelo concreto de SAI. Para ello, añadimos a dicho fichero una sección como la siguiente:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[mi_sai]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; driver = usbhid-ups&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; port = auto&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El &lt;em&gt;driver&lt;/em&gt; correcto lo podemos elegir del fichero &lt;code&gt;/usr/share/nut/driver.list&lt;/code&gt;, pero es muy posible que no lo encontremos, ya que las marcas más populares en España no aparecen en dicha lista. Para ello tendremos que tirar de Internet, pero recomiendo probar con los &lt;em&gt;drivers&lt;/em&gt; &amp;ldquo;megatec_usb&amp;rdquo; y &amp;ldquo;blazer_usb&amp;rdquo;, que suelen dar buenos resultados. Podemos comprobar si el driver es el correcto con el siguiente comando:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#/sbin/upsdrvctl start mi_sai&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si NUT se ejecuta adecuadamente, procedemos a pararlo para seguir con la configuración con:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#/sbin/upsdrvctl stop mi_sai&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El tercer fichero a editar debería ser &lt;code&gt;upsd.conf&lt;/code&gt;, pero como nuestra configuración es &amp;ldquo;standalone&amp;rdquo;, no hay que tocarlo. Pasamos entonces a &lt;code&gt;upsd.users&lt;/code&gt;, donde se establecen los permisos del servicio NUT. Aquí definimos usuarios, contraseñas y privilegios, por lo que es importante que este fichero esté bien protegido en cuanto a permisos de acceso, aunque ya lo está de serie. Añadimos una sección como ésta:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[monsai]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; password = secreto&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; upsmon master&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Los usuarios que definamos en este fichero NO son de sistema, son sólo para su uso en NUT y por lo tanto deberían ser diferentes.&lt;/p&gt;&#10;&lt;p&gt;El último fichero a editar es &lt;code&gt;upsmon.conf&lt;/code&gt;, donde detallamos los sistemas a monitorizar relacionando los usuarios anteriormente definidos con nuestro SAI. Siguiendo con nuestro ejemplo, añadiríamos líneas como la siguiente por cada usuario definido en NUT:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MONITOR mi_sai@localhost 1 monsai secreto master&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En este fichero podemos definir asimismo los eventos de los que queremos recibir notificación (y cómo recibir esta notificación) y modificar el comportamiento de la monitorización de nuestro SAI, entre otras cosas.&lt;/p&gt;&#10;&lt;p&gt;Una vez finalizada la edición de los ficheros de configuración, ya sólo queda arrancar NUT con el siguiente comando:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/init.d/nut-server start&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La única pega que le podría poner a NUT (y que no es realmente culpa suya) es que no encuentro un buen cliente gráfico para trabajar con comodidad con él. Antiguamente utilizaba el fabuloso &lt;code&gt;knutclient&lt;/code&gt;, que me permitía controlar diversos SAIs remotos a la vez, pero estaba diseñado para KDE3 y no existe versión compatible con KDE4. Si alguien conoce de algún cliente gráfico que realmente merezca la pena, estaré encantado de que me lo comente.&lt;/p&gt;&#10;&lt;p&gt;Habrá quien me recomiende utilizar las herramientas de monitorización que traen los propios SAIs antes que NUT, pero tengo mis motivos para preferir su uso antes que las aplicaciones de los fabricantes, algo de lo que hablaré en un próximo artículo.&lt;/p&gt;&#10;</description></item><item><title>Instalar el DNI electrónico español en Debian Wheezy</title><link>https://marcoantonioblanco.es/2012/11/instalar-el-dni-electronico-espanol-en-debian-wheezy/</link><pubDate>Fri, 02 Nov 2012 21:10:41 +0000</pubDate><guid>https://marcoantonioblanco.es/2012/11/instalar-el-dni-electronico-espanol-en-debian-wheezy/</guid><description>&lt;p&gt;Recientemente he adquirido un nuevo PC de sobremesa para mi uso doméstico al que he instalado rápidamente mi sistema operativo favorito, Debian Linux. En esta ocasión, en vez de utilizar la versión estable actual (Squeeze), lo he hecho con la versión en desarrollo (Wheezy), ya que prefiero tener el software que uso lo más actualizado posible y de paso ayudo al proyecto Debian si encuentro algún fallo o defecto del que pueda informar.&lt;/p&gt;&#10;&lt;p&gt;Dado que se trata del PC de mi casa, es imprescindible para mí contar con soporte del DNI electrónico, de forma que pueda llevar a cabo desde el ordenador personal las aún escasas gestiones telemáticas disponibles en España. Estos son los pasos que he dado para conseguir dicho soporte, que por cierto son indiferentes de la arquitectura de Debian instalada (excepto a la hora de escoger los paquetes de software adecuados). En mi caso, elegí utilizar la arquitectura amd64 (64 bits) ya que mi nueva CPU lo permite.&lt;/p&gt;&#10;&lt;p&gt;En primer lugar debemos dirigirnos a la página web del Ministerio del Interior y descargarnos el paquete de soporte del DNI electrónico. Como no hay versión para Wheezy, tendremos que conformarnos con la de Squeeze, lo que nos provocará una serie de inconvenientes que comentaré a continuación junto con su solución. La dirección web para descargar el paquete correspondiente es la siguiente:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://web.archive.org/web/20121102/http://www.dnielectronico.es/descargas/PKCS11_para_Sistemas_Unix/distribuciones_linux.html" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;http://www.dnielectronico.es/descargas/PKCS11_para_Sistemas_Unix/distribuciones_linux.html&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;A continuación debemos descargarnos de Debian los paquetes de los cuales depende el anterior. Aquí surge el primer inconveniente, ya que algunos de dichos paquetes o bien no existen en Wheezy o los que sí existen no son compatibles. Así que debemos descargarnos los de Squeeze en su lugar. Pero antes procederemos a instalar como administrador del sistema los que sí son compatibles:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install libpcsclite1 libopenct1 pinentry-qt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si utilizamos Gnome en vez de KDE como escritorio, cambiamos el paquete &lt;code&gt;pinentry-qt&lt;/code&gt; por &lt;code&gt;pinentry-gtk2&lt;/code&gt; (&lt;em&gt;pinentry&lt;/em&gt; es el encargado de solicitarnos el PIN de nuestro DNIe cuando lo utilizamos).&lt;/p&gt;&#10;&lt;p&gt;Ahora pasamos a descargarnos los paquetes necesarios de Squeeze desde estas direcciones:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="http://ftp.es.debian.org/debian/pool/main/o/opensc/libopensc2_0.11.13-1.1_amd64.deb" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;http://ftp.es.debian.org/debian/pool/main/o/opensc/libopensc2_0.11.13-1.1_amd64.deb&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="http://ftp.es.debian.org/debian/pool/main/o/opensc/opensc_0.11.13-1.1_amd64.deb" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;http://ftp.es.debian.org/debian/pool/main/o/opensc/opensc_0.11.13-1.1_amd64.deb&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="http://ftp.es.debian.org/debian/pool/main/o/opensc/mozilla-opensc_0.11.13-1.1_amd64.deb" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;http://ftp.es.debian.org/debian/pool/main/o/opensc/mozilla-opensc_0.11.13-1.1_amd64.deb&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="http://ftp.es.debian.org/debian/pool/main/o/openssl/libssl0.9.8_0.9.8o-4squeeze13_amd64.deb" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;http://ftp.es.debian.org/debian/pool/main/o/openssl/libssl0.9.8_0.9.8o-4squeeze13_amd64.deb&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;y a instalarlos junto con el paquete de DNI electrónico:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# dpkg -i Debian_Squeeze_opensc-dnie_1.4.8-2_amd64.deb opensc_0.11.13-1.1_amd64.deb libopensc2_0.11.13-1.1_amd64.deb mozilla-opensc_0.11.13-1.1_amd64.deb libssl0.9.8_0.9.8o-4squeeze13_amd64.deb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A continuación tenemos que configurar adecuadamente &lt;code&gt;opensc&lt;/code&gt; para que utilice la librería &lt;code&gt;libpcsclite1&lt;/code&gt; correcta. Editamos el fichero &lt;code&gt;/etc/opensc/opensc.conf&lt;/code&gt;, quitamos el comentario del parámetro &lt;code&gt;provider_library&lt;/code&gt; y, según la arquitectura de nuestra Debian, le asignamos el siguiente valor:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;32 bits: &lt;code&gt;/usr/lib/i386-linux-gnu/libpcsclite.so.1&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;64 bits: &lt;code&gt;/usr/lib/x86_64-linux-gnu/libpcsclite.so.1&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Durante la instalación de los paquetes se nos informa de que para poder utilizar el DNI electrónico en Firefox, es necesario utilizar la opción &amp;ldquo;Registrar módulo DNIe PKCS#11&amp;rdquo; del menú &amp;ldquo;Aplicaciones -&amp;gt; Oficina&amp;rdquo;, algo que debemos hacer a continuación y sin el navegador abierto. Para aquellos que se lo estén preguntando, efectivamente bajo Linux sólo hay soporte de DNIe para el navegador Firefox. Una vez arrancado el navegador, procedemos a cerrarlo para que se instale el certificado raíz de la Dirección General de la Policía. Es posible que en este paso se nos solicite guardar el certificado en vez de instalarlo, por lo que a continuación lo importaremos en Firefox a través de &amp;ldquo;Preferencias -&amp;gt; Avanzado -&amp;gt; Cifrado -&amp;gt; Ver certificados -&amp;gt; Importar&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;Con esto debería ser suficiente para que funcione correctamente el DNI electrónico en Debian Wheezy, pero para estar completamente seguros en primer lugar miramos en &amp;ldquo;Preferencias -&amp;gt; Avanzado -&amp;gt; Cifrado -&amp;gt; Dispositivos de seguridad&amp;rdquo; si aparece en la lista &amp;ldquo;DNIe Modulo PKCS #11&amp;rdquo;. A continuación, comprobamos que el sistema reconoce sin problemas nuestro lector de tarjetas inteligentes. Para ello, instalamos los paquetes necesarios:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install pcscd pcsc-tools&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;y ejecutamos el siguiente comando:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# pcsc_scan&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;el cual nos indicará si el lector ha sido reconocido y si hay introducida alguna tarjeta inteligente (como nuestro DNI electrónico). Incluso podemos probar en tiempo real a introducir y extraer el DNI para comprobar que dichas operaciones se detectan adecuadamente.&lt;/p&gt;&#10;&lt;p&gt;Ya sólo queda reiniciar la sesión de usuario y, tras acceder de nuevo al sistema, dirigirnos a algún sitio web que requiera del DNI electrónico y utilizarlo. Recomiendo utilizar la página que la propia Dirección General de la Policía facilita para esta comprobación:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://web.archive.org/web/20121102/http://www.dnielectronico.es/como_utilizar_el_dnie/verificar.html" target="_blank" rel="noopener"&#10; &gt;&lt;code&gt;http://www.dnielectronico.es/como_utilizar_el_dnie/verificar.html&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Si la verificación es positiva, ya podemos utilizar nuestro DNIe con total garantía para realizar nuestras gestiones telemáticas, firmar documentos, etc.&lt;/p&gt;&#10;</description></item><item><title>Navegación anónima en Internet con Linux</title><link>https://marcoantonioblanco.es/2012/10/navegacion-anonima-en-internet-con-linux/</link><pubDate>Thu, 11 Oct 2012 11:23:45 +0000</pubDate><guid>https://marcoantonioblanco.es/2012/10/navegacion-anonima-en-internet-con-linux/</guid><description>&lt;p&gt;Con el uso tan intensivo que le damos a Internet en la actualidad, hasta el punto de que nuestra vida diaria está muy integrada en la Red, es fundamental que nos preocupemos de salvaguardar nuestra intimidad de ojos ajenos. Una forma sencilla y completa de conseguirlo es combinando dos programas, Privoxy y Tor, de forma que el uso que le demos a Internet desde nuestro ordenador personal sea anónimo. Como creo que es importante conocer cómo funcionan las cosas para poder decidir si sirven o no, voy a profundizar en el trasfondo de estas tecnologías. Ni que decir tiene que ambas herramientas son de licencia libre.&lt;/p&gt;&#10;&lt;p&gt;En primer lugar presentemos a los actores. Privoxy es un proxy, es decir, un software intermediario entre el usuario y un servicio de red. De este modo, el usuario contacta con el proxy y es éste el que conecta con el servicio en nombre del usuario. Esto tiene numerosas aplicaciones, como acelerar la navegación web, filtrar el tráfico inadecuado, centralizar la gestión y el mantenimiento de un servicio o posibilitar la conexión a un servicio que de otra forma sería imposible.&lt;/p&gt;&#10;&lt;p&gt;Por otro lado tenemos a Tor, que es tanto una herramienta como una red abierta, diseñadas para ayudar al usuario a defender su privacidad y libertad personales. De este modo Tor permite proteger las comunicaciones de forma que nadie conozca nuestros hábitos de uso de Internet a través de cualquier servicio que dirijamos a través de Tor: navegación web, mensajería instantánea, redes sociales, etc.&lt;/p&gt;&#10;&lt;p&gt;Vemos como instalar y configurar ambas herramientas en un ordenador personal que corre Debian o alguna de sus derivaciones. Lo primero es proceder, como administrador del sistema, a instalar los paquetes necesarios:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install privoxy tor&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Este comando instalará Privoxy y Tor. Aunque existen clientes gráficos como TorK o Vidalia, lo cierto es que desaconsejo su uso por varios motivos: o bien están mal traducidos al español, o bien son complejos de configurar, o lo que es peor interfieren en el funcionamiento de Tor.&lt;/p&gt;&#10;&lt;p&gt;Una vez instalados los paquetes, Tor debería estar funcionando directamente. Al tratarse de un proxy SOCKS, para utilizarlo bastaría con configurar los programas que utilicemos en Internet y que entienda dicho protocolo con los siguientes datos:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Proxy SOCKS: 127.0.0.1 (para quien no lo sepa, esta IP siempre representa a nuestro propio equipo)&lt;/li&gt;&#10;&lt;li&gt;Puerto: 9050&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;¿Pero entonces para qué hemos instalado Privoxy? Para que traduzca automáticamente el protocolo HTTP al protocolo SOCKS, es decir, dirigiendo todo nuestra navegación web a través de Tor y consiguiendo así el ansiado anonimato web. Para ello tenemos que indicarle a Privoxy donde está Tor editando como administrador el fichero &lt;code&gt;/etc/privoxy/config&lt;/code&gt; y añadiendo la siguiente línea:&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;forward-socks4a / localhost:9050 . &lt;/code&gt;(el punto no es una errata, hay que incluirlo también)&lt;/p&gt;&#10;&lt;p&gt;debajo de ésta otra:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;listen-address localhost:8118&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sólo queda reiniciar Privoxy para que active la nueva configuración:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# /etc/init.d/privoxy restart&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para probar que ya podemos navegar de forma anónima, cogemos nuestro navegador favorito y lo configuramos para que utilice Privoxy como proxy de acceso a Internet. Por ejemplo, en el caso de Firefox, abrimos las Preferencias y nos dirigimos al apartado Avanzado, donde seleccionamos la pestaña Red. Allí tenemos un botón que nos sirve para configurar cómo Firefox se conecta a Internet. Una vez pulsado, en la ventana que aparece a continuación tenemos que seleccionar la opción &amp;ldquo;Configuración manual del proxy&amp;rdquo; y rellenar los campos de la siguiente manera:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Proxy HTTP: 127.0.0.1&lt;/li&gt;&#10;&lt;li&gt;Puerto: 8118&lt;/li&gt;&#10;&lt;li&gt;Usar el mismo proxy para todo: Sí&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Una vez configurada, la pantalla debería quedar así:&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://marcoantonioblanco.es/images/wp/2012/10/firefox_config_internet.png" &gt;&lt;img alt="Configuración del acceso a Internet en Firefox" data-title-escaped="Configuración del acceso a Internet en Firefox" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://marcoantonioblanco.es/images/wp/2012/10/firefox_config_internet-263x300.png" title="Configuración del acceso a Internet en Firefox"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Aceptamos y procedemos a comprobar que nuestra navegación ya es anónima conectándonos a &lt;a class="link" href="https://check.torproject.org/" target="_blank" rel="noopener"&#10; &gt;https://check.torproject.org/&lt;/a&gt; Si nos sale en pantalla un mensaje en verde diciendo &amp;ldquo;Congratulations. Your browser is configured to use Tor.&amp;rdquo;, eso quiere decir que lo hemos conseguido y que estamos usando la red Tor (en nuestro caso a través de Privoxy) para navegar de forma anónima por la Web.&lt;/p&gt;&#10;&lt;p&gt;La configuración de otros navegadores y otras herramientas es similar. Basta con probar con los datos ya mencionados, bien mediante Privoxy o directamente con Tor, para que todas nuestras comunicaciones sean realmente privadas.&lt;/p&gt;&#10;&lt;p&gt;Sólo una nota final. Tal y como avisan en el proyecto Tor, se trata de software experimental por lo que no debemos confiar en él si lo que buscamos es una anonimato a prueba de bombas.&lt;/p&gt;&#10;&lt;p&gt;Espero que esta receta os sea realmente útil, sobre todo para aquellos que tenéis menores en casa en edad de utilizar asiduamente Internet. Me gustaría conocer vuestras experiencias si decidís hacer la prueba con Tor y Privoxy.&lt;/p&gt;&#10;</description></item><item><title>PyODConverter, un conversor de formatos ofimaticos</title><link>https://marcoantonioblanco.es/2012/10/pyodconverter-un-conversor-de-formatos-ofimaticos/</link><pubDate>Fri, 05 Oct 2012 13:24:17 +0000</pubDate><guid>https://marcoantonioblanco.es/2012/10/pyodconverter-un-conversor-de-formatos-ofimaticos/</guid><description>&lt;p&gt;Una de las funcionalidades más interesantes de OpenOffice.org y sus derivados (como LibreOffice) es la de funcionar como servidor. Aunque suene raro que una suite ofimática funcione como servidor, esta capacidad abre un enorme abanico de posibilidades. Algunos ejemplos que se me ocurren de utilidad son los siguientes:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;En una migración a Linux puede facilitarnos la conversión de los formatos de nuestros documentos hacia estándares abiertos al poder realizar dicha operación de forma masiva.&lt;/li&gt;&#10;&lt;li&gt;Igualmente podemos realizar una conversión masiva de documentos al formato PDF en aquellas ocasiones en las que necesitemos preparar un buen conjunto de ficheros.&lt;/li&gt;&#10;&lt;li&gt;Podemos realizar conversiones al vuelo en una pasarela de correo hacia el formato ODT de todos los ficheros adjuntos que nos lleguen.&lt;/li&gt;&#10;&lt;li&gt;Como apoyo de un sistema de telepresencia y audio/videoconferencia en el que contemos con una pizarra digital y con compartición de ficheros, tratando así de forma automática y transparente los documentos subidos a la plataforma.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;La manera más sencilla de aprovechar la capacidad de OpenOffice.org de funcionar en modo servidor es a través de &lt;a class="link" href="https://github.com/mirkonasato/pyodconverter" target="_blank" rel="noopener"&#10; &gt;PyODConverter&lt;/a&gt;, una herramienta desarrollada en Python que automatiza la conversión de documentos ofimáticos desde la línea de comandos.&lt;/p&gt;&#10;&lt;p&gt;PyODConverter exige dos requisitos básicos para poder funcionar correctamente: que en nuestro sistema estén instalados los módulos UNO de Python y que OpenOffice.org esté corriendo como servicio en el puerto 2002.&lt;/p&gt;&#10;&lt;p&gt;Para cumplir el primer requisito, en el caso de Debian es tan sencillo como ejecutar el siguiente comando como administrador del sistema:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install python-uno&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;aunque lo más sencillo es utilizar el intérprete python que OpenOffice.org trae de serie.&lt;/p&gt;&#10;&lt;p&gt;En el caso del segundo requisito, basta con ejecutar el siguiente comando para que OpenOffice.org se ejecute como servidor:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# soffice &amp;#34;-accept=socket,port=2002;urp;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El uso de PyODConverter es muy sencillo. Basta con invocarlo desde línea de comandos indicándole el fichero a convertir y el fichero a obtener. Veamos un ejemplo utilizando el intérprete Python que trae LibreOffice 3.6 de serie para convertir un fichero ODT a PDF:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ /opt/libreoffice3.6/program/python DocumentConverter.py Informe.odt Informe.pdf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Como se puede ver, PyODConverter deduce los formatos con los que debe trabajar de las extensiones de los ficheros indicados en la línea de comandos.&lt;/p&gt;&#10;&lt;p&gt;Finalmente, PyODConverter tiene otra virtud muy interesante: la de poder ser invocado desde otros programas desarrollados en Python. Al funcionar como un módulo Python, se puede utilizar a través de un API muy sencillo, ampliando las posibilidades de nuestros propios desarrollos.&lt;/p&gt;&#10;&lt;p&gt;En definitiva, PyODConverter debe sin duda incluirse en nuestra &amp;ldquo;caja de herramientas&amp;rdquo; habituales por las enormes posibilidades que nos ofrece a la hora de trabajar con documentos ofimáticos.&lt;/p&gt;&#10;</description></item><item><title>Instalar un servidor de ebooks basado en Calibre y Debian Squeeze</title><link>https://marcoantonioblanco.es/2012/04/instalar-un-servidor-de-ebooks-basado-en-calibre-y-debian-squeeze/</link><pubDate>Thu, 12 Apr 2012 20:21:25 +0000</pubDate><guid>https://marcoantonioblanco.es/2012/04/instalar-un-servidor-de-ebooks-basado-en-calibre-y-debian-squeeze/</guid><description>&lt;p&gt;Hace tiempo que quería montar un servicio interno para facilitar la gestión y el acceso al ingente fondo bibliográfico con que contamos en la empresa, compuesto principalmente por ebooks de licencia libre y complementado con algunos títulos comprados en conocidas tiendas &lt;em&gt;online&lt;/em&gt;.&lt;/p&gt;&#10;&lt;p&gt;Buscando al respecto me topé con un &lt;a class="link" href="http://alt236.blogspot.com.es/2010/09/gettng-calibre-server-to-run-at-boot-in.html" target="_blank" rel="noopener"&#10; &gt;interesante artículo&lt;/a&gt; que relataba paso a paso la instalación de &lt;a class="link" href="http://calibre-ebook.com/" target="_blank" rel="noopener"&#10; &gt;Calibre&lt;/a&gt; en un servidor Ubuntu. Como en Activa Sistemas utilizamos preferentemente Debian en su versión estable (&amp;ldquo;Squeeze&amp;rdquo;), adapté un poco las instrucciones, le añadí algo de mi propia cosecha y ahora contamos con un fabuloso servidor de &lt;em&gt;ebooks&lt;/em&gt; en nuestra red local.&lt;/p&gt;&#10;&lt;p&gt;Para los que no lo conozcan aún, Calibre (del cuál hablé hace tiempo en un &lt;a class="link" href="https://marcoantonioblanco.es/2009/05/calibre-un-completo-gestor-de-e-books-para-linux/" &gt;artículo anterior&lt;/a&gt;) es posiblemente el software de gestión de libros electrónicos más completo del mercado y que cuenta con dos características que lo hacen aún más valioso y destacable frente a la competencia: es software libre y funciona en diversas plataformas. Entre sus numerosas funcionalidades hay una poco conocida pero muy útil si se le sabe sacar provecho: un servidor de contenidos accesible tanto vía web como a través de clientes &lt;a class="link" href="http://code.google.com/p/openpub/" target="_blank" rel="noopener"&#10; &gt;ODPS&lt;/a&gt; y a través del cual es muy sencillo acceder tanto a los libros como a la metainformación que los acompañe. Este servidor de contenidos es fácilmente gestionable desde el propio interfaz gráfico de Calibre, pero en el caso que nos ocupa estamos hablando de un servidor que cuenta únicamente con la consola de texto.&lt;/p&gt;&#10;&lt;p&gt;El primer paso es instalar los paquetes de software necesario para que Calibre funcione adecuadamente. Para ello, abrimos una sesión como &lt;em&gt;root&lt;/em&gt; en el servidor Debian y ejecutamos el siguiente comando:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install xdg-utils imagemagick python-imaging python-mechanize python-lxml python-dateutil python-cssutils python-beautifulsoup python-dnspython python-poppler libpodofo-utils libwmf-bin python-chm&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A continuación se lanza la instalación de Calibre, que no se realiza con un paquete Debian, sino descargándolo directamente del sitio web oficial. Este es uno de los pocos casos en que es recomendable hacerlo así. Ejecutamos el siguiente comando:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python -c &amp;#34;import urllib2; exec urllib2.urlopen(&amp;#39;http://status.calibre-ebook.com/linux_installer&amp;#39;).read(); main()&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;y se siguen las instrucciones en pantalla. Recomiendo aceptar los valores por defecto que el instalador nos proponga, sobre todo en lo referente al directorio de instalación (&lt;code&gt;/opt&lt;/code&gt;).&lt;/p&gt;&#10;&lt;p&gt;Con esto Calibre ya está instalado. Ahora lo que hay que asegurarse es de que es capaz de ejecutarse en un servidor sin consola gráfica y de que se inicia automáticamente en el arranque del sistema. Para ello crearemos un &lt;em&gt;script&lt;/em&gt; de arranque al uso:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# nano /etc/init.d/calibre&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;en el que copiaremos el siguiente contenido:&lt;/p&gt;&#10;&lt;p&gt;{code}&lt;br&gt;&#10;#! /bin/sh&lt;br&gt;&#10;### BEGIN INIT INFO&lt;br&gt;&#10;# Provides: calibre&lt;br&gt;&#10;# Required-Start: networking&lt;br&gt;&#10;# Required-Stop:&lt;br&gt;&#10;# Default-Start: 2 3 4 5&lt;br&gt;&#10;# Default-Stop: 0 1 6&lt;br&gt;&#10;# Short-Description: Controls the Calibre content server&lt;br&gt;&#10;# Description: Controls the Calibre content web server&lt;br&gt;&#10;#&lt;br&gt;&#10;### END INIT INFO&lt;br&gt;&#10;# Original author: Alexandrdos Schillings&lt;br&gt;&#10;# Modifications: K-Light&lt;br&gt;&#10;#&lt;br&gt;&#10;# UPDATES:&lt;br&gt;&#10;# - Added #USERNAME and PASSWORD to DAEMON_ARGS&lt;br&gt;&#10;# - In version 0.7.27+ of calibre, the &amp;ldquo;auto reload&amp;rdquo; command has been unbundled from &amp;ldquo;&amp;ndash;develop&amp;rdquo;&lt;br&gt;&#10;#&lt;br&gt;&#10;# Modifications: Marco Antonio Blanco (04/2012)&lt;br&gt;&#10;#&lt;br&gt;&#10;# UPDATES:&lt;br&gt;&#10;# - Changed &amp;ldquo;network&amp;rdquo; for &amp;ldquo;networking&amp;rdquo; in Required-Start field so it installs in Debian&lt;br&gt;&#10;#&lt;br&gt;&#10;# Please remove the &amp;ldquo;Author&amp;rdquo; lines above and replace them&lt;br&gt;&#10;# with your own name if you copy and modify this script.&lt;br&gt;&#10;# Do NOT &amp;ldquo;set -e&amp;rdquo;&lt;br&gt;&#10;# PATH should only include /usr/* if it runs after the mountnfs.sh script&lt;br&gt;&#10;#&lt;br&gt;&#10;#&lt;br&gt;&#10;PATH=/sbin:/usr/sbin:/bin:/usr/bin&lt;br&gt;&#10;DESC=&amp;ldquo;Calibre Content Server&amp;rdquo;&lt;br&gt;&#10;NAME=calibre-server&lt;br&gt;&#10;DAEMON=/usr/bin/$NAME&lt;br&gt;&#10;PIDFILE=/var/run/$NAME.pid&lt;/p&gt;&#10;&lt;p&gt;# Edit the CONTENT variable below to point it to your library directory.&lt;br&gt;&#10;# Edit the PORT variable below to change the port the server will run on.&lt;br&gt;&#10;# Edit the MAX_COVER variable below to change the maximum size of a book cover image.&lt;br&gt;&#10;# Edit the #USERNAME variable below to your desired username&lt;br&gt;&#10;# Edit the PASSWORD variable below to your desired password&lt;br&gt;&#10;CONTENT=/home/user/calibre&lt;br&gt;&#10;PORT=8080&lt;br&gt;&#10;MAX_COVER=300x400&lt;br&gt;&#10;#USERNAME=books&lt;br&gt;&#10;PASSWORD=12345678&lt;/p&gt;&#10;&lt;p&gt;DAEMON_ARGS=&amp;quot;&amp;ndash;auto-reload &amp;ndash;with-library=$CONTENT &amp;ndash;pidfile=$PIDFILE &amp;ndash;port=$PORT &amp;ndash;max-cover=$MAX_COVER &amp;ndash;username=$#USERNAME &amp;ndash;password=$PASSWORD &amp;ndash;daemonize&amp;quot;&lt;br&gt;&#10;SCRIPTNAME=/etc/init.d/$NAME&lt;/p&gt;&#10;&lt;p&gt;# Exit if the package is not installed&lt;br&gt;&#10;[ -x &amp;ldquo;$DAEMON&amp;rdquo; ] || exit 0&lt;/p&gt;&#10;&lt;p&gt;# Read configuration variable file if it is present&lt;br&gt;&#10;[ -r /etc/default/$NAME ] &amp;amp;&amp;amp; . /etc/default/$NAME&lt;/p&gt;&#10;&lt;p&gt;# Load the VERBOSE setting and other rcS variables&lt;br&gt;&#10;. /lib/init/vars.sh&lt;/p&gt;&#10;&lt;p&gt;# Define LSB log_* functions.&lt;br&gt;&#10;# Depend on lsb-base (&amp;gt;= 3.0-6) to ensure that this file is present.&lt;br&gt;&#10;. /lib/lsb/init-functions&lt;/p&gt;&#10;&lt;p&gt;#&lt;br&gt;&#10;# Function that starts the daemon/service&lt;br&gt;&#10;#&lt;br&gt;&#10;do_start()&lt;br&gt;&#10;{&lt;br&gt;&#10;# Return&lt;br&gt;&#10;# 0 if daemon has been started&lt;br&gt;&#10;# 1 if daemon was already running&lt;br&gt;&#10;# 2 if daemon could not be started&lt;br&gt;&#10;start-stop-daemon &amp;ndash;start &amp;ndash;quiet &amp;ndash;pidfile $PIDFILE &amp;ndash;exec $DAEMON &amp;ndash;test &amp;gt; /dev/null || return 1&lt;br&gt;&#10;start-stop-daemon &amp;ndash;start &amp;ndash;quiet &amp;ndash;pidfile $PIDFILE &amp;ndash;exec $DAEMON &amp;ndash; $DAEMON_ARGS || return 2&lt;br&gt;&#10;}&lt;/p&gt;&#10;&lt;p&gt;#&lt;br&gt;&#10;# Function that stops the daemon/service&lt;br&gt;&#10;#&lt;br&gt;&#10;do_stop()&lt;br&gt;&#10;{&lt;br&gt;&#10;# Return&lt;br&gt;&#10;# 0 if daemon has been stopped&lt;br&gt;&#10;# 1 if daemon was already stopped&lt;br&gt;&#10;# 2 if daemon could not be stopped&lt;br&gt;&#10;# other if a failure occurred&lt;br&gt;&#10;start-stop-daemon &amp;ndash;stop &amp;ndash;quiet &amp;ndash;retry=TERM/30/KILL/5 &amp;ndash;pidfile $PIDFILE&lt;br&gt;&#10;RETVAL=&amp;quot;$?&amp;quot;&lt;br&gt;&#10;[ &amp;ldquo;$RETVAL&amp;rdquo; = 2 ] &amp;amp;&amp;amp; return 2&lt;/p&gt;&#10;&lt;p&gt;# Wait for children to finish too if this is a daemon that forks&lt;br&gt;&#10;# and if the daemon is only ever run from this initscript.&lt;br&gt;&#10;# If the above conditions are not satisfied then add some other code&lt;br&gt;&#10;# that waits for the process to drop all resources that could be&lt;br&gt;&#10;# needed by services started subsequently. A last resort is to&lt;br&gt;&#10;# sleep for some time.&lt;br&gt;&#10;start-stop-daemon &amp;ndash;stop &amp;ndash;quiet &amp;ndash;oknodo &amp;ndash;retry=0/30/KILL/5 &amp;ndash;exec $DAEMON&lt;br&gt;&#10;[ &amp;ldquo;$?&amp;rdquo; = 2 ] &amp;amp;&amp;amp; return 2&lt;/p&gt;&#10;&lt;p&gt;# Many daemons don&amp;rsquo;t delete their pidfiles when they exit.&lt;br&gt;&#10;rm -f $PIDFILE&lt;br&gt;&#10;return &amp;ldquo;$RETVAL&amp;rdquo;&lt;br&gt;&#10;}&lt;/p&gt;&#10;&lt;p&gt;#&lt;br&gt;&#10;# Function that sends a SIGHUP to the daemon/service&lt;br&gt;&#10;#&lt;br&gt;&#10;case &amp;ldquo;$1&amp;rdquo; in&lt;br&gt;&#10;start)&lt;br&gt;&#10;[ &amp;ldquo;$VERBOSE&amp;rdquo; != no ] &amp;amp;&amp;amp; log_daemon_msg &amp;ldquo;Starting $DESC&amp;rdquo; &amp;ldquo;$NAME&amp;rdquo;&lt;br&gt;&#10;do_start&lt;br&gt;&#10;case &amp;ldquo;$?&amp;rdquo; in&lt;br&gt;&#10;0|1) [ &amp;ldquo;$VERBOSE&amp;rdquo; != no ] &amp;amp;&amp;amp; log_end_msg 0 ;;&lt;br&gt;&#10;2) [ &amp;ldquo;$VERBOSE&amp;rdquo; != no ] &amp;amp;&amp;amp; log_end_msg 1 ;;&lt;br&gt;&#10;esac&lt;br&gt;&#10;;;&lt;br&gt;&#10;stop)&lt;br&gt;&#10;[ &amp;ldquo;$VERBOSE&amp;rdquo; != no ] &amp;amp;&amp;amp; log_daemon_msg &amp;ldquo;Stopping $DESC&amp;rdquo; &amp;ldquo;$NAME&amp;rdquo;&lt;br&gt;&#10;do_stop&lt;br&gt;&#10;case &amp;ldquo;$?&amp;rdquo; in&lt;br&gt;&#10;0|1) [ &amp;ldquo;$VERBOSE&amp;rdquo; != no ] &amp;amp;&amp;amp; log_end_msg 0 ;;&lt;br&gt;&#10;2) [ &amp;ldquo;$VERBOSE&amp;rdquo; != no ] &amp;amp;&amp;amp; log_end_msg 1 ;;&lt;br&gt;&#10;esac&lt;br&gt;&#10;;;&lt;br&gt;&#10;status)&lt;br&gt;&#10;status_of_proc &amp;ldquo;$DAEMON&amp;rdquo; &amp;ldquo;$NAME&amp;rdquo; &amp;amp;&amp;amp; exit 0 || exit $?&lt;br&gt;&#10;;;&lt;br&gt;&#10;restart)&lt;br&gt;&#10;#&lt;br&gt;&#10;# If the &amp;ldquo;reload&amp;rdquo; option is implemented then remove the&lt;br&gt;&#10;# &amp;lsquo;force-reload&amp;rsquo; alias&lt;br&gt;&#10;#&lt;br&gt;&#10;log_daemon_msg &amp;ldquo;Restarting $DESC&amp;rdquo; &amp;ldquo;$NAME&amp;rdquo;&lt;br&gt;&#10;do_stop&lt;br&gt;&#10;case &amp;ldquo;$?&amp;rdquo; in&lt;br&gt;&#10;0|1)&lt;br&gt;&#10;do_start&lt;br&gt;&#10;case &amp;ldquo;$?&amp;rdquo; in&lt;br&gt;&#10;0) log_end_msg 0 ;;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;log_end_msg 1 ;; # Old process is still running&lt;br&gt;&#10;*) log_end_msg 1 ;; # Failed to start&lt;br&gt;&#10;esac&lt;br&gt;&#10;;;&lt;br&gt;&#10;*)&lt;br&gt;&#10;# Failed to stop&lt;br&gt;&#10;log_end_msg 1&lt;br&gt;&#10;;;&lt;br&gt;&#10;esac&lt;br&gt;&#10;;;&lt;br&gt;&#10;*)&lt;br&gt;&#10;echo &amp;ldquo;Usage: $SCRIPTNAME {start|stop|status|restart}&amp;rdquo; &amp;gt;&amp;amp;2&lt;br&gt;&#10;exit 3&lt;br&gt;&#10;;;&lt;br&gt;&#10;esac&lt;br&gt;&#10;:&lt;br&gt;&#10;{/code}&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Antes de guardar el &lt;em&gt;script&lt;/em&gt; debemos asegurarnos de editar adecuadamente las variables CONTENT, PORT, MAX_COVER, #USERNAME y PASSWORD, que especifican respectivamente el directorio donde se encuentra la biblioteca digital, el puerto en el que escucha el servidor de contenidos, el tamaño máximo de las cubiertas de los libros, el usuario para acceder al servidor y su contraseña correspondiente.&lt;/p&gt;&#10;&lt;p&gt;A continuación habilitamos el &lt;em&gt;script&lt;/em&gt; de arranque con los siguientes comandos:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cd /etc/init.d/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# chown root.root calibre&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# chmod 755 calibre&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# insserv calibre&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# update-rc.d calibre defaults&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ya sólo queda arrancar manualmente calibre:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# /etc/init.d/calibre start&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;y comprobar que funciona bien accediendo con un navegador a la siguiente URL:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http://servidor:8080&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En ese momento debe aparecer un diálogo solicitando usuario y contraseña, por lo que introduciremos los que indicamos en la configuración del script de arranque. A continuación debe aparecer en la ventana del navegador la página principal de la biblioteca, que en estos momentos debe estar vacía.&lt;/p&gt;&#10;&lt;p&gt;Finalmente procederemos a llenar de libros la biblioteca y comprobar que podemos acceder a ellos vía web sin problemas. Lo primero será detener de nuevo el servidor Calibre:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# /etc/init.d/calibre stop&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para introducir libros en la biblioteca es imprescindible el uso del interfaz gráfico de Calibre. Mi recomendación en este sentido es instalar Calibre en un puesto de escritorio, compartir el directorio del servidor donde se va a almacenar la biblioteca a través de NFS (para escritorios Linux) o SAMBA (para escritorios Windows) y configurar Calibre para indicarle que la biblioteca está en dicho directorio compartido. De este modo, no tenemos que mantener dos bibliotecas (una en el servidor y otra en el escritorio que tendríamos que sicronizar a mano, lo cual sería absurdo) y se facilita la gestión de los &lt;em&gt;ebooks&lt;/em&gt;.&lt;/p&gt;&#10;&lt;p&gt;Una ves populada la biblioteca con los primeros libros y la base de datos de Calibre con la metainformación correspondiente, arrancamos a mano de nuevo el servidor y accedemos al mismo mediante el navegador. Si todo ha ido bien, deberíamos ser capaces de consultar y descargar los libros, tanto desde el propio navegador como desde cualquier cliente ODPS (como Stanza para iPhone).&lt;/p&gt;&#10;&lt;p&gt;La única pega que tiene este método es que Calibre sólo acepta un usuario con su contraseña correspondiente, por lo que no podemos diferenciar entre diferentes usuarios. Si en nuestro caso queremos que todo el mundo acceda a la biblioteca digital, entonces lo mejor es dejar vacíos los campos #USERNAME y PASSWORD para acceder directamente a la misma sin autentificación.&lt;/p&gt;&#10;&lt;p&gt;Espero esta guía os sirva para montar vuestro propia biblioteca digital en red y que compartáis con todos vuestros comentarios, ideas y sugerencias al respecto.&lt;/p&gt;&#10;</description></item><item><title>Múltiples perfiles de usuario en Google Chrome</title><link>https://marcoantonioblanco.es/2010/12/multiples-perfiles-de-usuario-en-google-chrome/</link><pubDate>Fri, 31 Dec 2010 18:02:58 +0000</pubDate><guid>https://marcoantonioblanco.es/2010/12/multiples-perfiles-de-usuario-en-google-chrome/</guid><description>&lt;p&gt;Ya han pasado varias semanas &lt;a class="link" href="https://marcoantonioblanco.es/2010/11/adios-firefox-hola-chrome/" &gt;desde que me cambié a Google Chrome&lt;/a&gt; y poco a poco me voy acercando cada vez más a la funcionalidad y comportamiento de los que disfrutaba en Firefox. Una de las capacidades que más echaba de menos era la de poder utilizar varios perfiles de usuario diferentes en Chrome, incluso simultáneamente, de forma que pudiese dedicar cada perfil a tareas diferentes (navegación, promoción SEO, pruebas, ocio, etc.). Tras investigar el tema he conseguido lo que me proponía, aunque no es tan &lt;a class="link" href="https://marcoantonioblanco.es/2009/07/gestionar-varios-perfiles-de-usuario-en-firefox/" &gt;directo y sencillo como con Firefox&lt;/a&gt;. Espero que con la explicación que voy a dar a continuación le resulte más fácil hacerlo a todo aquél que quiera también varios perfiles en Chrome.&lt;/p&gt;&#10;&lt;p&gt;Antes de empezar con las instrucciones, es necesario aclarar que Chrome no cuenta con un gestor de perfiles como el de Firefox, sino que parte del trabajo de activación de los mismos hay que hacerlo desde línea de comandos, lo cual dificulta la tarea. Espero que esto no asuste a nadie, ya que mi propósito es precisamente facilitar el uso de perfiles en Chrome. Las instrucciones son para Linux, pero son fácilmente adaptables a otros sistemas operativos.&lt;/p&gt;&#10;&lt;p&gt;En primer lugar, es necesario saber que Chrome guarda sus preferencias en el directorio &lt;code&gt;.config/google-chrome&lt;/code&gt; dentro del directorio doméstico del usuario. Para crear otros perfiles de usuario, recomiendo guardarlos igualmente en &lt;code&gt;.config&lt;/code&gt;, utilizando para el directorio del perfil el nombre &lt;code&gt;google-chrome&lt;/code&gt; seguido de un prefijo que distinga el objetivo de dicho perfil. Por ejemplo, si vamos a destinar el perfil a juegos web podemos llamarlo ﻿﻿&lt;code&gt;.config/google-chrome-juegos&lt;/code&gt;, si lo vamos a dedicar a la promoción SEO lo podemos llamar &lt;code&gt;.config/google-chrome-seo&lt;/code&gt; y si lo que queremos es un perfil para realizar pruebas con el navegador (instalación de extensiones y plugins, visita de ciertas páginas web, etc.) podemos llamarlo &lt;code&gt;﻿.config/google-chrome-test&lt;/code&gt;, tan sencillo como eso.&lt;/p&gt;&#10;&lt;p&gt;Una vez creado el directorio deseado, hay que ejecutar Chrome para indicarle que queremos crear un nuevo perfil en el directorio recién creado. Si hemos utilizado los paquetes oficiales de Google para instalar Chrome en nuestro equipo, el ejecutable debe estar en el directorio &lt;code&gt;/opt/google/chrome&lt;/code&gt;. Así, el comando a utilizar para crear nuestro nuevo perfil de pruebas es el siguiente:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/opt/google/chrome/chrome --user-data-dir=&amp;#34;$HOME/.config/google-chrome-test&amp;#34; ﻿-first-run&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aconsejo ejecutar este comando desde un terminal de consola y no desde la opción &amp;ldquo;Ejecutar orden&amp;rdquo; de nuestro escritorio, ya que así podremos detectar si se produce algún problema. Con este comando le estamos indicando a Chrome el directorio a utilizar para el perfil de usuario y que lo inicialice al ser la primera vez que lo usamos. En este momento debería aparecer en pantalla el navegador como si fuera la primera vez que lo usamos. Podemos proceder a personalizarlo si queremos y después lo cerramos antes de seguir&lt;/p&gt;&#10;&lt;p&gt;Ya sólo queda crear un acceso directo al mismo para ejecutarlo bajo ese nuevo perfil cada vez que queramos. Podemos hacerlo donde nos sea más cómodo, ya sea el escritorio, los menús o el panel. Cuando lo creemos, hay que introducir en la orden a ejecutar lo siguiente:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/opt/google/chrome/chrome --user-data-dir=&amp;#34;$HOME/.config/google-chrome-test&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;y darle un nombre que nos permita diferenciarlo del perfil por defecto.&lt;/p&gt;&#10;&lt;p&gt;De este modo, podemos crear todos los perfiles que queramos y además ejecutarlos simultáneamente. Cada perfil tendrá sus propias extensiones, marcadores, contraseñas guardadas, preferencias, etc. Así, repartiendo el trabajo entre varios perfiles, evitaremos sobrecargar a Chrome y podremos seguir disfrutando de la rapidez tan gran navegador.&lt;/p&gt;&#10;</description></item><item><title>Migración de máquinas virtuales Xen</title><link>https://marcoantonioblanco.es/2010/03/migracion-de-maquinas-virtuales-xen/</link><pubDate>Fri, 26 Mar 2010 10:29:14 +0000</pubDate><guid>https://marcoantonioblanco.es/2010/03/migracion-de-maquinas-virtuales-xen/</guid><description>&lt;p&gt;Esta semana nos hemos visto en la tesitura de tener que migrar unas máquinas virtuales basadas en &lt;a class="link" href="http://es.wikipedia.org/wiki/Xen" target="_blank" rel="noopener"&#10; &gt;Xen&lt;/a&gt; desde un servidor físico a otro con más recursos. A pesar de que Xen incluye herramientas especializadas para estas tareas, hemos preferido seguir nuestra propia &amp;ldquo;receta&amp;rdquo; en previsión de una serie de obstáculos que imaginábamos nos podíamos encontrar durante el proceso de migración. Voy a describir a continuación cuales han sido estos obstáculos y las soluciones que utilizamos en cada caso.&lt;/p&gt;&#10;&lt;p&gt;La situación era la siguiente: teníamos que migrar varias máquinas virtuales Xen que contenían sendos portales web desde un servidor físico a otro. Aquí se nos presentaba la primera dificultad. A pesar de que las arquitecturas hardware de los servidores eran prácticamente idénticas, no era así en el caso de los sistemas operativos, ya que el origen tenía instalado Debian 4.0 y el destino Debian 5.0. Habrá quien piense que soy un exagerado y que eso no es tanta diferencia. Nada más lejos de la realidad, ya que las versiones de núcleo Linux y del software de virtualización Xen son diferentes, lo que de algún modo impedía el correcto funcionamiento de la herramienta &amp;ldquo;xm migrate&amp;rdquo;, que fallaba inmediata e indefectiblemente con un error críptico cada vez que era invocada desde la línea de comandos del servidor de origen. A pesar de preparar concienzudamente ambos servidores para permitir la migración al vuelo, la herramienta propia de Xen no hacía su trabajo.&lt;/p&gt;&#10;&lt;p&gt;La solución fue relativamente sencilla. Todo consistió en hacer lo mismo que se suponía debía hacer &amp;ldquo;xm migrate&amp;rdquo; pero a mano y paso a paso. Lo primero era parar la máquina virtual con &amp;ldquo;xm shutdown&amp;rdquo;, para proceder a continuación a su copia al servidor destino. Aunque nosotros lo hicimos por SSH, las posibilidades aquí son amplias (FTP, NFS, SMB, USB, etc.). La copia de cada máquina virtual comprendía el fichero imagen del disco principal, el fichero imagen de la memoria de intercambio o &lt;em&gt;swap&lt;/em&gt; y el fichero de configuración correspondiente.&lt;/p&gt;&#10;&lt;p&gt;Una vez copiados los ficheros al servidor destino, el siguiente paso es arrancar las máquinas virtuales una a una con &amp;ldquo;xm create&amp;rdquo;. Sin embargo, no iba a ser tan sencillo, ya que Xen se quejó de que le faltaban el núcleo Linux y el &lt;em&gt;initrd&lt;/em&gt; de las máquinas virtuales, que procedimos a copiar desde el servidor origen, con lo que el arranque se produjo después sin más problemas.&lt;/p&gt;&#10;&lt;p&gt;Para finalizar, quedaban por ajustar algunas cosas, como la configuración de red de Xen (en el servidor origen se usaba el modo &lt;em&gt;bridge&lt;/em&gt; mientras que en el destino estaba activo por defecto el modo NAT), la actualización de los DNS de los portales web con la IP del servidor destino y la configuración del proxy inverso residente en los servidores físicos que gestiona las peticiones realizadas a cada máquina virtual.&lt;/p&gt;&#10;&lt;p&gt;De esta historia puede obtenerse una valiosa lección. Aunque cualquier sistema de virtualización, incluyendo Xen, hacen su trabajo a un buen nivel, podemos encontrarnos en cualquier momento una serie de problemas que impidan su adecuada gestión y mantenimiento, más teniendo en cuenta lo delicados y exigentes que son. En este sentido, es fundamental tener unos profundos conocimientos y experiencia en administración de sistemas en general y en el sistema de virtualización de nuestra elección en particular para evitarnos males mayores y salir airosos de cualquier situación.&lt;/p&gt;&#10;</description></item><item><title>Planificación de proyectos basados en Typo3</title><link>https://marcoantonioblanco.es/2010/01/planificacion-de-proyectos-basados-en-typo3/</link><pubDate>Thu, 28 Jan 2010 21:47:57 +0000</pubDate><guid>https://marcoantonioblanco.es/2010/01/planificacion-de-proyectos-basados-en-typo3/</guid><description>&lt;p&gt;Aunque existen numerosas metodologías para llevar a cabo un proyecto de desarrollo de software, siendo una de las más populares la METRICA v3, todas se pueden resumir en seis fases consecutivas: Análisis, Diseño, Implementación, Pruebas, Puesta en marcha y Garantía. Todas estas fases se realizan de la misma forma independientemente del producto final y de las herramientas utilizadas en su desarrollo excepto en el caso de la Implementación, cuya evolución se ve directamente afectada por el entorno de trabajo y el software a obtener. En este artículo voy a explorar cómo enfocar la fase de Implementación cuando el desarrollo está basado en Typo3.&lt;/p&gt;&#10;&lt;p&gt;Para ilustrar cómo se ve afectada la fase de Implementación, baste recordar que al tratarse de un CMS, Typo3 nos va a restringir el tipo de herramientas y de lenguajes de programación a un entorno muy concreto, que evidentemente es el de la Web. Además, la forma de trabajar de Typo3 y sus peculiares características restringen aún más las metodologías y usos disponibles a la hora de acometer el proyecto.&lt;/p&gt;&#10;&lt;p&gt;Basándonos en nuestra experiencia, la fase de Implementación de un proyecto basado en Typo3 puede subdividirse en las siguientes tareas, que además pueden llevarse a cabo concurrentemente gracias a la separación de diseño, contenido y lógica de negocio en la que se basa el funcionamiento de este CMS:&lt;/p&gt;&#10;&lt;p&gt;- Instalación del motor de Typo3: Esta tarea es la primera que debe hacerse, ya que sin un Typo3 instalado no se pueden empezar las demás tareas. Básicamente consiste en &lt;a class="link" href="https://web.archive.org/web/20100128/http://typo3.org/download/packages/" target="_blank" rel="noopener"&#10; &gt;descargarse&lt;/a&gt; tanto el motor como la estructura básica (un paquete llamado &lt;em&gt;dummy&lt;/em&gt;), descomprimirlos en el servidor de hospedaje y ejecutar el asistente web de instalación. ¡Voilá, ya tenemos un CMS en perfecto funcionamiento! En este sentido debo recomendar el uso de Linux como sistema operativo del servidor, ya que gracias al uso de enlaces simbólicos posibilita el mantenimiento de varios motores a la vez y facilita la actualización de versión, pudiéndose volver atrás en cuestión de minutos si algo falla en el proceso o el resultado no es el deseado.&lt;/p&gt;&#10;&lt;p&gt;- Creación del árbol: La siguiente tarea debería ser la de generar el árbol que representará al nuevo sitio web, cuyas ramas se convertirán en los menús y cuyas hojas serán las páginas de contenido. Aunque se recomienda cierta planificación previa, gracias a las posibilidades de edición del panel de control de Typo3 es relativamente sencillo modificar un árbol existente. No olvidar que es posible crear hojas que sean accesibles pero ocultas en los menús e incluso completamente inaccesibles. A partir de aquí ya es posible realizar el resto de tareas de forma concurrente.&lt;/p&gt;&#10;&lt;p&gt;- Integración de diseño: Consiste en generar a partir del diseño gráfico que tendrá el nuevo sitio web una plantilla HTML con una serie de marcas de Typo3 intercaladas que le indicarán al motor dónde insertar el contenido a mostrar en el navegador, ya sea estático o dinámico. Quiero destacar que Typo3 es capaz de mantener y utilizar varias plantillas tanto para todo el sitio web como para subzonas específicas del mismo.&lt;/p&gt;&#10;&lt;p&gt;- Inserción de contenido: Gracias al editor visual enriquecido que incorpora Typo3, esta tarea es realmente sencilla y se reduce prácticamente tanto a escribir directamente en dicho editor como a copiar y pegar el texto desde otras fuentes, como ficheros ofimáticos propios u otras páginas web. En este sentido el editor visual puede ser tanto una bendición como un engorro, ya que suele respetar el formato original del texto.&lt;/p&gt;&#10;&lt;p&gt;- Instalación de extensiones: Una de mis tareas favoritas es la de rastrear el enorme repositorio de &lt;a class="link" href="https://marcoantonioblanco.es/2009/07/las-mejores-extensiones-de-typo3-i/" &gt;extensiones de Typo3&lt;/a&gt; en busca de aquellas que doten de funcionalidades útiles a un nuevo sitio web. La instalación en sí no puede ser más sencilla, ya que consiste simplemente en buscar en el instalador la extensión deseada y pulsar en el botón de instalación. Lo que ya no es tan sencillo es echarla a andar, ya que nos podemos encontrar mil y un problemas, desde aquellas que están pésimamente documentadas a aquellas que están diseñadas para versiones concretas de Typo3 y PHP, pasando por otras que necesitan de tanto trabajo previo y de tal complejidad que la relación esfuerzo-resultado se resentirá gravemente.  La experiencia nos dictará finalmente cuales son las extensiones que merecen la pena, terminando en nuestras manos una lista de las favoritas que utilizaremos una y otra vez en nuestros proyectos.&lt;/p&gt;&#10;&lt;p&gt;- Desarrollo de personalizaciones: Typo3 tiene muchas características destacables, pero una de las mejores es sin duda las amplias posibilidades de personalización que ofrece gracias a la disponibilidad del código fuente en PHP, de un lenguaje interno propio llamado TypoScript que permite modificar el comportamiento de prácticamente todos y cada uno de los aspectos de Typo3 y a un fabuloso asistente de desarrollo de extensiones llamado &amp;ldquo;&lt;a class="link" href="http://typo3.org/extensions/repository/view/kickstarter/current/" target="_blank" rel="noopener"&#10; &gt;Extension Kickstarter&lt;/a&gt;&amp;rdquo; (es una extensión en sí mismo). Con todas estas herramientas podemos dotar al sitio web de todas aquellas funcionalidades que queramos y que no ofrece ninguna extensión del repositorio, bien desde cero o partiendo de alguna existente.&lt;/p&gt;&#10;&lt;p&gt;Siguiendo esta guía, en Activa Sistemas hemos conseguido hasta la fecha llevar a buen puerto los diversos proyectos basados en Typo3 que hemos realizado, en plazo y con la entera satisfacción de nuestros clientes. Es por ello que la recomiendo a todo aquel que se enfrente a un proyecto de similares características, adaptándola a sus propias necesidades.&lt;/p&gt;&#10;</description></item></channel></rss>