<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Be Linux, my system!</title>
	<atom:link href="http://belinux.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://belinux.wordpress.com</link>
	<description>Tutoriales, manuales, soluciones... para devolver a la comunidad Linux todo lo que me ha aportado</description>
	<lastBuildDate>Sun, 31 Aug 2008 19:13:20 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='belinux.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/21808a5149cabb6be8a7e1cca1c09cdf?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Be Linux, my system!</title>
		<link>http://belinux.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://belinux.wordpress.com/osd.xml" title="Be Linux, my system!" />
		<item>
		<title>Anatomia de&#8230; el sistema de ficheros de Linux</title>
		<link>http://belinux.wordpress.com/2008/08/31/anatomia-de-el-sistema-de-ficheros-de-linux/</link>
		<comments>http://belinux.wordpress.com/2008/08/31/anatomia-de-el-sistema-de-ficheros-de-linux/#comments</comments>
		<pubDate>Sun, 31 Aug 2008 19:07:33 +0000</pubDate>
		<dc:creator>makj</dc:creator>
				<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Sistemas de ficheros]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://belinux.wordpress.com/?p=42</guid>
		<description><![CDATA[[Traducido del artículo original de M.Tim Jones del 30 de octubre de 2007 para IBM]
Una revisión por capas basada en la estructura
 
Cuando se trata de sistemas de ficheros, Linux® es la navaja suiza de los sistemas operativos. Linux soporta un gran número de sistemas de ficheros, desde sistemas con diario (journaling) a clustering o [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=42&subd=belinux&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><em>[Traducido del <a href="http://www.ibm.com/developerworks/linux/library/l-linux-filesystem/" target="_blank">artículo original</a> de M.Tim Jones del 30 de octubre de 2007 para IBM]</em></p>
<h2><em>Una revisión por capas basada en la estructura</em></h2>
<p><em> </em></p>
<p style="text-align:justify;padding-left:30px;"><em>Cuando se trata de sistemas de ficheros, Linux® es la navaja suiza de los sistemas operativos. Linux soporta un gran número de sistemas de ficheros, desde sistemas con diario (</em><em>journaling</em><em>) a clustering o criptográficos. Linux es una maravillosa plataforma para usar sistemas de ficheros estándar o los más exóticos, e incluso para el desarrollo de sistemas de ficheros. Este artículo explora el sistema de ficheros virtual (VFS por sus siglas en inglés) —algunas veces llamado el sistema de ficheros conmutador (</em><em>switch</em><em>) — en el kernel de Linux y después revisa algunas de las principales  estructuras que mantienen los sistemas de ficheros unidos.</em></p>
<p style="text-align:justify;padding-left:30px;"><span id="more-42"></span></p>
<h2>Arquitectura básica de un sistema de ficheros</h2>
<p style="text-align:justify;">La aquitectura de sistema de ficheros de Linux es un ejemplo interesante de complejidad de abstracción. Usando un conjunto común de funciones de interfaz (API), una gran variedad de sistemas de ficheros pueden ser soportados con una gran variedad de dispositivos de almacenamiento. Tomemos, por ejemplo, la llamada a la función &#8220;leer&#8221; (<em>read</em>), que permite que cierto número de bytes sean leídos de un descriptor de fichero dado. La función &#8220;leer&#8221; no sabe nada de los tipos de sistemas de ficheros, tales como EXT3 o NFS. Tampoco sabe nada de medios de almacenamiento particulares sobre los que el sistema de ficheros está montado, tales como discos de tipo <em>AT Attachment Packet Interface (ATAPI)</em>, discos <em>Serial-Attached SCSI (SAS)</em> o discos <em>Serial Advanced Technology Attachment (SATA)</em>. Aun así, cuando la función &#8220;leer&#8221; es llamada para un fichero abierto, los datos son devueltos tal como se esperaba. Este artículo explora como se hace esto e investiga las principales estructuras de la capa de sistema de ficheros de Linux.</p>
<h2>¿Qué es un sistema de ficheros?</h2>
<p style="text-align:justify;">Empezaré con una respuesta a la pregunta más básica, la definición de un sistema de ficheros. Un sistema de ficheros es una organización de datos y metadatos en un dispositivo de almacenamiento. Con una definición tan vaga como esa, ya se ve que el código requerido para soportarla será interesante. Como he dicho, hay muchos tipos de sistemas de ficheros y medios. Con todas estas variantes, cabe esperar que la interfaz de un sistema de ficheros Linux esté implementada como una arquitectura de capas, separando la capa de interfaz de usuario de la implementación del sistema de ficheros y de los controladores que manejan los dispositivos de almacenamiento.</p>
<blockquote><p>Los sistemas de ficheros como protocolos</p>
<p style="text-align:justify;">Otra manera de ver un sistema de ficheros es como un protocolo. Tal como los protocolos de red (p.ej., el protocolo IP) dar significado a las secuencias de datos atravesando la Internet, los sistemas de ficheros dan significado a los datos en un medio de almacenamiento particular.</p>
</blockquote>
<h3>Montaje</h3>
<p style="text-align:justify;">Asociar un dispositivo de almacenamiento a un sistema de ficheros en Linux es un proceso conocido como montaje (mounting). El comando &#8220;mount&#8221; es usado para adjuntar un sistema de ficheros a la actual jerarquía de sistema de ficheros (raíz, o root en inglés). Durante el montaje se debe indicar un tipo de sistema de ficheros, un dispositivo de almacenamiento que contenga un sistema de ficheros de ese tipo [Nota del traductor: en el texto original indica que debe ser un sistema de ficheros, pero eso no es exactamente así, por eso aquí está corregido] y un punto de montaje dentro de la jerarquía.</p>
<p style="text-align:justify;">Para ilustrar las posibilidades de la capa de sistema de ficheros de Linux ( y el uso del comando <em>mount</em> ), se puede crear un sistema de ficheros en un fichero dentro del propio sistema de ficheros. Esto se consigue creando primero un fichero de un tamaño determinado usando el comando <em>dd</em> (copia un fichero usando /dev/zero como origen) &#8212; en otras palabras, un fichero inicializado con ceros, tal como se muestra en el Listado 1:</p>
<pre style="padding-left:30px;">Listado 1. Creando un fichero inicializado a cero</pre>
<pre style="padding-left:30px;">$ dd if=/dev/zero of=file.img bs=1k count=10000</pre>
<pre style="padding-left:30px;">  10000+0 records in</pre>
<pre style="padding-left:30px;">  10000+0 records out
$</pre>
<p style="text-align:justify;">Ahora tenemos un fichero llamado &#8220;file.img&#8221; de 10MB de tamaño. A continuación, usaremos el comando &#8220;losetup&#8221; para asociar un dispositivo de bucle (loop) al fichero (para que funcione como un dispositivo de bloques en lugar de como un fichero normal dentro de un sistema de ficheros, es decir, lo convertimos en un dispositivo de almacenamiento):</p>
<pre style="padding-left:30px;">$ losetup /dev/loop0 file.img</pre>
<pre style="padding-left:30px;">$</pre>
<p style="text-align:justify;">Con el fichero ahora como un dispositivo de bloques (representado por /dev/loop0), creamos un sistema de fichero en él con el comando <em>mke2fs</em>. Este comando crea un nuevo sistema de ficheros de tipo EXT2 del tamaño especificado, tal como se indica en el Listado 2:</p>
<pre style="padding-left:30px;">Listado 2. Creando un sistema de ficheros EXT2 dentro de un dispositivo en bucle</pre>
<pre style="padding-left:30px;"> $ mke2fs -c /dev/loop0 10000</pre>
<pre style="padding-left:30px;"> mke2fs 1.35 (28-Feb-2004)</pre>
<pre style="padding-left:30px;"> max_blocks 1024000, rsv_groups = 1250, rsv_gdb = 39</pre>
<pre style="padding-left:30px;"> Filesystem label=</pre>
<pre style="padding-left:30px;"> OS type: Linux</pre>
<pre style="padding-left:30px;"> Block size=1024 (log=0)</pre>
<pre style="padding-left:30px;"> Fragment size=1024 (log=0)</pre>
<pre style="padding-left:30px;"> 2512 inodes, 10000 blocks</pre>
<pre style="padding-left:30px;"> 500 blocks (5.00%) reserved for the super user</pre>
<pre style="padding-left:30px;"> ...</pre>
<pre style="padding-left:30px;"> $</pre>
<p style="text-align:justify;">El fichero file.img, representado por el dispositivo de bucle (<em>/dev/loop0</em>), está ahora montado en el punto de montaje <em>/mnt/point1</em> usando el comando <em>mount</em>. Destacar la especificación del sistema de ficheros como de tipo EXT2. Cuando esté montado, se puede tratar este nuevo punto de montaje como un nuevo sistema de ficheros usando el comando <em>ls</em>, tal como muestra el Listado 3:</p>
<pre style="padding-left:30px;">Listado 3. Creando un punto de montaje y montando el sistema de ficheros a través de un dispositivo de bucle.</pre>
<pre style="padding-left:30px;"> $ mkdir /mnt/point1</pre>
<pre style="padding-left:30px;"> $ mount -t ext2 /dev/loop0 /mnt/point1</pre>
<pre style="padding-left:30px;"> $ ls /mnt/point1</pre>
<pre style="padding-left:30px;"> lost+found</pre>
<pre style="padding-left:30px;"> $</pre>
<p style="text-align:justify;">Como se muestra en el Listado 4, se puede continuar este proceso creando un nuevo fichero dentro del nuevo sistema de ficheros montado, asociando con un dispositivo de bucle, y creando otro sistema de fichero en él:</p>
<pre style="padding-left:30px;">Listado 4. Creando un nuevo sistema de ficheros de bucle dentro de un sistema de ficheros de bucle.</pre>
<pre style="padding-left:30px;"> $ dd if=/dev/zero of=/mnt/point1/file.img bs=1k count=1000</pre>
<pre style="padding-left:30px;"> 1000+0 records in</pre>
<pre style="padding-left:30px;"> 1000+0 records out</pre>
<pre style="padding-left:30px;"> $ losetup /dev/loop1 /mnt/point1/file.img</pre>
<pre style="padding-left:30px;"> $ mke2fs -c /dev/loop1 1000</pre>
<pre style="padding-left:30px;"> mke2fs 1.35 (28-Feb-2004)</pre>
<pre style="padding-left:30px;"> max_blocks 1024000, rsv_groups = 125, rsv_gdb = 3</pre>
<pre style="padding-left:30px;"> Filesystem label=</pre>
<pre style="padding-left:30px;"> ...</pre>
<pre style="padding-left:30px;"> $ mkdir /mnt/point2</pre>
<pre style="padding-left:30px;"> $ mount -t ext2 /dev/loop1 /mnt/point2</pre>
<pre style="padding-left:30px;"> $ ls /mnt/point2</pre>
<pre style="padding-left:30px;"> lost+found</pre>
<pre style="padding-left:30px;"> $ ls /mnt/point1</pre>
<pre style="padding-left:30px;"> file.img lost+found</pre>
<pre style="padding-left:30px;"> $</pre>
<p style="text-align:justify;">A partir de esta simple demostración, es fácil ver lo poderoso que puede ser el sistema de ficheros de Linux (y el dispositivo de bucle). Puede usarse la misma aproximación para crear sistemas de ficheros encriptados con el dispositivo de bucle en un fichero. Esto es extremadamente útil para proteger tus datos mediante el montaje transitorio del fichero usando el dispositivo de bucle cuando sea necesario.</p>
<h2>Arquitectura de sistema de ficheros</h2>
<p style="text-align:justify;">Ahora que hemos visto la construcción de un sistema de ficheros en acción, vuelvo a la arquitectura de la capa de sistema de ficheros de Linux. Este artículo muestra el sistema de ficheros de Linux desde dos perspectivas. La primera perspectiva es la de una arquitectura de alto nivel. La segunda excarva un poco más hondo y explora la capa de sistema de ficheros a partir de las estructuras principales que la implementan.</p>
<h3>Arquitectura de alto nivel</h3>
<p style="text-align:justify;">Mientras que la mayoria del código de un sistema de ficheros existe en el nucleo (kernel en inglés) &#8212; excepto en el caso de los sistemas de ficheros del espacio de usuario, de los que hablaremos más tarde &#8211;, la arquitectura mostrada en la Figura 1 muestra las relaciones entre los principales componentes de un sistema de ficheros tanto en el espacio de usuario como en el núcleo.</p>
<div class="wp-caption aligncenter" style="width: 512px"><img src="http://www.ibm.com/developerworks/linux/library/l-linux-filesystem/figure1.gif" alt="Figura 1. Arquitectura de los componentes de un sistema de ficheros" width="502" height="366" /><p class="wp-caption-text">Figura 1. Arquitectura de los componentes de un sistema de ficheros</p></div>
<p style="text-align:justify;">El espacio de usuario <em>(user space)</em> contiene las aplicaciones (por ejempo, el usuario del sistema de ficheros) y las librerias GNU de C (glibc), que proveen la interfaz de usuario para las llamadas al sistema de ficheros (open, read, write, close). La interfaz de llamadas a sistema actua como un conmutador, concentrando las llamadas a sistema desde el espacio de usuario hacia los puntos de entrada apropiados dentro del espacio del núcleo <em>(kernel space)</em>.</p>
<p style="text-align:justify;">El VFS es el interfaz primario de los sistemas de ficheros subyacentes. Este componente exporta un conjunto de interfaces y después las abstrae para los sistemas de ficheros individuales, que pueden comportarse de maneras muy diferentes unos de otros. Existen dos cachés para los objetos del sistema de ficheros (inodos y entradas de directorio), que definiré brevemente. Cada una proveé un contenedor de objetos usados recientemente por el sistema de ficheros.</p>
<p style="text-align:justify;">Cada implementación particular de un sistema de ficheros, tales como EXT2, JFS, etc., exporta un conjunto común de interfaces que son usadas (y esperadas) por el VFS. El <em>buffer caché</em> almacena peticiones entre el sistema de ficheros y los dispositivos de bloques que manipula. Por ejemplo, peticiones de lectura y escritura al dispositivo subyacente son pasadas a través del <em>buffer caché</em>. Esto permite que las peticiones sean cacheadas ahí para un acceso más rápido (en lugar de salir directamente hacia el dispositivo físico). El <em>buffer caché</em> es manejado como un conjunto de las listas menos usadas recientemente (LRU, por sus siglas en inglés). Es importante fijarse que se puede usar el comando <em>sync</em> para liberar todo el <em>buffer caché</em> hacia el medio de almacenamiento (para forzar la salida de todos los datos no escritos hacia los controladores de dispositivo, y a continuación hacia el dispositivo de almacenamiento).</p>
<p style="text-align:justify;">Esta es la vista aérea de un VFS y de los componentes de un sistema de ficheros. Ahora echemos un vistazo a las principales estructuras que implementan este subsystema.</p>
<blockquote>
<p style="text-align:justify;">¿Qué es un dispositivo de bloques?</p>
<p style="text-align:justify;">Un dispositivo de bloques es aquel en el que los datos que envia y recibe se mueven en bloques (tales como sectores de discos) y soporta atributos tales como <em>buffering </em>y acceso aleatorio (no es necesario que lea bloques secuencialmente, pero si que pueda acceder cualquier bloque en cualquier momento). Los dispositivos de bloques incluyen discos duros, CD-ROMs, y discos RAM. En contraste con los dispositivos de caracteres, de los que difieren en que ellos no tienen un medio fisicamente direccionable.  Los dispositivos de caracteres incluyen puertos serie y dispositivos de cinta, en los que los datos son secuenciados caracter a caracter.</p>
</blockquote>
<h2>Principales estructuras</h2>
<p style="text-align:justify;">Linux ve todos los sistemas de ficheros desde la perspectiva de un conjunto común de objetos. Estos objetos son el superbloque, el inodo, las entradas-D (dentry), y el fichero. En la raíz de cada sistema de ficheros está el superbloque, que describe y mantiene el estado del sistema de ficheros. Cada objeto que es gestionado dentro de un sistema de ficheros (fichero o directorio) está representado en Linux como un inodo. El inodo contiene todos los metadatos para gestionar objetos en el sistema de ficheros (incluyendo las operaciones que son posibles sobre él). Otro conjunto de estructuras, llamadas entradas-D (dentries), son usadas para hacer la traducción entre nombres e inodos, para los que existe una caché de directorios que mantiene los más recientemente usados. La entrada-D también mantiene las relaciones entre directorios y ficheros a través del sistema de ficheros. Finalmente, un fichero VFS representa un fichero abierto (mantiene un estado para el fichero abierto tal como el desplazamiento de lectura, y demás).</p>
<h3>Capa del sistema de ficheros virtual (VFS)</h3>
<p style="text-align:justify;">El VFS actua como el nivel raíz de la interfaz de sistema de ficheros. El VFS mantiene registro de los sistemas de ficheros actualmente soportados, así como de aquellos sistemas de ficheros que están actualmente montados.</p>
<p style="text-align:justify;">Los sistemas de ficheros pueden ser añadidos o eliminados de Linux dinámicamente usando un conjunto de funciones de registro. El núcle guarda una lista de los sistemas de ficheros actualmente soportados, que puede ser vista desde el espacio de usuario a través del sistema de ficheros <em>/proc</em>. Este fichero virtual también muestra los dispositivos actualmente asociados con algún sistema de ficheros. Para añadir un nuevo sistema de ficheros a Linux, se llama a la función register_filesystem. Ésta toma un único argumento que define la referencia a una estructura de sistema de ficheros (<em>file_system_type</em>), que define el nombre de un sistema de ficheros, un conjunto de atributos, y dos funciones de superbloque. Un sistema de ficheros también puede ser des-registrado.</p>
<p style="text-align:justify;">Al registrar un nuevo sistema de ficheros, se ubica éste y la información pertinente sobre la lista <em>file_systems</em> (ver Figura 2 y linux/include/linux/mount.h). Esta lista define los sistemas de ficheros que pueden ser soportados. Se puede ver esta lista tecleando <em>cat /proc/filesystems</em> en la linea de comandos.</p>
<div class="wp-caption aligncenter" style="width: 462px"><img src="http://www.ibm.com/developerworks/linux/library/l-linux-filesystem/figure2.jpg" alt="Figura 2. Sistemas de ficheros registros con el núcleo" width="452" height="357" /><p class="wp-caption-text">Figura 2. Sistemas de ficheros registros con el núcleo</p></div>
<p>Otra estructura mantenida en el VFS son los sistemas de ficheros montados (ver Figura 3). Esto proveé los sistemas de ficheros que actualmente están montados (ver linux/include/linux/fs.h). Esto enlaza con la estructura de superbloque, que exploraré a continuación.</p>
<div class="wp-caption aligncenter" style="width: 534px"><img src="http://www.ibm.com/developerworks/linux/library/l-linux-filesystem/figure3.jpg" alt="Lista de sistemas de ficheros montados" width="524" height="257" /><p class="wp-caption-text">Figura 3. Lista de sistemas de ficheros montados</p></div>
<h3>Superbloque</h3>
<p style="text-align:justify;">El superbloque es una estructura que representa un sistema de ficheros. Incluye la información necesaria para manejar el sistema de ficheros durante las operaciones. Incluye el nombre del sistema de ficheros (tal como EXT2), el tamaño del sistema de ficheros y su estado, una referencia al dispositivo de bloques, e información de metadatos (tal como listas libres y demás). El superbloque es típicamente almacenado en el medio de almacenamiento pero puede ser creado en tiempo real si no existe uno. Se puede ver la estructura de superbloque (Figura 4) en linux/include/linux/fs.h.</p>
<p style="text-align:justify;">
<div class="wp-caption aligncenter" style="width: 527px"><img src="http://www.ibm.com/developerworks/linux/library/l-linux-filesystem/figure4.jpg" alt="Figura 4. Estructura de superbloque y operaciones de inodo" width="517" height="330" /><p class="wp-caption-text">Figura 4. Estructura de superbloque y operaciones de inodo</p></div>
<p style="text-align:justify;">
<p style="text-align:justify;">Un elemento importante del superbloque es la definición de las operaciones del superbloque. Esta estructura define un conjunto de funciones para manejo de inodos dentro del sistema de ficheros. Por ejemplos, los inodos pueden ser asignados con <em>alloc_inode</em> o eliminado con <em>destroy_inode</em>. Puedes leer y escribir inodos con read_inode and <em>write_inode</em> o sincronizar el sistema de ficheros con <em>sync_fs</em>. Se pueden encontrar la estructura de las <em>super_operations</em> (operaciones de superbloque) en /linux/include/linux/fs.h. Cada sistema de ficheros proveé sus propios métodos de inodos, que implementan las operaciones y proveén la abstracción común de la capa VFS.</p>
<h3>inodo y entrada-d</h3>
<p style="text-align:justify;">El inodo representa un objeto en el sistema de ficheros con un identificador único. Cada sistema de ficheros particular proveé métodos para convertir un nombre de fichero en un identificador único de inodo y despues a una referencia a un inodo. Una porción de la estructura de un inodo se muestra en la Figura 5 junto con algunas de las estructuras relacionadas. Cabe notar en particular las estructuras inode_operations (operaciones sobre un inodo) y file_operations (operaciones sobre ficheros). Cada una de esas estructuras se refiere a las operaciones individuales que pueden ser ejecutadas sobre un inodo concreto. Por ejemplo, inode_operations define aquellas operaciones que operan directamente sobre un inodo, mientras que file_operations se refiere a aquellos émtodos relacionados con ficheros y directorios (las llamadas a sistema estándar).</p>
<p style="text-align:justify;">
<div class="wp-caption aligncenter" style="width: 570px"><img src="http://www.ibm.com/developerworks/linux/library/l-linux-filesystem/figure5.jpg" alt="Figura 5. La estructura de un inodo y las estructuras relacionadas" width="560" height="303" /><p class="wp-caption-text">Figura 5. La estructura de un inodo y las operaciones asociadas</p></div>
<p>Los inodos y entradas-d más recientemente usados son guardados en la caché de inodos y directorios respectivamente. Cabe destacar que para cada inodo en la caché de inodos hay una entrada-d correspondiente en la caché de directorios. Pueden encontrarse las estructuras de inodo y entrada-d definidas en ./linux/include/linux/fs.h</p>
<h3>El caché de bloques (buffer caché)</h3>
<p style="text-align:justify;">Excepto en las implementaciones particulares de cada sistema de ficheros (que puede ser encontrada en ./linux/fs), la parte baja de la capa de sistema de ficheros es el buffer caché. Este elemento mantiene un registro de las peticiones de lecturas y escrituras de cada implementacion particular del sistema de ficheros y de los dispositivos físicos (a través de los controladores de dispositivos). Por cuestiones de eficiencia, Linux mantiene una caché de las peticiones para evitar tener que volver a ir al dispositivo físico para cada petición. En su lugar, los bloques (páginas) más recientemente usados son cacheados aquí para ser rápidamente devueltos al sistema de ficheros particular.</p>
<h2>Sistemas de ficheros interesantes</h2>
<p style="text-align:justify;">Este artículo no va a extenderse explorando los sistemas de ficheros particulares que están disponibles para Linux, pero es importante hablar de ellos, aunque sea de pasada. Linux soporta un amplio abanico de sistemas de ficheros diferentes, desde los antiguos sistemas de ficheros tales como MINIX, MS-DOS, y ext2, hasta los nuevos sistemas de ficheros con bitácora (journaling) tales como ext3, JFS y ReiserFS. Adicionalmente, Linux soporta sistemas de ficheros criptográficos tales como CFS, y sistemas de ficheros virtuales tales como /proc.</p>
<p style="text-align:justify;">Por último, un sistema de ficheros digno de mención es el sistema de ficheros dentro del espacio de usuario, o FUSE (por sus siglas en inglés). Este es un interesante proyecto que permite al usuario dirigir las peticiones al sistema de ficheros a través del VFS de vuelta hacia el espacio de usuario. De modo que si alguna vez has jugado con la idea de crear tu propio sistema de ficheros, este es un gran punto de inicio.</p>
<h2>Conclusiones</h2>
<p style="text-align:justify;">Mientras que la implementación de un sistema de ficheros es cualquier cosa menos trivial, este es un gran ejemplo de una arquitectura escalable y extensible. La arquitectura de sistema de ficheros ha evolucionado a través de los años pero ha soportado exitósamente muchos tipos diferentes de sistemas de ficheros y muchos tipos de dispositivos de almacenamiento objetivo. Usando una arquitectura basada en conectores (plug-ins) con varios niveles de funciones indirectas, será interesante ver la evolución del sistema de ficheros de Linux en el futuro cercano.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/belinux.wordpress.com/42/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/belinux.wordpress.com/42/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/belinux.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/belinux.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/belinux.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/belinux.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/belinux.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/belinux.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/belinux.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/belinux.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/belinux.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/belinux.wordpress.com/42/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=42&subd=belinux&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://belinux.wordpress.com/2008/08/31/anatomia-de-el-sistema-de-ficheros-de-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/835677ebae322dfcb383ac2b840668f2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">makj</media:title>
		</media:content>

		<media:content url="http://www.ibm.com/developerworks/linux/library/l-linux-filesystem/figure1.gif" medium="image">
			<media:title type="html">Figura 1. Arquitectura de los componentes de un sistema de ficheros</media:title>
		</media:content>

		<media:content url="http://www.ibm.com/developerworks/linux/library/l-linux-filesystem/figure2.jpg" medium="image">
			<media:title type="html">Figura 2. Sistemas de ficheros registros con el núcleo</media:title>
		</media:content>

		<media:content url="http://www.ibm.com/developerworks/linux/library/l-linux-filesystem/figure3.jpg" medium="image">
			<media:title type="html">Lista de sistemas de ficheros montados</media:title>
		</media:content>

		<media:content url="http://www.ibm.com/developerworks/linux/library/l-linux-filesystem/figure4.jpg" medium="image">
			<media:title type="html">Figura 4. Estructura de superbloque y operaciones de inodo</media:title>
		</media:content>

		<media:content url="http://www.ibm.com/developerworks/linux/library/l-linux-filesystem/figure5.jpg" medium="image">
			<media:title type="html">Figura 5. La estructura de un inodo y las estructuras relacionadas</media:title>
		</media:content>
	</item>
		<item>
		<title>Ubuntu y las impresoras</title>
		<link>http://belinux.wordpress.com/2008/07/31/ubuntu-y-las-impresoras/</link>
		<comments>http://belinux.wordpress.com/2008/07/31/ubuntu-y-las-impresoras/#comments</comments>
		<pubDate>Thu, 31 Jul 2008 07:41:58 +0000</pubDate>
		<dc:creator>makj</dc:creator>
				<category><![CDATA[Configurando linux]]></category>
		<category><![CDATA[Scripts]]></category>

		<guid isPermaLink="false">http://belinux.wordpress.com/?p=33</guid>
		<description><![CDATA[Haca tiempo que no escribía nada, ya que últimamente estoy trabajando bastante con equipos que usan Ubuntu y la verdad es que los problemas son mínimos y la gente que los usa estan encantados de la vida. Sin embargo, todavía hay algunas cosas que no funcionan tan simple como deberian, me estoy refiriendo por supuesto [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=33&subd=belinux&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Haca tiempo que no escribía nada, ya que últimamente estoy trabajando bastante con equipos que usan Ubuntu y la verdad es que los problemas son mínimos y la gente que los usa estan encantados de la vida. Sin embargo, todavía hay algunas cosas que no funcionan tan simple como deberian, me estoy refiriendo por supuesto a ese gran &#8220;enemigo&#8221; de las distribuciones linux de escritorio: las impresoras.</p>
<p style="text-align:justify;">Le pese a quien le pese, y lo diga quien lo diga, linux todavia no es un gran sistema de escritorio como lo pueden ser windows o mac, en ese sentido siguen ganando estos dos, ya que la sensación que tiene el usuario de poder controlar completamente su equipo y los recursos auxiliares de una manera relativamente sencilla es muy grande&#8230;</p>
<p><span id="more-33"></span></p>
<ul>
<li>Cualquier usuario de windows o mac sabe que si se compra una impresora nueva basta con instalarle una cosa llamada drivers y que permiten usarla (en algunos casos ni siquiera sera necesario), y una vez hecho eso ya la impresora funciona siempre correctamente.</li>
<li>Cualquier usuario de windows o mac sabe que si se compra una cámara de fotos o cualquier otro aparato que lleve USB, bastará con instalarle previamente los drivers y luego el sistema ya conoce al aparatejo y podrá usarlo de una manera similar a como usa un disco externo o similar&#8230;</li>
<li>Cualquier usuario de windows o mac sabe como instalar un programa, que le haces doble-clic al instalador, te aparecera un asistente que te dará instrucciones y que siguiendo las instrucciones al final tendrás instalado el software y podras usarlo sin haber tenido que hacer cosas extrañas (lease compilar, tocar registros o similares, ejecutar algo desde la consola, &#8230;)</li>
</ul>
<p style="text-align:justify;">Esto desde mi punto de vista son los 3 grandes caballos de batalla con los que aún tiene que lidiar cualquier distribución Linux (que no quiere decir que sean sus únicos handicaps, pero por lo que veo estos son los más importantes), y es cierto que últimamente ha mejorado muchísimo la cosa y se ha simplificado todo una barbaridad en cuanto a la impresión (en parte gracias al sistema CUPS de la gente de Apple), pero aún determinadas  impresoras no se reconocen de manera sencilla.</p>
<p style="text-align:justify;">Hace poco tuve que instalar una impresora HP1018 en un PC con Ubuntu 8.04, pues bien, al buscar las impresoras me detectaba la impresora, de hecho el driver &#8220;se supone&#8221; que lo incluye la distribucion, pero la impresora no respondia a las paginas de prueba&#8230;.</p>
<p style="text-align:justify;">Googleando encontre <a href="http://belinux.files.wordpress.com/2008/07/hp1000-1005-1018-1020_install.pdf">una &#8220;joya&#8221; de script</a> que instala un paquete extra y configura un par de cosas para permitir que el driver haga lo que toca: drivear <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />    Funciona (comprobado!!) para la HP1018, y según el autor para la HP1000, HP1005 y HP1020 (estas no lo he podido comprobar). Copiais y pegais el código en un fichero .sh para bash, le dais permisos de ejecución y lo ejecutais como usuario  (os pedirá la contraseña para hacer sudo), después ya podeis configurar la impresora normalmente y tras reiniciar tanto el PC como la impresora todo irá como la seda <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align:justify;">Suerte!!</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/belinux.wordpress.com/33/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/belinux.wordpress.com/33/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/belinux.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/belinux.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/belinux.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/belinux.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/belinux.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/belinux.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/belinux.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/belinux.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/belinux.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/belinux.wordpress.com/33/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=33&subd=belinux&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://belinux.wordpress.com/2008/07/31/ubuntu-y-las-impresoras/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/835677ebae322dfcb383ac2b840668f2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">makj</media:title>
		</media:content>
	</item>
		<item>
		<title>Que bonito es compartir, DAVid !! (1ª parte)</title>
		<link>http://belinux.wordpress.com/2008/03/12/que-bonito-es-compartir-david-1%c2%aa-parte/</link>
		<comments>http://belinux.wordpress.com/2008/03/12/que-bonito-es-compartir-david-1%c2%aa-parte/#comments</comments>
		<pubDate>Wed, 12 Mar 2008 19:51:06 +0000</pubDate>
		<dc:creator>makj</dc:creator>
				<category><![CDATA[Configurando linux]]></category>
		<category><![CDATA[HowTO]]></category>
		<category><![CDATA[Redes]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[compartir]]></category>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[configuracion]]></category>
		<category><![CDATA[ficheros]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://belinux.wordpress.com/?p=25</guid>
		<description><![CDATA[   Bueno, con este título seguramente no queda muy claro de que va esto, pero seguro que estás de acuerdo conmigo en lo bonito que es compartir, es algo que de pequeñitos nos enseñan que es mucho mejor que ser egoista y querer las cosas sólo para uno mismo. Y esa idea la hemos llevado [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=25&subd=belinux&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><div align="justify">   Bueno, con este título seguramente no queda muy claro de que va esto, pero seguro que estás de acuerdo conmigo en lo bonito que es compartir, es algo que de pequeñitos nos enseñan que es mucho mejor que ser egoista y querer las cosas sólo para uno mismo. Y esa idea la hemos llevado al mundo interconectado de hoy en dia donde un ordenador no tiene sentido por si solo, si no tienes acceso al mundo exterior o a recursos compartidos con los demás, de que sirve. Pues de eso va todo esto, de como compartir teniendo en cuenta que todos somos diferentes pero no por ello deben tener unos preferencia sobre los otros.</div>
<div align="justify"></div>
<div align="justify"></div>
<div align="justify">   No estoy filosofando sobre la naturaleza humana aunque lo pueda parecer, sino sobre los diferentes sistemas operativos y protocolos de compartición de ficheros que existen hoy en dia y de como cada uno tiene sus propias preferencias por uno u otro protocolo a la hora de definir lo que es un recurso compartido (curiosamente cada uno considera que la forma &#8220;natural&#8221; de compartir es el protocolo propio de su plataforma). Lo ideal sería que, independientemente del sistema operativo que usemos, podamos tener acceso a los recursos de forma totalmente transparente y que luego se presenten en cada sitio adaptados a las condiciones especiales de cada uno. Ésta es la idea detrás del protocolo HTTP, pensado e ideado para compartir información en forma de documentos de texto facilmente accesibles desde cualquier navegador sobre cualquier plataforma: un documento en particular debería poder accederse y obtener el mismo resultado independientemente de la presentación final, pero en esencia el contenido será siempre el mismo.</div>
<div align="justify"></div>
<div align="justify"></div>
<div align="justify">   Si esto es algo natural para los documentos, ¿porqué no lo es para los ficheros?</div>
<p><span id="more-25"></span></p>
<div align="justify">   En los sistemas windows usan NetBIOS para compartir ficheros, en Linux y familiares disponemos de NFS (de forma nativa) y de Samba (como clon de NetBIOS), en Mac hay preferencia por iMac o por carpetas AppleShared (que se basan también en SMB). Adicionalmente podemos acceder a recursos remotos por otro tipo de conexiones : ftp, sftp, &#8230;  y en cada caso hace falta un cliente particular para realizar la conexión y que no es, en principio, compatible 100% con el resto (permisos, juegos de caracteres, &#8230;)</div>
<div align="justify"></div>
<div align="justify"></div>
<div align="justify">   Buscando, buscando&#8230; nos hacia falta algún sistema multiplataforma que sea compatible 100% con todos los sistemas siendo el mismo en todos para que no sea necesario un servidor de samba, uno de nfs, otro de iMac, otro de ftp, otro de &#8230;  con la consiguiente configuración de cada uno y con la más que probable redundancia de ficheros. Y cuando por fin lo encontramos, resulta que requiere de algunos ajustes en cada plataforma para hacerlo funcionar correctamente: hablo de WebDAV, un protocolo HTTP ampliado que permite acceder por este sistema (con todas las ventajas que conlleva) a ficheros y carpetas de manera transparente y pudiendo distribuirlo sin que por ello deje de ser accesible tanto en redes locales como a través de internet.</div>
<div align="justify"></div>
<div align="justify"></div>
<div align="justify">   Seguramente no os descubro nada nuevo al hablaros de este protocolo (para los que así sea, agradeceré cualquier corrección o mejora al artículo), pero si es algo nuevo para vosotros estas son algunas de sus características y/o (des)ventajas:</div>
<div align="justify">
<ul>
<li>La configuración es única y sencilla, basta con tener un servidor Apache (o cualquier otro servidor web).</li>
<li>Todas las plataformas pueden acceder a este protocolo por ser de red y ampliamente conocido, y todos tienen clientes nativos.</li>
<li>Si bien, algunos cliente nativos son bastante malos:
<ul>
<li>en windows no permite la modificación parcial de un fichero, i.e., no se puede editar un fichero directamente desde la carpeta montad (si únicamente conectamos a la carpeta, ni siquiera permite la escritura)</li>
<li>en linux (al menos en ubuntu y mandriva), los navegadores de ficheros no admiten acceder a los volúmenes de red (algo increible para mi!!) al querer guardar o examinar ficheros desde ciertas aplicaciones (office, navegador, &#8230;) y es necesario montarlo como carpetas locales (objetivo final de este artículo)</li>
<li>en mac, salvo algunos problemillas con la caché si la conexión no es buena, funciona como uno esperaría.</li>
</ul>
</li>
<li>Por ser un protocolo netamente de red y mapeable dentro de un espacio de direcciones URL, no quedamos restringidos a recursos compartidos en la red local</li>
<li>Puede estar distribuido a través de proxys</li>
<li>Permite todos los tipos de identificación que soporte el servidor web (via LDAP, BDD, fichero local, &#8230;), asi como cualquier característica que soporte el servidor y que pueda ser aplicable a un fichero (compresión de salida, caché si los contenidos no cambia, &#8230;)</li>
<li>Usando cualquier navegador podremos, como mínimo, acceder en modo lectura y por tanto integrarlo en cualquier aplicación.</li>
<li>Lamentablemente, supone una carga adicional importante para el servidor web que se encargue de su gestión, por lo que convendría aislarlo en uno propio o en un host virtual diferente.</li>
<li>Incluso en las últimas versiones, es posible configurar un servidor SVN bajo las carpetas para mantener versionado de los ficheros. Claro que esto implica un servidor adicional y que no todos los clientes soportan DAV/DeltaV (la variante necesaria para gestionar los cambios en los ficheros), por no decir casi ninguno.</li>
<li>[...]</li>
</ul>
</div>
<div align="justify">   Seguramente me dejo alguna más, si se os ocurre alguna otra estaré encantado de incluirla. Y de momento, hasta aquí la introducción del porqué de todo esto, y a partir de aquí decir que en el siguiente post continuaremos con éste tema y la configuración de un servidor Apache y de un proxy para acceder a las carpetas DAV, así como un segundo post en el que detallaremos como instalar y configurar el acceso a éste tipo de comparticiones desde las tres plataformas mayoritarias para tener acceso total a todas las características de éste sistema.</div>
<div align="justify"></div>
<div align="justify"></div>
<div align="justify">      Espero que pueda servir de referencia a alguien.</div>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/belinux.wordpress.com/25/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/belinux.wordpress.com/25/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/belinux.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/belinux.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/belinux.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/belinux.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/belinux.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/belinux.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/belinux.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/belinux.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/belinux.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/belinux.wordpress.com/25/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=25&subd=belinux&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://belinux.wordpress.com/2008/03/12/que-bonito-es-compartir-david-1%c2%aa-parte/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/835677ebae322dfcb383ac2b840668f2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">makj</media:title>
		</media:content>
	</item>
		<item>
		<title>Anatomía de&#8230; el asignador de losas de Linux</title>
		<link>http://belinux.wordpress.com/2007/11/22/anatomia-de-el-asignador-de-losas-de-linux/</link>
		<comments>http://belinux.wordpress.com/2007/11/22/anatomia-de-el-asignador-de-losas-de-linux/#comments</comments>
		<pubDate>Thu, 22 Nov 2007 18:31:00 +0000</pubDate>
		<dc:creator>makj</dc:creator>
				<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://belinux.wordpress.com/2007/11/22/anatomia-de-el-asignador-de-losas-de-linux/</guid>
		<description><![CDATA[Empiezo con éste una serie de artículos, traducidos de los originales de M.Tim Jones (mtj@mtjones.com) y que se pueden encontrar en el servicio de documentación técnica de IBM. Algunos de ellos ya tienen algunos meses de antigüedad, lamentablemente los he descubierto recientemente a partir del último publicado, pero los voy a ir traduciendo en el [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=23&subd=belinux&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">Empiezo con éste una serie de artículos, traducidos de los originales de M.Tim Jones (<a href="mailto:mtj@mtjones.com?subject=Anatomy%20of%20the%20Linux%20slab%20allocator&amp;cc=tomyoung@us.ibm.com">mtj@mtjones.com</a>) y que se pueden encontrar en el <a href="http://www.ibm.com/developerworks/views/linux/libraryview.jsp?topic_by=All+topics+and+related+products&amp;sort_order=asc&amp;lcl_sort_order=desc&amp;search_by=anatomy&amp;search_flag=true&amp;type_by=Articles&amp;show_abstract=true&amp;start_no=1&amp;sort_by=Date&amp;end_no=100&amp;show_all=false&amp;S_TACT=105AGX59&amp;S_CMP=GR" target="_blank">servicio de documentación técnica de IBM</a>. Algunos de ellos ya tienen algunos meses de antigüedad, lamentablemente los he descubierto recientemente a partir del último publicado, pero los voy a ir traduciendo en el orden cronológico de publicación intentando traducir uno cada semana.</p>
<p align="justify">Puesto que muchas veces la designación técnica de algunos elementos y algoritmos descritos en estos artículos suele ser la inglesa, sin que exista una traducción válida, adjuntaré a cada traducción literal que haga de estos conceptos el nombre original en inglés.</p>
<p align="justify">Y una vez expuestos estos dos puntos, empiezo con el cuerpo del artículo original.</p>
<p align="justify">&nbsp;</p>
<h2>Anatomía del asignador de losas (<em>slab allocator</em>) de Linux</h2>
<p><a href="http://www.ibm.com/developerworks/linux/library/l-linux-slab-allocator/index.html?S_TACT=105AGX59&amp;S_CMP=GR" target="_blank">[artículo original]</a></p>
<p align="justify">Un buen rendimiento del sistema operativo depende en parte de la habilidad del propio sistema para gestionar eficientemente los recursos. En los viejos tiempos, los gestores de pila <em>(heap memory managers)</em> eran la norma, pero el rendimiento se veia afectado por la fragmentación y la necesidad de reasignar memoria. Hoy, el núcleo de Linux® usa un método que fue originado en Solaris pero que ha sido usado en sistemas empotrados durante algún tiempo ya, asignando memoria como objetos basándose en su tamaño. Éste artículo explora las ideas tras el asignador de losas <em>(slab allocator)</em> y examina sus interfaces y sus usos.</p>
<h3><span id="more-23"></span></h3>
<h3>Gestión de memoria dinámica</h3>
<p align="justify">&nbsp;</p>
<p align="justify">El objetivo de la gestión de memoria es proveer de un método por el cual la memoria pueda ser compartida de manera dinámica entre una variedad de usuarios para una variedad de propósitos. El método de gestión de memoria usado debería cumplir las dos siguientes premisas:</p>
<ul>
<li>Minimizar la cantidad de tiempo requerido para gestionar la memoria</li>
<li>Maximizar la memoria disponible para uso general (minimizando la sobrecarga de gestión)</li>
</ul>
<p align="justify">La gestión de memoria es, en última instancia, una suma nula de compensaciones. Se puede desarrollar un algortimo que use poca memoria para la gestión, pero al que le lleve mucho tiempo gestionar la memoria disponible. También se puede desarrollar un algoritmo que gestione la memoria muy eficientemente pero que use un poco más de memoria. Finalmente, los requisitos de una aplicación particular nos llevan al balance de compensaciones.</p>
<p align="justify">Los primeros gestores de memoria usaban una estrategia de asignación basada en pila. En éste método, un bloque grande de memoria (llamado pila) es usado para proveer memoria a los fines de cada usuario. Cuando los usuarios necesitan un bloque de memoria, hacen una petición de una determinada cantidad. El gestor de la pila mira en la memoria disponible (usando algún algoritmo particular) y devuelve el bloque. Algunos de los algoritmos usados en esta búsqueda son del tipo <strong>primer-ajuste</strong> <em>(first-fit)</em>, en los que el bloque devuelto es el primero que se encuentre y que satisface la petición, o bien del tipo <strong>mejor-ajuste</strong> <em>(best-fit)</em>, en los que el bloque devuelto es el que mejor se ajuste a la petición. Cuando los usuarios han terminado con la memoria, devuelven el bloque a la pila.</p>
<p align="justify">El problema principal con esta estrategia de asignación basada en pila es la fragmentación. A medida que se van asignando bloques de memoria, son devueltos en diferente orden y en diferentes instantes. Esto tiende a dejar agujeros en la pila haciendo necesario más tiempo para gestionar eficientemente la memoria libre. Éste algoritmo tiende a ser eficiente en consumo de memoria (ya que asigna exactamente lo que es necesario), pero requiere más tiempo para gestionar la pila.</p>
<p align="justify">Otra aproximación, llamada <strong>asignación de memoria del amigo</strong> <em>(buddy memory allocation)</em>, es una técnica de memoria rápida que divide la memoria en un número de particiones potencia-de-2 y trata de asignar las peticiones de memoria usando una aproximación del tipo mejor-ajuste. Cuando la memoria es liberada por el usuario, el bloque amigo es chequeado para ver si alguno de sus vecinos colindantes han sido también liberados. Si es asi, los bloques son combinados para minimizar la fragmenteación. Éste algoritmo tiende a ser un poco más eficiente en tiempo pero puede desperdiciar memoria debido a la aproximación de mejor-ajuste.</p>
<p>Éste artículo se centra en la gestión de memoria del núcleo de Linux y, en particular, en los mecanismo provistos gracias a la asignación de losas <em>(slab allocation)</em>.</p>
<blockquote>
<h4><a title="N1008C" name="N1008C"></a><span class="smalltitle">La caché de losas <em>(slab cache)</em></span></h4>
</blockquote>
<p align="justify">El asignador de losas usado en Linux se basa en un algoritmo originalmente creado por Jeff Bonwick para el sistema operativo SunOS. El asignador de Jeff  gira en torno al cacheado de objetos. Dentro de un núcleo, una considerable cantidad de memoria es asignada para un conjunto finito de objetos tales como descriptores de ficheros y otras estructuras comunes. Jeff         vió que la cantidad de tiempo requerido para inicializar un objeto ordinario en el núcleo excedía la cantidad de tiempo requerido para asignarlo y liberarlo. Su conclusión fue que, en lugar de retornar la memoria de vuelta al contenedor global, él hizo que la memoria siguiera inicializada para el propósito previsto. Por ejemplo, si la memoria había sido asignada para un exclusor mútuo <em>(mutex)</em>, la función de inicialización         (<code>mutex_init</code>) sólo necesita ser ejecutada una vez cuando la memoria es asignada por primera vez al exclusor mútuo. Subsiguientes asignaciones de la memoria no necesitarian ejecutar la inicialización porque ya se encontraria en el estado deseado desde la liberación previa y la llamada al destructor.</p>
<p align="justify">El asignador de losas de Linux usa estas ideas y otras para construir un asignador de memoria que es eficiente tanto en espacio como en tiempo.</p>
<p align="justify">La figura 1 ilustra el alto nivel de organización de las estructuras de losas. En el nivel más alto está la cadena de caché ( <code>cache_chain</code>), que es una lista enlazada de las cachés de losas. Esto es útil para los algoritmos de mejor-ajuste que buscan una caché que mejor se ajuste al tamaño de la asignación deseada (iterado sobre la lista). Cada elemento de la  <code>cache_chain</code> es un puntero a una estructura         <code>kmem_cache</code> (lo que llamamos una <strong>caché</strong>). Esto define un contenedor de objetos de un tamaño fijo para gestionar.</p>
<h5 align="center"><strong>Figura 1. Las principales estructuras del asignador de losas </strong></h5>
<p align="center"><img src="http://belinux.files.wordpress.com/2007/11/figure1.gif" alt="Las principales estructuras del asignador de losas" /></p>
<p align="justify">Cada caché contiene una lista de <strong>losas</strong> <em>(slabs)</em>, que son bloques de memoria contiguos (típicamente páginas). Existen 3tres tipos de losas:</p>
<dl>
<dt><strong>                     <code>slabs_full</code>                 </strong></dt>
<dd>Losas que son asignadas completamente.</dd>
<dt><strong>                     <code>slabs_partial</code>                 </strong></dt>
<dd>Losas que son parcialmente asignadas.</dd>
<dt><strong>                     <code>slabs_empty</code>                 </strong></dt>
<dd>Losas que están vacías, o que son objetos no asignados.</dd>
</dl>
<p align="justify">Evidentemente las losas en la lista <code>slabs_empty</code> son los primeros candidatos para la <strong>recolecta</strong> <em>(reaping)</em>. Este es el proceso por el cual la memoria usada por las losas es devuelta al sistema operativo para otros usos.</p>
<p align="justify">Cada losa en su lista es un bloque de memoria contiguo (una o más páginas contiguas) que es dividido en objetos. Estos objetos son los elementos fundamentales que se asignan y liberan de una caché en particular. Fijese en que la losa es la minima asignación posible del asignador de losas, así que si necesita crecer, ésta es la cantidad mínima en que crecerá. Típicamente, múltiples objetos son asignados en cada losa.</p>
<p align="left">&nbsp;</p>
<p>A medida que los objetos son asignados y liberados de una losa, la losa individual se puede mover entre las listas de losas. Por ejemplo, cuando todos los objetos son consumidos dentro de una losa, se mueve de la lista <code>slabs_partial</code> hacia la lista         <code>slabs_full</code>. Cuando una losa está llena y un objeto es liberado, se mueve de la lista <code>slabs_full</code> hacia la lista         <code>slabs_partial</code>. Cuando todos los objetos son liberados, se mueve desde la lista <code>slabs_partial</code> hasta la lista <code>slabs_empty</code>.</p>
<blockquote>
<h4>Motivación a favor de las losas<a title="N1010C" name="N1010C"></a><span class="smalltitle"><br />
</span></h4>
</blockquote>
<p align="justify">El asignador de caché de losas proveé una serie de beneficios sobre los esquemas tradicionales de gestión de memoria. Primero, los núcleos normalmente esperan múltiples asignaciones de los mismos pequeños objetos a lo largo del tiempo de vida del sistema. El asignador de caché de losas dispone de esto gracias al cacheado de objetos de tamaños similares, evitando de este modo el problema de la fragmentación que suele ocurrir. El asignador de losas también soporta la inicialización de objetos comunes, evitando así la necesidad de inicializar repetidamente un objeto para un mismo propósito. Finalmente, el asignador de losas soporta alineación y coloreado de caché por hardware, lo que permite a objetos en diferentes cachés ocupar las mismas lineas de caché para un incremento del uso de la caché y un mejor rendimiento.</p>
<p align="justify">&nbsp;</p>
<p align="justify">&nbsp;</p>
<blockquote><address><font color="#ff9900"><strong>Nota del traductor.</strong> A partir de éste punto, el artículo incluye código fuente y ejemplos prácticos sobre el código del slab caché allocator, lo que hace complicada y algo inútil su traducción. Teniendo en cuenta que la teoría ya ha sido expuesta y que lo importante para entender el concepto ya ha sido traducido, entiendo que si a alguien le interesa el resto sobre el código fuente, por favor se remita al <a href="http://www.ibm.com/developerworks/linux/library/l-linux-slab-allocator/index.html?S_TACT=105AGX59&amp;S_CMP=GR#N10115" target="_blank">artículo original</a>, ya que la diferencia entre ese y como lo pueda yo traducir aquí será mínima y por tanto un esfuerzo inútil para mí. Espero de todas maneras que esta traducción le sirva a alguien para entender y tener claro el concepto del gestor de memoria usado por Linux.</font> </address>
</blockquote>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/belinux.wordpress.com/23/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/belinux.wordpress.com/23/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/belinux.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/belinux.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/belinux.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/belinux.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/belinux.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/belinux.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/belinux.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/belinux.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/belinux.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/belinux.wordpress.com/23/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=23&subd=belinux&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://belinux.wordpress.com/2007/11/22/anatomia-de-el-asignador-de-losas-de-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/835677ebae322dfcb383ac2b840668f2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">makj</media:title>
		</media:content>

		<media:content url="http://belinux.files.wordpress.com/2007/11/figure1.gif" medium="image">
			<media:title type="html">Las principales estructuras del asignador de losas</media:title>
		</media:content>
	</item>
		<item>
		<title>Actualización automática de repositorios RPM</title>
		<link>http://belinux.wordpress.com/2007/07/30/actualizacion-automatica-de-repositorios-rpm/</link>
		<comments>http://belinux.wordpress.com/2007/07/30/actualizacion-automatica-de-repositorios-rpm/#comments</comments>
		<pubDate>Mon, 30 Jul 2007 12:25:25 +0000</pubDate>
		<dc:creator>makj</dc:creator>
				<category><![CDATA[Configurando linux]]></category>
		<category><![CDATA[Distribuciones]]></category>
		<category><![CDATA[HowTO]]></category>

		<guid isPermaLink="false">http://belinux.wordpress.com/2007/07/30/actualizacion-automatica-de-repositorios-rpm/</guid>
		<description><![CDATA[Probablemente una de las causas por las que el usuario medio ha encontrado Ubuntu como una distribución atractiva frente a otras más clásicas es, además de por una buena selección de aplicaciones sencillas, el sistema Debian de actualización de software: apt-get.
Para los que, como yo, venimos del mundo RedHat y funcionamos con sistemas que han [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=22&subd=belinux&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">Probablemente una de las causas por las que el usuario medio ha encontrado Ubuntu como una distribución atractiva frente a otras más clásicas es, además de por una buena selección de aplicaciones sencillas, el sistema Debian de actualización de software: apt-get.</p>
<p align="justify">Para los que, como yo, venimos del mundo RedHat y funcionamos con sistemas que han heredado su gestión de paquetes RPM, quizá nos parece algo incontrolable el hecho como apt-get gestiona las descargas, ya que simplemente te instala todas las dependencias que te hagan falta y la última versión de todo. Esto en una instalación de usuario típica es fantástico, porque de una manera sencilla configuras las actualizaciones automáticas y siempre estás al día sin preocuparte de que necesitas y si tienes que quitar este o aquel paquete para poder poner el nuevo. Pero en un sistema de servidor no es tan trivial: cambiar la versión de una determinada libreria o aplicación puede hacer que otra, que depende exactamente de aquella, deje de funcionar sin razón aparente.</p>
<p align="justify">En ese sentido, el sistema RPM es mucho más selectivo y te permite un mayor control de lo que tienes instalado, y te permite incluso definir desde donde lo quieres instalar (del DVD original, de internet, de un disco en otro ordenador&#8230;). Esta es la gran ventaja, a mi modo de ver, del sistema RPM: no necesitas una conexión a internet en cada PC, y esto en una red local de una empresa puede ser el escenario.</p>
<p align="justify">De cualquier modo, y teniendo en cuenta la posibilidad que tiene RPM de usar repositorios definidos en algún sitio, podemos emular el funcionamiento de actualización automática de apt-get.</p>
<p><span id="more-22"></span></p>
<p align="center"><font color="#ff6600"><em>[Nota: el HOWTO que viene a continuación se deberá ejecutar desde consola y como usuario root]</em> </font></p>
<p align="justify">Lo primero que deberemos hacer es asegurarnos que nuestra BDD de paquetes esté correcta y no presente incoherencias debido a un mal uso o posibles bugs en las aplicaciones que la manejen. Para esto tenemos el comando:</p>
<blockquote>
<h5><font color="#808000">rpm &#8211;rebuilddb</font></h5>
</blockquote>
<p align="justify">Si todo está bien, no devolverá ninguna salida, pero si hubiera algún error mostrará los mensajes de lo que ha corregido. En ese caso, vuelve a ejecutar las veces que haga falta hasta que no produzca ninguna salida.  En casos extremos en que el mensaje sea que no se puede reparar la BDD, tendremos que reiniciarla:</p>
<blockquote>
<h5><font color="#808000">cd /var/lib/rpm</font></h5>
<h5><font color="#808000">rm -rf ??db.00*</font></h5>
<h5><font color="#808000">rpm &#8211;rebuilddb</font></h5>
</blockquote>
<p align="justify">Una  vez que tengamos limpia y coherente nuestra BDD de RPMs, deberemos descargarnos la lista de repositorios de paquetes a los que posteriormente accederemos para actualizarnos. Primero eliminaremos todos los posibles repositorios (seguramente tendremos el DVD de instalación) que podamos tener:</p>
<blockquote>
<h5><font color="#808000">urpmi.removemedia -a</font></h5>
</blockquote>
<p align="justify">Después, accedemos a la web <a href="http://easyurpmi.zarb.org/index.php" target="_blank">EasyURPMI</a> para obtener las direcciones de los repositorios adecuados a nuestra instalación y arquitectura. Son tres pasos, en el tercero obtendremos una lista de comandos que deberemos copiar y ejecutar en la consola para añadir los repositorios a nuestra lista (os recomiendo seleccionar la opción de índices comprimidos, así las descargas serán de unos cientos de K&#8217;s en lugar de unas decenas de M&#8217;s).</p>
<p align="justify">Una vez tengamos los repositorios descargados, deberemos proceder a la actualización de nuestro sistema. En adelante, y una vez hecho todo lo anterior, sólo deberemos lanzar este comando periódicamente si queremos mantener nuestro sistema actualizado:</p>
<blockquote>
<h5><font color="#808000">urpmi &#8211;auto-select &#8211;force &#8211;auto</font></h5>
</blockquote>
<p align="justify">Podemos añadir algunas opciones más, como por ejemplo &#8211;no-install (para evitar la instalación, sólo se harán las descargas) o &#8211;keep (para mantener las versiones actualmente instaladas siempre que sea posible y no vaya en contra de las dependencias).</p>
<p align="justify">Espero que os sea de utilidad.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/belinux.wordpress.com/22/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/belinux.wordpress.com/22/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/belinux.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/belinux.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/belinux.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/belinux.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/belinux.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/belinux.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/belinux.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/belinux.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/belinux.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/belinux.wordpress.com/22/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=22&subd=belinux&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://belinux.wordpress.com/2007/07/30/actualizacion-automatica-de-repositorios-rpm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/835677ebae322dfcb383ac2b840668f2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">makj</media:title>
		</media:content>
	</item>
		<item>
		<title>Breve manual de comandos básicos de consola</title>
		<link>http://belinux.wordpress.com/2007/07/18/breve-manual-de-comandos-basicos-de-consola/</link>
		<comments>http://belinux.wordpress.com/2007/07/18/breve-manual-de-comandos-basicos-de-consola/#comments</comments>
		<pubDate>Wed, 18 Jul 2007 19:24:57 +0000</pubDate>
		<dc:creator>makj</dc:creator>
				<category><![CDATA[Consola Linux]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://belinux.wordpress.com/2007/07/18/breve-manual-de-comandos-basicos-de-consola/</guid>
		<description><![CDATA[Existen una enorme cantidad de comandos de consola en el mundo *NIX, esto proporciona a éste entorno una potencia y flexibilidad increíbles pudiendo hacer absolutamente de todo y teniendo control absoluto sobre los procesos que lanzamos en nuestro sistema y sobre los ficheros que manejamos, así como sobre su contenido. Pero esta flexibilidad no es [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=21&subd=belinux&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">Existen una enorme cantidad de comandos de consola en el mundo *NIX, esto proporciona a éste entorno una potencia y flexibilidad increíbles pudiendo hacer absolutamente de todo y teniendo control absoluto sobre los procesos que lanzamos en nuestro sistema y sobre los ficheros que manejamos, así como sobre su contenido. Pero esta flexibilidad no es fácil de asimilar ni de controlar, y de hecho uno de los primeros problemas que se encuentra con el novato en el mundo Llinux suele ser un entorno hostil y extraño en el que debe dejar a un lado el ratón y tener en la memoria los comandos, ya que no hay iconos ni ayudas visuales, sólo una línea de comandos que espera pacientemente que se le diga qué debe hacer.</p>
<p align="justify">Se echa en falta en esos momentos un manual sencillo, no-completo (ya que una lista completa de todos los comandos GNU y de la shell que usemos es tan extensa que no sabríamos por donde empezar), y sobre todo centrada en lo esencial para poder empezar a movernos.</p>
<p align="justify">En <a href="http://belinux.wordpress.com/comandos-basicos-de-consola/">ésta página</a> voy a intentar formar una lista de comandos que puedan servir a cualquiera para empezar a moverse por la consola, evidentemente hay muchísimos más y seguramente me dejo alguno que alguien pueda pensar que es esencial. Pero creo que con éste listado se pueden realizar todas las funciones básicas del sistema, y aprender el resto sobre la marcha usando los manuales y la ayuda del sistema será sólo cuestión de tiempo y práctica, cosa que por otra parte resulta vital para moverse en éste entorno en el que debemos tener siempre buena memoria para recordar comandos, ubicaciones de ficheros, &#8230;</p>
<p align="justify">Se admiten todo tipo de correcciones y/o añadidos, que en todo caso podrían ir a parar a un listado de comandos avanzados. Espero que ésto pueda ser de utilidad a alguien.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/belinux.wordpress.com/21/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/belinux.wordpress.com/21/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/belinux.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/belinux.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/belinux.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/belinux.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/belinux.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/belinux.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/belinux.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/belinux.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/belinux.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/belinux.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=21&subd=belinux&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://belinux.wordpress.com/2007/07/18/breve-manual-de-comandos-basicos-de-consola/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/835677ebae322dfcb383ac2b840668f2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">makj</media:title>
		</media:content>
	</item>
		<item>
		<title>Porqué es difícil recuperar un fichero borrado de EXT3</title>
		<link>http://belinux.wordpress.com/2007/07/16/porque-es-dificil-recuperar-un-fichero-borrado-de-ext3/</link>
		<comments>http://belinux.wordpress.com/2007/07/16/porque-es-dificil-recuperar-un-fichero-borrado-de-ext3/#comments</comments>
		<pubDate>Mon, 16 Jul 2007 19:17:23 +0000</pubDate>
		<dc:creator>makj</dc:creator>
				<category><![CDATA[HowTO]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Sistemas de ficheros]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://belinux.wordpress.com/2007/07/16/porque-es-dificil-recuperar-un-fichero-borrado-de-ext3/</guid>
		<description><![CDATA[[traducción del artículo original que se encuentra en ésta página]
Todos lo hemos hecho antes: accidentalmente tecleas el argumento incorrecto al hacer rm o seleccionas el fichero incorrecto para su borrado, al pulsar enter te das cuenta de tu error y tu estómago da un vuelco. Y cuando vas a buscar la copia de seguridad del [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=19&subd=belinux&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>[traducción del artículo original que se encuentra en <a href="http://linux.sys-con.com/read/117909.htm" target="_blank">ésta página</a>]</p>
<p align="justify">Todos lo hemos hecho antes: accidentalmente tecleas el argumento incorrecto al hacer <em>rm</em> o seleccionas el fichero incorrecto para su borrado, al pulsar enter te das cuenta de tu error y tu estómago da un vuelco. Y cuando vas a buscar la copia de seguridad del sistema no hay ninguna.</p>
<p align="justify">Hay muchas herramientas de desborrado para sistemas FAT y NTFS, pero hay muy pocas para EXT3, que es actualmente el sistema de fichero por defecto de muchas distribuciones Linux. Esto es debido al modo en que los ficheros EXT3 son eliminados: información crucial que almacena donde está localizado el contenido del fichero es eliminada durante el proceso de borrado.</p>
<p align="justify">En este artículo, echaremos un vistazo a bajo nivel de porqué la recuperación es dificil y a algunas aproximaciones que son efectivas algunas veces. Usaremos herramientas de código abierto para la recuperación, pero las técnicas no son completamente automáticas.</p>
<p><span id="more-19"></span></p>
<p align="center"><strong>¿Qué es un fichero?</strong></p>
<p align="justify">Antes de poder ver como recuperar ficheros, necesitamos ver como se almacenan. Típicamente, los sistemas de ficheros están localizados dentro de particiones de disco, que a su vez está organizada en sectores (usualmente de 512 bytes). Cuando la partición está formateada usando EXT3, los sectores consecutivos son agrupados en bloques, cuyo rango puede variar entre 1024 y 4096 bytes. Los bloques son agrupados juntos en grupos de bloques, cuyo tamaño será de decenas de miles de bloques. Cada ficheros tiene sus datos almacenados en tres ubicaciones principales: bloques, inodos y entradas de directorio. El contenido del fichero se almacena en bloques, que son dispuestos para el uso exclusivo de ese fichero, expandiéndose por tantos bloques como sea necesario. Idealmente, el fichero debería utilizar bloques consecutivos, pero esto no es siempre posible.</p>
<p align="justify">Los metadatos del fichero son almacenados en una estructura de inodo, que se encuentra en una tabla de inodos colocada en el inicio de un grupo de bloques. Hay un número finito de inodos y cada uno es asignado a un grupo de bloques. Los metadatos de un fichero incluyen los datos temporales tales como la última modificación, el último acceso, el último cambio y la fecha de borrado. También incluye el tamaño del fichero, el identificador de usuario y de grupo, los permisos, y las direcciones de los bloques donde se puede encontrar el contenido del fichero.</p>
<p align="justify">Las direcciones de los primeros 12 bloques son guardadas en el inodo y las direcciones adicionales son almacenadas externamente en bloques, llamados bloques indirectos. Si el fichero requiere muchos bloques y no todas las direcciones caben en un bloque indirecto, un doble bloque indirecto es usado cuya dirección se incluye en el inodo. El doble bloque indirecto contiene direcciones de bloques indirectos simples, que contienen direcciones de bloques con datos de fichero. Hay incluso direcciones indirectas triples en el inodo que añaden una capa más de punteros.</p>
<p align="justify">Por último, el nombre del fichero está almacenado en una estructura de entrada de directorio ubicada en un bloque asignado al directorio padre del fichero. Un directorio EXT3 es parecido a un fichero y sus bloques contienen una lista de estructuras de entradas de directorio, cada una conteniendo el nombre de un fichero y las dirección del inodo en el que se almacenan los metadatos del fichero. Con el comando <em>ls -i</em> puedes ver la dirección del inodo que corresponde a cada nombre de fichero. Se puede ver la relación entre una entrada de directorio, el inodo y los bloques en la <a href="http://res.sys-con.com/story/aug05/117909/linux-carrier-fig1.gif">Figura 1</a>.</p>
<p align="justify">Cuando un nuevo fichero es creado, el sistema operativo (SO) debe elegir que bloques e inodo asignará al fichero. Linux intentará asignar los bloques y el inodo en el mismo grupo de bloques que su directorio padre. Esto provoca que los ficheros en un mismo directorio estén mucho más cercanos. Posteriormente usaremos este hecho para restringir donde buscar datos eliminados.</p>
<p align="justify">El sistema de ficheros EXT3 tiene un  <em>journal</em> (<span style="color:#c0c0c0;"><strong>nota del traductor:</strong> me permito aquí mantener el término en inglés por comodidad en lugar de usar bitácora o diario de registro, ya que cualquiera de los dos queda algo raro</span>) que registra las actualizaciones de los metadatos del sistea ANTES de que la actualización ocurra. En caso de una caída del sistema, el SO lee el journal y podrá reprocesar o deshacer las transacciones registradas para que la recuperación sea mucho más rápida que examinar cada estructura de metadatos, que era el antiguo y lentísimo mecanismo. Las estructuras de metadatos de ejemplo incluyen las entradas de directorio que almacenan nombres de fichero e inodos que almacenan los metadatos del fichero. El journal contiene el bloque entero que está siendo actualizado, no solo el valor que está cambiando. Cuando un nuevo fichero es creato, el journa debería contener la versión actualizada de los bloques que contienen la entrada del directorio y el inodo.</p>
<p align="center"><strong>El proceso de borrado</strong></p>
<p align="justify">Varias cosas ocurren cuando un fichero es borrado de un sistema EXT3 en Linux. Hay que tener en cuenta que el SO debe decidir exactamente que ocurre cuando un fichero es eliminado y éste artículo asume un sistema Linux general.</p>
<p align="justify">Como mínimo, el SO debe marcar cada uno de los bloques, el inodo y la entrada de directorio como no-asignados para que ficheros posteriores puedan usarlos. Esta mínima aproximación es lo que ocurría hace años con los sistemas EXT2. En ese caso, el proceso de recuperación era relativamente simple ya que el inodo aún contenía las direcciones de los bloques del contenido del fichero y herramientas tales como <span style="color:#808000;">debugfs</span> y <span style="color:#808000;">e2undel</span> podían re-crear el fichero fácilmente. Esto funcionaba mientras que los bloques no habían sido asignados a un nuevo fichero y el contenido original no había sido sobreescrito.</p>
<p align="justify">Con EXT3, hay un paso adicional que hace la recuperación mucho más difícil: cuando los bloques son desasignados, el tamaño del fichero y las direcciones de los bloques en el inodo son limpiados; por tanto ya no podemos determinar donde estaba el contenido del fichero. Podemos ver la relación entre la entrada de directorio, el inodo y los bloques de un fichero desasignado en la <a href="http://res.sys-con.com/story/aug05/117909/linux-carrier-fig2.gif">Figura 2</a>.</p>
<p align="center"><strong>Aproximaciones de recuperación</strong></p>
<p align="justify">Ahora que conocemos los componente involucrados con los ficheros y cuales son limpiados durante el borrado, podemos examinar dos aproximaciones a la recuperación de ficheros (aparte de usar un backup). La primera aproximación usa el tipo de aplicación del fichero eliminado y la segunda aproximación usa los datos en el journal. Independientemente de la aproximación, debería dejar de usar el sistema de ficheros porque podría crear un fichero que sobreescriba los datos que está tratando de recuperar, puede detener su sistema y poner el disco en otro ordenador con un sistema Linux como un disco esclavo (<em>slave</em>) o arrancar desde un Linux LiveCD (<span style="color:#808000;">knoppix</span> o <span style="color:#808000;">necromantux</span> son buenas distribuciones para este tipo de tareas).</p>
<p align="justify">El primer paso para ambas técnicas es determinar la dirección del inodo del fichero eliminado. Esto puede ser determinado usando <span style="color:#808000;">debugfs</span> o <span style="color:#808000;">The Sleuth Kit (TSK)</span>. Mostraré aquí el método usando debugfs ya que esta herramiento se incluye en muchas distribuciones Linux y es un depurador del sistema de ficheros. Para empezar con debugfs, debe saber el nombre del dispositivo de la partición que contiene el fichero eliminado. En mi ejemplo, he iniciado desde un LiveCD y el fichero está ubicado en /dev/hda5:</p>
<pre><span style="color:#800000;"><strong><span style="font-family:&quot;color:#800000;font-size:x-small;"> # debugfs /dev/hda5</span><span style="font-family:&quot;color:#800000;font-size:x-small;">

</span><span style="font-family:&quot;color:#800000;font-size:x-small;"> debugfs 1.37 (21-Mar-2005)</span><span style="font-family:&quot;color:#800000;font-size:x-small;">
</span><span style="font-family:&quot;color:#800000;font-size:x-small;"> debugfs: </span></strong></span></pre>
<p align="justify">Podemos usar el comando <em>cd</em> para cambiar al directorio del fichero eliminado:</p>
<pre><span style="font-family:&quot;color:#800000;font-size:x-small;"> <strong><span style="color:#800000;">debugfs:  cd /home/carrier/ </span></strong></span></pre>
<p align="justify">El comando <em>ls -d</em> listará los ficheros asignados y eliminados del directorio. Recuerde que la estructura de entrada de directorio almacena el nombre e inodo de los ficheros y este listado nos dará ambos valores ya que ninguno es eliminado durante el proceso de borrado. Los ficheros eliminados tendrán su dirección de inodo delimitado por &#8220;&lt;&#8221; y &#8220;&gt;&#8221;:</p>
<pre><span style="color:#800000;"><strong><span style="font-family:&quot;color:#800000;font-size:x-small;"> debugfs: ls -d</span><span style="font-family:&quot;color:#800000;font-size:x-small;">

</span><span style="font-family:&quot;color:#800000;font-size:x-small;"> 415848  (12) .    376097  (12) ..    415864  (16) .bashrc</span><span style="font-family:&quot;color:#800000;font-size:x-small;"> </span>
<span style="font-family:&quot;color:#800000;font-size:x-small;">[...]</span>

<span style="font-family:&quot;color:#800000;font-size:x-small;"> &lt;415926&gt; (28 ) oops.dat </span></strong></span></pre>
<blockquote><address>(<strong>Nota:</strong> esta ultima linea deberia poner un 28 entre parentesis sin espacios dentro, pero aqui hay un espacio detras del 8 para evitar caritas sonrientes) </address>
</blockquote>
<p align="justify">El fichero que estamos intentando recuperar es <em>/home/carrier/oops.dat</em> y podemos verlo previamente asociado al inodo 415,926.  El &#8220;(28)&#8221; nos indica la longitud de la estructura de entrada de directorio, pero eso no nos interesa.</p>
<p align="center"><strong>Recuperación por &#8220;esculpido&#8221; de ficheros (<em>file carving</em>) </strong></p>
<p align="justify">La primera técnica de recuperación, llamada <em>file carving</em> (<span style="color:#c0c0c0;"><strong>nota del traductor:</strong> mantendré el nombre en inglés</span>), utiliza las firmas del fichero eliminado. Muchos tipos de ficheros tienen valores estándar en los primeros bytes de la cabecera del fichero, y ésta técnica de recuperación busca los valores de cabecera del fichero eliminado para determinar donde puede que empezara el fichero. Por ejemplo, los ficheros JPEG empiezan con 0xFFD8 y terminan con 0xFFD9. Para recuperar un fichero JPEG eliminado, deberíamos buscar en los dos primeros bytes de cada bloque hasta encontrarnos con la marca OxFFD8. Cuando encontrásemos ese bloque, deberíamos buscar un bloque con los bytes 0xFFD9 en él. Los datos intermedios se asume que era el fichero. Desafortunadamente, no todos los tipos de ficheros tienen una firma final, por tanto determinar el final es dificil. Un ejemplo de una herramiento de código abierto que hace <em>file carving </em>es <span style="color:#808000;">foremost</span>, también existen varias herramientas comerciales.</p>
<p align="justify">Podemos ejecutar una herramienta como <em>foremost</em> en un sistema de ficheros completo, pero acabaríamos probablemente con demasiados ficheros, incluyendo algunos ya asignados. Será preferible lanzarlo sobre cuantos menos datos sea posible. La primera manera en que podemos restringir el tamaño de los datos es examinar sólo los grupos de bloques donde el fichero estaba ubicado. Recuerde que los inodos y los bloques de un fichero están asociados a un mismo grupo de bloques, si hay espacio. En nuestro caso, sabemos que inodo usaba el fichero y por tanto podemos examinar sólo los bloques del mismo grupo. El comando<em> imap</em> en <em>debugfs</em> nos indicará a que grupo de bloques pertenece un inodo:</p>
<pre><span style="color:#800000;"><strong><span style="font-family:&quot;color:#800000;font-size:x-small;"> debugfs:  imap &lt;415926&gt;</span><span style="font-family:&quot;color:#800000;font-size:x-small;"> Inode 415926 is part of block group 25</span>

<span style="font-family:&quot;color:#800000;font-size:x-small;"> located at block 819426, offset 0x0a80 </span></strong></span></pre>
<p align="justify">La salida del comando <em>fsstat</em> en <em>TSK</em> nos dirá también lo siguiente:</p>
<pre><span style="font-family:&quot;color:#800000;font-size:x-small;"> <strong><span style="color:#800000;"># fsstat /dev/hda5 [...] Group: 25: Inode Range: 408801 - 425152 Block Range: 819200 - 851967</span></strong></span></pre>
<p align="justify">A continuación, necesitamos determinar los bloques que están en el grupo de bloques del fichero eliminado. Podemos verlos en la salida del comando <em>fsstat</em> mostrado anteriormente, pero si estuvieramos usando <em>debugfs</em>, necesitamos calcular el rango. El comando stats nos da el número de bloques en cada grupo:</p>
<pre><span style="font-family:&quot;color:#800000;font-size:x-small;"> <span style="color:#800000;"><strong>debugfs: stats [...] Blocks per group: 32768 [...]</strong></span></span></pre>
<p align="justify">Puesto que estamos buscando en el grupo de bloques 25, el rango de bloques va desde 819,200 ( 25 * 32,768 ) hasta el  851,967 ( 26 * 32,768 &#8211; 1 ). Si nos centramos sólo en estos bloques, estaremos mirando en 128Mb en lugar de en el sistema de ficheros completo. Aún así, si no podemos encontrar el fichero en estos bloques, necesitaremos mirar en todo el sistema de ficheros.</p>
<p align="justify">El siguiente paso para reducir los datos a analizar es extraer los bloques no asignados del sistema de ficheros ya que ahí es donde nuestro fichero eliminado estará. <em>debugfs</em> no nos permite actualmente extraer el espacio no asignado de sólo un grupo de bloques específico, por tanto deberemos usar la herramienta <em>dls</em> de <em>TSK</em>.</p>
<pre><span style="font-family:&quot;color:#800000;font-size:x-small;"><strong> <span style="color:#800000;"># dls /dev/hda5 819200-851867 &gt; /mnt/unalloc.dat </span></strong></span></pre>
<p align="justify">El comando anterior nos guardará los bloques no asignados en el grupo de bloqes 25 en un fichero llamado /mnt/unalloc.dat . Asegurese que este fichero esté en un sistema de ficheros diferente ya que de otro modo podría acabar sobreescribiendo su fichero eliminado.</p>
<p align="justify">Ahora podemos ejecutar la herramienta foremost sobre los datos no asignados. foremost puede recuperar sólo tipos de ficheros para los que se haya configurado. Si foremost no tiene la firma de cabecera para el tipo del fichero eliminado, deberá examinar algunos ficheros similar y personalizar el fichero de configuración. Podemos ejecutarlo del siguiente modo:</p>
<pre><span style="font-family:&quot;color:#800000;font-size:x-small;"><strong><span style="color:#800000;"> # foremost -d -i /mnt/unalloc.dat -o /mnt/output/ </span></strong></span></pre>
<p align="justify">La opción -d intentará detectar que bloques son indirectos y no los incluirá en el fichero final. El directorio /mnt/output contendrá los ficheros que hayan podido ser recuperados. Si su fichero no está ahí, puede expandir su búsqueda a todos los bloques no asignados en el sistema de ficheros en lugar de sólo a los bloques del grupo.</p>
<p align="center"><strong>Recuperación basada en journal</strong></p>
<p align="justify">El segundo método para tratar de recuperar ficheros es usar el journal. Ya hemos visto que las actualizaciones de inodos se guardan primero en el journal, pero el concepto importante es que el bloque entero en el que el inodo está ubicado es guardado en el journal. Por tanto, cuando un inodo es actualizado, el journal contendrá copias de otros inodos almacenados en el mismo bloque. Versiones anteriores del inodo de nuestro fichero elimiando pueden existir en el journal porque otro fichero fuera actualizado antes del borrado.</p>
<p align="justify">La maner más fácil de buscar versiones anteriores del inodo es usando el comando<em> logdump -i </em>en <em>debugfs</em>:</p>
<pre><span style="font-family:&quot;color:#800000;font-size:x-small;"><strong><span style="color:#800000;"> debugfs:  logdump -i &lt;415926&gt;
 Inode 415926 is at group 25, block 819426, offset 2688
 Journal starts at block 1, transaction 104588
 FS block 819426 logged at sequence 104940, journal block 2687
 (inode block for inode 415926):
 Inode: 415926   Type: regular        Mode:  0664   Flags: 0x0
 User:   500   Group:   500   Size: 2048000
 [...]
 Blocks:  (0+12): 843274 (IND): 843286
 [...] </span></strong></span></pre>
<p align="justify">En este caso, podemos encontrar una copia previa del inodo y los bloques del contenido del fichero están listados en la última línea. La última línea muestra que el primer bloque del fichero es 843,274 y los siguientes 12 bloques en el sistema de ficheros son los siguientes 12 bloques del fichero. El fichero es grande y necesita un bloque indirecto, que está localizado en el bloque 843,286. Hasta aquí, todos los bloques son consecutivos y no había fragmentación. El bloque 843,286 contiene el resto de direcciones de bloques, así que podríamos buscar en una versión anterior para descubrir donde está ubicado el resto del fichero. Podemos ver si hay una copia en el journal usando<em> logdump -b</em>:</p>
<pre><span style="font-family:&quot;color:#800000;font-size:x-small;"><strong><span style="color:#800000;"> debugfs:  logdump -b 843286 -c </span></strong></span></pre>
<p align="justify">Desafortunadamente, no encontramos una copia del bloque que contiene la lista original de punteros de bloque así que, si queremos recuperar el fichero deberemos asumir que el resto del contenido del fichero está guardado en el bloque 843,287 y siguientes. Una aproximación más avanzada podría también considerar qué bloques están actualmente asignados y saltarnoslos. Los datos pueden ser extraidos con herramientas tales como <em>dd</em> o <em>Linux Disk Editor</em>. El journal puede ser consultado también usando las herramientas <em>jls</em> y <em>jcat</em> de <em>TSK</em>.</p>
<p align="center"><strong>Conclusión</strong></p>
<p align="justify">La recuperación de ficheros con EXT3 no es una tema trivial, lo que refuerza el concepto de la importancia de hacer copias de seguridad de los ficheros. Si el fichero no estaba fragmentado, la búsqueda de su firma de cabecera puede ser útil, pero la herramienta necesita saber ignorar los bloques indirectos y donde parar de copiar (no todos los ficheros tienen una marca de final de fichero). Restringiendo la búsqueda al grupo de bloques local puede ahorrar mucho tiempo. El journal puede ser útil si los ficheros cerca del fichero eliminado han sido reciéntemente actualizados y por tanto existe una versión previa del inodo, pero esto no está siempre garantizado y el bloque indirecto del fichero puede no existir.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/belinux.wordpress.com/19/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/belinux.wordpress.com/19/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/belinux.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/belinux.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/belinux.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/belinux.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/belinux.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/belinux.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/belinux.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/belinux.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/belinux.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/belinux.wordpress.com/19/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=19&subd=belinux&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://belinux.wordpress.com/2007/07/16/porque-es-dificil-recuperar-un-fichero-borrado-de-ext3/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/835677ebae322dfcb383ac2b840668f2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">makj</media:title>
		</media:content>
	</item>
		<item>
		<title>PHP y la codificación de caracteres</title>
		<link>http://belinux.wordpress.com/2007/06/29/php-y-la-codificacion-de-caracteres/</link>
		<comments>http://belinux.wordpress.com/2007/06/29/php-y-la-codificacion-de-caracteres/#comments</comments>
		<pubDate>Fri, 29 Jun 2007 06:16:12 +0000</pubDate>
		<dc:creator>makj</dc:creator>
				<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://belinux.wordpress.com/2007/06/29/php-y-la-codificacion-de-caracteres/</guid>
		<description><![CDATA[Ya sé que esto no tiene que ver específicamente con linux, puesto que PHP es un lenguaje de programación multiplataforma, pero si es uno de los más usados en entornos linux para desarrollos web (evidentemente también hay otros como Perl, Python, Java, etc&#8230;). Por eso y por los problemas que pueden surgir con la codificación [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=18&subd=belinux&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">Ya sé que esto no tiene que ver específicamente con linux, puesto que PHP es un lenguaje de programación multiplataforma, pero si es uno de los más usados en entornos linux para desarrollos web (evidentemente también hay otros como Perl, Python, Java, etc&#8230;). Por eso y por los problemas que pueden surgir con la codificación e internacionalización de caracteres es que creo que éste es un tema delicado.</p>
<p align="justify">Últimamente casi todas las distribuciones (mandriva 2007, ubuntu feisty, opensuse, &#8230;) funcionan enteramente de manera nativa con sistema utf-8 para evitar los típicos problemas con los &#8220;caracteres especiales&#8221;, o lo que los americanos/ingleses consideran que es especial simplemente porque no corresponde con su alfabeto. Muchas veces esos caracteres se pueden evitar, sobre todo en idiomas como el castellano o cualquier otro que use el mismo alfabeto, simplemente no incluyendo acentos, eñes, etc&#8230; pero otras veces es más complicado, no siempre se puede escribir según qué evitando todo eso. Y es peor en otros idiomas que usan distintos alfabetos, estos son los que promueven el uso del alfabeto utf-8 que es mucho más lógico.</p>
<p><span id="more-18"></span></p>
<p align="justify">El problema surge de la codificación interna que se hace de los caracteres: en el estándar ASCII el juego de caracteres es de 128 (esto incluye todo el alfabeto latino básico en minúsculas y mayúsculas, signos de puntuación, números, etc&#8230; pero no acentos, eñes, ç, etc&#8230;) y por tanto se pueden usar únicamente 7 bits para representar cualquier símbol ode la tabla; el ASCII extendido llega a 256 y contiene (dependiendo del código de página) los caracteres especiales de los alfabetos latinos de otros idiomas, y esto se guarda en 8 bits lo cual es comodísimo para manejar el texto y hacer cálculos sobre cadenas usando expresiones regulares o funciones sencillas. <font color="#808000">¿¿¿Y que pasa con el resto??? ¿¿¿Debemos cambiar continuamente de página de códigos cada vez que nos aparezca un texto de otro sitio???</font></p>
<p align="justify">La solución la aportaron los desarrolladores de utf-8: codificación multibyte!! Esto es, una extensión del ascii, de modo que sea compatible con lo básico y para los caracteres extra se usan dos bytes pudiendo así guardar hasta 65535 caracteres diferentes. <font color="#808000">¿¿¿Porqué no  65536 que es lo que permiten 16 bits???</font> Porque hace falta reservar un carácter que permita marcar que extendemos a 16 bits. También hay soluciones de tamaño fijo para los sistemas en que es habitual trabajar con más de 256 símbolos, estos no reservan nada y todos los caracteres representados ocupan 2 ó 3 bytes.</p>
<p align="justify">Todo esto no sería un problema si trabajasemos únicamente en nuestro ordenador de casita donde todo puede estar perfectamente sincronizado para funcionar siempre con el mismo juego de caracteres. Pero cuando desde PHP (o cualquier otro lenguaje) accedemos a una BDD o a un recurso remoto en otra máquina nos encontramos con el problema de no tenerlo todo en el mismo juego de caracteres, aquí es donde entran las herramientas de conversión, ya que PHP nativamente (al menos por ahora) no funciona en utf8 aunque sí es capaz de manejar los datos.</p>
<p align="justify">Aunque mejor de lo que lo he explicado yo, y con buenos ejemplos, lo explica <a href="http://www.phpwact.org/php/i18n/charsets" target="_blank">ésta página </a>que está en inglés pero que es muy completita.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/belinux.wordpress.com/18/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/belinux.wordpress.com/18/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/belinux.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/belinux.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/belinux.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/belinux.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/belinux.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/belinux.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/belinux.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/belinux.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/belinux.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/belinux.wordpress.com/18/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=18&subd=belinux&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://belinux.wordpress.com/2007/06/29/php-y-la-codificacion-de-caracteres/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/835677ebae322dfcb383ac2b840668f2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">makj</media:title>
		</media:content>
	</item>
		<item>
		<title>nmap: mapeando la red</title>
		<link>http://belinux.wordpress.com/2007/06/28/nmap-mapeando-la-red/</link>
		<comments>http://belinux.wordpress.com/2007/06/28/nmap-mapeando-la-red/#comments</comments>
		<pubDate>Thu, 28 Jun 2007 16:28:53 +0000</pubDate>
		<dc:creator>makj</dc:creator>
				<category><![CDATA[Aplicaciones]]></category>
		<category><![CDATA[Configurando linux]]></category>
		<category><![CDATA[HowTO]]></category>
		<category><![CDATA[Redes]]></category>
		<category><![CDATA[Seguridad]]></category>

		<guid isPermaLink="false">http://belinux.wordpress.com/2007/06/28/nmap-mapeando-la-red/</guid>
		<description><![CDATA[&#8220;nmap&#8221; es una herramienta impresionante para configurar, explorar y verificar agujeros de seguridad en redes de todo tipo. Es multiplataforma y está disponible tanto a nivel de consola como en aplicaciones gráficas que le hacen de frontend (&#8220;knmap&#8221; y similares).
Si leemos la página de manual que tengamos en cualquier distribución linux sobre esta herramienta, veremos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=17&subd=belinux&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">&#8220;nmap&#8221; es una herramienta impresionante para configurar, explorar y verificar agujeros de seguridad en redes de todo tipo. Es multiplataforma y está disponible tanto a nivel de consola como en aplicaciones gráficas que le hacen de frontend (&#8220;knmap&#8221; y similares).</p>
<p align="justify">Si leemos la página de manual que tengamos en cualquier distribución linux sobre esta herramienta, veremos la infinidad de opciones y posibilidades que tiene, tantas que se hace muy dificil llegar a ser capaz de entender todo su potencial, sobre todo para alguien que no tenga mucha idea de cómo funciona el tráfico de red, las topologías, servicios, puertos, etc&#8230;.</p>
<p align="justify">He encontrado <a href="http://www.thewilfamily.com/hacking/nmap-a-fondo-escaneo-de-redes-y-hosts" target="_blank">éste artículo</a> muy interesante en castellano sobre como utilizar este comando con todas sus opciones, desde cero las opciones que pueden ser más comunes, creo que vale la pena que le echeis un ojo.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/belinux.wordpress.com/17/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/belinux.wordpress.com/17/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/belinux.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/belinux.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/belinux.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/belinux.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/belinux.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/belinux.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/belinux.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/belinux.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/belinux.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/belinux.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=17&subd=belinux&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://belinux.wordpress.com/2007/06/28/nmap-mapeando-la-red/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/835677ebae322dfcb383ac2b840668f2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">makj</media:title>
		</media:content>
	</item>
		<item>
		<title>Linux y la teoría de la relatividad: el tiki-taka del kernel!</title>
		<link>http://belinux.wordpress.com/2007/06/13/linux-y-la-teoria-de-la-relatividad-el-tiki-taka-del-kernel/</link>
		<comments>http://belinux.wordpress.com/2007/06/13/linux-y-la-teoria-de-la-relatividad-el-tiki-taka-del-kernel/#comments</comments>
		<pubDate>Wed, 13 Jun 2007 13:02:13 +0000</pubDate>
		<dc:creator>makj</dc:creator>
				<category><![CDATA[Configurando linux]]></category>
		<category><![CDATA[Kernel]]></category>

		<guid isPermaLink="false">http://belinux.wordpress.com/2007/06/13/linux-y-la-teoria-de-la-relatividad-el-tiki-taka-del-kernel/</guid>
		<description><![CDATA[Parece increíble poder mezclar estos tres conceptos, pero parece ser que el pingüino nos tenia reservada una pequeña sorpresa temporal, al menos en la versión x86-64 que no parece estar muy fina a pesar de llevar ya cierto tiempo en el mercado los procesadores a los que va destinado.
Vayamos al grano, tengo una máquina AMDX2 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=16&subd=belinux&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="justify">Parece increíble poder mezclar estos tres conceptos, pero parece ser que el pingüino nos tenia reservada una pequeña sorpresa temporal, al menos en la versión x86-64 que no parece estar muy fina a pesar de llevar ya cierto tiempo en el mercado los procesadores a los que va destinado.</p>
<p align="justify">Vayamos al grano, tengo una máquina AMDX2 de 64 bits con un núcleo pre-compilado de la Mandriva2007 para x86-64. El rendimiento es más que aceptable, va muy rápido y no ha dado ningún problema salvo tener que encontrar todo el software que me ha hecho falta en la versión adaptada a esta arquitectura (para poder instalar via RPM, evidentemente podría, y lo he hecho con algún paquete, haber  compilado los fuentes, pero no siempre es tan sencillo como pueda parecer)</p>
<p align="justify">En cualquier caso, hace unos dias he tenido serios problemas de &#8220;continuidad&#8221; con el funcionamiento de esta máquina, ya que me aparecían &#8220;kernels oops&#8221; que la reiniciaban o que la dejaban en un estado inestable en el que la mayoría de señales no funcionaban (fallaba algún subsistema y todo lo relacionado con él también). Los &#8220;oops&#8221; tenían que ver con IRQs, con E/S de disco cuando haciamos trabajo intensivo sobre él, etc&#8230;</p>
<p align="justify"><span id="more-16"></span></p>
<p align="justify">Tras googlear un rato (como siempre, donde si no?), encontré varias soluciones de gente que parecía tener el mismo problema con los drivers de nVidia (no parecía muy relacionado!), no con ellos directamente sino con el tenerlos cargados en el kernel como módulos. Parece ser que los drivers de nVidia para arquitecturas x86-64 no están muy finos (por ser suaves y no decir que petan como unos desgraciaos), el caso es que encontré abundante material y soluciones temporales a los problemas que la gente tenía con las tarjetas gráficas. La única relación que ví con mi arquitectura era que en mi placa el chipset es nForce570 !!! (vaya, driver de nVidia para E/S)</p>
<p align="justify">&nbsp;</p>
<ul>
<li>Una de las soluciones pasaba por retirar fisicamente memoria del sistema y dejarlo en 1 ó 2 GB (el tipo que tenía el problema tenía 4Gb igual que yo)&#8230; parece ser que le funcionó pero no tenía muy claro el porqué.</li>
<li>Otra de las soluciones era pasar como parámetro al kernel mem=2G , alegando que los drivers de nVidia no estaban pensados nativamente para 64bits y que no se llevan muy bien con los límites de memoria de los 32bits&#8230; teniendo en cuenta que mi placa sólo detecta 3.8GB esta solución me pareció un buen camino a seguir, y la verdad es que funcionó, pero no sabía muy bien porqué.</li>
<li> La respuesta la encontré en otro sitio donde hablaba de un parámetro del kernel que yo desconocía: <strong>report_lost_ticks<br />
</strong></li>
</ul>
<p align="justify">&nbsp;</p>
<p align="justify">Este parámetro incluye en el dmesg los ticks (y los tacks&#8230; vamos todo lo relacionado con el reloj del sistema que no vaya bien) del kernel al hacer cosas. Muy interesante: con la opción de arranque normal un montón de mensajes de perdida de ticks, con la opción de 2G muchísimos menos, pero aún algunos&#8230; y los más curioso: al darle caña al procesador (haciendo trabajo en batch intensivo sobre la BDD) se perdían continuamente ticks de 2 en 2&#8230; consecuencia: el reloj corría que daba gusto, es decir en su propio eje temporal!! había encontrado la 5ª dimensión!!!</p>
<p align="justify">Al final, probando, probando, probé a cambiar el ventilador por otro más super-tochísimo (de 875gramos) que parece haber calmado a la cpu, pero que aún así no arregla el problema del tiki-taka&#8230;</p>
<p align="justify">&nbsp;</p>
<p align="justify">No tengo una solución definitiva, solo esta orientación sobre los ticks para los que les pase algo similar con pc&#8217;s x86-64&#8230; [continuará?]</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/belinux.wordpress.com/16/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/belinux.wordpress.com/16/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/belinux.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/belinux.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/belinux.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/belinux.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/belinux.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/belinux.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/belinux.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/belinux.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/belinux.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/belinux.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=belinux.wordpress.com&blog=857121&post=16&subd=belinux&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://belinux.wordpress.com/2007/06/13/linux-y-la-teoria-de-la-relatividad-el-tiki-taka-del-kernel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/835677ebae322dfcb383ac2b840668f2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">makj</media:title>
		</media:content>
	</item>
	</channel>
</rss>