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

<channel>
	<title>Linux, Java y programación &#187; ide</title>
	<atom:link href="http://casidiablo.net/tag/ide/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Mon, 08 Mar 2010 03:41:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Usando el System Tray desde Java</title>
		<link>http://casidiablo.net/systray-java-ejemplo/</link>
		<comments>http://casidiablo.net/systray-java-ejemplo/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 13:55:04 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[area]]></category>
		<category><![CDATA[awt]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[jpoupmenu]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[notificacion]]></category>
		<category><![CDATA[system tray]]></category>
		<category><![CDATA[systray]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3625</guid>
		<description><![CDATA[

En esta ocasión vamos a aprender usar el System Tray desde una aplicación hecha en Java. El System Tray o área de notificaciones, es el espacio en el escritorio en donde &#8216;residen&#8217; aplicaciones que el sistema está ejecutando, pero que no tienen en foco de lo que estamos haciendo.
Antes se usaban librerías nativas + JNI [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fsystray-java-ejemplo%2F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2FckC2zY%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Usando%20el%20System%20Tray%20desde%20Java%22%20%7D);"></div>
<p style="text-align: justify;">En esta ocasión vamos a aprender usar el System Tray desde una aplicación hecha en Java. El System Tray o área de notificaciones, es el espacio en el escritorio en donde &#8216;residen&#8217; aplicaciones que el sistema está ejecutando, pero que no tienen en foco de lo que estamos haciendo.</p>
<p style="text-align: justify;"><strong>Antes</strong> se usaban librerías nativas + JNI para lograr esto, pero desde hace un tiempo se incluyeron en el API de Java 6 las clases SystemTray y TrayIcon (dentro del paquete java.awt) lo cual nos facilita mucho las cosas.</p>
<p style="text-align: center;"><img class="size-full wp-image-3638 aligncenter" title="windowsxp" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/windowsxp.png" alt="" width="325" height="173" /></p>
<h3>0. Entendiendo las clases SystemTray y TrayIcon + Prerrequisitos</h3>
<p style="text-align: justify;">Antes que nada, debes tener instalada una versión reciente del JDK6. La clase <code><a href="http://java.sun.com/javase/6/docs/api/java/awt/SystemTray.html">java.awt.SystemTray</a> </code>representa el System Tray del escritorio. Para manipular dicha clase es necesario obtener un objeto estático de esta usando el método <code>SystemTray.getSystemTray() </code> (es decir, no es posible crear instancias de dicha clase). Además, es necesario verificar que el uso de esta clase sea soportada en el sistema donde se ejecuta. Esto lo hacemos usando el método estático <code>SystemTray.isSupported()</code>. Si no hay soporte, este método retornará false. Si haces un llamado al método <code>getSystemTray</code> y tu sistema no está soportado, se lanzará la excepción <code>java.lang.UnsupportedOperationException</code>.</p>
<p style="text-align: justify;">La instancia de <code>SystemTray</code> contiene uno o más <code>TrayIcons</code>, los cuales son añadidos usando el método <code>add(java.awt.TrayIcon)</code>, y son eliminados con el método <code>remove(java.awt.TrayIcon)</code>.</p>
<p><span id="more-3625"></span></p>
<h3>1. Ejemplo de uso</h3>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java; highlight: [8,10,46,50];">import java.awt.*;
import java.awt.event.*;
public class EjemploSystemTray {
    public EjemploSystemTray() {
        //se declara el objeto tipo icono
        final TrayIcon iconoSystemTray;
        //se verifica que el SystemTray sea soportado
        if (SystemTray.isSupported()) {
            //se obtiene una instancia estática de la clase SystemTray
            SystemTray tray = SystemTray.getSystemTray();
            //esta es la imagen de icono
            Image imagenIcono = Toolkit.getDefaultToolkit().getImage(&quot;icono.png&quot;);
            //este listener nos permite capturar cualquier tipo de evento
            //que se haga con el mouse sobre el icono
            MouseListener mouseListener = new MouseListener() {
                public void mouseClicked(MouseEvent e) {
                    System.out.println(&quot;Icono del System Tray - Mouse clicked!&quot;);
                }
                public void mouseEntered(MouseEvent e) {
                    System.out.println(&quot;Icono del System Tray - Mouse entered!&quot;);
                }
                public void mouseExited(MouseEvent e) {
                    System.out.println(&quot;Icono del System Tray - Mouse exited!&quot;);
                }
                public void mousePressed(MouseEvent e) {
                    System.out.println(&quot;Icono del System Tray - Mouse pressed!&quot;);
                }
                public void mouseReleased(MouseEvent e) {
                    System.out.println(&quot;Icono del System Tray - Mouse released!&quot;);
                }
            };
            //este listener se asociara con un item del menu contextual
            //que aparece al hacer click derecho sobre el icono
            ActionListener escuchadorSalir = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println(&quot;Saliendo...&quot;);
                    System.exit(0);
                }
            };
            //menu que aparece al hacer click derecho
            PopupMenu popup = new PopupMenu();
            MenuItem item = new MenuItem(&quot;Exit&quot;);
            item.addActionListener(escuchadorSalir);
            popup.add(item);
            //iniciamos el objeto TrayIcon
            iconoSystemTray = new TrayIcon(imagenIcono, &quot;Prueba System Tray&quot;, popup);
            //este tipo de listener captura el doble click sobre el icono
            ActionListener accionMostrarMensaje = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    iconoSystemTray.displayMessage(&quot;Titulo mensaje&quot;,
                            &quot;Este es el contenido del mensaje!&quot;,
                            TrayIcon.MessageType.INFO);
                }
            };

            iconoSystemTray.setImageAutoSize(true);
            iconoSystemTray.addActionListener(accionMostrarMensaje);
            iconoSystemTray.addMouseListener(mouseListener);

            //se debe capturar una excepción en caso que falle la adicion de un icono
            try {
                tray.add(iconoSystemTray);
            } catch (AWTException e) {
                System.err.println(&quot;No es posible agregar el icono al System Tray&quot;);
            }
        }
        else
            System.err.println(&quot;Tu sistema no soporta el System Tray&quot;);
    }
    public static void main(String[] args) {
        new EjemploSystemTray();
    }
}</pre>
<p><!--INFOLINKS_ON--><br />
Así se ve en Linux (usando Gnome) y en Windows7:</p>
<p style="text-align: center;"><img title="en gnome" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/gnome.png" alt="" /> <img title="en-windows7" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/02/windows7.png" alt="" /></p>
<p style="text-align: justify;">Del ejemplo anterior veamos las líneas más importantes:</p>
<ul>
<li style="text-align: justify;">Línea 8: verificamos que tengamos soporte.</li>
<li style="text-align: justify;">Línea 10: obtenemos una instancia de la clase SystemTray.</li>
<li style="text-align: justify;">Línea 46: creamos el icono que vamos a añadir.</li>
<li style="text-align: justify;">Línea 50: invocación del método displayMessage para mostrar globos de notificación.</li>
<li style="text-align: justify;">Línea 62: añadimos el icono al systray.</li>
</ul>
<h3>2. ¿Cómo usar Swing en vez de AWT?</h3>
<p style="text-align: justify;">Si te fijaste bien, el SystemTray es una clase que pertenece al paquete AWT&#8230; por alguna razón no se tuvo en cuenta Swing en todo esto. Es por ello que no podemos usar directamente <code>JPopupMenu</code> en vez de <code>PopupMenu</code>. Además, <code>JPopupMenu</code> tampoco es una subclase de <code>PopupMenu</code> por lo cual no podemos usar polimorfismo <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_mrgreen.gif' alt=':mrgreen:' class='wp-smiley' /> </p>
<p style="text-align: justify;">Afortunadamente hay algunos trucos para hacerlo funcionar con Swing que nos proporciona varias ventajas: la apariencia del menú sería igual en cualquier sistema operativo, podemos añadir iconos a los items, etc.</p>
<p style="text-align: justify;">El truco más sencillo del cual tengo conocimiento lo leí en el blog de Artem Ananiev, en un post llamado <a href="http://weblogs.java.net/blog/2006/05/04/using-jpopupmenu-trayicon">Using JPopupMenu in TrayIcon</a>. He preparado entonces otro ejemplo sencillo en donde se muestra cómo lograr esto:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java; highlight: [40,41,42,43,44];">import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class EjemploSystemTraySwing {
    public EjemploSystemTraySwing() {
        //se declara el objeto tipo icono
        final TrayIcon iconoSystemTray;
        //se verifica que el SystemTray sea soportado
        if (SystemTray.isSupported()) {
            //se obtiene una instancia estática de la clase SystemTray
            SystemTray tray = SystemTray.getSystemTray();
            //esta es la imagen de icono
            Image imagenIcono = Toolkit.getDefaultToolkit().getImage(&quot;icono.png&quot;);
            //este listener se asociara con un item del menu contextual
            //que aparece al hacer click derecho sobre el icono
            ActionListener escuchadorSalir = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println(&quot;Saliendo...&quot;);
                    System.exit(0);
                }
            };
            //menu que aparece al hacer click derecho
            final JPopupMenu popup = new JPopupMenu();

            //aniadir un menu con icono (swing)
            JMenuItem carita = new JMenuItem(&quot;casidiablo.net&quot;,  new ImageIcon(&quot;carita.png&quot;));
            popup.add(carita);
            popup.addSeparator();

            //aniadir el item de salir
            JMenuItem item = new JMenuItem(&quot;Exit&quot;, new ImageIcon(&quot;salir.png&quot;));
            item.addActionListener(escuchadorSalir);
            popup.add(item);
            //iniciamos el objeto TrayIcon
            iconoSystemTray = new TrayIcon(imagenIcono, &quot;Prueba System Tray&quot;, null);
            iconoSystemTray.setImageAutoSize(true);
            //iconoSystemTray.addMouseListener(mouseListener);
            iconoSystemTray.addMouseListener(new MouseAdapter() {
                public void mouseReleased(MouseEvent e) {
                    if (e.isPopupTrigger()) {
                        popup.setLocation(e.getX(), e.getY()-50);
                        popup.setInvoker(popup);
                        popup.setVisible(true);
                    }
                }
            });
            //se debe capturar una excepción en caso que falle la adicion de un icono
            try {
                tray.add(iconoSystemTray);
            } catch (AWTException e) {
                System.err.println(&quot;No es posible agregar el icono al System Tray&quot;);
            }
        }
        else
            System.err.println(&quot;Tu sistema no soporta el System Tray&quot;);
    }
    public static void main(String[] args) {
        new EjemploSystemTraySwing();
    }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">El resultado es algo como lo que aparece en la primera imagen que acompaña esta entrada. Importante tener en cuenta las líneas resaltadas (40 a 44) que es donde se hace la <em>magia</em> <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Como siempre, puedes descargar el código y probar tú mismo:</p>
