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

<channel>
	<title>Linux, Java y programación &#187; kernel</title>
	<atom:link href="http://casidiablo.net/tag/kernel/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Mon, 08 Mar 2010 03:41:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Instalar/reinstalar VMware 7 en Linux con el kernel 2.6.32</title>
		<link>http://casidiablo.net/error-vmware-linux-kernel/</link>
		<comments>http://casidiablo.net/error-vmware-linux-kernel/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 18:19:07 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[2.6.32]]></category>
		<category><![CDATA[compilación]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[módulos]]></category>
		<category><![CDATA[vmware]]></category>

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

Si has intentado instalar VMware 7 sobre una máquina Linux corriendo el kernel 2.6.32 tal vez hayas tenido problemas. También, como en mi caso, tener VMware instalado con el kernel 2.6.31 y actualizar a 2.6.32 resulta en problemas al recompilar los módulos (específicamente el vmnet y el vmci).
Los errores que arroja VMware al momento de [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Ferror-vmware-linux-kernel%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Instalar%2Freinstalar%20VMware%207%20en%20Linux%20con%20el%20kernel%202.6.32%22%20%7D);"></div>
<p style="text-align: justify;">Si has intentado instalar VMware 7 sobre una máquina Linux corriendo el kernel 2.6.32 tal vez hayas tenido problemas. También, como en mi caso, tener VMware instalado con el kernel 2.6.31 y actualizar a 2.6.32 resulta en problemas al recompilar los módulos (específicamente el vmnet y el vmci).</p>
<p style="text-align: justify;">Los errores que arroja VMware al momento de tratar de recompilar los módulos son similares a esto:</p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/error-vmware.png"><img class="size-full wp-image-3522 aligncenter" title="error-vmware" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/error-vmware.png" alt="error-vmware" width="382" height="341" /></a></p>
<p style="text-align: justify;">Errores con el vmnet que se muestran en consola:</p>
<div class="consola">CC [M]  /tmp/vmware-root/modules/vmnet-only/vnetUserListener.o<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c: En la función ‘VNetUserListenerEventHandler’:<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: ‘TASK_INTERRUPTIBLE’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: (Cada identificador no declarado solamente se reporta una vez<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: para cada funcion en la que aparece.)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c: En la función ‘VNetUserListenerRead’:<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: ‘TASK_INTERRUPTIBLE’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: declaración implícita de la función ‘signal_pending’<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: declaración implícita de la función ‘schedule’<br />
make[2]: *** [/tmp/vmware-root/modules/vmnet-only/vnetUserListener.o] Error 1<br />
make[1]: *** [_module_/tmp/vmware-root/modules/vmnet-only] Error 2<br />
make[1]: se sale del directorio `/usr/src/linux-2.6.32&#8242;<br />
make: *** [vmnet.ko] Error 2</div>
<p style="text-align: justify;">Errores con el vmci (Virtual Machine Communication Interface) que se muestran en consola:</p>
<div class="consola">CC [M]  /tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.o<br />
In file included from /tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:48:<br />
/tmp/vmware-root/modules/vmci-only/./include/pgtbl.h: En la función ‘PgtblVa2MPN’:<br />
/tmp/vmware-root/modules/vmci-only/./include/pgtbl.h:301: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/./include/pgtbl.h: En la función ‘PgtblVa2Page’:<br />
/tmp/vmware-root/modules/vmci-only/./include/pgtbl.h:373: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c: En la función ‘VMCIHost_SignalCall’:<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:328: error: ‘TASK_NORMAL’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:328: error: (Cada identificador no declarado solamente se reporta una vez<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:328: error: para cada funcion en la que aparece.)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c: En la función ‘VMCIHost_WaitForCallLocked’:<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:370: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:370: error: ‘TASK_INTERRUPTIBLE’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:378: error: declaración implícita de la función ‘schedule’<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:386: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:386: error: ‘TASK_RUNNING’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:390: error: declaración implícita de la función ‘signal_pending’<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c: En la función ‘VMCI_SignalEvent’:<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:682: error: ‘TASK_NORMAL’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c: En la función ‘VMCI_WaitOnEventInterruptible’:<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:739: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:739: error: ‘TASK_INTERRUPTIBLE’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:751: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:751: error: ‘TASK_RUNNING’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c: En la función ‘VMCIHost_GetUserMemory’:<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:1438: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:1440: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:1459: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:1487: error: puntero deferenciado a tipo de dato incompleto<br />
make[2]: *** [/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.o] Error 1<br />
make[1]: *** [_module_/tmp/vmware-root/modules/vmci-only] Error 2<br />
make[1]: se sale del directorio `/usr/src/linux-2.6.32&#8242;<br />
make: *** [vmci.ko] Error 2</div>
<p style="text-align: justify;">La <a href="http://blog.chmouel.com/2009/12/05/vmware-vmplayer-and-kernel-2-6-32/">solución</a> la comentan en Chmouel Blog y me la a sugerido <a href="http://casidiablo.net/author/c0rtex/">Cortex</a>, aunque hablan solamente de errores en el vmnet y no en el vmci. De cualquier forma, la solución prácticamente la misma:</p>
<ul>
<li><code>cd /tmp</code></li>
<li><code>tar xf /usr/lib/vmware/modules/source/vmnet.tar</code></li>
<li>Entramos al directorio (<code>cd vmnet-only</code>)</li>
<li>Abrimos el archivo <code>vnetUserListener.c</code> con un editor de texto</li>
<li>Añadimos esto al final de todos los <em>includes</em>:<br />
<!--INFOLINKS_OFF-->
<pre class="brush: cpp; pad-line-numbers: false; toolbar: false;">add this line #include &quot;compat_sched.h&quot;</pre>
<p><!--INFOLINKS_ON-->
</li>
<li>Salimos del directorio (cd /tmp)</li>
<li>Reemplazamos el arvhivo vmnet de vmware con el que hemos editado:<br />
<code>sudo tar cf /usr/lib/vmware/modules/source/vmnet.tar vmnet-only</code></li>
</ul>
<p>Lo anterior es para evitar el problema con vmnet&#8230; con esto puedes intentar correr de nuevo VMWare. Si lo que ahora falla es el vmci puedes hacer lo mismo pero con el archivo <code>/usr/lib/vmware/modules/source/vmci.tar</code>.<br />
Luego de esto, intentamos iniciar VMware o VMplayer los cuales recompilarán los módulos esta vez sin problemas:</p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/vmware-compilacion-correcta.png"><img class="size-full wp-image-3523 aligncenter" title="vmware-compilacion-correcta" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/vmware-compilacion-correcta.png" alt="vmware-compilacion-correcta" width="382" height="341" /></a></p>
<h3>SEO thing XD&#8230;</h3>
<p>Pongo los errores como salen en inglés por si alguien los busca así <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<div class="consola">CC [M] /tmp/vmware-root/modules/vmnet-only/vnetEvent.o<br />
CC [M] /tmp/vmware-root/modules/vmnet-only/vnetUserListener.o<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c: In function ‘VNetUserListenerEventHandler’:<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: (Each undeclared identifier is reported only once<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: for each function it appears in.)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c: In function ‘VNetUserListenerRead’:<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: implicit declaration of function ‘signal_pending’<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: implicit declaration of function ‘schedule’<br />
make[2]: *** [/tmp/vmware-root/modules/vmnet-only/vnetUserListener.o] Error 1<br />
make[1]: *** [_module_/tmp/vmware-root/modules/vmnet-only] Error 2<br />
make[1]: Leaving directory `/opt/temp/linux-2.6.32′<br />
make: *** [vmnet.ko] Error 2<br />
Failed to compile module vmci</div>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/2-6-32/" rel="tag nofollow">2.6.32</a>, <a href="http://casidiablo.net/tag/compilacion/" rel="tag nofollow">compilación</a>, <a href="http://casidiablo.net/tag/error/" rel="tag nofollow">error</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/modulos/" rel="tag nofollow">módulos</a>, <a href="http://casidiablo.net/tag/vmware/" rel="tag nofollow">vmware</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/error-vmware-linux-kernel/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Trabajando con el Kernel Linux (III) &#8211; Buscando drivers de dipositivos PCI</title>
		<link>http://casidiablo.net/identificando-drivers-pci-kernel-linux/</link>
		<comments>http://casidiablo.net/identificando-drivers-pci-kernel-linux/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 19:30:57 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[dispositivos]]></category>
		<category><![CDATA[drivers]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[pci]]></category>
		<category><![CDATA[wordpress]]></category>

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

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


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

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

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

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


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

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

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


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

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

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


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/how-to/" rel="tag nofollow">how-to</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/tu-primer-modulo-cargable-kernel-explicacion/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[how-to] Tu primer módulo cargable para el Linux kernel</title>
		<link>http://casidiablo.net/desarrollar-compilar-modulo-linux/</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[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[módulos]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[wordpress]]></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[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fdesarrollar-compilar-modulo-linux%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%5Bhow-to%5D%20Tu%20primer%20m%C3%B3dulo%20cargable%20para%20el%20Linux%20kernel%22%20%7D);"></div>
<p style="text-align: justify;"><img style="float:right;" title="codigo c linux" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/06/codigo-c.png" alt="codigo c" width="150" height="158" />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>
<p><!--INFOLINKS_OFF-->
<pre class="brush: cpp;">/* El nombre del archivo es 'hola.c'. */
#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 '%s'\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><!--INFOLINKS_ON--></p>
<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;"><!--INFOLINKS_OFF-->
<pre class="brush: 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><!--INFOLINKS_ON--></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/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 nofollow">how-to</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/modulos/" rel="tag nofollow">módulos</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag nofollow">tip</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/desarrollar-compilar-modulo-linux/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>[how-to] Activando soporte para ext4 en Gentoo u otras distros</title>
		<link>http://casidiablo.net/como-activar-ext4-linux/</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[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[ext4]]></category>
		<category><![CDATA[how-to]]></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[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fcomo-activar-ext4-linux%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%5Bhow-to%5D%20Activando%20soporte%20para%20ext4%20en%20Gentoo%20u%20otras%20distros%22%20%7D);"></div>
<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>
<p><!--INFOLINKS_OFF-->
<pre class="brush: 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><!--INFOLINKS_ON--></p>
<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>
<p><!--INFOLINKS_OFF-->
<pre class="brush: python;">Enable the block layer ---&gt;
     --- Enable the block layer
     [*]   Support for Large single files</pre>
<p><!--INFOLINKS_ON--></p>
<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 nofollow">ext4</a>, <a href="http://casidiablo.net/tag/gentoo/" rel="tag nofollow">gentoo</a>, <a href="http://casidiablo.net/tag/how-to/" rel="tag nofollow">how-to</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/como-activar-ext4-linux/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Activando Framebuffer en Linux</title>
		<link>http://casidiablo.net/activando-framebuffer-vesafb-linux/</link>
		<comments>http://casidiablo.net/activando-framebuffer-vesafb-linux/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 19:32:52 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[gentoo]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[framebuffer]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[videos]]></category>

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

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

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


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/framebuffer/" rel="tag nofollow">framebuffer</a>, <a href="http://casidiablo.net/tag/gentoo/" rel="tag nofollow">gentoo</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a>, <a href="http://casidiablo.net/tag/ubuntu/" rel="tag nofollow">ubuntu</a>, <a href="http://casidiablo.net/tag/videos/" rel="tag nofollow">videos</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/activando-framebuffer-vesafb-linux/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Curiosidades sobre el kernel de Linux</title>
		<link>http://casidiablo.net/curiosidades-kernel-linux/</link>
		<comments>http://casidiablo.net/curiosidades-kernel-linux/#comments</comments>
		<pubDate>Tue, 14 Oct 2008 17:57:01 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[curiosidades]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux hispano]]></category>
		<category><![CDATA[sabias que]]></category>

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


Linux tiene 9,2 Millones de líneas de código, se incrementa 10% cada año.
El Kernel en sí mismo es el 5%, y los drivers son aproximadamente el 55%.
4500 líneas son agregadas, 1800 removidas y 1500 modificadastodos los días.
Es un sistema jerárquico pero no depende de las personas individuales.
Una nueva versión cada 2 o 3 meses.
2399 desarrolladores, la mitad de ellos contribuye [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fcuriosidades-kernel-linux%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Curiosidades%20sobre%20el%20kernel%20de%20Linux%22%20%7D);"></div>
<ul>
<li><strong>Linux tiene 9,2 Millones de líneas de código</strong>, se incrementa 10% cada año.</li>
<li>El Kernel en sí mismo es el <strong>5%</strong>, y los <em>drivers</em> son aproximadamente el <strong>55%</strong>.</li>
<li><strong>4500 </strong>líneas son agregadas, <strong>1800 </strong>removidas y <strong>1500 </strong>modificadas<span><strong>todos los días</strong></span>.</li>
<li>Es un sistema jerárquico pero no depende de las personas individuales.</li>
<li>Una nueva versión cada 2 o 3 meses.</li>
<li><strong>2399 desarrolladores</strong>, la mitad de ellos contribuye con sólo 1 o 2 parches.</li>
<li>Ya no hay un Kernel estable (con mumeración par, como el 2.4) y otro inestable (con numeración impar, como el 2.3); este proceso ha sido discontinuado.</li>
<li>Las actualizaciones de seguridad de una versión vienen numeradas como x.x.x. Por ejemplo, las correcciones para el 2.6.19 se numeran como 2.6.19.1, 2.6.19.2, etc.</li>
<li>El Kernel es <strong>activamente desarrollado</strong> las 24 horas del día, los 7 días de la semana, los 365 días del año.</li>
</ul>
<p>Visto en <a href="http://www.linuxhispano.net/portal/noticia/curiosidades-sobre-kernel-linux">Linux Hispano</a> | Fuente <a href="http://pillateunlinux.wordpress.com/2008/10/09/curiosidades-sobre-el-kernel-linux/">Píllate un Linux</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/curiosidades/" rel="tag nofollow">curiosidades</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/linux-hispano/" rel="tag nofollow">linux hispano</a>, <a href="http://casidiablo.net/tag/sabias-que/" rel="tag nofollow">sabias que</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/curiosidades-kernel-linux/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Documental sobre Linux [kernel]</title>
		<link>http://casidiablo.net/documental-linux/</link>
		<comments>http://casidiablo.net/documental-linux/#comments</comments>
		<pubDate>Mon, 29 Sep 2008 16:32:25 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[videos]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[video]]></category>

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

Se trata de un documental en donde explica los inicios del proyecto Linux (el kernel [aqui explican que es el kernel linux]). Sin duda un gran material para cualquier tipo de usuario de Gnu/Linux:
       


	Etiquetas: kernel, video
]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fdocumental-linux%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Documental%20sobre%20Linux%20%5Bkernel%5D%22%20%7D);"></div>
<p>Se trata de un documental en donde explica los inicios del proyecto Linux (el kernel [<a href="http://sololinex.wordpress.com/2008/09/26/que-es-linux/">aqui explican que es el kernel linux</a>]). Sin duda un gran material para cualquier tipo de usuario de Gnu/Linux:</p>
<p><center><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/1RtWkywPJ5I&amp;hl=en&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><strong><embed src="http://www.youtube.com/v/1RtWkywPJ5I&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></strong></object></center>  <center><object width="425" height="344"></p><param name="movie" value="http://www.youtube.com/v/_F5FiP9yCEc&amp;hl=en&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><strong><embed src="http://www.youtube.com/v/_F5FiP9yCEc&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></strong></object></center>  <center><object width="425" height="344"></p><param name="movie" value="http://www.youtube.com/v/4iN-Q3c9_Zg&amp;hl=en&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><strong><embed src="http://www.youtube.com/v/4iN-Q3c9_Zg&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></strong></object></center> <center><object width="425" height="344"></p><param name="movie" value="http://www.youtube.com/v/NVMg3AMF8lc&amp;hl=en&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><strong><embed src="http://www.youtube.com/v/NVMg3AMF8lc&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></strong></object></center>  <center><object width="425" height="344"></p><param name="movie" value="http://www.youtube.com/v/ACqOXd4rqpg&amp;hl=en&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><strong><embed src="http://www.youtube.com/v/ACqOXd4rqpg&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></strong></object></center></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/video/" rel="tag nofollow">video</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/documental-linux/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
