<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2spanishfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Linux, Java y programación</title>
	
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Fri, 03 Jul 2009 20:37:38 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<thespringbox:skin xmlns:thespringbox="http://www.thespringbox.com/dtds/thespringbox-1.0.dtd">http://feeds.feedburner.com/casidiablo?format=skin</thespringbox:skin><creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-nc-sa/2.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/casidiablo" type="application/rss+xml" /><feedburner:emailServiceId>casidiablo</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/casidiablo" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fcasidiablo" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fcasidiablo" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://add.my.yahoo.com/content?lg=es&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fcasidiablo" src="http://eur.i1.yimg.com/eur.yimg.com/i/es/my/addto1.gif">Subscribe with My Yahoo!</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>A fondo: Tu primer módulo cargable para el Linux kernel</title>
		<link>http://feedproxy.google.com/~r/casidiablo/~3/ShqhgkH4ShM/</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[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[kernel]]></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[<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.</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>
<pre name="code" class="c">
#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 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>
<pre name="code" class="c">
printk(KERN_INFO &quot;Hola, el modulo esta siendo cargado.\n&quot;);
printk(KERN_INFO &quot;El user space del proceso es &#039;%s&#039;\n&quot;, current-&gt;comm);
printk(KERN_INFO &quot;El PID es  %i\n&quot;, current-&gt;pid);
</pre>
<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>
<pre name="code" class="c">
#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 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>
<pre name="code" class="c">
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 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>
<pre name="code" class="c">
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 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>
<pre name="code" class="python">
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
</pre>
<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">how-to</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag">linux</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag">programación</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag">tutorial</a><br /></div>
<img src="http://feeds.feedburner.com/~r/casidiablo/~4/ShqhgkH4ShM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/tu-primer-modulo-cargable-kernel-explicacion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://casidiablo.net/tu-primer-modulo-cargable-kernel-explicacion/</feedburner:origLink></item>
		<item>
		<title>[how-to] Tu primer módulo cargable para el Linux kernel</title>
		<link>http://feedproxy.google.com/~r/casidiablo/~3/xeVvlyuIc1I/</link>
		<comments>http://casidiablo.net/desarrollar-compilar-modulo-linux/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 20:31:15 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[módulos]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3113</guid>
		<description><![CDATA[Este how-to está basado en el artículo The Kernel Newbie Corner: Your First Loadable Kernel Module escrito por Rob Day en Linux.com. En él se enseñan las bases de la programación de módulos para el kernel de Linux. Este primer artículo pretende ilustrar de manera clara los conceptos básicos y espero que, a medida que [...]]]></description>
			<content:encoded><![CDATA[<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" />Este how-to está basado en el artículo <a href="http://www.linux.com/news/software/linux-kernel/23685-the-kernel-newbie-corner-your-first-loadable-kernel-module">The Kernel Newbie Corner: Your First Loadable Kernel Module</a> escrito por <a href="http://www.linux.com/community/profile?userid=7433">Rob Day</a> en Linux.com. En él se enseñan las bases de la <strong>programación de módulos para el kernel de Linux</strong>. Este primer artículo pretende ilustrar de manera clara los conceptos básicos y espero que, a medida que Rob vaya escribiendo más artículos, pueda ir traduciéndolos para ofrecer este excelente contenido en español. Además, funciona para cualquier distro, aunque en este caso lo hice todo sobre Gentoo. Sin más, ¡vamos al grano!</p>
<h3>¿Es necesario tener privilegios de root?</h3>
<p style="text-align: justify;">Mientras desarrollamos el módulo, no. Pero al momento de cargar el módulo necesitaremos privilegios administrativos. Por supuesto, es recomendable que el desarrollo lo hagamos con un usuario normal, y solo al final usemos un <strong>usuario root para cargar o remover los módulos</strong>.</p>
<h3>Prerrequisitos</h3>
<p style="text-align: justify;">Antes de comenzar es necesario saber/tener algunas cosas:</p>
<ul style="text-align: justify;">
<li>La versión del kernel con la que vamos a trabajar (usualmente la que estamos corriendo). Esto lo hacemos con el comando <code>uname -r</code>:
<div class="consola">$ uname -r<br />
2.6.29-gentoo-r5</div>
</li>
<li>El uso de herramientas de desarrollo, como <code>gcc</code>, <code>binutils</code>, etc.</li>
<li>Tener instalados las utilidades para trabajar con módulos (<code>insmod</code>, <code>rmmod</code>, etc.), el cual se encuentra en el paquete <code>module-init-tools</code>.</li>
<li style="text-align: justify;">El código del kernel de Linux, de tal manera que puedas compilar tu módulo contra este.</li>
</ul>
<h3>¿Para qué el código del kernel?</h3>
<p style="text-align: justify;">Esto es realmente importante, así que echaremos un vistazo un poco más profundo. <strong>Cuando compilamos un módulo para Linux es necesario tener el código fuente de algunas partes del kernel</strong>, puesto que muchas instrucciones de preprocesador usadas no se encuentran en los <em>headers</em> estándar de desarrollo. En vez de ello, se encuentran en los headers de kernel.</p>
<p style="text-align: justify;">Podrías simplemente descargar el código del kernel directamente de la página oficial, aunque <strong>lo más sencillo es instalar el paquete que corresponda a la versión del kernel que estemos ejecutando</strong>. Por lo general, este tipo de paquetes instala el código en <code>/usr/src</code> o <code>/usr/src/kernels</code>. Por ejemplo, en Fedora el paquete que debes instalar se llama <code>kernel-dev</code>, mientras que en Gentoo es <code>gentoo-sources</code>.</p>
<p style="text-align: justify;">Una vez tengas el código instalado, es necesario saber exactamente en donde se encuentra, de tal manera que podamos referenciarlo al momento de compilar el módulo. Podrías revisar eso manualmente o, mejor aún, buscar el enlace simbólico hacia el kernel, que por lo general se encuentra en <code>/lib/modules</code>:</p>
<div class="consola" style="text-align: justify;">$ ls -l /lib/modules/`uname -r`<br />
total 104<br />
lrwxrwxrwx 1 root root    31 jun 11 10:24 build -&gt; /usr/src/linux-2.6.29-gentoo-r5<br />
&#8230;</div>
<p style="text-align: justify;">El enlace simbólico que buscamos es <code>build</code>, y como puedes ver en el ejemplo, apunta a la raíz del código del kernel. Esto significa que, cada vez que quieras hacer referencia al kernel en el momento de compilar el módulo, basta con usar dicho enlace.</p>
<h3 style="text-align: justify;">&#8220;Hola, kernel!&#8221;</h3>
<p style="text-align: justify;">Bien, es hora de crear nuestro primer módulo. Sin más rodeos, el código sería el siguiente:</p>
<pre name="code" class="c">
/* El nombre del archivo es &#039;hola.c&#039;. */
#include &lt;linux/module.h&gt;      // para todos los modulos
#include &lt;linux/init.h&gt;        // para las macros entry/exit
#include &lt;linux/kernel.h&gt;      // para usar la macro printk
#include &lt;asm/current.h&gt;       // informacion del proceso (solo por diversion)
#include &lt;linux/sched.h&gt;       // para usar la estructura &quot;task_struct&quot;
static int hola(void)
{
     printk(KERN_INFO &quot;Hola, el modulo esta siendo cargado.\n&quot;);
     printk(KERN_INFO &quot;El user space del proceso es &#039;%s&#039;\n&quot;, current-&gt;comm);
     printk(KERN_INFO &quot;El PID es  %i\n&quot;, current-&gt;pid);
     return 0;       // para indicar que todo ha salido bien
}
static void adios(void)
{
     printk(KERN_INFO &quot;Chao, el modulo esta siendo removido.\n&quot;);
}
module_init(hola);     // lo que se debe llamar al cargar un modulo
module_exit(adios);    // lo que se debe llamar al remover un modulo

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 style="text-align: justify;">Algunas observaciones acerca del código de arriba:</p>
<ul style="text-align: justify;">
<li>Técnicamente, <strong>no es necesario imprimir cosas cada vez que se carga o remueve un módulo</strong> (con <code>printk</code>). Pero puesto que es nuestro primer módulo, y aún no hace nada especial, es más divertido si lo dejamos así.</li>
<li><strong>Es necesario hacer que la función de inicio retorne 0</strong>, si queremos indicar que la carga fue satisfactoria.</li>
<li>No, no es necesario poner una coma después de indicar el nivel de logs (<code>KERN_INFO</code>). Es un error común hacerlo.</li>
</ul>
<p style="text-align: justify;">Eso es todo&#8230; ¡vamos a compilarlo!</p>
<h3 style="text-align: justify;">El archivo Makefile</h3>
<p style="text-align: justify;">Este es el archivo Makefile que necesitaremos:</p>
<p style="text-align: justify;">
<pre name="code" class="python">
ifeq ($(KERNELRELEASE),)  

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)  

.PHONY: build clean

build:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules  

clean:
	rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c
else  

$(info Building with KERNELRELEASE = ${KERNELRELEASE})
obj-m :=    hola.o

endif
</pre>
</p>
<p style="text-align: justify;">Como has de saber, <strong>los archivos Makefile indican las reglas necesarias para compilar código</strong>. En este caso, explicándolo a groso modo, lo que hace el Makefile es detectar que aún nos encontramos en el directorio de desarrollo de nuestro módulo, y por lo tanto se dirige al directorio del kernel, compila el módulo desde ahí y se devuelve. Para probarlo basta con ejecutar el comando <code>make</code>:</p>
<div class="consola" style="text-align: justify;">$ make<br />
make -C /lib/modules/2.6.29-gentoo-r5/build  M=/tmp/hola   modules<br />
make[1]: se ingresa al directorio `/usr/src/linux-2.6.29-gentoo-r5&#8242;<br />
Building with KERNELRELEASE = 2.6.29-gentoo-r5<br />
CC [M]  /tmp/hola/hola.o<br />
Building modules, stage 2.<br />
Building with KERNELRELEASE = 2.6.29-gentoo-r5<br />
MODPOST 1 modules<br />
CC      /tmp/hola/hola.mod.o<br />
LD [M]  /tmp/hola/hola.ko<br />
make[1]: se sale del directorio `/usr/src/linux-2.6.29-gentoo-r5&#8242;</div>
<h3 style="text-align: justify;">Examinar el módulo</h3>
<p style="text-align: justify;">Una vez compiles el módulo <strong>obtendrás un archivo con extensión <code>.ko</code></strong>. Si quieres echarle un ojo a dicho archivo, puedes usar el comando <code>modinfo</code> así:</p>
<div class="consola" style="text-align: justify;">$ 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;">En Gentoo es necesario ejecutarlo con privilegios; en otras distros puedes ejecutarlo normalmente.</p>
<h3 style="text-align: justify;">Cargar o remover el módulo</h3>
<p style="text-align: justify;">Llego la hora de cargar nuestro módulo. Para ello, como comenté anteriormente, es necesario poseer privilegios administrativos. Al grano:</p>
<div class="consola" style="text-align: justify;"># insmod hola.ko<br />
# lsmod<br />
Module                  Size  Used by<br />
hola                    1148  0   &lt;&#8211; GENIAL! Es nuestro módulo!<br />
vboxnetflt             69976  0<br />
vboxdrv                94368  1 vboxnetflt<br />
nvidia               9531788  40<br />
&#8230;<br />
$ sudo rmmod hola</div>
<p style="text-align: justify;">¿Y donde está lo que imprimimos con <code>printk</code>? Bien, no es común imprimir en consola cosas mientras un módulo es cargado o removido; en este caso, <strong>la salida va a dar al archivo de logs principal de Linux</strong> (<code>/var/log/messages</code>); puedes ver la salida con el comando <code>dmesg</code> o directamente en dicho archivo:</p>
<div class="consola" style="text-align: justify;"># dmesg | tail<br />
[20651.176989] Hola, el modulo esta siendo cargado.<br />
[20651.176993] El user space del proceso es &#8216;insmod&#8217;<br />
[20651.176997] El PID es  13786<br />
[20678.497134] Chao, el modulo esta siendo removido.<br />
# tail /var/log/messages</div>
<h3 style="text-align: justify;">Conclusión</h3>
<p style="text-align: justify;">Estas son apenas las bases que deberíamos tener para comenzar con la construcción de un módulo para el kernel de Linux. Es de valiosa ayuda jugar un poco con este ejemplo, de tal manera que podamos estar seguros que todo irá bien cuando hagamos algo un poco más complejo.</p>
<p><a class="tooltip descargacodigo" title="Descargar el código::Contiene: hola.c y Makefile" href="http://casidiablo.net/wordpress/descargar/Codigo+Kernel+Modulo+Hola">Descargar código fuente del ejemplo</a></p>

	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/how-to/" rel="tag">how-to</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag">linux</a>, <a href="http://casidiablo.net/tag/modulos/" rel="tag">módulos</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag">programación</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag">tutorial</a><br /></div>
<img src="http://feeds.feedburner.com/~r/casidiablo/~4/xeVvlyuIc1I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/desarrollar-compilar-modulo-linux/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://casidiablo.net/desarrollar-compilar-modulo-linux/</feedburner:origLink></item>
		<item>
		<title>Video Tutoriales – Creación de Juegos</title>
		<link>http://feedproxy.google.com/~r/casidiablo/~3/7mCB8MHqJf0/</link>
		<comments>http://casidiablo.net/videotutoriales-desarrollo-juegos-java/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 14:52:35 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[video tutoriales]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3105</guid>
		<description><![CDATA[La siguiente es una recopilación de tutoriales hechos por Jorge Rubira, en donde explica el desarrollo de diferentes juegos en diferentes lenguajes de programación (Java, JSP, laszlo, etc.)

Matamarcianos
Algoritmo Minimax
Pong3D con Java3D
Desarrollo de una bolera virtual
Game Maker
Juego de coches
MazeRunner
Búsqueda de soluciones basadas en IA
El juego del trilero
Tiro a diana
Busca las minas
Tragaperras
Tetris


	Etiquetas: java, programación, video tutoriales
]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-3106" title="video" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/06/video.png" alt="video" width="150" height="137" />La siguiente es una recopilación de tutoriales hechos por <a href="http://weblogs.javahispano.org/jh/entry/integrantes_de_javahispano_jorge_rubira">Jorge Rubira</a>, en donde explica el desarrollo de diferentes juegos en diferentes lenguajes de programación (Java, JSP, laszlo, etc.)</p>
<ul>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/wordpress/descargar/Matamarcianos">Matamarcianos</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/wordpress/descargar/Algoritmo+Minimax">Algoritmo Minimax</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/wordpress/descargar/Pong3D+con+Java3D">Pong3D con Java3D</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/wordpress/descargar/Desarrollo+de+una+bolera+virtual">Desarrollo de una bolera virtual</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/wordpress/descargar/Game+Maker">Game Maker</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/wordpress/descargar/Juego+de+coches">Juego de coches</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/wordpress/descargar/MazeRunner">MazeRunner</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/wordpress/descargar/Busqueda+soluciones+basadas+IA">Búsqueda de soluciones basadas en IA</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/wordpress/descargar/El+juego+del+trilero">El juego del trilero</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/wordpress/descargar/Tiro+a+diana">Tiro a diana</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/wordpress/descargar/Busca+las+minas">Busca las minas</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/wordpress/descargar/Tragaperras">Tragaperras</a></li>
<li><a class="tooltip" title="Descargar video y código" href="http://casidiablo.net/wordpress/descargar/Tetris">Tetris</a></li>
</ul>

	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/java/" rel="tag">java</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag">programación</a>, <a href="http://casidiablo.net/tag/video-tutoriales/" rel="tag">video tutoriales</a><br /></div>
<img src="http://feeds.feedburner.com/~r/casidiablo/~4/7mCB8MHqJf0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/videotutoriales-desarrollo-juegos-java/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://casidiablo.net/videotutoriales-desarrollo-juegos-java/</feedburner:origLink></item>
		<item>
		<title>[How-to] Instalar Firefox 3.5 RC en Gentoo</title>
		<link>http://feedproxy.google.com/~r/casidiablo/~3/yMAxa7XDHDI/</link>
		<comments>http://casidiablo.net/how-to-instalar-firefox-3-5-rc-en-gentoo/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 13:28:27 +0000</pubDate>
		<dc:creator>Cortex</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Firefox]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3079</guid>
		<description><![CDATA[Hola a todos, mi nombre es Juan Esteban (Cortex), y al igual que mi amigo Cristian uso la meta-distribución Gentoo Linux. Para los que no lo sabían la organización Mozilla anda trabajando actualmente en la versión 3.5 del navegador Firefox y hace un par de días se encuentra disponible la versión Release Candidate 2, la [...]]]></description>
			<content:encoded><![CDATA[<p>Hola a todos, mi nombre es <strong>Juan Esteban</strong> (<a title="Cortex" href="http://www.dragonjar.org/author/c0rt3x"><strong>Cortex</strong></a>), y al igual que mi amigo <strong>Cristian</strong> uso la <em>meta-distribución</em> <strong><a title="Gentoo" href="http://casidiablo.net/category/gentoo/">Gentoo Linux</a>. </strong>Para los que no lo sabían la organización Mozilla anda trabajando actualmente en la versión 3.5 del navegador Firefox y hace un par de días se encuentra disponible la versión Release Candidate 2, la cual incluye ya múltiples mejoras y agregados.</p>
<p>Entre sus nuevas funciones podemos destacar:</p>
<ul>
<li>La posibilidad de ver videos sin hacer uso de plugins ó reproductores externos.</li>
<li>La disponibilidad del modo de navegación privado y la herramienta para limpiar el historial, la cual ha sido actualizada, permitiendo seleccionar también el rango de tiempo del cual se hará la limpieza.</li>
<li>Controlar los resultados de la barra de localización haciendo uso de caracteres especiales.</li>
<li><a title="Firefox 3.5" href="http://www.mozilla.com/en-US/firefox/3.5/whatsnew/">Mucho más&#8230;</a></li>
</ul>
<p>Ahora bien, veamos como podemos instalarlo en Gentoo.</p>
<h3>1. Actualizar el árbol de Portage</h3>
<p>Lo primero es actualizar el árbol de Portage para poder hacer uso del ebuild de Firefox 3.5 RC2.</p>
<div class="consola">emerge &#8211;sync</div>
<p>Para verificar si ya se encuentra disponible el ebuild en nuestro directorio de Portage, podríamos hacerlo de la siguiente manera:</p>
<div class="consola">ls -l /usr/portage/www-client/mozilla-firefox-bin/ | grep 3.5</div>
<h3>2. Desenmascarar el paquete</h3>
<p>Al ser una versión aún <em>inestable</em> el paquete viene por defecto enmascarado así que debemos primero desenmascararlo para poder hacer uso de él.</p>
<div class="consola">touch /usr/portage/profiles/package.unmask # En caso de que no tengas el archivo creado<br />
echo &#8216;&gt;=www-client/mozilla-firefox-bin-3.1_alpha1&#8242; &gt;&gt; /usr/portage/profiles/package.unmask</div>
<div class="nota">Advertencia: Recuerda que aún es una versión de pruebas y no debería de ser usada sino para eso, probar. Además los bugs que detectes no deben ser reportados al Bugzilla de Gentoo sino directamente a Mozilla.</div>
<h3>3. Instalar Firefox 3.5 RC2</h3>
<p>De momento <strong>sólo se encuentra disponible el paquete precompilado</strong>. Para instalarlo con el idioma español podríamos editar nuestro archivo <code>/etc/make.conf</code> y agregarle la línea:</p>
<div class="consola">LINGUAS=&#8221;es es_ES&#8221;</div>
<p>En caso de que sólo quieras hacerlo temporalmente y sólo para este paquete ó agregar también el soporte para otros idiomas, puedes anteponer la línea escrita anteriormente al emerger el paquete.</p>
<p>Ahora sí, instalemos:</p>
<div class="consola">emerge -av =mozilla-firefox-bin-3.5_rc2</div>
<div class="nota">Nota: Recuerda agregar un = antes del paquete para especificarle cual es la versión que queremos instalar, si no lo haces te aparecerá que el ebuild no existe.</div>
<h3>4. Ejecutar Firefox</h3>
<p>En <strong>Gnome</strong> se encuentra en el menú Aplicaciones -&gt; Internet -&gt; Mozilla Firefox (bin). Sí, el que tiene el ícono más colorido <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Con esto terminamos. Espero les sirva, y además espero escribir más seguido <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Saludos!</p>

	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/firefox/" rel="tag">Firefox</a>, <a href="http://casidiablo.net/tag/gentoo/" rel="tag">gentoo</a><br /></div>
<img src="http://feeds.feedburner.com/~r/casidiablo/~4/yMAxa7XDHDI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/how-to-instalar-firefox-3-5-rc-en-gentoo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://casidiablo.net/how-to-instalar-firefox-3-5-rc-en-gentoo/</feedburner:origLink></item>
		<item>
		<title>[how-to] Activando soporte para ext4 en Gentoo u otras distros</title>
		<link>http://feedproxy.google.com/~r/casidiablo/~3/OTo-yVcUt1w/</link>
		<comments>http://casidiablo.net/como-activar-ext4-linux/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 22:11:31 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[gentoo]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[ext4]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[kernel]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3070</guid>
		<description><![CDATA[Este es un pequeño how-to en donde explico cómo activar el soporte para el sistema de archivos ext4 en Gentoo.  El tutorial está enfocado hacia distribuciones que, como Gentoo, no tengan activado dicho soporte y en donde es necesario recompilar el kernel para hacerlo funcionar.
Espero que sirva de paso para mostrar un poco el proceso [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Este es un pequeño how-to en donde explico cómo activar el soporte para el sistema de archivos <a href="http://es.wikipedia.org/wiki/Ext4">ext4</a> en Gentoo.  El tutorial está enfocado hacia distribuciones que, como <a href="http://www.gentoo.org/">Gentoo</a>, no tengan activado dicho soporte y en donde es necesario recompilar el kernel para hacerlo funcionar.</p>
<p style="text-align: justify;">Espero que sirva de paso para mostrar un poco el proceso de recompilación del kernel, que a primera vista puede sonar difícil, pero que en realidad es algo muy sencillo y saludable <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>0. Prerequisitos</h3>
<p style="text-align: justify;">Es necesario tener el paquete e2fsprogs y las fuentes del <a href="http://es.wikipedia.org/wiki/Linux_(núcleo)">kernel de linux</a>. Para ello, basta con ejecutar este comando:</p>
<div class="consola">emerge -au e2fsprogs gentoo-sources</div>
<h3>1. Configurando nuestro kernel</h3>
<p style="text-align: justify;">Lo que haremos a continuación será configurar el kernel para activar el soporte al sistema de archivos ext4. Para ello, abrimos una consola y entramos en el directorio donde se encuentren las fuentes, por ejemplo /usr/src/linux-2.6.30-gentoo-r5. Estando allí, iniciamos el configurador gráfico del kernel con este comando:</p>
<div class="consola">make menuconfig</div>
<p style="text-align: justify;">Una vez hayamos hecho esto, debemos navegar y dar enter en la opción <code>File systems</code>, y seleccionar (con la tecla espacio) <code>The Extended 4 (ext4) filesystem</code>. Debería quedar así:</p>
<pre name="code" class="python">
File systems  ---&gt;
     &lt;*&gt; The Extended 4 (ext4) filesystem
     [ ]   Enable ext4dev compatibility
     [ ]   Ext4 extended attributes
     [ ]     Ext4 POSIX Access Control Lists
     [ ]     Ext4 Security Labels
</pre>
<p style="text-align: justify;">Además, por defecto las particiones que se crean con ext4 tienen activada la opción huge_file, lo cual permite que se manejen ficheros de un gran tamaño. Por ello, es necesario activar la opción <code>Support for Large single files</code> del kernel. Dicha opción se encuentra en <code>Enable the block layer</code> y debería lucir así:</p>
<pre name="code" class="python">
Enable the block layer ---&gt;
     --- Enable the block layer
     [*]   Support for Large single files
</pre>
<p style="text-align: justify;">Una vez hayamos configurado el kernel, salimos de la configuración presionando el botón exit, compilamos e instalamos:</p>
<div class="consola">make<br />
cp arch/x86/boot/bzImage /boot/kernel &lt;&#8211; depende de tu configuración</div>
<h3>2. Crear y montar particiones con el sistema de archivos ext4</h3>
<p>Para ello basta con usar el comando <code>mkfs.ext4</code>, por ejemplo:</p>
<div class="consola">mkfs.ext4 /dev/sda2</div>
<p>Para montar la partición:</p>
<div class="consola">mount -t ext4 /dev/sda2 /media/cosas</div>
<h3>3. Convirtiendo ext3 a ext4</h3>
<p style="text-align: justify;">Ten en cuenta que puedes montar una partición ext3 con la opción <code>-t ext4</code> y todo funcionará bien, aunque no tendrás disponibles las características de ext4. Si deseas, puedes convertir una partición que se encuentra en ext3 a ext4. Para ello puedes ejecutar el siguiente comando:</p>
<div class="nota">Advertencia: esto hará que no puedas volver a montar la partición como ext3.</div>
<div class="consola">tune2fs -O extents,uninit_bg,dir_index /dev/dispositivo</div>
<p style="text-align: justify;">Es recomendable hacer un chequeo de la partición para verificar que todo haya salido bien:</p>
<div class="consola">fsck -pf /dev/dispositivo</div>
<h3>Más información:</h3>
<p><a href="http://fr.gentoo-wiki.com/wiki/Ext4">http://fr.gentoo-wiki.com/wiki/Ext4</a></p>

	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/ext4/" rel="tag">ext4</a>, <a href="http://casidiablo.net/tag/gentoo/" rel="tag">gentoo</a>, <a href="http://casidiablo.net/tag/how-to/" rel="tag">how-to</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag">linux</a><br /></div>
<img src="http://feeds.feedburner.com/~r/casidiablo/~4/OTo-yVcUt1w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/como-activar-ext4-linux/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://casidiablo.net/como-activar-ext4-linux/</feedburner:origLink></item>
		<item>
		<title>Video Tutorial de Introducción a MonoDevelop</title>
		<link>http://feedproxy.google.com/~r/casidiablo/~3/rCrx4oo2uQk/</link>
		<comments>http://casidiablo.net/video-introduccion-monodevelop/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 03:22:08 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[video tutoriales]]></category>
		<category><![CDATA[monodevelop]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3063</guid>
		<description><![CDATA[¡Hola de nuevo! En esta ocasión me gustaría compartir con ustedes este video tutorial acerca de MonoDevelop. No es nada avanzado, solo muestra algunas características de este IDE. El video en cuestión lo grabé hace más o menos siete meses, pero casualmente había olvidado que lo había grabado   Y, aunque ya vamos en [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">¡Hola de nuevo! En esta ocasión me gustaría compartir con ustedes este video tutorial acerca de MonoDevelop. No es nada avanzado, solo muestra algunas características de este IDE. El video en cuestión lo grabé hace más o menos siete meses, pero casualmente había olvidado que lo había grabado <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  Y, aunque ya vamos en la versión 2 de MonoDevelop, no quiero perder el trabajo que alguna vez hice.</p>
<p style="text-align: justify;"><embed src="http://blip.tv/play/g9MGgYjCR5OibA%2Em4v" type="application/x-shockwave-flash" width="640" height="430" allowscriptaccess="always" allowfullscreen="true"></embed></p>
<p style="text-align: justify;">Como siempre, pueden encontrar el vídeo en <a title="Esta dividido en dos partes (Youtube solo deja videos menores de 10 minutos)" href="http://www.youtube.com/watch?v=sbdI1iSoRYE">Youtube</a> o en <a href="http://www.vimeo.com/5084692">Vimeo</a>. Aunque creo que hay un pedazo que se ve feo y el sonido no es el mejor, espero que les guste y disculpen lo feo <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>

	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/net/" rel="tag">.net</a>, <a href="http://casidiablo.net/tag/c-sharp/" rel="tag">C-Sharp</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag">linux</a>, <a href="http://casidiablo.net/tag/mono/" rel="tag">mono</a>, <a href="http://casidiablo.net/tag/monodevelop/" rel="tag">monodevelop</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag">programación</a>, <a href="http://casidiablo.net/tag/video/" rel="tag">video</a>, <a href="http://casidiablo.net/tag/video-tutoriales/" rel="tag">video tutoriales</a><br /></div>
<img src="http://feeds.feedburner.com/~r/casidiablo/~4/rCrx4oo2uQk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/video-introduccion-monodevelop/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://casidiablo.net/video-introduccion-monodevelop/</feedburner:origLink></item>
		<item>
		<title>Video Tutorial VirtualBox: ejecutar sistemas operativos REALES</title>
		<link>http://feedproxy.google.com/~r/casidiablo/~3/6aIeY1Zp04Q/</link>
		<comments>http://casidiablo.net/correr-diferentes-so-instalados-con-vbox/#comments</comments>
		<pubDate>Mon, 11 May 2009 19:51:27 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Arch Linux]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[opensuse]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[video tutoriales]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[sistemas operativos]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[virtualbox]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3043</guid>
		<description><![CDATA[Hola amigos&#8230; he grabado un pequeño vídeo en donde enseño cómo ejecutar varios sistemas operativos REALES, es decir, que no son virtuales, al mismo tiempo usando VirtualBox. Por ejemplo, si tienes instalado Windows XP, Ubuntu y Fedora, y en cada uno tienes aplicaciones que usas a diario, podrías ejecutar Windows XP desde Ubuntu sin necesidad [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Hola amigos&#8230; he grabado un pequeño vídeo en donde enseño cómo ejecutar varios sistemas operativos REALES, es decir, que no son virtuales, al mismo tiempo usando VirtualBox. Por ejemplo, si tienes instalado Windows XP, Ubuntu y Fedora, y en cada uno tienes aplicaciones que usas a diario, podrías ejecutar Windows XP desde Ubuntu sin necesidad de tener que reiniciar el equipo.</p>
<p style="text-align: justify;">Esto tiene una gran ventaja frente al típico entorno en el cual tienes máquinas virtuales instaladas ya que, cuando realmente quieras usar el otro sistema operativo, lo ejecutas directamente en tu máquina sin las limitaciones de RAM o aceleración gráfica. Es más o menos lo que explicaba en <a href="http://casidiablo.net/correr-windows-preinstalado-sobre-ubuntu/">esta entrada, en donde lo hacia con Windows XP</a>. Pero puesto que algunos han tenido problemas con eso, y otros más me han pedido algo de información más detallada, mejor dejar todo registrado en este vídeo.</p>
<p style="text-align: justify;"><embed src="http://blip.tv/play/gs1QgYDVY5OibA" type="application/x-shockwave-flash" width="640" height="430" allowscriptaccess="always" allowfullscreen="true"></embed></p>
<p style="text-align: justify;">Como siempre lo he subido en <a href="http://blip.tv/file/2097553">Blip.tv</a>, <a href="http://www.youtube.com/watch?v=DcmLNy08iag">Youtube</a> y <a href="http://www.vimeo.com/4591443">Vimeo</a>. El vídeo es completamente libre, puedes darle el uso que desees; si deseas el vídeo original para cualquier propósito me contactan por correo.</p>

	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/how-to/" rel="tag">how-to</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag">linux</a>, <a href="http://casidiablo.net/tag/sistemas-operativos/" rel="tag">sistemas operativos</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag">tip</a>, <a href="http://casidiablo.net/tag/video/" rel="tag">video</a>, <a href="http://casidiablo.net/tag/video-tutoriales/" rel="tag">video tutoriales</a>, <a href="http://casidiablo.net/tag/virtualbox/" rel="tag">virtualbox</a>, <a href="http://casidiablo.net/tag/windows/" rel="tag">Windows</a><br /></div>
<img src="http://feeds.feedburner.com/~r/casidiablo/~4/6aIeY1Zp04Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/correr-diferentes-so-instalados-con-vbox/feed/</wfw:commentRss>
		<slash:comments>63</slash:comments>
		<feedburner:origLink>http://casidiablo.net/correr-diferentes-so-instalados-con-vbox/</feedburner:origLink></item>
		<item>
		<title>Video tutorial de introducción a las shellcodes en Linux</title>
		<link>http://feedproxy.google.com/~r/casidiablo/~3/w_G98gwD7Ak/</link>
		<comments>http://casidiablo.net/video-tutorial-shellcodes-linux/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 22:29:21 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[hacking]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[video tutoriales]]></category>
		<category><![CDATA[videos]]></category>
		<category><![CDATA[politécnico]]></category>
		<category><![CDATA[shellcodes]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3037</guid>
		<description><![CDATA[Uff&#8230; ya llevo bastante sin pasarme por este, mi querido blog. Puesto que ya no cuento con el mismo tiempo de antes es muy poco lo que puedo publicar; así que, aprovecho a colocar trabajos de la universidad que, de una u otra forma, podrían serviles a alguien. El video tutorial que verán a continuación [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Uff&#8230; ya llevo bastante sin pasarme por este, mi querido blog. Puesto que ya no cuento con el mismo tiempo de antes es muy poco lo que puedo publicar; así que, aprovecho a colocar trabajos de la universidad que, de una u otra forma, podrían serviles a alguien. El video tutorial que verán a continuación con tiene una pequeña (muy pequeña) introducción a lo que son los shellcodes en Linux:</p>
<p><object width="640" height="430" data="http://blip.tv/play/gs1Q_pBRk6Js" type="application/x-shockwave-flash"><param name="src" value="http://blip.tv/play/gs1Q_pBRk6Js" /><param name="allowfullscreen" value="true" /></object></p>
<p style="text-align: justify;">También <a href="http://youtube.com/watch?v=hNBdzUce4F8">lo subí a Youtube</a>, por si no te gusta blip.tv. No es definitivamente el mejor video que hemos hecho, pero de seguro le será útil a alguien. Si deseas necesitas el video original, me puedes escribir solicitándolo, aunque creo que es suficiente con que esté en internet; no pongo el link descarga por cuestiones de recursos <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Te recomiendo además <a href="http://www.wired.com/threatlevel/2009/03/conficker-how-a/">esta animación</a> en donde se explica qué es y cómo funcionan las vulnerabilidades de buffer overflow.</p>

	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/hacking/" rel="tag">hacking</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag">linux</a>, <a href="http://casidiablo.net/tag/politecnico/" rel="tag">politécnico</a>, <a href="http://casidiablo.net/tag/shellcodes/" rel="tag">shellcodes</a>, <a href="http://casidiablo.net/tag/video/" rel="tag">video</a>, <a href="http://casidiablo.net/tag/video-tutoriales/" rel="tag">video tutoriales</a><br /></div>
<img src="http://feeds.feedburner.com/~r/casidiablo/~4/w_G98gwD7Ak" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/video-tutorial-shellcodes-linux/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://casidiablo.net/video-tutorial-shellcodes-linux/</feedburner:origLink></item>
		<item>
		<title>Tip: resaltar sintaxis de código en nano</title>
		<link>http://feedproxy.google.com/~r/casidiablo/~3/lKeyaomlv7c/</link>
		<comments>http://casidiablo.net/howto-resaltar-codigo-nano-linux/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 14:22:56 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Arch Linux]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[opensuse]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[nano]]></category>
		<category><![CDATA[resaltar]]></category>
		<category><![CDATA[sintaxis]]></category>
		<category><![CDATA[tip]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3031</guid>
		<description><![CDATA[Nano es sin duda mi editor de texto favorito: es simple, es rápido y anticuado (?). Me encanta usarlo aun cuando estoy en un entorno gráfico y tengo la posibilidad de usar Gedit o Kate. Este tip es bastante sencillo y hace que nano resalte el código fuente de los programos que estemos editando.
Basta con [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Nano es sin duda mi editor de texto favorito: es simple, es rápido y anticuado (?). Me encanta usarlo aun cuando estoy en un entorno gráfico y tengo la posibilidad de usar Gedit o Kate. Este tip es bastante sencillo y hace que nano resalte el código fuente de los programos que estemos editando.</p>
<p style="text-align: justify;">Basta con crear un archivo llamado <em>.nanorc</em> en el directorio home (<code>nano ~/.nanorc</code>) de nuestro usuario, y poner algo como esto (para PHP):</p>
<pre name="code" class="python">
syntax &quot;php&quot; &quot;\.php[2345s~]?$&quot;
color brightblue &quot;(.*)\(&quot;
color blue &quot;\$[a-zA-Z_0-9$]*|[=!&lt;&gt;]&quot;
color green &quot;(var|class|function|echo|case|break|default|exit|switch|if|else|elseif|@|while)\s&quot;
color green &quot;[.,{}();]&quot;
color red &quot;(&#039;[^&#039;]*&#039;)|(\&quot;[^&quot;]*\&quot;)&quot;
color brightyellow &quot;(#.*|//.*)$&quot;
color brightyellow start=&quot;/\*&quot; end=&quot;\*/&quot;
color brightblue &quot;(&lt;\?(php)?|\?&gt;)&quot;
color white start=&quot;\?&gt;&quot; end=&quot;&lt;\?(php)?&quot;
</pre>
<p style="text-align: justify;"><a href="http://wiki.linuxhelp.net/index.php/Nano_Syntax_Highlighting">Este es un listado completo</a> de la configuración para el resaltado de sintaxis en otros lenguajes de programación. Personalmente tengo sólo los que uso (Java, C/C++, SQL, Python, HTML y PHP), pero hay muchos más. Además, como puedes ver son fáciles de crear o modificar. El resultado es algo como esto:</p>
<p style="text-align: center;"><img title="ejemplo-nano" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/04/ejemplo-nano.png" alt="resaltar sintaxis nano" width="474" height="404" /></p>
<p>¡Nada mejor que nano!</p>

	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/linux/" rel="tag">linux</a>, <a href="http://casidiablo.net/tag/nano/" rel="tag">nano</a>, <a href="http://casidiablo.net/tag/resaltar/" rel="tag">resaltar</a>, <a href="http://casidiablo.net/tag/sintaxis/" rel="tag">sintaxis</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag">tip</a><br /></div>
<img src="http://feeds.feedburner.com/~r/casidiablo/~4/lKeyaomlv7c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/howto-resaltar-codigo-nano-linux/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		<feedburner:origLink>http://casidiablo.net/howto-resaltar-codigo-nano-linux/</feedburner:origLink></item>
		<item>
		<title>Ejemplo fullscreen y cómo crear ventanas sin bordes en Java</title>
		<link>http://feedproxy.google.com/~r/casidiablo/~3/Xz6XkPFaPgc/</link>
		<comments>http://casidiablo.net/pantalla-completa-java/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 15:11:41 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>
		<category><![CDATA[fullscreen]]></category>
		<category><![CDATA[pantalla completa]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3028</guid>
		<description><![CDATA[Este es un tip bastante útil que nos permitirá poner las ventanas de nuestras aplicaciones en Fullscreen (pantalla completa), y de paso aprenderemos a crear ventanas sin bordes (lo cual es útil si queremos hacer algún splash de inicio para nuestra aplicación).
En el siguiente ejemplo usaremos básicamente los siguientes métodos y clases:

Método setUndecorated de la [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Este es un tip bastante útil que nos permitirá poner las ventanas de nuestras aplicaciones en Fullscreen (pantalla completa), y de paso aprenderemos a crear ventanas sin bordes (lo cual es útil si queremos hacer algún splash de inicio para nuestra aplicación).</p>
<p style="text-align: justify;">En el siguiente ejemplo usaremos básicamente los siguientes métodos y clases:</p>
<ul style="text-align: justify;">
<li>Método <code>setUndecorated</code> de la clase <code>JFrame</code>, el cual recibe un parámetro <code>boolean</code>. Si le enviamos true, quitará los bordes de la ventana.</li>
<li>La clase <code>GraphicsDevice</code> nos permite manejar objetos que representan dispositivos gráficos, como la pantalla del computador. En este caso creamos el  objeto con la instrucción <code>GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();</code> que nos devuelve un objeto que representa la pantalla en donde se está mostrando nuestro programa.</li>
<li>El método <code>setFullScreenWindow</code>, de la clase <code>GraphicsDevice</code>, nos permite poner nuestro programa en pantalla completa. Además, aunque no lo usemos en el ejemplo, contamos con el método <code>isFullScreenSupported</code> que nos permite saber si es posible poner la ventana en modo fullscreen o no.</li>
</ul>
<h3>Código fuente del ejemplo&#8230;</h3>
<pre name="code" class="java">
import javax.swing.*;
import java.awt.GraphicsEnvironment;
import java.awt.GraphicsDevice;
import java.awt.event.*;

public class EjemploFullscreen extends JFrame implements ActionListener{
        private JButton boton;
        private boolean estaFull = false;
        static GraphicsDevice grafica=
                GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        public EjemploFullscreen() {
                super(&quot;Ejemplo pantalla completa en Java&quot;);

                boton = new JButton(&quot;Presioname&quot;);
                boton.addActionListener(this);
                getContentPane().add(boton);

                setSize(640, 400);
                setUndecorated(true);
                setVisible(true);
        }

        public static void main(String[] args) {
                new EjemploFullscreen();
        }

        public void actionPerformed(ActionEvent e) {
                if(!estaFull)
                        grafica.setFullScreenWindow(this);
                else
                        grafica.setFullScreenWindow(null);
                estaFull = !estaFull;
        }
}
</pre>
<p><a class="tooltip descargacodigo" title="Descarga las fuentes del ejemplo" href="http://casidiablo.net/wordpress/descargar/Ejemplo+Pantalla+Completa">Descargar código fuente</a></p>

	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/ejemplo/" rel="tag">ejemplo</a>, <a href="http://casidiablo.net/tag/ejercicio/" rel="tag">ejercicio</a>, <a href="http://casidiablo.net/tag/fullscreen/" rel="tag">fullscreen</a>, <a href="http://casidiablo.net/tag/java/" rel="tag">java</a>, <a href="http://casidiablo.net/tag/pantalla-completa/" rel="tag">pantalla completa</a><br /></div>
<img src="http://feeds.feedburner.com/~r/casidiablo/~4/Xz6XkPFaPgc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/pantalla-completa-java/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://casidiablo.net/pantalla-completa-java/</feedburner:origLink></item>
		<item>
		<title>La clase BigInteger en Java</title>
		<link>http://feedproxy.google.com/~r/casidiablo/~3/Jxmf1_0X1VM/</link>
		<comments>http://casidiablo.net/numeros-primos-java-biginteger/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 18:14:15 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[BigInteger]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ejercicios]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3021</guid>
		<description><![CDATA[BigInteger y BigDecimal son clases envoltura de los tipos primitivos int y double, sin embargo tienen ventajas sobre los tipos primitivos. Cuando necesites usar números grandes en Java la mejor opción es usar estas clases, ya que su limite de almacenamiento es el límite de memoria que tenga la máquina virtual de Java.
Además, estas clases [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><code>BigInteger</code> y <code>BigDecimal</code> son clases envoltura de los tipos primitivos <code>int</code> y <code>double</code>, sin embargo tienen ventajas sobre los tipos primitivos. Cuando necesites usar números grandes en Java la mejor opción es usar estas clases, ya que su limite de almacenamiento es el límite de memoria que tenga la máquina virtual de Java.</p>
<p style="text-align: justify;">Además, estas clases proporcionan algunos métodos bastante interesantes, como las operaciones básicas o saber si el número es primo o no. Como siempre vamos con algunos ejemplos de apoyo:</p>
<h3 style="text-align: justify;">Operaciones básicas con la clase BigInteger</h3>
<p style="text-align: justify;">En el siguiente ejemplo se hace uso de los métodos <em>add</em>, <em>substract</em>, <em>multiply</em> y <em>divide</em> para realizar las operaciones básicas de suma, resta, multiplicación y división:<span id="more-3021"></span></p>
<pre name="code" class="java">
import java.math.BigInteger;
public class PruebaOperacionesBasicas {
    public static void main(String args[]){
        BigInteger entero1 = BigInteger.valueOf(45);
        BigInteger entero2 = BigInteger.valueOf(15);
        //sumar con metodo add()
        String texto = &quot;La suma entre &quot;+entero1+
                &quot; y &quot;+entero2+&quot; es &quot;+entero1.add(entero2);
        //restar con metodo substract()
        texto += &quot;\nLa resta entre &quot;+entero1+
                &quot; y &quot;+entero2+&quot; es &quot;+entero1.subtract(entero2);
        //multiplicar con metodo multiply()
        texto += &quot;\nEl producto de &quot;+entero1+
                &quot; y &quot;+entero2+&quot; es &quot;+entero1.multiply(entero2);
        //dividir con metodo divide()
        texto += &quot;\nLa división de &quot;+entero1+
                &quot; y &quot;+entero2+&quot; entre &quot;+entero1.divide(entero2);
        System.out.println(texto);
    }
}
</pre>
<h3 style="text-align: justify;">Números primos en Java</h3>
<p style="text-align: justify;">Este es un típico ejercicio que nos plantean en la universidad; se trata de hacer un listado de los primeros X números primos. En este caso <code>BigInteger</code> nos proporciona dos métodos muy interesantes: <em>isProbablePrime</em> y <em>nextProbablePrime</em>. El primero de ellos devuelve <code>true</code> si el número es probablemente primo (recordemos que es complejo saber si un número es o no primo cuando es demasiado grande); el segundo devuelve el próximo posible número primo a partir del valor que contenga el objeto.</p>
<p style="text-align: justify;">La siguiente aplicación usa el método <em>nextProbablePrime</em> para listar los primeros 2000 números primos:</p>
<pre name="code" class="java">
import java.math.BigInteger;
public class PruebaNumerosPrimos {
    public static void main(String args[]){
        //iniciar el entero en cero
        BigInteger entero = BigInteger.ZERO;
        StringBuffer texto = new StringBuffer();
        for(int i = 0; i&lt;2000; i++){
            entero = entero.nextProbablePrime();
            texto.append(entero+&quot;\n&quot;);
            entero.add(BigInteger.ONE);
        }
        System.out.println(texto);
    }
}
</pre>
<p style="text-align: justify;"><strong>Otros métodos interesantes</strong></p>
<p style="text-align: justify;">La clase <code>BigInteger</code> proporciona además otros métodos que nos ahorrarán bastante tiempo y líneas de código:</p>
<ul style="text-align: justify;">
<li><em>pow</em>, nos permite elevar un número a la potencia que deseemos.</li>
<li><em>comparteTo</em>, nos permite comparar si un BigInteger es mayor, igual o menor que otro.</li>
<li><em>min</em> y <em>max</em>, nos permiten saber cuál de los dos BigInteger es menor o mayor.</li>
</ul>
<p style="text-align: justify;">Como mencioné al principio, también es posible usar la clase <code>BigDecimal</code> que funciona de manera similar pero con números de coma flotante.</p>
</p>
<p><a class="descargacodigo tooltip" title="Descargar archivo ZIP con las fuentes del ejemplo" href="http://casidiablo.net/wordpress/descargar/Pruebas+BigInteger"><strong>Descargar código fuente de ejemplos</strong></a></p>

	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/biginteger/" rel="tag">BigInteger</a>, <a href="http://casidiablo.net/tag/ejemplos/" rel="tag">ejemplos</a>, <a href="http://casidiablo.net/tag/ejercicios/" rel="tag">ejercicios</a>, <a href="http://casidiablo.net/tag/java/" rel="tag">java</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag">programación</a><br /></div>
<img src="http://feeds.feedburner.com/~r/casidiablo/~4/Jxmf1_0X1VM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/numeros-primos-java-biginteger/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://casidiablo.net/numeros-primos-java-biginteger/</feedburner:origLink></item>
		<item>
		<title>El podcast de Marvin #1</title>
		<link>http://feedproxy.google.com/~r/casidiablo/~3/mvczgpo8CL8/</link>
		<comments>http://casidiablo.net/el-podcast-de-marvin-1/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 17:02:50 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[noticias]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[marvin]]></category>
		<category><![CDATA[podcast]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3014</guid>
		<description><![CDATA[Comenzamos bien la semana&#8230; me entero que uno de mis mejores amigos &#8220;virtuales&#8221;, Marvin del Blog de Marvin y Familia, ha decidido iniciar un podcast. Así que, aquí tienen su primera entrega, que como verán promete cosas muy buenas a futuro.
Los temas tratados en este primer número son:

CentOS 5.3
Encarta cierra
KDE 4.2.2
TuxInfo 15
Linux Fundation dice no [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Comenzamos bien la semana&#8230; me entero que uno de mis mejores amigos &#8220;virtuales&#8221;, Marvin del <a href="http://www.maty1206linuxeando.com">Blog de Marvin y Familia</a>, ha decidido iniciar un podcast. Así que, aquí tienen su <a href="http://www.maty1206linuxeando.com/podcast/index.php?id=2">primera entrega</a>, que como verán promete cosas muy buenas a futuro.</p>
<p>Los temas tratados en este primer número son:</p>
<ul>
<li>CentOS 5.3</li>
<li>Encarta cierra</li>
<li>KDE 4.2.2</li>
<li>TuxInfo 15</li>
<li>Linux Fundation dice no a FAT</li>
</ul>
<p>Además, algo totalmente loable es que se distribuya con el formato libre OGG:</p>
<p><a class="tooltip download" title="¡Descargar!" href="http://www.marvinortega.com/ftp/podcast/1/1.ogg"><strong>Descargar</strong></a></p>

	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/linux/" rel="tag">linux</a>, <a href="http://casidiablo.net/tag/marvin/" rel="tag">marvin</a>, <a href="http://casidiablo.net/tag/podcast/" rel="tag">podcast</a>, <a href="http://casidiablo.net/tag/software-libre/" rel="tag">software libre</a><br /></div>
<img src="http://feeds.feedburner.com/~r/casidiablo/~4/mvczgpo8CL8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/el-podcast-de-marvin-1/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://casidiablo.net/el-podcast-de-marvin-1/</feedburner:origLink></item>
		<item>
		<title>Los mejores vídeos de Youtube en VideosYoutube.tv</title>
		<link>http://feedproxy.google.com/~r/casidiablo/~3/9nQCBUrDWqs/</link>
		<comments>http://casidiablo.net/los-mejores-videos-de-youtube-en-videosyoutubetv/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 14:48:57 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[off-topic]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3009</guid>
		<description><![CDATA[VideosYoutube.tv es un sitio en donde puedes encontrar los mejores de videos de Youtube organizados perfectamente por categorías, lo cual te asegura que encontrarás lo mejor de lo que buscas. Por lo general me gustan los videos divertidos o los músicales; pues bien, este sitio ya tiene categorizados los mejores, lo cual te facilita la [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><img class="size-full wp-image-3011 aligncenter" title="videosyoutube" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/04/videosyoutube.png" alt="videosyoutube" width="600" height="398" /><a href="http://videosyoutube.tv">VideosYoutube.tv</a> es un sitio en donde puedes encontrar los mejores de <a href="http://videosyoutube.tv">videos</a> de <a href="http://videosyoutube.tv">Youtube</a> organizados perfectamente por categorías, lo cual te asegura que encontrarás lo mejor de lo que buscas. Por lo general me gustan los videos divertidos o los músicales; pues bien, este sitio ya tiene categorizados los mejores, lo cual te facilita la tediosa tarea de buscar <a href="http://videosyoutube.tv">videos</a> de buena calidad.</p>
<p style="text-align: justify;">Puedes encontrar videos de humor, videos deportivos, videos caseros, videos musicales, videos de amor, comerciales, capítulos, series, y todo lo que te puedas imaginar.</p>
<p>Visita VideosYoutube.tv: <a href="http://videosyoutube.tv">http://videosyoutube.tv</a></p>
No hay etiquetas para esta entrada.<img src="http://feeds.feedburner.com/~r/casidiablo/~4/9nQCBUrDWqs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/los-mejores-videos-de-youtube-en-videosyoutubetv/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://casidiablo.net/los-mejores-videos-de-youtube-en-videosyoutubetv/</feedburner:origLink></item>
		<item>
		<title>Mini guía PC-BSD – Configurando la red</title>
		<link>http://feedproxy.google.com/~r/casidiablo/~3/ZPIerjTjTSA/</link>
		<comments>http://casidiablo.net/configuracion-network-pcbsd/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 16:42:59 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[bsd]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[configuración]]></category>
		<category><![CDATA[pc-bsd]]></category>
		<category><![CDATA[red]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2989</guid>
		<description><![CDATA[Continuando con la experiencia en PC-BSD, veremos cómo configurar la red. Los pasos son similares a como se haría en Linux, aun así, puesto que algún par de cosas cambian, he preferido dejarlo documentado.
Lo primero que deberíamos hacer es identificar el nombre que el sistema le ha dado a nuestras tarjetas, en mi caso la [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Continuando con la experiencia en PC-BSD, veremos cómo configurar la red. Los pasos son similares a como se haría en Linux, aun así, puesto que algún par de cosas cambian, he preferido dejarlo documentado.</p>
<p style="text-align: justify;">Lo primero que deberíamos hacer es identificar el nombre que el sistema le ha dado a nuestras tarjetas, en mi caso la tarjeta es <code>le0</code> (que es el equivalente al típico <code>eth0</code> en Linux). Para hacerlo basta con ejecutar desde una consola el comando <code>ifconfig</code>.</p>
<h3>Configuración manual de la red</h3>
<p style="text-align: justify;">Para configurar manualmente nuestra red podemos ejecutar los siguientes comandos:</p>
<div class="consola"># ifconfig le0 inet 192.168.16.88 netmask 255.255.255.0 up<br />
# route add default 192.168.16.2<br />
# netstat -r</div>
<p><strong>Explicación</strong></p>
<ul style="text-align: justify;">
<li>En el primero comando usamos <code>ifconfig</code> para configurar la interfaz de red <code>le0</code>, con la dirección IP 192.168.16.8 y la máscara de red 255.255.255.0. La opción up activa la interfaz de red.</li>
<li>Posteriormente usamos el comando <code>route</code> para añadir el gateway por defecto de la red.</li>
<li>El comando <code>netstat -r</code> nos permite verificar que el gateway fue añadido correctamente. Interesante tener en cuenta que, a diferencia de Linux, para mirar las tablas de enrutamiento no se usa <code>route -n</code> sino <code>netstat -r</code></li>
</ul>
<h3>Configurar la interfaz de red con DHCP</h3>
<p style="text-align: justify;">Esta es la opción más sencilla y la que recomiendo. Si tienes un servidor DHCP en la red, lo mejor será configurar nuestra interfaz de red para que solicite una IP automáticamente. Para ello basta con abrir el archivo <code>/etc/rc.conf</code> y modificar nuestra interfaz de red de tal manera que quede así:</p>
<div class="consola">ifconfig_le0=&#8221;DHCP&#8221;</div>
<div class="nota" style="text-align: justify;"><strong>Nota</strong>: ten en cuenta que en mi caso la interfaz de red se llama <code>le0</code>, pero en tu caso puede ser distinto. Así que debes asegurarte que la línea que modifiques corresponda a tu tarjeta de red.</div>
<p style="text-align: justify;">Además, si estás usando otro cliente DHCP diferente del que trae por defecto el sistema, o quieres ejecutarlo con alguna opción en especial, debes modificar estas variables:</p>
<div class="consola">dhclient_program=&#8221;/sbin/dhclient&#8221;<br />
dhclient_flags=&#8221;"</div>

	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/bsd/" rel="tag">bsd</a>, <a href="http://casidiablo.net/tag/configuracion/" rel="tag">configuración</a>, <a href="http://casidiablo.net/tag/pc-bsd/" rel="tag">pc-bsd</a>, <a href="http://casidiablo.net/tag/red/" rel="tag">red</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag">tutorial</a><br /></div>
<img src="http://feeds.feedburner.com/~r/casidiablo/~4/ZPIerjTjTSA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/configuracion-network-pcbsd/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://casidiablo.net/configuracion-network-pcbsd/</feedburner:origLink></item>
		<item>
		<title>Mini guía PC-BSD – Instalando PC-BSD</title>
		<link>http://feedproxy.google.com/~r/casidiablo/~3/wZKI3aROGZI/</link>
		<comments>http://casidiablo.net/instalacion-pcbsb/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 19:29:16 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[bsd]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[instalación]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[pc-bsd]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2944</guid>
		<description><![CDATA[Hace rato quería probar algún sistema BSD, y al final me he decidido por PC-BSD por su amabilidad con el usuario novel. A veces, al hablar de BSD, lo primero que se piensa es en un servidor o algo así, pero gracias a proyectos como PC-BSD podemos tener un BSD como sistema de escritorio, y [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><img style="float:left;" title="pcbsd-large-noreflection" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd-large-noreflection.png" alt="pcbsd-large-noreflection" width="300" height="62" />Hace rato quería probar algún sistema BSD, y al final me he decidido por PC-BSD por su amabilidad con el usuario novel. A veces, al hablar de BSD, lo primero que se piensa es en un servidor o algo así, pero gracias a proyectos como PC-BSD podemos tener un BSD como sistema de escritorio, y con ello, disfrutar la estabilidad y seguridad que nos ofrece (sí, mucho más estable y seguro que Linux).</p>
<h3>¿Qué es PC-BSD?</h3>
<p style="text-align: justify;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pc-bsd-kde.jpg" class="smoothbox tooltip" title="PC-BSD Fibonacci con KDE 4"><img title="pc-bsd-kde" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pc-bsd-kde-300x239.jpg" alt="pc-bsd-kde" width="300" height="239" style="float:right;" /></a>PC-BSD es un sistema operativo basado en FreeBSD. Puesto que bajo PC-BSD se encuentra un sistema FreeBSD, cuentas con todas las ventajas de velocidad y seguridad que éste proporciona. Es importante tener en cuenta que PC-BSD NO es una distribución de Linux. Ambos están basados en UNIX, pero PC-BSD está basado en FreeBSD y no en Linux.</p>
<p style="text-align: justify;">Existen algunas diferencias entre PC-BSD y FreeBSD. PC-BSD está pensado ser usado como sistema de escritorio, mientras que FreeBSD fue concebido sobre todo para usarse como servidor. Además PC-BSD ofrece un instalador gráfico y el escritorio KDE, tiene un gran número de aplicaciones de escritorio pre-instaladas y, aunque soporta el sistema de ports de FreeBSD, proporciona un <a href="http://pbidir.com/">método de instalación sencillo de paquetes precompilados</a>.</p>
<p style="text-align: justify;">Además, el kernel de PC-BSD ha sido recompilado con algunas modificaciones de tal manera que tenga un mejor comportamiento como sistema de escritorio. E incluso incluye los drivers para las tarjetas aceleradoras de video NVIDIA.</p>
<p style="text-align: justify;"><span id="more-2944"></span></p>
<h3>Instalación</h3>
<p style="text-align: justify;">Lo primero es ir a la <a href="http://www.pcbsd.org/content/view/21/11/">página de descargas</a> y bajar la ISO que deseemos. Las ISOs más importantes son:</p>
<h3>PC-BSD 32Bit (i386)</h3>
<ul>
<li><a href="http://www.pcbsd.org/content/view/21/11/#CD1">PC-BSD CD #1 32bit (i386) &#8211; System install CD1</a></li>
<li><a href="http://www.pcbsd.org/content/view/21/11/#CD2">PC-BSD CD #2 32bit (i386) &#8211; System Install CD2<br />
</a></li>
<li><a href="http://www.pcbsd.org/content/view/21/11/#CD3">PC-BSD CD #3 32bit (i386) &#8211; Multi-language support + Optional Components</a></li>
<li><a href="http://www.pcbsd.org/content/view/21/11/#DVD">PC-BSD DVD 32bit (i386) &#8211; Complete install + Optional Components</a></li>
</ul>
<h3>PC-BSD 64Bit (amd64)</h3>
<ul>
<li><a href="http://www.pcbsd.org/content/view/21/11/#CD1-64">PC-BSD CD #1 64bit (amd64) &#8211; System install CD1</a></li>
<li><a href="http://www.pcbsd.org/content/view/21/11/#CD2-64">PC-BSD CD #2 64bit (amd64) &#8211; System Install CD2<br />
</a></li>
<li><a href="http://www.pcbsd.org/content/view/21/11/#CD3-64">PC-BSD CD #3 64bit (amd64) &#8211; Multi-language support + Optional Components</a></li>
<li><a href="http://www.pcbsd.org/content/view/21/11/#DVD-64">PC-BSD DVD 64bit (amd64) &#8211; Complete install + Optional Components</a></li>
</ul>
<p style="text-align: justify;">Una vez hayamos descargado la imagen y la hayamos quemado en un CD, es hora de insertarlo en el PC y bootear desde él. Esto cargará el instalador de  PC-BSD, siendo la primera opción la selección de nuestro idioma, la distribución del teclado y la zona horaria:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Seleccionando el idioma" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd1.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd1.png" alt="pcbsd1" width="600" /></a></p>
<p style="text-align: justify;">Aceptamos los términos de la licencia:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Aceptando la licencia" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd2.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd2.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">En el siguiente paso decidimos si vamos a realizar una instalación nueva, el tipo de sistema a instalar (Desktop o Server), así como la fuente de los paquetes a instalar. Yo escogí Desktop por supuesto:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Seleccionando tipo de instalación" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd3.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd3.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">Luego ponemos el password que le daremos al usuario root, y creamos un usuario con privilegios que será nuestro usuario. Es recomendable que, si eres usuario de Linux, selecciones bash como la shell por defecto del usuario:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Configurando usuarios" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd4.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd4.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">Seleccionamos el disco sobre el cual haremos la instalación. En este caso, para propósitos de documentación lo instalé en una máquina virtual, por lo que uso todo el disco. En tu caso podrías usar el asistente de partición:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Particionamiento" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd5.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd5.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">Es hora de escoger el software adicional que queremos instalar, teniendo en cuenta que el sistema de escritorio es KDE:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Seleccionando el software adicional a instalar" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd6.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd6.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">En este punto ya hemos configurado todo lo necesario para dar inicio a la instalación; clic en <em>Next</em>:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Seleccionando el idioma" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd7.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd7.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">El progreso de la instalación&#8230;</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="El progreso de la instalación..." href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd10.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd10.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">¡Y eso es todo! Damos clic en Reboot, removemos el CD de instalación y ya tenemos un BSD instalado.</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Fin" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd12.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd12.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">Una vez hemos iniciado nuestro PC-BSD configuramos la resolución de la pantalla&#8230;</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Configurando resolución" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd13.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd13.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">Iniciamos sesión desde el KDM:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Inicio de sesión" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd14.png"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd14.png" alt="pcbsd" width="600" /></a><br />
<a class="tooltip smoothbox" title="Inicio de sesión" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd1.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd1.png" alt="pcbsd1" width="600" /></a></p>
<h3>Enlaces interesantes&#8230;</h3>
<ul>
<li>Página oficial del proyecto PC-BSD: <a href="http://pcbsd.org/">http://pcbsd.org/</a></li>
<li>Foros de ayuda: <a href="http://forums.pcbsd.org/">http://forums.pcbsd.org/</a></li>
<li><a href="http://www.pcbsd.org/content/view/21/11/">Descarga PC-BSD</a></li>
</ul>

	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/bsd/" rel="tag">bsd</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag">ide</a>, <a href="http://casidiablo.net/tag/instalacion/" rel="tag">instalación</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag">linux</a>, <a href="http://casidiablo.net/tag/pc-bsd/" rel="tag">pc-bsd</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag">tip</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag">tutorial</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag">wordpress</a><br /></div>
<img src="http://feeds.feedburner.com/~r/casidiablo/~4/wZKI3aROGZI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/instalacion-pcbsb/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://casidiablo.net/instalacion-pcbsb/</feedburner:origLink></item>
	</channel>
</rss>