<p><a href="http://casidiablo.net/descargar/Ejemplos+System+Tray+Java" class="descargacodigo">Descargar ZIP con ejemplos</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/area/" rel="tag nofollow">area</a>, <a href="http://casidiablo.net/tag/awt/" rel="tag nofollow">awt</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/jpoupmenu/" rel="tag nofollow">jpoupmenu</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/mac/" rel="tag nofollow">mac</a>, <a href="http://casidiablo.net/tag/notificacion/" rel="tag nofollow">notificacion</a>, <a href="http://casidiablo.net/tag/system-tray/" rel="tag nofollow">system tray</a>, <a href="http://casidiablo.net/tag/systray/" rel="tag nofollow">systray</a>, <a href="http://casidiablo.net/tag/windows/" rel="tag nofollow">Windows</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/systray-java-ejemplo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Recuperar archivos eliminados usando Foremost [configuración manual]</title>
		<link>http://casidiablo.net/restaurar-archivos-eliminados-accidentalmente/</link>
		<comments>http://casidiablo.net/restaurar-archivos-eliminados-accidentalmente/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 05:58:39 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[archivos]]></category>
		<category><![CDATA[carving]]></category>
		<category><![CDATA[eliminados]]></category>
		<category><![CDATA[ext2]]></category>
		<category><![CDATA[ext3]]></category>
		<category><![CDATA[ext4]]></category>
		<category><![CDATA[foremost]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[ntfs]]></category>
		<category><![CDATA[recovery]]></category>
		<category><![CDATA[recuperar]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[undelete]]></category>
		<category><![CDATA[videos]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3487</guid>
		<description><![CDATA[


¡Hola a todos! Hace un par de días perdí la partición donde tenía mi /home. Afortunadamente pude recuperar el 98% de los archivos que necesitaba. Es decir, en realidad no me interesaba recuperar imágenes, música, etc&#8230; lo único importante era recuperar los archivos PHP con los que había estado trabajando.
Aclaro esto puesto que esta entrada [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Frestaurar-archivos-eliminados-accidentalmente%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Recuperar%20archivos%20eliminados%20usando%20Foremost%20%5Bconfiguraci%C3%B3n%20manual%5D%22%20%7D);"></div>
<p style="text-align: justify;">
<p style="text-align: justify;">¡Hola a todos! Hace un par de días perdí la partición donde tenía mi /home. Afortunadamente pude recuperar el 98% de los archivos <em>que necesitaba</em>. Es decir, en realidad no me interesaba recuperar imágenes, música, etc&#8230; lo único importante era recuperar los archivos PHP con los que había estado trabajando.</p>
<p style="text-align: justify;">Aclaro esto puesto que esta entrada se va a enfocar en la configuración manual de <a href="http://foremost.sourceforge.net/">Foremost</a>, un programa para hacer carving, de tal manera que rescatemos solamente aquello que realmente nos interesa. Existen otros programas, pero este fue el que realmente me ayudó en esos momentos de pánico.</p>
<p style="text-align: justify;">¿Cómo funciona? Foremost trabaja con imágenes generadas con dd o particiones directamente, y se basa en el análisis de encabezados y footers de los archivos para &#8216;extraer&#8217; lo que se pueda salvar.</p>
<div class="nota"><strong>Importante:</strong> si has eliminado accidentalmente algún archivo lo primero, después de blasfemar un rato, es evitar hacer cualquier tipo de escritura de datos sobre la misma. Esto es porque tus datos en realidad aún están allí, y el único riesgo que tienen de ser eliminados es que se sobrescriban datos en el mismo sector en donde se encuentran.</div>
<p><span id="more-3487"></span></p>
<p style="text-align: justify;">Dicho esto, tienes dos opciones:</p>
<ul style="text-align: justify;">
<li>Si tienes otra partición con suficiente espacio para almacenar un backup de la partición a ser tratada, puedes usar el comando dd y luego trabajar sobre esa imagen. <a href="http://casidiablo.net/crear-un-backup-o-imagen-del-disco-duro/">En esta entrada se explica con más detalle cómo hacer esto</a>.</li>
<li style="text-align: justify;">Si no tienes espacio (tal como me ocurrió a mi), puedes trabajar directamente sobre la partición (i.e. el archivo /dev/sdaX ó /dev/hdbX, etc.). Solo ten en mente que NO deberías montar dicha partición, al menos no en modo de lectura-escritura.</li>
</ul>
<p style="text-align: justify;">
<h3>Instalación de Foremost</h3>
<p style="text-align: justify;">La instalación es bastante sencilla ya que Foremost se incluye en prácticamente todos los repositorios de cualquier distribución. Así que puedes usar tu gestor de paquetes preferido. Siendo tan sencilla la instalación por repositorios, solo me queda mostrar la instalación manual que es incluso más sencilla&#8230; descargamos la última versión de Foremost (1.5.6 al momento de escribir esta entrada), descomprimimos, compilamos e instalamos:</p>
<div class="consola">wget http://foremost.sourceforge.net/pkg/foremost-1.5.6.tar.gz<br />
tar xfzv foremost-1.5.6.tar.gz<br />
cd foremost-1.5.6<br />
make &amp;&amp; make install</div>
<p style="text-align: justify;">
<h3>Ejemplo básico de uso de Foremost</h3>
<p style="text-align: justify;">El siguiente comando de ejemplo es un de los tantos cientos de miles que te encontrarás en la red&#8230; no me enfocaré mucho en este aspecto porque ya se encuentra muy bien documentado:</p>
<div class="consola">foremost -t pdf -i imagen.iso -o pdfs-recuperados</div>
<p style="text-align: justify;">Básicamente le estamos diciendo al Foremost que busque archivos de tipo PDF en el archivo de imagen (creado con dd) imagen.iso y que los guarde en pdfs-recuperados. Lo único que nos interesa recalcar en este punto es que Foremost tiene un set de archivos predefinidos de los cuales conoce su header y footer (como los PDFs en este caso); este set se compone de los archivos más comunes (imágenes  y videos en diferentes formatos, archivos de office, zips, etc.) Pero&#8230; ¿qué pasa con otro tipo de archivos menos comunes? Tranquilo, ya vamos para allá <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: justify;">
<h3>Ejemplo de configuración del Foremost</h3>
<p style="text-align: justify;">Foremost puede ser configurado mediante un archivo (por defecto: <code>/etc/foremost.conf</code>) de tal manera que no tengamos que especificar el tipo de archivo a buscar y, lo que es mejor, podemos definir nuestros propios tipos de archivos. En nuestro ejemplo, te meterás en mis zapatos, te imaginarás que has perdido el trabajo de tres días y que tu objetivo es rescatar unos cuantos archivos de PHP.</p>
<p style="text-align: justify;">Entonces&#8230; ¿por donde comenzar? Bien&#8230; lo primero es echar un vistazo al archivo /etc/foremost.conf en donde puedes encontrar patrones de búsqueda para diferentes tipos de archivo (de hecho, son las que usa Foremost cuando usamos el flag <code>-t</code>). La sintáxis de estos patrones es sencilla y consta de una sola línea; esta línea tiene los siguientes parámetros separados por espacios o tabulaciones:</p>
<ul>
<li>Extensión del archivo&#8230; ¿debo explicar esto?</li>
<li>Definir si se debe hacer distinción entre mayúsculas y minúsculas al buscar el header y footer del archivo. Pon &#8216;y&#8217; si deseas que sea case-sensitive o &#8216;n&#8217; en caso contrario.</li>
<li>Tamaño máximo del archivo.</li>
<li>Encabezado: lo que se debe buscar en los encabezados de los archivos; puede ser especificado en texto plano o, mejor aún, en hexadecimal.</li>
<li>Footer (opcional): lo que se debe buscar al final de los archivos; puede ser especificado en texto plano o, mejor aún, en hexadecimal.</li>
</ul>
<p style="text-align: justify;">Por ejemplo, este es uno de los que se encuentra configurados por defecto en el Foremost:</p>
<p><code>jpg          y          20000000          \xff\xd8\xff\xe1          \xff\xd9</code></p>
<p style="text-align: justify;">Básicamente busca archivos con extensión .jpg y con un tamaño máximo de 20000000 bytes. Además especifica uno de los posibles encabezados que un archivo tipo JPEG puede tener (<code>\xff\xd8\xff\xe1</code>) y su footer (<code>\xff\xd9</code>).</p>
<p style="text-align: justify;">Como puedes ver, el encabezado y el footer pueden ser especificados en hexadecimal. Esto es bastante útil ya que en muchos casos no necesitamos simples archivos de texto sino que podríamos querer recuperar uno binario. En cualquier caso, es recomendable usar hexadecimal&#8230; pero ¿cómo se qué debo poner? Bien&#8230; recuerda que tu misión es recuperar los archivos PHP, así que&#8230; ¿qué tal si creamos uno para ver cómo se ve en hexadecimal?</p>
<p style="text-align: justify;">Creamos entonces un archivo con el siguiente contenido y lo guardamos como <em>test.php</em>:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: php;">&lt;?php
if($meLoTire){
	echo &quot;o_O mode-panic:on&quot;;
}
?&gt;</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Ahora debemos abrir este archivo con algún editor hexadecimal. Si usas Gnome, Ghex es una buena opción (sino, también)&#8230; lo instalas desde los repositorios y con él abres el archivo que acabas de crear&#8230; este lucirá así:</p>
<p><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/ghex.png"><img class="aligncenter size-full wp-image-3499" title="ghex" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/ghex.png" alt="ghex" width="640" height="469" /></a></p>
<p style="text-align: justify;">¡Ahora ya podemos configurar Foremost como expertos, puesto que ya sabemos qué hexadecimales poner! Cada caracter del archivo que creamos equivale a un valor en hexadecimal y nos interesa enfocarnos en la representación hexadecimal de &#8220;&lt;?php&#8221; puesto que así comienzan los archivos en los que estamos interesados.</p>
<p style="text-align: justify;">Así que para este caso, los hexadecimales son 3C, 3F, 70, 68 y 70. Por lo tanto podemos crear un nuevo patrón dentro de /etc/foremost.conf que luzca algo así:</p>
<p><code>php y 100000 \x3C\x3F\x70\x68\x70</code></p>
<p style="text-align: justify;">Si queremos ser más precisos podemos especificar el footer:</p>
<p><code>php y 100000 \x3c\x3f\x70\x68\x70 \7d\0a\3f\x3e</code></p>
<p style="text-align: justify;">Fíjate que he definido un footer bastante concreto que hará que Foremost busque archivos que finalicen con un &#8216;}&#8217; seguido de un &#8216;Enter&#8217; (retorno de carro) y finalmente con &#8220;?&gt;&#8221;. Una vez hayamos terminado de configurar los patrones con los que queramos iniciar la búsqueda, guardamos y cerramos el archivo.</p>
<p style="text-align: justify;">Puesto que es el archivo por defecto no es necesario especificarlo al momento de ejecutar Foremost. Esto por supuesto implica que puedes crear un archivo con patrones en cualquier otro lado, y en tales casos debes referencialo con el flag -c. ¡Que comience el carving!</p>
<div class="consola">foremost -i /dev/sda1 -o ~/recuperados/</div>
<p style="text-align: justify;">Como puedes ver, no especificamos ningún tipo  de archivo así que Foremost se enfocará en aquellos configurados en el archivo .conf. Además, en este caso estamos especificando directamente la partición. Esto podría llevar un rato, así que tienes tiempo de leer algo entretenido ¿qué tal esta bonita <a href="http://www.gentoo.org/doc/en/vi-guide.xml">guía sobre Vi</a>? ¿o esta otra sobre un hermoso <a href="http://www.gentoo.org/doc/en/gentoo-freebsd.xml">Gentoo/BSD</a>?</p>
<p style="text-align: justify;">Una vez Foremost haya terminado su trabajo&#8230; el tuyo apenas comienza. Aunque Foremost es un excelente programa, los resultados no pueden ser 100% confiables (¿hay algo que lo sea?). Y para empeorar las cosas, Foremost NO recupera los nombres de los archivos. En vez de ello, crea una secuencia de archivos numéricos con la extensión; cosas como 8392383874.php ó 239492782.php ¿chévere, no?</p>
<p style="text-align: justify;">Todo parece que pasaremos un buen rato jugando con nuestro querido amigo GREP; y es que este maravilloso comando puede ser realmente útil en estos casos. Así que aquí van algunos comandos que te podrían servir:</p>
<ul>
<li style="text-align: justify;"><code>grep busqueda changos.ext</code><br />
Busca la cadena &#8216;busqueda&#8217; dentro del archivo changos.ext</li>
<li style="text-align: justify;">¿qué tal una búsqueda en todos los archivos? Esto podría servir para nuestro caso de los PHP:<br />
<code>cat *.php | grep -l cosa_a_buscar</code></li>
<li style="text-align: justify;">¿y si queremos buscar un string en varios archivos que se encuentran en diferentes directorios? Este comando es de los que más uso a diario:<br />
<code>find /ruta/ -exec grep -l cosa_a_buscar {} \;</code></li>
</ul>
<p style="text-align: justify;">
<h3>Cosas por considerar</h3>
</p>
<p style="text-align: justify;">
<ul>
<li style="text-align: justify;">Existe una gran probabilidad que los datos recuperados no estén del todo bien formados. Por ejemplo, podrían tener &#8220;basura&#8221; dentro. Esto es posible de corregir en archivos de texto, ya que solo necesitas un editor decente y un par de minutos para &#8220;ver qué te sirve&#8221;.</li>
<li style="text-align: justify;">Si los archivos recuperados tienen basura dentro, es mejor usar editores de texto en consola que no se quejan tanto al momento de editarlos. Gedit simplemente no los abre.</li>
<li style="text-align: justify;">Algunas veces los archivos quedan fragmentados; esto es, en un archivo recuperado queda una parte de lo que buscas, y en otro queda el restante. Por esto, es bastante útil que uses herramientas como Meld (excelente por cierto).  Considera este ejemplo de la vida real: en el archivo blablaa.php tenía parte inicial del archivo mientras que en blebelbel.php tenía el resto:</li>
</ul>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/meld_1280.png"><img class="size-full wp-image-3501 aligncenter" title="meld_640" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/meld_640.png" alt="meld_640" width="640" height="331" /></a></p>
<p style="text-align: justify;">Esto es difícil de notar &#8216;a ojo&#8217;, por lo que puedo decir que Meld me salvó el trasero una vez más (y de paso se ganó una donación). Así, combinando el trabajo de Foremost y la ayuda de Meld pude recuperar prácticamente todo lo que necesitaba.</p>
<p style="text-align: justify;">Pero, te repito, si fuesen archivos binarios los que quieres rescatar la cosa sería mucho más difícil. En este caso, &#8216;la basura&#8217; se puede identificar fácilmente dentro del archivo, y de la misma manera se puede eliminar. En una archivo binario sin embargo es un poco más difícil.</p>
<p style="text-align: justify;">
<h3>Otros buenos programas con propósitos similares</h3>
</p>
<p style="text-align: justify;">
<ul>
<li><a href="http://www.cgsecurity.org/wiki/PhotoRec">TestDisk (aka, PhotoRec)</a></li>
<li><a href="http://www.digitalforensicssolutions.com/Scalpel/">Scalpel</a></li>
<li><a href="http://www.student.dtu.dk/~s042078/magicrescue/">Magic Rescue</a></li>
<li><a href="http://www.sleuthkit.org/autopsy/desc.php">Sleuth Kit y Autopsy</a></li>
<li><a href="http://www.sleuthkit.org/">Sleuthkit</a></li>
</ul>
<p><br/><br/><br/></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/archivos/" rel="tag nofollow">archivos</a>, <a href="http://casidiablo.net/tag/carving/" rel="tag nofollow">carving</a>, <a href="http://casidiablo.net/tag/eliminados/" rel="tag nofollow">eliminados</a>, <a href="http://casidiablo.net/tag/ext2/" rel="tag nofollow">ext2</a>, <a href="http://casidiablo.net/tag/ext3/" rel="tag nofollow">ext3</a>, <a href="http://casidiablo.net/tag/ext4/" rel="tag nofollow">ext4</a>, <a href="http://casidiablo.net/tag/foremost/" rel="tag nofollow">foremost</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/ntfs/" rel="tag nofollow">ntfs</a>, <a href="http://casidiablo.net/tag/recovery/" rel="tag nofollow">recovery</a>, <a href="http://casidiablo.net/tag/recuperar/" rel="tag nofollow">recuperar</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag nofollow">tip</a>, <a href="http://casidiablo.net/tag/undelete/" rel="tag nofollow">undelete</a>, <a href="http://casidiablo.net/tag/videos/" rel="tag nofollow">videos</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/restaurar-archivos-eliminados-accidentalmente/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Ejecutar aplicación Java como servicio &#8211; Integración básica</title>
		<link>http://casidiablo.net/correr-programa-java-como-demonio/</link>
		<comments>http://casidiablo.net/correr-programa-java-como-demonio/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 01:16:20 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[daemon]]></category>
		<category><![CDATA[demonio]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[servicio]]></category>
		<category><![CDATA[solaris]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3407</guid>
		<description><![CDATA[

En esta entrada abordaremos un tema bastante interesante: cómo correr un programa en Java como servicio en Windows o demonio en UNIX/Linux. Puesto que el API de Java no proporciona nada para estos casos, utiliza
remos una librería llamada Java Service Wrapper. Dicha librería nos ofrece una serie de scripts y binarios preparados para diferentes sistemas [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fcorrer-programa-java-como-demonio%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ejecutar%20aplicaci%C3%B3n%20Java%20como%20servicio%20-%20Integraci%C3%B3n%20b%C3%A1sica%22%20%7D);"></div>
<p style="text-align: justify;">En esta entrada abordaremos un tema bastante interesante: <strong>cómo correr un programa en Java como servicio en Windows o demonio en UNIX/Linux</strong>. Puesto que el API de <a href="http://casidiablo.net/java/">Java</a> no proporciona nada para estos casos, utiliza</p>
<p style="text-align: justify;">remos una librería llamada <a href="http://wrapper.tanukisoftware.org/">Java Service Wrapper</a>. Dicha librería nos ofrece una serie de scripts y binarios preparados para diferentes sistemas operativos y arquitecturas, que nos permitirán correr nuestros programas como un servicio; además ofrece diferentes versiones: Profesional, Estándar y Comunity. En este caso usaremos la versión Comunity que es libre y gratuita.</p>
<p style="text-align: justify;">La mejor manera de aprender a usar dicha librería es con un pequeño laboratorio, así que he preparado uno en donde explico la integración más simple que existe con Java Service Wrapper (existen 4 métodos; unos más avanzados que otros). La integración sencilla que he escogido nos permitirá ejecutar como servicio una aplicación que ya esté creada (probablemente ya empaquetada en un .jar) y a la que no podemos o es difícil hacerle modificaciones. Esta es la manera más sencilla de hacerlo, sin embargo tiene una desventaja: al detener el servicio se envía directamente un System.exit() a la JVM por lo que la aplicación no se cerrará limpiamente.</p>
<p style="text-align: justify;">Si quieres integrar tu aplicación de una manera más segura y estás en la capacidad de prepararla para ello, podrías intentar la integración avanzada en la que utilizas el API de Java Service Wrapper para implementar métodos de inicio, pausa y detención del servicio [<a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Avanzado+Java+src&#8220;>descargar un ejemplo</a>].</p>
<h3>Laboratorio 1 &#8211; Integración Simple (Linux/Windows/Solaris)</h3>
<p style="text-align: justify;">Para este caso utilizaremos una aplicación de ejemplo que recibe un archivo como parámetro y escribe en él <a href="http://casidiablo.net/capturar-informacion-sistema-operativo-java/">información sobre la memoria del sistema</a>, cada 60 segundos. He escogido este ejemplo porque posee varios aspectos interesantes: requiere de librerías externas (tanto JARs como librerías nativas [.so, dll, etc.]) y recibe parámetros.</p>
<p style="text-align: justify;">Puedes descargar la aplicación de ejemplo de haciendo <a class="tooltip" title="Descargar los binarios del ejemplo" href="http://casidiablo.net/descargar/Ejemplo+Servicio+Simple+Java+bin">clic aquí</a>. Si la ejecutáramos de manera convencional veríamos algo de este tipo:</p>
<div class="consola">gentookde@larry bin % java -jar servicio.jar /tmp/log<br />
^C<br />
gentookde@larry bin % cat /tmp/log<br />
======Mon Oct 05 09:42:05 COT 2009=======<br />
Cantidad de memoria RAM: 3952MB<br />
Total: 4042664<br />
Usada: 3509516<br />
Disponible: 533148<br />
Memoria SWAP total: 1052248<br />
Memoria SWAP usada: 0<br />
Memoria SWAP libre: 1052248</div>
<p style="text-align: justify;">Como puedes ver se trata de una aplicación de consola común y corriente. La aplicación consta básicamente de:</p>
<ul style="text-align: justify;">
<li>El ejecutable servicio.jar ubicado en el directorio bin/</li>
<li>La librería sigar.jar en el directorio lib/</li>
<li style="text-align: justify;">Las librerías específicas de cada arquitectura de sigar en lib/</li>
</ul>
<h3>Pasos para la integración</h3>
<p style="text-align: justify; ">Lo primero es descargar el paquete de <a href="http://wrapper.tanukisoftware.org/doc/english/download.jsp">Java Service Wrapper</a> y descomprimirlo<span style="background-color: #ffffff;">. Supondremos que el directorio donde se encuentra Java Service Wrapper es $RUTA_JSW y que el directorio de la aplicación que  vamos a convertir en servicio es </span><span style="background-color: #ffffff;">$RUTA_APP</span><span style="background-color: #ffffff;">.</span></p>
<h4>1. Copiamos los siguentes archivos al directorio bin de nuestra aplicación de ejemplo&#8230;</h4>
<p style="text-align: justify; "><span style="background-color: #ffffff;"><strong>UNIX/Linux</strong><br />
</span></p>
<div class="consola">cp $RUTA_JSW/bin/wrapper $RUTA_APP/bin/<br />
cp $RUTA_JSW/src/bin/sh.script.in $RUTA_APP/bin/<br />
cp $RUTA_JSW/lib/* $RUTA_APP/bin/</div>
<p style="text-align: justify; ">El archivo $RUTA_JSW/bin/wrapper podría no existir; por lo tanto lo que debes copiar es el archivo wrapper-xxx específico para tu plataforma. Por ejemplo, en este caso estoy usando Gentoo Linux de 64bits por lo tanto copiaré el archivo $RUTA_JSW/bin/wrapper-linux-x86-64.</p>
<p style="text-align: justify; "><strong><span style="background-color: #ffffff;">Windows</span></strong></p>
<div class="consola">copy $RUTA_JSW/bin/ wrapper-windows-x86-32.exe $RUTA_APP/bin/<br />
copy $RUTA_JSW/src/bin/ App.bat.in $RUTA_APP/bin/<br />
copy $RUTA_JSW/src/bin/ InstallApp-NT.bat.in $RUTA_APP/bin/<br />
copy $RUTA_JSW/src/bin/ UninstallApp-NT.bat.in $RUTA_APP/bin/<br />
copy $RUTA_JSW/lib/* $RUTA_APP/bin/</div>
<h4>2. Renombramos algunos archivos&#8230;</h4>
<p><strong>UNIX/Linux&#8230;</strong></p>
<p style="text-align: justify;">Ahora debes renombrar el script sh.script.in con el nombre de la aplicación con la que haremos la integración y darle privilegios de ejecución. En este casó se llama simplemente &#8220;servicio&#8221;:</p>
<div class="consola">cd $RUTA_APP/bin<br />
mv sh.script.in servicio<br />
chmod a+x servicio</div>
<p><strong>Windows</strong></p>
<p style="text-align: justify;">Ahora debes renombrar los archivos .bat  para que concuerden con el nombre de la aplicación con la que haremos la integración. En este casó se llama simplemente &#8220;servicio&#8221; (lo puedes hacer usando el explorador si no te gusta usar la consola, pero a mi me daría pena):</p>
<div class="consola">cd $RUTA_APP/bin<br />
move App.bat.in servicio.bat<br />
move InstallApp-NT.bat.in InstallServicio-NT.bat<br />
move UninstallApp-NT.bat.in UninstallServicio-NT.bat</div>
<h4>3. editar archivo de configuración</h4>
<p style="text-align: justify;">Editamos el archivo wrapper.conf y lo dejamos en el directorio $RUTA_APP/conf/. El archivo para este ejemplo tendrá el siguiente contenido (<strong>importante</strong>! lee la explicación si usas Windows):</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: plain;"># Comando de Java
wrapper.java.command=java
# Clase que ejecutara el Wrapper
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
# Librerias necesarias para ejecutar el programa
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=servicio.jar
# Java Library Path (ubicacion de las librerias wrapper.dll o wrapper.so)
wrapper.java.library.path.1=../lib
# Java Bits.  On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
wrapper.java.additional.auto_bits=TRUE
# Parametros del programa
wrapper.app.parameter.1=net.casidiablo.servicio.Servicio
wrapper.app.parameter.2=/tmp/log
#********************************************************************
# Wrapper General Properties
#********************************************************************
# Allow for the use of non-contiguous numbered properties
wrapper.ignore_sequence_gaps=TRUE
# Title to use when running as a console
wrapper.console.title=servicio
#********************************************************************
# Wrapper Windows NT/2000/XP Service Properties
#********************************************************************
# Name of the service
wrapper.name=jgossip
# Display name of the service
wrapper.displayname=Servicio
# Description of the service
wrapper.description=Monitor de memoria
# Mode in which the service is installed. AUTO_START or DEMAND_START
wrapper.ntservice.starttype=AUTO_START
# Allow the service to interact with the desktop.
wrapper.ntservice.interactive=false</pre>
<p><!--INFOLINKS_ON--></p>
<p>Explicación del archivo de configuración:</p>
<ul>
<li style="text-align: justify;"><code>wrapper.java.command=java</code> es el comando para ejecutar java. En este caso es simplemente java porque estoy en Linux y además tengo configurado correctamente el path. En Windows podría ser algo como: c:\archivos de programa\java\jdk1.6\bin\java.exe</li>
<li style="text-align: justify;"><code>wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp</code> indica el archivo a ejecutar es la clase WrapperSimpleApp que se usa en la integración sencilla. Esta clase envoltorio es la que permite ejecutar la aplicación como servicio.</li>
<li style="text-align: justify;"><code>wrapper.java.classpath.1=../lib/wrapper.jar<br />
wrapper.java.classpath.2=servicio.jar</code> indican las rutas o archivos del classpath.</li>
<li style="text-align: justify;"><code>wrapper.java.library.path.1=../lib</code> indica el directorio donde se encuentran las librerías a usar.</li>
<li style="text-align: justify;"><code>wrapper.app.parameter.1=net.casidiablo.servicio.Servicio<br />
wrapper.app.parameter.2=/tmp/log</code> estos son los parámetros que se pasarán al programa. <strong>Importante</strong>: como estamos haciendo la integración simple, el primer parámetro debe ser la clase que contiene el método main de nuestra aplicación.</li>
<li style="text-align: justify;"><code>wrapper.name=jgossip</code> esta opción es para Windows y define el nombre del servicio en el sistema.</li>
<li style="text-align: justify;"><code>wrapper.ntservice.starttype=AUTO_START</code> si estás en windows, define si el servicio quedará configurado para iniciar automáticamente.</li>
</ul>
<h4>4. Probar/Instalar el servicio&#8230;</h4>
<p style="text-align: justify;">Ahora veremos cómo podemos probar la aplicación para asegurarnos que ha quedado bien configurada antes de proceder con la instalación.</p>
<p><strong>UNIX/Linux</strong></p>
<p style="text-align: justify;">Ejecutamos el script &#8217;servicio&#8217; que configuramos en el paso 1 y 2 con el parámetro console:</p>
<div class="consola">./servicio console</div>
<p>Deberías ver algo como:</p>
<div class="consola">Running un servicio que escribe cosas&#8230;<br />
wrapper  | &#8211;&gt; Wrapper Started as Console<br />
wrapper  | Java Service Wrapper Community Edition 64-bit 3.3.6<br />
wrapper  |   Copyright (C) 1999-2009 Tanuki Software, Ltd.  All Rights Reserved.<br />
wrapper  |     http://wrapper.tanukisoftware.org<br />
wrapper  |<br />
wrapper  | Launching a JVM&#8230;<br />
jvm 1    | WrapperManager: Initializing&#8230;</div>
<p style="text-align: justify;">Lo detienes presionando Ctrl+C. Ahora, si queremos probarlo como demonio basta con ejecutar los comandos típicos de un demonio en UNIX/Linux:</p>
<div class="consola">$ ./servicio start<br />
Starting un servicio que escribe cosas&#8230;<br />
$ ./servicio stop<br />
Stopping un servicio que escribe cosas&#8230;<br />
Stopped un servicio que escribe cosas.</div>
<p style="text-align: justify;">Para instalarlo basta con crear un enlace simbólico del script en el directorio /etc/init.d y añadirlo al listado de servicios a iniciar; por ejemplo:</p>
<div class="consola">sudo ln -sv $RUTA_APP/bin/servicio /etc/init.d/servicio<br />
sudo rc-update add servicio default</div>
<p><strong>Windows</strong></p>
<p style="text-align: justify;">Para instalarlo en Windows basta con ejecutar el archivo InstallServicio-NT.bat. Puedes verificar que fue instalado correctamente accediendo a la consola de administración de servicios de NT (ejecutas el comando services.msc):</p>
<p><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_001.png"><img class="aligncenter size-full wp-image-3460" title="servicio windows java" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_001.png" alt="servicio windows java" width="778" height="566" /></a></p>
<h3>Fuentes y descargas</h3>
<p>Aunque en esta entrada no explico cómo hacer la integración avanzada, he preparado un ejemplo completo que puedes descargar en el listado de abajo.<strong><br />
</strong></p>
<ul>
<li><a href="http://wrapper.tanukisoftware.org/doc/">Puedes encontrar más documentación en la página oficial del proyecto</a></li>
<li><a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Simple+Java+bin">Descargar el laboratorio de esta entrada</a></li>
<li><a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Simple+Java+src">Descargar el código fuente del laboratorio</a></li>
<li><a href="http://casidiablo.net/descargar/Ejemplo+Servicio+Avanzado+Java+src"><strong>Descargar código fuente y laboratorio de la integración avanzada</strong></a></li>
</ul>
<p><br/><br/><br/></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/daemon/" rel="tag nofollow">daemon</a>, <a href="http://casidiablo.net/tag/demonio/" rel="tag nofollow">demonio</a>, <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/servicio/" rel="tag nofollow">servicio</a>, <a href="http://casidiablo.net/tag/solaris/" rel="tag nofollow">solaris</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag nofollow">tip</a>, <a href="http://casidiablo.net/tag/unix/" rel="tag nofollow">unix</a>, <a href="http://casidiablo.net/tag/windows/" rel="tag nofollow">Windows</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/correr-programa-java-como-demonio/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Obtener información del sistema [memoria disponible, %CPU, espacio en disco] en Java</title>
		<link>http://casidiablo.net/capturar-informacion-sistema-operativo-java/</link>
		<comments>http://casidiablo.net/capturar-informacion-sistema-operativo-java/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 22:00:33 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[cpu]]></category>
		<category><![CDATA[disco]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ejercicio]]></category>
		<category><![CDATA[espacio]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[informacion]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[memoria]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[sistema]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3382</guid>
		<description><![CDATA[

En esta guía aprenderemos a obtener información de los recursos sistema en Java, usando la librería Sigar. Los datos que podremos extraer son los siguientes:

Información de la CPU.
Espacio en disco disponible.
Cantidad de espacio que consume un directorio en específico.
Cantidad de memoria RAM disponible y en uso.
Información de red (dirección IP, nombre de la NIC, puertos [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fcapturar-informacion-sistema-operativo-java%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Obtener%20informaci%C3%B3n%20del%20sistema%20%5Bmemoria%20disponible%2C%20%25CPU%2C%20espacio%20en%20disco%5D%20en%20Java%22%20%7D);"></div>
<p style="text-align: justify;">En esta guía aprenderemos a obtener información de los recursos sistema en Java, usando la librería Sigar. Los datos que podremos extraer son los siguientes:</p>
<ul style="text-align: justify;">
<li><strong>Información de la CPU.</strong></li>
<li><strong>Espacio en disco disponible.</strong></li>
<li>Cantidad de espacio que consume un directorio en específico.</li>
<li><strong>Cantidad de memoria RAM disponible y en uso.</strong></li>
<li>Información de red (dirección IP, nombre de la NIC, puertos abiertos, tablas de enrutamiento, etc.)</li>
<li>Información de los procesos que se están ejecutando en el sistema.</li>
<li>Asignación de <a href="http://casidiablo.net/obtener-variables-entorno-informacion-sistema-java/">variables de entorno</a>.</li>
<li><strong>Uptime, o cantidad de tiempo que el equipo ha estado encendido.</strong></li>
<li><strong>Nombre y versión del sistema operativo.</strong></li>
<li>Usuarios logueados actualmente.</li>
</ul>
<p style="text-align: justify;">Resaltadas en negrita está la información en la que nos concentraremos en el ejemplo. Pero antes aclaremos un poco que es Sigar: el API de Sigar nos proporciona una serie de métodos que nos permiten obtener información del sistema operativo; consta de una librería de Java (.jar) y otras librerías nativas específicas para cada sistema operativo soportado (<code>libsigar-amd64-linux.so</code>, para Linux de 64 bits o <code>sigar-x86-winnt.dll</code> para Windows de 32 bits, por poner un ejemplo).</p>
<p style="text-align: justify;">Teniendo esto en cuenta, para hacer funcionar dicha API en una de nuestras aplicaciones, bastaría con tener el archivo .jar y la librería específica de nuestro sistema operativo. En el desarrollo del ejemplo se usará Eclipse y, aunque se explicará cómo añadir las librerías en el proyecto, se da por conocido el funcionamiento del flag <code>--classpath</code> de los comandos <code>javac</code> y <code>java</code> (obligatorio si no se usa ningún IDE).</p>
<h3>El resultado&#8230;</h3>
<p style="text-align: justify;">Siempre pongo primero el resultado ya que nos aclara la visión de hacia donde vamos, y de paso saber si lo que está aquí es lo que buscamos. Esta es la salida del programa en mi Gentoo Linux:</p>
<p><span id="more-3382"></span></p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: plain;">====Informacion del sistema====
Descripcion del SO	Gentoo 2.1.6
Nombre del SO		Linux
Arquitectura del SO	x86_64
Version del SO		2.6.31-gentoo
Nivel de parches	unknown
Fabricante		Gentoo
Version SO		2.1.6
Encendido durante:	6:15

==== Informacion de la CPU ====
Fabricante:		Intel
Modelo			Core(TM)2 Duo CPU     T5750  @ 2.00GHz
Mhz			1994
Total CPUs		2
CPUs fisiscas		1
Nucleos por CPU		2
Tamanio cache		2048

Consumo de CPU 0	22.0%
Consumo de CPU 1	2.0%
Consumo total de CPU	6.0%

====Informacion del sistema de archivos====

dispos.|total|usado|disponible|%uso|dir|tipo

/dev/root|24042944|10698228|12123376|47%|/|ext4
/dev/sda1|175457764|155825380|10719932|94%|/home|ext3

====Informacion de la memoria====
Cantidad de memoria RAM: 3968MB
Total: 4056984
Usada: 2307076
Disponible: 1749908
Memoria SWAP total: 1052248
Memoria SWAP usada: 0
Memoria SWAP libre: 1052248</pre>
<p><!--INFOLINKS_ON--></p>
<h3>Descargar Sigar</h3>
<p style="text-align: justify;">Puedes descargar Sigar de la página oficial: <a href="http://support.hyperic.com/display/SIGAR/Home">http://support.hyperic.com/display/SIGAR/Home</a> que incluye además ejemplos para Java, Perl, C, Python, Ruby, y más. Puedes además descargar el código fuente que se encuentra licenciado bajo la GPL2.</p>
<h3>Creación del proyecto en Eclipse</h3>
<p style="text-align: justify;">Voy a usar este ejemplo para además enseñar a manipular librerías externas en Eclipse; si lo que te interesa es conocer el código, puedes saltarte a dicha sección directamente.</p>
<p style="text-align: justify;">Creamos un proyecto en Eclipse llamado InfoSistema:</p>
<p style="text-align: center;"><img class="size-full wp-image-3385 aligncenter" title="eclipse1" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/10/eclipse1.png" alt="eclipse1" width="457" height="381" /></p>
<p style="text-align: justify;">Ahora creamos una carpeta dentro del proyecto llamada lib, en donde guardaremos las librerías de Sigar (.jar, .so, .dll, etc.):</p>
<p style="text-align: center;"><img class="size-full wp-image-3386 aligncenter" title="eclipse2" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/10/eclipse2.png" alt="eclipse2" width="600" height="372" /></p>
<p style="text-align: justify;">Ahora descomprimimos el archivo que descargamos de Sigar, y copiamos los archivos que se encuentran en la carpeta <code>sigar-bin/lib</code> a la carpeta <code>lib</code> de nuestro proyecto. En mi caso la copia la hice con este comando:</p>
<div class="consola">cp sigar-bin/lib/* /home/compartido/workspace/InfoSistema/lib/</div>
<p style="text-align: justify;">Cabe resaltar que bastaría con copiar el archivo llamado <code>sigar.jar</code> y la librería del sistema donde vamos a correr nuestro programa (<code>libsigar-amd64-linux.so</code> en mi caso).</p>
<p style="text-align: justify;">Una vez hecha la copia, hacemos clic en la raiz del proyecto en Eclipse y presionamos F5 para actualizar el árbol de ficheros; de esta manera Eclipse sabrá de los nuevos archivos que hemos copiado. Y lo que haremos a continuación será enlazar la librería <code>sigar.jar</code> a nuestro proyecto, para lo cual hacemos clic derecho en el mismo, <em>Build Path</em> -&gt; <em>Configure Build Path&#8230;</em></p>
<p style="text-align: center;"><img class="size-full wp-image-3388 aligncenter" title="eclipse3" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/10/eclipse3.png" alt="eclipse3" width="600" height="345" /></p>
<p style="text-align: justify;">En la ventana que aparece, seleccionaremos la pestaña <em>Libraries</em> y hacemos clic en el botón <em>Add JARs&#8230;</em> Seleccionamos el archivo <code>sigar.jar</code> y hacemos clic en <em>OK</em>:</p>
<p style="text-align: center;"><img class="size-full wp-image-3389 aligncenter" title="eclipse4" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/10/eclipse4.png" alt="eclipse4" width="373" height="336" /></p>
<p style="text-align: justify;">Ahora que la librería se encuentra añadida, podemos utilizar el API que Sigar nos ofrece. ¡Pasemos entonces al código!</p>
<h3>Información del sistema&#8230;</h3>
<p style="text-align: justify;">La siguiente clase nos permite obtener información del sistema operativo, como el nombre, la versión, la arquitectura, etc. Creamos una nueva clase llamada <code>InfoSO</code> con el siguiente código:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import org.hyperic.sigar.OperatingSystem;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

public class InfoSO {
	private Sigar sigar = new Sigar();
	public void imprimirInfo() {
		OperatingSystem sys = OperatingSystem.getInstance();
		System.out.println(&quot;Descripcion del SO\t&quot; + sys.getDescription());
		System.out.println(&quot;Nombre del SO\t\t&quot; + sys.getName());
		System.out.println(&quot;Arquitectura del SO\t&quot; + sys.getArch());
		System.out.println(&quot;Version del SO\t\t&quot; + sys.getVersion());
		System.out.println(&quot;Nivel de parches\t&quot; + sys.getPatchLevel());
		System.out.println(&quot;Fabricante\t\t&quot; + sys.getVendor());
		System.out.println(&quot;Version SO\t\t&quot; + sys.getVendorVersion());
		try {
			imprimirUptime();
		} catch (SigarException e) {
			e.printStackTrace();
		}
	}
	public void imprimirUptime() throws SigarException {
		double uptime = sigar.getUptime().getUptime();
		String resultado = &quot;&quot;;
		int dias = (int) uptime / (60 * 60 * 24);
		int minutos, horas;
		if (dias != 0)
			resultado += dias + &quot; &quot; + ((dias &gt; 1) ? &quot;dias&quot; : &quot;dia&quot;) + &quot;, &quot;;
		minutos = (int) uptime / 60;
		horas = minutos / 60;
		horas %= 24;
		minutos %= 60;
		if (horas != 0)
			resultado += horas + &quot;:&quot; + (minutos &lt; 10 ? &quot;0&quot; + minutos : minutos);
		else
			resultado += minutos + &quot; min&quot;;
		System.out.println(&quot;Encendido durante:\t&quot; + resultado);
	}
}
</pre>
<p><!--INFOLINKS_ON-->
<p style="text-align: justify;">Aspectos importantes:</p>
<ul style="text-align: justify;">
<li>La clase que nos proporciona los métodos para recuperar información del sistema operativo es <code>OperatingSystem</code>.</li>
<li>Con los métodos <code>getName</code> y <code>getDescription</code> obtenemos el nombre del sistema operativo y descripción (por ejemplo: nombre = Linux; descripción = Gentoo 2.1.6).</li>
<li style="text-align: justify;">El método <code>getUptime</code> de la clase Sigar nos permite conocer cuanto tiempo ha estado prendido el equipo analizado.</li>
</ul>
<p style="text-align: justify;">
<h3 style="text-align: justify;">Información de la CPU&#8230;</h3>
</p>
<p style="text-align: justify;">La siguiente clase nos permitirá conocer el modelo del procesador, sus capacidades, la cantidad de núcleos y el uso de los mismos, etc. Creamos una nueva clase llamada <code>InfoCPU</code> con el siguiente código:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import org.hyperic.sigar.CpuInfo;
import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

public class InfoCPU {
	private Sigar sigar;

	public void imprimirInfoCPU() {
		sigar = new Sigar();
		CpuInfo[] infos = null;
		CpuPerc[] cpus = null;
		try {
			infos = sigar.getCpuInfoList();
			cpus = sigar.getCpuPercList();
		} catch (SigarException e) {
			e.printStackTrace();
		}

		CpuInfo info = infos[0];
		long tamanioCache = info.getCacheSize();
		System.out.println(&quot;Fabricante:\t\t&quot; + info.getVendor());
		System.out.println(&quot;Modelo\t\t\t&quot; + info.getModel());
		System.out.println(&quot;Mhz\t\t\t&quot; + info.getMhz());
		System.out.println(&quot;Total CPUs\t\t&quot; + info.getTotalCores());
		if ((info.getTotalCores() != info.getTotalSockets())
				|| (info.getCoresPerSocket() &gt; info.getTotalCores())) {
			System.out.println(&quot;CPUs fisiscas\t\t&quot; + info.getTotalSockets());
			System.out
					.println(&quot;Nucleos por CPU\t\t&quot; + info.getCoresPerSocket());
		}

		if (tamanioCache != Sigar.FIELD_NOTIMPL)
			System.out.println(&quot;Tamanio cache\t\t&quot; + tamanioCache);
		System.out.println(&quot;&quot;);

		for (int i = 0; i &lt; cpus.length; i++)
			System.out.println(&quot;Consumo de CPU &quot; + i + &quot;\t&quot;
					+ CpuPerc.format(cpus[i].getUser()));

		try {
			System.out.println(&quot;Consumo total de CPU\t&quot;
					+ CpuPerc.format(sigar.getCpuPerc().getUser()));
		} catch (SigarException e) {
			e.printStackTrace();
		}
	}
}
</pre>
<p><!--INFOLINKS_ON-->Aspectos importantes:</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">Se deben usar objetos de <code>CpuInfo</code> y <code>CpuPerc</code> que proporcionan los métodos para recuperar información del procesador. Dichos objetos se crean a partir de un objeto principal de tipo <code>Sigar</code>.</li>
<li style="text-align: justify;">Para extraer información acerca del  procesador usamos los métodos de la clase CpuInfo (por ejemplo <code>getVendor</code> o <code>getModel</code>).</li>
<li style="text-align: justify;">Los datos específicos de cada núcleo de nuestro procesador se extraen con los métodos de la clase <code>CpuPerc</code> (getUser para obtener el uso de un núcleo, por ejemplo).</li>
</ul>
<p style="text-align: justify;">
<h3>Información del sistema de archivos&#8230;</h3>
</p>
<p style="text-align: justify;">La siguiente clase nos permite obtener información del sistema de archivos: unidades montadas, espacio en disco, tipo de sistema de archivos, etc. Creamos una nueva clase llamada <code>InfoSistemaArchivos</code> con el siguiente código:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.FileSystem;
import org.hyperic.sigar.FileSystemUsage;
import org.hyperic.sigar.NfsFileSystem;
import org.hyperic.sigar.SigarProxy;
import org.hyperic.sigar.SigarProxyCache;

public class InfoSistemaArchivos {
	private SigarProxy proxy;
	private Sigar sigar;

	public InfoSistemaArchivos() {
		sigar = new Sigar();
		proxy = SigarProxyCache.newInstance(sigar);
	}

	public void imprimirInfo() throws SigarException {
		FileSystem[] listaSistemaArchivos = proxy.getFileSystemList();
		System.out.println(&quot;\ndispos.|total|usado|disponible|%uso|dir|tipo\n&quot;);
		for (int i = 0; i &lt; listaSistemaArchivos.length; i++)
			imprimirSistemaArchivos(listaSistemaArchivos[i]);
	}

	public void imprimirSistemaArchivos(FileSystem sistemaArchivos)
			throws SigarException {
		long usado, disponible, total, porcentaje;

		try {
			FileSystemUsage uso;
			if (sistemaArchivos instanceof NfsFileSystem) {
				NfsFileSystem nfs = (NfsFileSystem) sistemaArchivos;
				if (!nfs.ping()) {
					System.out.println(nfs.getUnreachableMessage());
					return;
				}
			}
			uso = sigar.getFileSystemUsage(sistemaArchivos.getDirName());

			usado = uso.getTotal() - uso.getFree();
			disponible = uso.getAvail();
			total = uso.getTotal();

			porcentaje = (long) (uso.getUsePercent() * 100);
		} catch (SigarException e) {
			// por ejemplo, si en al procesar D:\ en windows falla
			// con &quot;Device not ready&quot;
			usado = disponible = total = porcentaje = 0;
		}

		String porcentajeUso;
		if (porcentaje == 0)
			porcentajeUso = &quot;-&quot;;
		else
			porcentajeUso = porcentaje + &quot;%&quot;;

		System.out.print(sistemaArchivos.getDevName());
		System.out.print(&quot;|&quot; + total);
		System.out.print(&quot;|&quot; + usado);
		System.out.print(&quot;|&quot; + disponible);
		System.out.print(&quot;|&quot; + porcentajeUso);
		System.out.print(&quot;|&quot; + sistemaArchivos.getDirName());
		System.out.println(&quot;|&quot; + sistemaArchivos.getSysTypeName());
	}
}
</pre>
<p><!--INFOLINKS_ON-->Aspectos importantes:</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">La clase que nos proporciona los métodos para obtener información de una unidad en específico es <code>FileSystem</code>.</li>
<li style="text-align: justify;">El método <code>getDevName</code> nos devuelve el nombre del dispositivo referenciado por el objeto de la clase <code>FileSystem</code>.</li>
<li style="text-align: justify;">Los métodos <code>getTotal</code> y <code>getAvail</code> devuelven un <code>long</code> que representa el espacio total del dispositivo y espacio disponible, respectivamente.</li>
<li style="text-align: justify;">Para conocer el tipo de sistema de archivos (ext4, ntfs, fat, btrfs, etc.) utilizamos el método <code>getSysTypeName</code>.</li>
</ul>
<p style="text-align: justify;">
<h3>Información de la memoria&#8230;</h3>
</p>
<p style="text-align: justify;">La siguiente clase nos permite conocer la cantidad de memoria RAM que tiene el equipo, así como la que se está usando actualmente (tanto memoria física como virtual, aka, swap). Creamos una nueva clase llamada <code>InfoMemoria</code> con el siguiente código:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import org.hyperic.sigar.Mem;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.Swap;
import org.hyperic.sigar.SigarException;

public class InfoMemoria {
	private Sigar sigar = new Sigar();
	public void imprimirInfo() throws SigarException {
		Mem memoria = sigar.getMem();
		Swap intercambio = sigar.getSwap();

		System.out.println(&quot;Cantidad de memoria RAM: &quot;+ memoria.getRam() + &quot;MB&quot;);

		System.out.println(&quot;Total: &quot;+enBytes(memoria.getTotal()));
		System.out.println(&quot;Usada: &quot;+enBytes(memoria.getUsed()));
		System.out.println(&quot;Disponible: &quot;+enBytes(memoria.getFree()));

		System.out.println(&quot;Memoria SWAP total: &quot;+enBytes(intercambio.getTotal()));
		System.out.println(&quot;Memoria SWAP usada: &quot;+enBytes(intercambio.getUsed()));
		System.out.println(&quot;Memoria SWAP libre: &quot;+enBytes(intercambio.getFree()));

	}
	private Long enBytes(long valor) {
		return new Long(valor / 1024);
	}
}</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Aspectos importantes:</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">La clase <code>Mem</code> nos proporciona métodos para obtener información de la memoria del sistema.</li>
<li style="text-align: justify;">La clase <code>Swap</code> hace lo mismo que Mem, pero para la memoria virtual.</li>
<li style="text-align: justify;">Los métodos <code>getTotal</code> y <code>getUsed</code> nos devuelven un long que representa (en bits) la cantidad de memoria del equipo y lo que está usando, respectivamente.</li>
</ul>
<p style="text-align: justify;">
<h3>La clase main&#8230;</h3>
</p>
<p style="text-align: justify;">El main de nuestro proyecto estará contenido en la clase <code>InfoSistema</code>:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import org.hyperic.sigar.SigarException;
public class InfoSistema {
	public static void main(String[] args) {
		try {
			System.out.println(&quot;====Informacion del sistema====&quot;);
			new InfoSO().imprimirInfo();
			System.out.println(&quot;\n==== Informacion de la CPU ====&quot;);
			new InfoCPU().imprimirInfoCPU();
			System.out.println(&quot;\n====Informacion del sistema de archivos====&quot;);
			new InfoSistemaArchivos().imprimirInfo();
			System.out.println(&quot;\n====Informacion de la memoria====&quot;);
			new InfoMemoria().imprimirInfo();
		} catch (SigarException e) {
			e.printStackTrace();
		}
	}
}</pre>
<p><!--INFOLINKS_ON--></p>
<p>Eso es todo, solo nos queda ejecutar el proyecto y, opcionalmente, crear un archivo .jar para ejecutar en cualquier lado.</p>
<p style="text-align: justify;">
<h3>Descargas&#8230;</h3>
</p>
<ul style="text-align: justify;">
<li><a href="http://casidiablo.net/descargar/Informacion+Sistema+Java" class="tooltip" title="Proyecto de Eclipse comprimido en ZIP (contiene las librerías de Sigar)">Descarga del código fuente usado en esta entrada</a></li>
<li><a href="https://sourceforge.net/project/showfiles.php?group_id=172552">Descargar librerías de Sigar de SourceForge</a></li>
</ul>
<p><br/><br/></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/cpu/" rel="tag nofollow">cpu</a>, <a href="http://casidiablo.net/tag/disco/" rel="tag nofollow">disco</a>, <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/ejemplos/" rel="tag nofollow">ejemplos</a>, <a href="http://casidiablo.net/tag/ejercicio/" rel="tag nofollow">ejercicio</a>, <a href="http://casidiablo.net/tag/espacio/" rel="tag nofollow">espacio</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/informacion/" rel="tag nofollow">informacion</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/memoria/" rel="tag nofollow">memoria</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/ram/" rel="tag nofollow">ram</a>, <a href="http://casidiablo.net/tag/sistema/" rel="tag nofollow">sistema</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/capturar-informacion-sistema-operativo-java/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Trabajando con el Kernel Linux (III) &#8211; Buscando drivers de dipositivos PCI</title>
		<link>http://casidiablo.net/identificando-drivers-pci-kernel-linux/</link>
		<comments>http://casidiablo.net/identificando-drivers-pci-kernel-linux/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 19:30:57 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[dispositivos]]></category>
		<category><![CDATA[drivers]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[pci]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3363</guid>
		<description><![CDATA[

Contribuyendo a la excelente labor de mi amigo Cortex, vamos con este pequeño artículo.
Una de las tareas más dispendiosas a la hora de configurar el kernel es determinar qué opción/driver activar para determinado dispositivo. La idea de este artículo es dar a conocer una excelente herramienta online que nos permitirá conocer mejor nuestro sistema, y [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fidentificando-drivers-pci-kernel-linux%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Trabajando%20con%20el%20Kernel%20Linux%20%28III%29%20-%20Buscando%20drivers%20de%20dipositivos%20PCI%22%20%7D);"></div>
<p style="text-align: justify;"><em>Contribuyendo a la excelente labor de mi amigo <a href="http://casidiablo.net/author/c0rtex/">Cortex</a>, vamos con este pequeño artículo.</em></p>
<p style="text-align: justify;">Una de las tareas más dispendiosas a la hora de configurar el kernel es determinar qué opción/driver activar para determinado dispositivo. La idea de este artículo es dar a conocer una excelente herramienta online que nos permitirá conocer mejor nuestro sistema, y de paso saber los nombres de los drivers que podemos usar por cada dispositivo.</p>
<p style="text-align: justify;">La página en cuestión es <a href="http://kmuto.jp/debian/hcl/">http://kmuto.jp/debian/hcl/</a> y contiene una base de datos de IDs de dispositivos PCI, que nos permite consultar información acerca de nuestros dispositivos y los drivers que los controlan.</p>
<h3>Uso</h3>
<p style="text-align: justify;">Para usarlo debemos ejecutar el siguiente comando:</p>
<div class="consola">lspci -n</div>
<p style="text-align: justify;">y copiamos la salida en el area de texto que aparece al entrar a <a href="http://kmuto.jp/debian/hcl/">http://kmuto.jp/debian/hcl/</a>; hacemos clic en el botón Comprobar y obtendremos un listado de dispositivos vs. nombre del driver.</p>
<p style="text-align: justify;">Por ejemplo, mi laptop tiene una ranura para insertar memorias SD; el nombre de dicho dispositivo es <em>R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter</em> y el driver es <code>sdhci-pci</code>.</p>
<p style="text-align: center;"><img style="border:1px solid;" title="driver linux sdhci-pci" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/10/screenshot_030.png" alt="pantallazo del driver" /></p>
<p style="text-align: justify;">Con dicha información, podemos hacer una búsqueda (presionando la tecla /) en la configuración del kernel (cuando hacemos un <code>make menuconfig</code>):</p>
<p style="text-align: center;"><img class="size-full wp-image-3365 aligncenter" title="screenshot_031" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/10/screenshot_031.png" alt="screenshot_031" width="698" height="391" /></p>
<p style="text-align: justify;">El resultado es la ubicación exacta de la opción que debes habilitar para tener tu dispositivo funcionando:</p>
<p style="text-align: center;"><img class="size-full wp-image-3366 aligncenter" title="screenshot_032" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/10/screenshot_032.png" alt="screenshot_032" width="689" height="386" /></p>
<p style="text-align: justify;">Eso es todo. Ahora podemos estar seguros de escoger el driver adecuado y podemos compilar nuestro kernel normalmente.</p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/dispositivos/" rel="tag nofollow">dispositivos</a>, <a href="http://casidiablo.net/tag/drivers/" rel="tag nofollow">drivers</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/pci/" rel="tag nofollow">pci</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/identificando-drivers-pci-kernel-linux/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Trabajando con el Kernel Linux (II)</title>
		<link>http://casidiablo.net/trabajando-con-el-kernel-linux-ii/</link>
		<comments>http://casidiablo.net/trabajando-con-el-kernel-linux-ii/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 14:00:02 +0000</pubDate>
		<dc:creator>Cortex</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[bsd]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[camara]]></category>
		<category><![CDATA[compilación]]></category>
		<category><![CDATA[driver]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[sysctl]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3306</guid>
		<description><![CDATA[

Anterior artículo&#8230;
Continuando con la serie de posts dedicados al Kernel, hoy vamos a hablar sobre las cámaras web y la herramienta sysctl.
Cámaras Web

En la actualidad, el kernel tiene muy buen soporte para las cámaras web, tanto las integradas como las externas. Basado en mi experiencia, nunca he tenido ningún problema con dispositivos de captura de [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Ftrabajando-con-el-kernel-linux-ii%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Trabajando%20con%20el%20Kernel%20Linux%20%28II%29%22%20%7D);"></div>
<p><a title="Trabajando con el Kernel Linux (I)" href="http://casidiablo.net/trabajando-con-el-kernel-linux-i/">Anterior artículo&#8230;</a></p>
<p>Continuando con la serie de posts dedicados al Kernel, hoy vamos a hablar sobre las cámaras web y la herramienta <strong>sysctl</strong>.</p>
<h2>Cámaras Web</h2>
<p style="text-align: center"><img class="alignnone size-full wp-image-3324" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/09/webcam_pinguino.jpg" alt="webcam_pinguino" width="214" height="195" /></p>
<p>En la actualidad, el kernel tiene muy buen soporte para las cámaras web, tanto las integradas como las externas. Basado en mi experiencia, nunca he tenido ningún problema con dispositivos de captura de video en Linux aunque me imaginó que en algún hardware habrá incompatibilidades. La ventaja es que los desarrolladores del kernel cada día trabajan por mejorarlo y desarrollando controladores para maximizar el soporte en la mayor cantidad de máquinas posibles.<span id="more-3306"></span></p>
<p>Lo primero que debemos hacer es identificar la <em>referencia</em> del dispositivo. Si tienes un portatil y lo que buscas es hacer funcionar la cámara integrada que trae, usando el <a title="Linux UVC driver and tools" href="http://linux-uvc.berlios.de/">driver UVC</a> sería suficiente:</p>
<pre>Device Drivers  ---&gt;
     &lt;*&gt; Multimedia support  ---&gt;
          [*]   Video capture adapters  ---&gt;
               [*]   Autoselect pertinent encoders/decoders and other helper chips
               [*]   V4L USB devices  ---&gt;
                    &lt;*&gt;   USB Video Class (UVC)
                          [*]     UVC input events device support</pre>
<p>Ahora, en caso de que la cámara sea externa debes conectarla y hacer un <strong>lsusb</strong>. Hay tantos modelos disponibles que sería difícil hacer una guía definitiva, además de que ya existe un <a title="Linux Webcam HOWTO" href="http://www.tldp.org/HOWTO/Webcam-HOWTO/">completo HOWTO que explica esto</a>. Lo que haré, será mostrar un ejemplo haciendo uso de una vieja cámara <strong>Genius</strong> que tengo. Si la conecto y hago un <strong>dmesg</strong> puedo ver la información del dispositivo:</p>
<div class="consola">[ 4601.153221] usb 5-1: New USB device found, idVendor=093a, idProduct=2471<br />
[ 4601.153228] usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0<br />
[ 4601.153235] usb 5-1: Product: CIF Single Chip<br />
[ 4601.153241] usb 5-1: Manufacturer: Pixart Imaging Inc.</div>
<p>Ahora <strong>lsusb</strong>:</p>
<div class="consola">Bus 005 Device 003: ID 093a:2471 Pixart Imaging, Inc.</div>
<p>Teniendo el <strong>ID</strong>, debemos buscar cuál es el módulo necesario para esta cámara. <a title="GSPCA V4L2 - Webcams" href="http://moinejf.free.fr/webcam.html">Aquí tienes una larga lista</a> de IDs con su respectivo módulo. Si buscamos también en la <a title="Linux Kernel Driver DataBase" href="http://cateee.net/lkddb">base de datos de drivers del kernel</a> veremos la <a href="http://cateee.net/lkddb/web-lkddb/USB_GSPCA_PAC207.html">configuración</a> que debemos hacer y el módulo a activar. El driver en cuestión es: <strong>gspca_pac207.</strong></p>
<pre>&lt;*&gt;   GSPCA based webcams  ---&gt;
     &lt;M&gt;   Pixart PAC207 USB Camera Driver</pre>
<p>Si compilaste como módulo no olvides agregarlo al inicio del sistema (si es lo que deseas). En Gentoo con OpenRC y Baselayout 2:</p>
<div class="consola"># echo &#8216;modules_2_6=&#8221;${modules_2_6} gspca_pac207&#8243;&#8216; &gt;&gt; /etc/conf.d/modules</div>
<p>Para esta cámara es necesario tener instalada la librería <strong>v4l (Video 4 Linux)</strong>.</p>
<div class="consola"># emerge -av media-libs/libv4l</div>
<div class="nota">En general, este es el proceso para todos las cámaras, aunque en algunas puede haber variaciones. Con los enlaces que expuse anteriormente debe ser suficiente para encontrar la información relativa a tu hardware.</div>
<p>Y listo. Reiniciamos con el nuevo kernel y usamos cualquier programa como <strong>cheese</strong> para comprobar que todo funciona bien.</p>
<h2>Sysctl</h2>
<p>A raíz de un <a title="arpunk" href="http://casidiablo.net/trabajando-con-el-kernel-linux-i/#comment-7291">comentario de arpunk</a>, he decidido posponer uno de los temas que iba a tocar en este artículo y hablar sobre <strong>sysctl.</strong></p>
<p>El kernel Linux es tan flexible que te permite modificar la manera en que trabaja, dinámicamente, a través del comando <em>sysctl</em>. Sysctl provee de una interfaz que permite examinar y cambiar cientos de parámetros en núcleos Linux y BSD. Gracias a esta herramienta podemos modificar y optimizar el kernel sin tener que recompilarlo. Los cambios son realizados inmediatamente e incluso pueden ser definidos como persistentes, de manera que continúen después de reiniciar.</p>
<p>Para ver los parámetros actuales del kernel en ejecución:</p>
<div class="consola">sysctl -a<br />
sysctl -n vm.swappiness</div>
<p>Con el segundo lo que hacemos es ver el valor de un determinado parámetro, en este caso <strong>vm.swappiness</strong>. Suponiendo que quisiéramos decirle al kernel que <a title="Swappiness" href="http://kerneltrap.org/node/3000">use más la memoria RAM que la swap</a> ó habilitar el <em>forwarding</em> en IPv4, bastaría con cambiar el valor de estas <em>variable</em>s:</p>
<div class="consola">sysctl vm.swappiness=10<br />
sysctl net.ipv4.conf.all.forwarding=1</div>
<p>Recuerda que las modificaciones que hagas con este comando serán temporales, y la próxima vez que reinicies el sistema se cargarán los valores por defecto. Para cambiar este comportamiento, hay que editar el archivo <em>/etc/sysctl.conf</em></p>
<div class="consola">echo &#8216;net.ipv4.conf.all.forwarding=1&#8242; &gt;&gt; /etc/sysctl.conf</div>
<p><strong>Básicamente</strong> eso es sysctl. El tema podría tornarse más extenso pero la idea de estos artículos, es tan sólo, recopilar conceptos en torno al kernel Linux. Para más información <a title="man sysctl" href="http://linux.die.net/man/8/sysctl">man sysctl</a>.</p>
<p>Hasta aquí por hoy. En el próximo artículo hablaremos un poco de optimizaciones para el procesador y de otras buenas prácticas a la hora de compilar el núcleo.</p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/camara/" rel="tag nofollow">camara</a>, <a href="http://casidiablo.net/tag/compilacion/" rel="tag nofollow">compilación</a>, <a href="http://casidiablo.net/tag/driver/" rel="tag nofollow">driver</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/sysctl/" rel="tag nofollow">sysctl</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/trabajando-con-el-kernel-linux-ii/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Trabajando con el Kernel Linux (I)</title>
		<link>http://casidiablo.net/trabajando-con-el-kernel-linux-i/</link>
		<comments>http://casidiablo.net/trabajando-con-el-kernel-linux-i/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 16:12:14 +0000</pubDate>
		<dc:creator>Cortex</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[compilación]]></category>
		<category><![CDATA[configuración]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[lcd]]></category>
		<category><![CDATA[microfono]]></category>
		<category><![CDATA[pantalla]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3256</guid>
		<description><![CDATA[

Hola a todos! Otra vez yo, Cortex, que hace un buen rato no me pasaba por aquí.
Hoy me gustaría hablar sobre un tema en el que seguro todos tenemos muchas lagunas, configurar el kernel. Si alguna vez has instalado ó intentando instalar Gentoo te habrás dado cuenta que en el ritual de instalación debes de [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Ftrabajando-con-el-kernel-linux-i%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Trabajando%20con%20el%20Kernel%20Linux%20%28I%29%22%20%7D);"></div>
<p>Hola a todos! Otra vez yo, <strong>Cortex</strong>, que hace un buen rato no me pasaba por aquí.</p>
<p><img style="float: right" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/07/logo-gentoo.png" alt="" width="147" height="155" />Hoy me gustaría hablar sobre un tema en el que seguro todos tenemos muchas lagunas,<strong> configurar el kernel</strong>. Si alguna vez has instalado ó intentando instalar Gentoo te habrás dado cuenta que en el <em>ritual</em> de instalación debes de compilar tu propio núcleo, incluyendo también la configuración del mismo. Desde mi experiencia, este suele ser un punto en el que la mayoría de usuarios se quedan; es cierto que también existe <strong>genkernel</strong>, una herramienta que facilita por completo este proceso  pero que también, entre otras cosas, ralentiza mucho el arranque.</p>
<p>Casi la totalidad de distribuciones Linux, incluyen en su sistema un kernel con soporte para la mayor cantidad de hardware posible y en el booteo hay un <em>script</em> que se encarga de identificar el perfil del equipo en cuestión y cargar los módulos respectivos (sonido, disco, sistemas de archivos, etc.). Este sistema me parece excelente, puesto que sobretodo al usuario nuevo le ahorra mucho trabajo a la hora de poner a funcionar su distribución, pero como dije anteriormente no es lo más óptimo, <strong>sobretodo si queremos el mejor rendimiento posible.</strong><span id="more-3256"></span></p>
<p>No pretendo con esta entrada crear una guía completa de configuración del kernel. Primero, porque mis conocimientos en este tema son limitados, o sino que lo diga <a title="It Should Work..." href="http://vierito.es/wordpress"><strong>Javi</strong></a>, que siempre le toca aguantarse mis quejas porque no me funcionan bien las cosas <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  Y segundo, porque todos tenemos necesidades diferentes y puede que algunos necesiten soporte para determinadas cosas que otros no. Lo que sí me gustaría es hablar sobre buenas prácticas a la hora de trabajar con el núcleo y sobre problemas muy comunes que surgen cuando hacemos una configuración desde 0, como dispositivos que no funcionan, entre otras cosas. <strong>El post está abierto a cualquier aporte/mejora/correción que quieran hacer</strong>.</p>
<h2>Brillo en pantallas LCD</h2>
<p>Son varias las personas que alguna vez me han preguntado como pueden hacer funcionar las teclas para definir la intensidad del brillo de la pantalla. Si usas portatil, habrás notado que es una funcionalidad demasiado útil y que además es muy maluco tener que trabajar únicamente con el brillo que el laptop <em>haya decidido definir al ser encendido</em>.</p>
<ul>
<li><strong>Lo primer es activar el controlador:</strong></li>
</ul>
<pre>Device Drivers  ---&gt;
     Graphics Support ---&gt;
          [*] Lowlevel video output switch controls
          [*] Backlight &amp; LCD device support  ---&gt;
               &lt;*&gt;   Lowlevel LCD controls
               &lt;*&gt;     Platform LCD controls
               -*-   Lowlevel Backlight controls
               &lt;*&gt;     Generic (aka Sharp Corgi) Backlight Drive
      Display device support  ---&gt;
           &lt;*&gt; Display panel/monitor support</pre>
<ul>
<li><strong>Ahora nos dirigimos a las opciones de ACPI y activamos el manejo de video:</strong></li>
</ul>
<pre>Power management and ACPI options  ---&gt;
     [*] ACPI (Advanced Configuration and Power Interface) Support  ---&gt;
          &lt;*&gt;   Video</pre>
<p>Y con esto bastaría recompilar para disfrutar del brillo <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>/proc/config.gz</h2>
<p>Una opción que quizás muchos no conocen es la de poder acceder a la configuración del kernel en ejecución a través del archivo <em>/proc/config.gz</em>. Actívemosla y curémosnos en salud ante la pérdida del preciado <em>.config</em>.</p>
<pre>General setup  ---&gt;
     &lt;*&gt; Kernel .config support
     [*]   Enable access to .config through /proc/config.gz</pre>
<p>Para disponer del archivo de configuración:</p>
<div class="consola">zcat /proc/config.gz &gt; .config</div>
<h2>Sonido como módulo</h2>
<p>Entre los problemas más comunes en Linux está el sonido. Sobretodo si trabajamos con versiones de ALSA muy viejas ya que nos toca recurir a <em>hacks</em> ó pasar parámetros a la hora de cargar los módulos. <strong>Por si no está claro para alguien</strong>, <strong>ALSA</strong> (Advanced Linux Sound Architecture) a grosso modo, es el encargado de la gestión del sonido en Linux, reemplazando al obsoleto OSS. No es la única opción, pero sí la mejor en la mayoría de los casos.</p>
<p>Existen 3 formas de instalar ALSA:</p>
<ul>
<li>Desde los drivers del kernel (estáticamente)<em></em></li>
<li>Desde los drivers del kernel (módulo)</li>
<li>Drivers externos (<a href="http://www.alsa-project.org/main/index.php/Main_Page">alsa-drivers</a>)</li>
</ul>
<p>La más recomendada es la segunda. Las ventaja de compilar el sonido como módulo es que no tenemos que preocuparnos de identificar cual es el controlador apropiado para nuestra tarjeta, sino, simplemente dejar hacer su trabajo a <em>alsaconf</em> y usar <em>alsamixer</em> para definir el volumen. Aparte de que también se obtiene un mejor rendimiento.</p>
<p><a href="http://wonkabar.org/2009/09/01/three-ways-to-install-alsa-drivers/">Si quieres profundizar un poco en el tema puedes leer este artículo.</a></p>
<p>No pondré aquí las opciones que se  necesitan activar en el núcleo, puesto que en la <a title="ALSA - Gentoo" href="http://www.gentoo.org/doc/es/alsa-guide.xml">documentación de Gentoo</a> está todo perfectamente explicado. Más bien hablemos sobre los <strong>micrófonos integrados</strong>, esos que a veces resulta tan difícil hacer funcionar.</p>
<div class="nota">Si se ha compilado el núcleo como se explica en el anterior enlace, y además, se está usando la última versión de ALSA (<strong>recomendado</strong>) el micrófono ya debe de funcionar, sólo falta configurarlo.</div>
<p>Abrimos en una shell <strong>alsamixer</strong> y presionando la tecla Tabulador nos movemos a los <strong>dispositivos de Captura</strong>. Debemos cambiar en <em>Input Source, Mic</em> por <em>Front Mic</em> y también verificar que los dispositivos <em>Capture</em> y <em>Digital</em> no están mudos y además que tengan el volumen al 100%.</p>
<p>Guardamos la configuración</p>
<div class="consola"># alsactl store</div>
<p>Ahora abrimos cualquier aplicación para captura de audio y probamos con los dispositivos disponibles a ver cual funciona. <strong>Eso es todo.</strong></p>
<p>No quiero alargar más el post, de momento es suficiente. Más adelante veremos como podemos hacer funcionar las <strong>cámaras web</strong> en Linux y algunas otras cosas.</p>
<p>Cualquier comentario será bien recibido, ¡Hasta pronto!</p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/compilacion/" rel="tag nofollow">compilación</a>, <a href="http://casidiablo.net/tag/configuracion/" rel="tag nofollow">configuración</a>, <a href="http://casidiablo.net/tag/gentoo/" rel="tag nofollow">gentoo</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/lcd/" rel="tag nofollow">lcd</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/microfono/" rel="tag nofollow">microfono</a>, <a href="http://casidiablo.net/tag/pantalla/" rel="tag nofollow">pantalla</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/trabajando-con-el-kernel-linux-i/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>A fondo: Tu primer módulo cargable para el Linux kernel</title>
		<link>http://casidiablo.net/tu-primer-modulo-cargable-kernel-explicacion/</link>
		<comments>http://casidiablo.net/tu-primer-modulo-cargable-kernel-explicacion/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 20:37:38 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3132</guid>
		<description><![CDATA[

Esta entrada pretende profundizar los temas aprendidos en el anterior artículo (Tu primer módulo cargable para el Linux kernel), con el fin de clarificar dudas, atar algunos cabos que dejamos sueltos y prepararnos para los siguientes artículos.
¿Puedo usar directamente el árbol del código fuente del kernel?
Sí, por supuesto. Como ya sabes, no es posible compilar [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Ftu-primer-modulo-cargable-kernel-explicacion%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22A%20fondo%3A%20Tu%20primer%20m%C3%B3dulo%20cargable%20para%20el%20Linux%20kernel%22%20%7D);"></div>
<p style="text-align: justify;"><img style="float:right;" title="codigo c linux" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/06/codigo-c.png" alt="codigo c" width="150" height="158" />Esta entrada pretende profundizar los temas aprendidos en el anterior artículo (<a href="http://casidiablo.net/desarrollar-compilar-modulo-linux/">Tu primer módulo cargable para el Linux kernel</a>), con el fin de clarificar dudas, atar algunos cabos que dejamos sueltos y prepararnos para los siguientes artículos.</p>
<h3>¿Puedo usar directamente el árbol del código fuente del kernel?</h3>
<p style="text-align: justify;">Sí, por supuesto. Como ya sabes, <strong>no es posible compilar un módulo cargable sin al menos parte del código fuente del kernel</strong> &#8211; esto es, la parte que contiene la infraestructura de construcción general y los archivos de cabecera esenciales. Solo por recordar, un <a href="http://es.wikipedia.org/wiki/Header_file">archivo header</a> (con extensión .h), contiene, normalmente, una declaración directa de clases, subrutinas, variables, u otros identificadores; sin la definición de estas, no es posible compilar código que las use.</p>
<p style="text-align: justify;">En cualquier caso, es siempre útil tener una copia completa del código del kernel, y la manera más fácil de obtenerla es usando <code>git</code>:</p>
<div class="consola">$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git git-kernel</div>
<p style="text-align: justify;">Además que puedes actualizarlo fácilmente:</p>
<div class="consola">$ git pull</div>
<p style="text-align: justify;">Nótese que, al contrario de instalar el paquete oficial de desarrollo del kernel como hicimos en el anterior artículo, <strong>usando <code>git</code> no es necesario tener privilegios administrativos para poner todo el código en algún lugar de tu directorio <em>home</em></strong>. Además, si por alguna razón no puedes usarlo, puedes descargarte un archivo tar y funcionará igual; claro, usar <code>git</code> es mucho más cool <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_cool.gif' alt='8-)' class='wp-smiley' /> <span id="more-3132"></span></p>
<div class="nota">Nota: Seguiremos compilando nuestros módulos contra los archivos que nos proporciona el paquete de desarrollo del kernel; el que descargaste con el git es sólo para propósitos educativos, al menos por el momento. <a href="http://dockernel.casidiablo.net/">Documentación kernel Linux</a>.</div>
<h3>Urgando en el código fuente: examinando los archivos de cabecera (Header Files)</h3>
<p style="text-align: justify;">Recordemos que en el ejemplo del artículo anterior, nuestro código contiene referencias a archivos de cabecera del kernel:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: cpp;">#include &lt;linux/module.h&gt;      // para todos los módulos
#include &lt;linux/init.h&gt;        // para entrada y salida de macros
#include &lt;linux/kernel.h&gt;      // para los macros de prioridad de printk
#include &lt;asm/current.h&gt;       // procesar información, solo por diversión
#include &lt;linux/sched.h&gt;       // para usa la estructura task_struct</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Tales referencias son siempre relativas al nivel superior del directorio <code>include/</code> en el código fuente del kernel, así que un include de, <strong>por ejemplo, <code>&lt;linux/module.h&gt;</code>, se refiere al archivo de cabecera <code>include/linux/module.h</code></strong>, y así sucecivamente.</p>
<p style="text-align: justify;">Sin embargo, si miras un poco más de cerca, notarás que no hay un directorio <code>include/asm/</code>, lo cual es bastante fácil solucionar. Incluso si no planeas construir algo contra el código fuente que descargaste, deberías prepararlo de tal manera que refleje de una manera más precisa lo que piensas hacer con él:</p>
<div class="consola">$ make defconfig<br />
$ make modules_prepare</div>
<p style="text-align: justify;">Los comandos anteriores hacen bastantes cosas, aunque lo único que nos interesa en este momento es que crea algunos enlaces simbólicos en el directorio <code>include/</code>, que reflejan la arquitectura de nuestro sistema.</p>
<p style="text-align: justify;">Antes de ejecutar los comandos:</p>
<div class="consola">$ ls -ld include/asm*<br />
drwxrwxr-x. &#8230; include/asm-arm<br />
drwxrwxr-x. &#8230; include/asm-generic<br />
drwxrwxr-x. &#8230; include/asm-x86</div>
<p style="text-align: justify;">Después de ejecutarlos:</p>
<div class="consola">$ ls -ld include/asm*<br />
lrwxrwxrwx. &#8230; include/asm -&gt; asm-x86   &lt;&#8211; aja!<br />
drwxrwxr-x. &#8230; include/asm-arm<br />
drwxrwxr-x. &#8230; include/asm-generic<br />
drwxrwxr-x. &#8230; include/asm-x86</div>
<p style="text-align: justify;">Una vez que esto es hecho, los includes de preprocesador tendrán sentido, y podemos usar los nombres genéricos para referirnos al archivo de cabecera apropiado de ahora en adelante. Por supuesto, esto que hicimos no es necesario hacerlo con los paquetes oficiales de desarrollo del kernel, puesto que ya vienen preparados.</p>
<h3>¿Es posible generar mensajes de salida con un módulo?</h3>
<p style="text-align: justify;">No, no lo es. Bueno, no realmente. Como un autor de módulos novato, es necesario que entiendas que tu módulo será ejecutado en el <em>kernel space</em>, no en el <em>user space</em>, así que debes dejar de pensar en impresiones de mensajes en la consola. Olvídate de ello. <strong>La manera canónica de generar mensajes de depuración desde tu módulo es con llamadas <code>printk</code></strong>:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: cpp;">printk(KERN_INFO &quot;Hola, el modulo esta siendo cargado.\n&quot;);
printk(KERN_INFO &quot;El user space del proceso es '%s'\n&quot;, current-&gt;comm);
printk(KERN_INFO &quot;El PID es  %i\n&quot;, current-&gt;pid);  </pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Corriendo el riesgo de sobre-simplificar el asunto, la salida que genera <code>printk</code> acabará en el archivo <code>/var/log/messages</code> así que, si estás insertando y removiendo tu módulo, es útil tener una terminal aparte mostrando en tiempo real todo lo que sea escrito en dicho archivo (para lo cual necesitas privilegios administrativos):</p>
<div class="consola"># tail -f /var/log/messages</div>
<p style="text-align: justify;">Para los más ambiciosos, es útil fijarse en la definición de los niveles de log en el archivo de cabecera <code>&lt;linux/kernel.h&gt;</code>:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: cpp;">#define KERN_EMERG    &quot;&lt;0&gt;&quot;  /* system is unusable                 */
#define KERN_ALERT    &quot;&lt;1&gt;&quot;  /* action must be taken immediately   */
#define KERN_CRIT     &quot;&lt;2&gt;&quot;  /* critical conditions                */
#define KERN_ERR      &quot;&lt;3&gt;&quot;  /* error conditions                   */
#define KERN_WARNING  &quot;&lt;4&gt;&quot;  /* warning conditions                 */
#define KERN_NOTICE   &quot;&lt;5&gt;&quot;  /* normal but significant condition   */
#define KERN_INFO     &quot;&lt;6&gt;&quot;  /* informational                      */
#define KERN_DEBUG    &quot;&lt;7&gt;&quot;  /* debug-level messages               */</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Si algunos de ellos lucen vagamente familiares, no es de sorprenderse &#8211; son los niveles de depuración (debugging) soportados por <a href="http://es.wikipedia.org/wiki/Syslog#C.C3.B3digos_de_severidad">syslog</a>, así que eres libre de personalizar el syslog si quieres redireccionar la salida de tu módulo a donde quieras basado en los niveles de log, lo cual está más allá del objetivo de este artículo.</p>
<div class="nota">Nota: el más observador entre ustedes habrá notado que el nivel de log usado por <code>printk</code> es simplemente una cadena de texto como &#8220;&lt;0&gt;&#8221; y así sucesivamente, lo cual explica el porqué no usar comas al momento de usarlo &#8211; todo lo que el preprocesador está haciendo es concatenando dos cadenas de caracteres, así que hubiera sido totalmente equivalente escribir cualquiera de estos:</div>
<p><!--INFOLINKS_OFF-->
<pre class="brush: cpp;">printk(KERN_INFO &quot;Hola, el modulo esta siendo cargado.\n&quot;);
printk(&quot;&lt;6&gt;&quot; &quot;Hola, el modulo esta siendo cargado.\n&quot;);
printk(&quot;&lt;6&gt;Hola, el modulo esta siendo cargado.\n&quot;);</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Aun así, es mejor hacerlo como se muestra en la primera línea. Incluso programando cosas del kernel, la estética importa.</p>
<h3>Cargando tu módulo lleno de información</h3>
<p style="text-align: justify;">Como te diste cuenta la última vez, puedes cargar tu módulo con información bastante útil como:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: cpp;">MODULE_AUTHOR(&quot;Robert P. J. Day&quot;);
MODULE_AUTHOR(&quot;Cristian Castiblanco [solo lo puse en castellano]&quot;);
MODULE_LICENSE(&quot;Dual BSD/GPL&quot;);
MODULE_DESCRIPTION(&quot;Aqui puedes poner una descripcion de tu modulo&quot;);</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">que puede examinarse con el comando <code>modinfo</code>:</p>
<div class="consola">$ sudo modinfo hola.ko<br />
filename:       hola.ko<br />
description:    Aqui puedes poner una descripcion de tu modulo<br />
license:        Dual BSD/GPL<br />
author:         Cristian Castiblanco [solo lo puse en castellano <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  ]<br />
author:         Robert P. J. Day<br />
depends:<br />
vermagic:       2.6.29-gentoo-r5 SMP mod_unload CORE2</div>
<p style="text-align: justify;">Algunas cosas útiles acerca de esta característica:</p>
<ul>
<li style="text-align: justify;">El conjunto completo de estos macros está definido en el archivo de cabecera <code>&lt;linux/module.h&gt;</code>, en donde verás macros relacionados con firmware, tablas de dispositivos y más.</li>
<li style="text-align: justify;">Además de esos macros en específico, está el menos conocido macro genérico MODULE_INFO, el cual puedes usar dentro del módulo en el lugar que quieras. Curiosamente, muy pocos programadores toman ventaja de este.</li>
<li style="text-align: justify;">La única macro que realmente debes poner es la licencia. Si no especificas alguna de las variaciones de la licencia GPL, entonces el módulo &#8220;contaminará&#8221; el kernel, un tema que trataremos en otro artículo. El conjunto completo de licencias válidas está definido en el mismo archivo de cabecera.</li>
</ul>
<h3>Compilando contra el código fuente del kernel</h3>
<p style="text-align: justify;">Finalmente, podrías querer construir tu módulo, no contra el código instalado por el paquete de desarrollo, sino contra el código que descargaste tú mismo. Si ese es tu plan, es bastante simple.</p>
<p style="text-align: justify;">Primero, como decíamos arriba, necesitas preparar tu código fuente para construir el módulo:</p>
<div class="consola">$ make defconfig<br />
$ make modules_prepare</div>
<p style="text-align: justify;">Todo lo que falta es configurar el Makefile de tal manera que compile el módulo contra nuestro código fuente. Recordemos parte del archivo Makefile del artículo anterior:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: python;">ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Lo que hace la segunda línea es <strong>asignar la ubicación del código fuente del kernel a ser usado</strong>. Para cambiar esta variable, podemos asignarle el valor deseado con este comando:</p>
<div class="consola">$ export KERNELDIR=/home/gentoo/kernel/git-kernel</div>
<p style="text-align: justify;">y aquí es donde comienzas a notar algunas diferencias. Asumiendo que la versión del código que descargué es 2.6.31-rc1, esto es lo que sucede en mi sistema:</p>
<div class="consola">$ make<br />
make -C /usr/src/git-kernel M=/tmp/modulo   modules<br />
make[1]: se ingresa al directorio `/usr/src/git-kernel&#8217;</p>
<p>WARNING: Symbol version dump /usr/src/git-kernel/Module.symvers<br />
is missing; modules will have no dependencies and modversions.</p>
<p>Building with KERNELRELEASE = 2.6.31-rc1<br />
CC [M]  /tmp/modulo/hola.o<br />
Building modules, stage 2.<br />
Building with KERNELRELEASE = 2.6.31-rc1<br />
MODPOST 1 modules<br />
CC      /tmp/modulo/hola.mod.o<br />
LD [M]  /tmp/modulo/hola.ko<br />
make[1]: se sale del directorio `/usr/src/git-kernel&#8217;</p></div>
<p style="text-align: justify;">Puesto que estoy compilando contra un código fuente que no concuerda con el que estoy corriendo actualmente, pierdo la <a href="http://linux.about.com/cs/linux101/g/symboltable.htm">tabla de símbolos</a> actual, pero la compilación funciona.</p>
<p style="text-align: justify;">El comando <code>modinfo</code> también muestra el árbol contra el cual el módulo fue compilado:</p>
<div class="consola">$ sudo modinfo hola.ko<br />
filename:       hola.ko<br />
description:    Aqui puedes poner una descripcion de tu modulo<br />
license:        Dual BSD/GPL<br />
author:         Cristian Castiblanco [solo lo puse en castellano <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  ]<br />
author:         Robert P. J. Day<br />
depends:<br />
vermagic:       2.6.31-rc1 SMP mod_unload 686</div>
<p style="text-align: justify;">Ahora algunas preguntas capciosas &#8211; ¿es posible cargarlo? ¿no dará problemas por la versión? Eso depende de si el kernel que se está ejecutando fue configurado para permitir diferencias de versiones, y hay una manera rápida de comprobarlo. En mi Gentoo por ejemplo:</p>
<div class="consola"># insmod hi.ko<br />
insmod: error inserting &#8216;hi.ko&#8217;: -1 Invalid module format</div>
<p style="text-align: justify;">Mala suerte. Tal parece que el kernel no fue compilado con las opciones necesarias. Si miramos en el archivo <code>/var/log/messages</code>:</p>
<div class="consola">&#8230;<br />
[ 4908.680123] hola: version magic &#8216;2.6.31-rc1 SMP mod_unload 686 \<br />
&#8216; should be &#8216;2.6.29-gentoo-r5 SMP mod_unload CORE2 &#8216;&#8230;</div>
<p style="text-align: justify;">Por lo pronto entonces, de ahora en adelante, jugaremos un poco dentro de la seguridad que nos ofrece compilar contra el kernel que concuerda con la versión que corremos. No hay motivo para hacerlo más difícil de lo que debe ser. En el próximo artículo veremos algo acerca de las rutinas entry y exit.</p>
<div class="nota">Este artículo está basado en: <a href="http://www.linux.com/learn/careers-training/25078-the-kernel-newbie-corner-your-first-loadable-kernel-module-part-deux">The Kernel Newbie Corner: Your First Loadable Kernel Module, Part Deux</a> escrito por Rob Day. Todos los créditos son de él, yo simplemente estoy acercando dicho contenido a las personas de habla hispana.</div>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/how-to/" rel="tag nofollow">how-to</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/tu-primer-modulo-cargable-kernel-explicacion/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Activando Framebuffer en Linux</title>
		<link>http://casidiablo.net/activando-framebuffer-vesafb-linux/</link>
		<comments>http://casidiablo.net/activando-framebuffer-vesafb-linux/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 19:32:52 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[gentoo]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[framebuffer]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[videos]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2799</guid>
		<description><![CDATA[

Nota: de nuevo un tutorial raro, que tal vez a pocos le importa. Lo siento.

Esta receta la aprendí configurando mi Gentoo pero bien podría aplicarse a cualquier otra distribución. La idea es activar el soporte para Framebuffer, el cual permite al kernel mostrar gráficos en consolas de texto. Además sirve para otras cosas, como ejecutar [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Factivando-framebuffer-vesafb-linux%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Activando%20Framebuffer%20en%20Linux%22%20%7D);"></div>
<p><em><strong>Nota</strong>: de nuevo un tutorial raro, que tal vez a pocos le importa. Lo siento.<br />
</em></p>
<p style="text-align: justify;">Esta receta la aprendí configurando mi Gentoo pero bien podría aplicarse a cualquier otra distribución. La idea es activar el soporte para Framebuffer, el cual permite al kernel mostrar gráficos en consolas de texto. Además sirve para otras cosas, como ejecutar servidores X sin aceleración o reproducir videos en la consola (en ASCII, por supuesto).</p>
<p style="text-align: justify;">El tutorial tiene además un valor didáctico que me gusta, ya que vamos a tocar cosas en el Kernel, algo bastante interesante.</p>
<h3>Ventajas</h3>
<p style="text-align: justify;">Las ventajas de hacer esto, y por lo que yo lo hice, son:</p>
<ul style="text-align: justify;">
<li>Te proporciona una muy bonita consola (de hasta 128 colores + más de 48 líneas con 1280&#215;800, al menos en mi laptop) cuando estás trabajando sobre las TTY (sin entornos gráficos).</li>
<li>Te pone el logo de Linux mientras carga el sistema, una maravilla. Los que usen usplash se reirán de mi, pero bueno, prefiero el pingüino y saber que está pasando cuando mi sistema inicia.</li>
</ul>
<h3>Compilando el kernel con las opciones adecuadas</h3>
<div class="nota">Cuando se trabaja con Gentoo, es muy común tener el código fuente del kernel de Linux descargado puesto que, en el momento de la instalación, se compila manualmente. En otras distros, lo más probable es que no lo tengas. En cualquier caso, la mejor manera de disponer de las fuentes de Linux es: en Gentoo ejecutar el comando <code>emerge gentoo-sources</code>; en otras distros, descargar las fuentes directamente de la página oficial, copiar y descomprimir el archivo en la carpeta <em>/usr/src</em>.</div>
<p style="text-align: justify;">En este punto, he de suponer que tienes algo de experiencia con el kernel. Sino, estás de suerte porque me gusta explicar todo muy bien. Lo primero es abrir una consola y situarnos en el directorio donde tengamos las fuentes de Linux, y posteriormente ejecutamos la herramienta de configuración del Kernel:<span id="more-2799"></span></p>
<div class="consola"># cd /usr/src/linux<br />
# make menuconfig</div>
<p style="text-align: justify;">Una vez hecho esto, debemos activar algunas opciones (dentro de <em>Device Drivers</em>):</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: python;">(*) Graphics Support
    (*) Enable firmware EDID
    (*) Support for Frame buffer devices
        (*) VESA VGA graphics support
    (*) Console display support
        (*) Video mode selection support
        (*) Frame buffer console support
    (*) Logo Configuration
        (*) Bootup logo</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;"><em>Ten en cuenta que deben estar compilados dentro del kernel (*) y no como módulos (M)</em>. Una vez que hayamos configurado correctamente nuestro kernel, lo compilamos y copiamos al directorio /boot, por ejemplo:</p>
<div class="consola"># make <span style="color: #ff0000;">&lt;- compilamos el kernel</span><br />
# cp arch/x86/boot/bzImage /boor/el-nombre-de-tu-kernel <span style="color: #ff0000;">&lt;- copiamos la imagen del kernel al sector del boot</span></div>
<h3>Identificar qué resoluciones podemos usar con Framebuffer</h3>
<p style="text-align: justify;">Para identificar qué resolución es la más adecuada para nuestro equipo, lo más sencillo es instalar la herramienta <em><strong>hwinfo</strong></em> (si no la tienes ya instalada):</p>
<p>En <a href="../../category/linux/ubuntu/">Ubuntu</a>/<a href="../../category/debian/">Debian</a>:</p>
<div class="consola">$ sudo aptitude install hwinfo</div>
<p>En <a href="../../category/gentoo">Gentoo</a>:</p>
<div class="consola"># emerge hwinfo</div>
<p>En <a href="../../category/arch-linux">Arch</a>:</p>
<div class="consola"># pacman -S hwinfo</div>
<p>En <a href="../../category/fedora">Fedora</a>:</p>
<div class="consola">$ sudo yum install hwinfo</div>
<p style="text-align: justify;">Una vez instalado, ejecutas el comando:</p>
<div class="consola"># <strong>hwinfo &#8211;framebuffer</strong><br />
02: None 00.0: 11001 VESA Framebuffer<br />
[Created at bios.447]<br />
Unique ID: rdCR.BCD4SQrtey2<br />
Hardware Class: framebuffer<br />
Model: &#8220;NVIDIA G86 Board &#8211; e416h01c&#8221;<br />
Vendor: &#8220;NVIDIA Corporation&#8221;<br />
Device: &#8220;G86 Board &#8211; e416h01c&#8221;<br />
SubVendor: &#8220;NVIDIA&#8221;<br />
SubDevice:<br />
Revision: &#8220;Chip Rev&#8221;<br />
Memory Size: 14 MB<br />
Memory Range: 0xcd000000-0xcddfffff (rw)<br />
Mode 0&#215;0300: 640&#215;400 (+640), 8 bits<strong><br />
Mode 0&#215;0361: 1280&#215;800 (+5120), 24 bits</strong> [YO SELECCIONÉ ESTE]<br />
Mode 0&#215;037d: 1920&#215;1200 (+7680), 24 bits<br />
Config Status: cfg=new, avail=yes, need=no, active=unknown</div>
<p style="text-align: justify;">Lo que tienes que hacer es identificar el valor del <em>Mode</em>; en mi caso es <strong>0&#215;0361</strong>&#8230;</p>
<h3>Configurando el GRUB</h3>
<p style="text-align: justify;">Una vez identificado el valor del <em>Mode</em>, no queda más que pasarle a nuestro kernel las opciones adecuadas. Abrimos con nuestro editor de texto favorito el archivo <code>/boot/grub/menu.lst</code>, y añadimos el parámetro <em>vga=modo</em> al final de la línea del kernel. Por ejemplo, en mi caso luce así:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: python;">title Gentoo
root (hd0,9)
kernel /boot/kernel root=/dev/sda10 vga=0x0361</pre>
<p><!--INFOLINKS_ON--></p>
<p>¡Reiniciamos, y listo!</p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/framebuffer/" rel="tag nofollow">framebuffer</a>, <a href="http://casidiablo.net/tag/gentoo/" rel="tag nofollow">gentoo</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a>, <a href="http://casidiablo.net/tag/ubuntu/" rel="tag nofollow">ubuntu</a>, <a href="http://casidiablo.net/tag/videos/" rel="tag nofollow">videos</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/activando-framebuffer-vesafb-linux/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Ubuntu &#8211; Tutoriales, tips, software</title>
		<link>http://casidiablo.net/ubuntu/</link>
		<comments>http://casidiablo.net/ubuntu/#comments</comments>
		<pubDate>Tue, 16 Sep 2008 15:20:51 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[off-topic]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?page_id=1653</guid>
		<description><![CDATA[

Soy un amante de Linux, y como muchos, hace tiempo soñé con una masificación de este sistema operativo. Imaginaba que cada vez más personas utilizarían software libre, y participaban en una verdadera comunidad. Y aunque Debian es mi distro favorita, he visto que Ubuntu está haciendo que ese sueño se haga latente y se acerque [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fubuntu%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ubuntu%20-%20Tutoriales%2C%20tips%2C%20software%22%20%7D);"></div>
<p>Soy un amante de Linux, y como muchos, hace tiempo soñé con una masificación de este sistema operativo. Imaginaba que cada vez más personas utilizarían software libre, y participaban en una verdadera comunidad. Y aunque Debian es mi distro favorita, he visto que Ubuntu está haciendo que ese sueño se haga latente y se acerque a la realidad.</p>
<p>Por tanto, en este blog hablo mucho sobre Ubuntu, me gusta recomendar software, en señar algunos tips, y escribir uno que otro mini tutorial. Todo esto pensando en ofrecer lo mejor al usuario nuevo que venga de Windows, y que espera encontrar una verdadera comunidad amigable y calorosa.</p>
<p><strong>Artículos destacados<br />
</strong></p>
<ul>
<li><a href="http://casidiablo.net/vlc-crear-screencast/">Graba tu escritorio con VLC</a></li>
<li><a href="http://casidiablo.net/habilitar-root-modo-grafico-ubuntu/">Activar usuario root en Ubuntu</a></li>
<li><a href="http://casidiablo.net/mutt-gmail-desde-la-consola/">Manejar tu cuenta Gmail desde la consola</a></li>
<li><a href="http://casidiablo.net/administrar-linux-via-web/">Webmin, administra tu Linux vía web</a></li>
<li><a href="http://casidiablo.net/unir-dividir-pdf/">Unir y partir PDF</a></li>
<li><a href="http://casidiablo.net/archivos-seguros-linux/">3 maneras de mantener seguros tus archivos</a></li>
<li><a href="http://casidiablo.net/pngcrush-optimiza-tus-imagenes-png/">pngcrush, optimiza tus imágenes PNG</a></li>
<li><a href="http://casidiablo.net/partir-ficheros-linux/">Partir archivos en Linux</a></li>
<li><a href="http://casidiablo.net/10-maneras-de-acelerar-el-arranque-en-linux/">10 maneras de acelerar el arranque en Linux</a></li>
<li><a href="http://casidiablo.net/10-tips-productividad-linux/">10 hábitos de productividad en Linux</a></li>
<li><a href="http://casidiablo.net/mover-carpeta-home-a-otra-particion/">Mover directorio /home a otra partición</a></li>
<li><a href="http://casidiablo.net/como-ayudar-a-otros-a-migrar-a-gnulinux/">Cómo ayudar a otros a migrar a Gnu/Linux</a></li>
<li><a href="http://casidiablo.net/%c2%bfque-es-eso-de-linux-%c2%bfporque-usar-linux/">¿Qué es eso de Linux? ¿Porqué usar Linux?</a></li>
</ul>
<p>Por supuesto, <a href="http://casidiablo.net/category/ubuntu">escribo mucho más acerca de Ubuntu</a>, pero los links de arriba son los que considero más relevantes, y espero sea de ayuda.</p>
<p>No está de más recomendar, lo que para mi son, los tres pilares de información para Ubuntu en español:</p>
<ul>
<li><a href="http://www.ubuntips.com.ar/">Ubuntips</a></li>
<li><a href="http://belinuxmyfriend.blogspot.com/">Be linux my friend</a></li>
<li><a href="http://ubuntulife.wordpress.com/">UbuntuLife</a></li>
</ul>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag nofollow">tip</a>, <a href="http://casidiablo.net/tag/ubuntu/" rel="tag nofollow">ubuntu</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
