tag:blogger.com,1999:blog-60221736230419488402024-03-22T06:00:29.488+01:00Bit Bang!Otro blog sobre tecnología, Internet, informática y GNU/LinuxRaul Moraleshttp://www.blogger.com/profile/09319604893149735458noreply@blogger.comBlogger8125tag:blogger.com,1999:blog-6022173623041948840.post-55413630794655409592013-03-27T18:07:00.000+01:002013-03-27T18:07:52.541+01:00Creando dispositivos loop con losetup<br />
En UNIX, un dispositivo loop es un dispositivo de bloques virtual que apunta a un fichero normal y corriente de nuestro sistema de ficheros. Esto significa que podemos dar a un fichero la apariencia de ser un disco duro para el resto del sistema. En Linux, estos dispositivos son <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/dev/loop0</span>, <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/dev/loop1</span>, etc...<br />
<br />
Su uso más habitual siempre ha sido montar ficheros <a href="https://es.wikipedia.org/wiki/ISO_9660" target="_blank">ISO</a> (imágenes de CD y DVD) mediante el comando <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">mount -o loop</span>, pero también se puede usar para manipular ficheros como si fuesen un disco duro; particionarlos, formatearlos y montar esos sistemas de ficheros entre otras cosas.<br />
<br />
Un dispositivo loop es muy útil para recuperación de datos, por ejemplo, cuando un disco duro está fallando y volcamos su contenido en un fichero. Podemos crear un dispositivo loop que apunte al fichero y después ejecutar herramientas de recuperación sobre los datos, como por ejemplo <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">fsck</span>. Otra situación en la que también es muy útil es para acceder al contenido de los discos duros de máquinas virtuales sin tener que arrancar la maquina virtual. Los discos duros <i>raw</i> que utiliza <a href="http://www.linux-kvm.org/page/Main_Page" target="_blank">KVM</a> son imágenes exactas de un disco duro y perfectos para utilizarlos con losetup.<br />
<br />
<a name='more'></a><br />
Para enlazar el dispositivo loop1 a un fichero llamado fichero.raw ejecutamos lo siguiente<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ sudo losetup /dev/loop1 fichero.raw</code></pre>
Otra opción es utilizar el fichero loop más bajo disponible con la opción <i><b>-f</b></i>, y que nos diga que dispositivo loop ha utilizado con la opción <i><b>--show</b></i>. Si usamos <i><b>-r</b></i> el dispositivo funciona en modo de solo lectura.<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ sudo losetup -r -f --show fichero.raw
/dev/loop0</code></pre>
En un momento dado, podemos ver todos los dispositivos loop que estamos utilizando con<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ sudo losetup -a
/dev/loop0: [fc00]:9963478 (~/fichero.raw)</code></pre>
Y una vez hayamos terminado de trabajar con el dispositivo lo desenlazamos con <i><b>-d</b></i><br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ sudo losetup -d /dev/loop0</code></pre>
Otra característica muy interesante es poder enlazar de dispositivo loop con una parte del fichero, por ejemplo con la parte que corresponde una partición, y no con el fichero entero.<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ sudo losetup -o <offset bytes> --sizelimit <size bytes> <loopdev> <fichero></code></pre>
El <i>offset</i> es, contando desde el principio del fichero, el byte que se corresponderá con el primero del dispositivo loop. Con <i>sizelimit</i> indicamos cuantos bytes se van a enlazar contando desde el <i>offset
</i><br />
<br />
Ahora ponemos en práctica lo aprendido. Creamos un fichero de 10 GiB y lo enlazamos con <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/dev/loop0</span><br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>ramhux@bitbang:~$ dd if=/dev/zero of=fichero.raw bs=1GiB count=10
10+0 records in
10+0 records out
10737418240 bytes (11 GB) copied, 98.2422 s, 109 MB/s
ramhux@bitbang:~$ sudo losetup -f --show fichero.raw
/dev/loop0</code></pre>
Despues creamos dos particiones, una de 2 GiB y otra de 8 GiB, y vemos como aparecen dispositivos representando las particiones.<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>ramhux@bitbang:~$ sudo parted /dev/loop0
GNU Parted 2.3
Using /dev/loop0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel msdos
(parted) mkpart primary 0GiB 2GiB
(parted) mkpart primary 2GiB 10GiB
(parted) quit
Information: You may need to update /etc/fstab.
ramhux@bitbang:~$ ls /dev/loop0*
/dev/loop0 /dev/loop0p1 /dev/loop0p2</code></pre>
Formateamos la partición de 8GiB en <i>ext4</i>, la montamos en <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/mnt</span>, y vemos el espacio disponible<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>ramhux@bitbang:~$ sudo mkfs.ext4 -q /dev/loop0p2
ramhux@bitbang:~$ sudo mount /dev/loop0p2 /mnt
ramhux@bitbang:~$ df -h | grep mnt
/dev/loop0p2 7.9G 146M 7.4G 2% /mnt</code></pre>
Enlazamos un nuevo fichero loop que corresponde a la primera partición, y lo formateamos en <i>ext2</i>. Los valores del <i>offset</i> y <i>sizelimit</i> los veo en la tabla de particiones
<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>ramhux@bitbang:~$ sudo parted /dev/loop0 unit b print
Model: Loopback device (loop)
Disk /dev/loop0: 10737418240B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1048576B 2147483647B 2146435072B primary
2 2147483648B 10737418239B 8589934592B primary ext4
ramhux@bitbang:~$ sudo losetup -o 1048576 --sizelimit 2146435072 /dev/loop1 fichero.raw
ramhux@bitbang:~$ sudo mkfs.ext2 -q /dev/loop1</code></pre>
Comprobamos que los cambios hechos en <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/dev/loop1</span> también se reflejan de <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/dev/loop0</span> (ahora aparece el sistema de ficheros)
<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>ramhux@bitbang:~$ sudo parted /dev/loop0 print
Model: Loopback device (loop)
Disk /dev/loop0: 10737418240B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1048576B 2147483647B 2146435072B primary ext2
2 2147483648B 10737418239B 8589934592B primary ext4
</code></pre>
Por ultimo desmontamos y desenlazamos el dispositivo
<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>ramhux@bitbang:~$ sudo umount /mnt
ramhux@bitbang:~$ sudo losetup -d /dev/loop0
ramhux@bitbang:~$ sudo losetup -d /dev/loop1</code></pre>
<h3>
Referencias</h3>
<a href="http://manpages.ubuntu.com/manpages/precise/man8/losetup.8.html">http://manpages.ubuntu.com/manpages/precise/man8/losetup.8.html</a><div class="blogger-post-footer"><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es"><img alt="Licencia Creative Commons" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png" /></a></div>Raul Moraleshttp://www.blogger.com/profile/09319604893149735458noreply@blogger.com0tag:blogger.com,1999:blog-6022173623041948840.post-55167214812405527812013-01-27T18:00:00.000+01:002013-01-27T18:00:02.535+01:00Cerrando ventanas en Unity<a href="http://unity.ubuntu.com/">Unity</a>, el controvertido entorno de escritorio de Ubuntu tiene la peculiaridad de tener los botones de control de ventanas a la izquierda. Yo suelo adaptarme a cualquier escritorio con relativa facilidad (menos a KDE, que no lo entiendo), pero una cosa que suelen preguntarme los que prueban por primera vez Ubuntu es como cambiar estos botones a la derecha, al estilo Windows.<br />
<div>
<br /></div>
<a name='more'></a><div>
La forma más sencilla de hacer esto es abrir un terminal de línea de comandos y ejecutar el siguiente comando:</div>
<div>
<br /></div>
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ gsettings set org.gnome.desktop.wm.preferences button-layout ":minimize,maximize,close"</code></pre>
<div>
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqNhuDCW3yPNNscM3FUFfzMh6of2kMLV77Hk6oBBrxH0A4-P3qBXoDnPVRWEeaASnRbVm3aMZNurUtCPDOQ2q9LqezKNifFSehZohemsnPbM-CASWwynnDl-3egafJ37mD8AR2n5JVV44/s1600/close-unity.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqNhuDCW3yPNNscM3FUFfzMh6of2kMLV77Hk6oBBrxH0A4-P3qBXoDnPVRWEeaASnRbVm3aMZNurUtCPDOQ2q9LqezKNifFSehZohemsnPbM-CASWwynnDl-3egafJ37mD8AR2n5JVV44/s1600/close-unity.png" height="204" width="320" /></a></div>
<br /></div>
<div>
<br /></div>
<div>
Esto funciona para Ubuntu 12.04 y 12.10, pero la pega es que cuando la ventana está maximizada los botones siguen saliendo a la izquierda, dentro de la barra de menú.</div>
<div>
<br /></div>
<div>
Para volver a dejarlo como estaba, hay que ejecutar</div>
<div>
<br /></div>
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ gsettings set org.gnome.desktop.wm.preferences button-layout "close,minimize,maximize:"</code></pre>
<div>
<br /></div>
<div>
Referencias:</div>
<div>
<a href="http://askubuntu.com/">http://askubuntu.com/</a></div>
<div class="blogger-post-footer"><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es"><img alt="Licencia Creative Commons" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png" /></a></div>Raul Moraleshttp://www.blogger.com/profile/09319604893149735458noreply@blogger.com2tag:blogger.com,1999:blog-6022173623041948840.post-57216058327055712342013-01-20T12:22:00.000+01:002013-01-20T18:01:11.653+01:00La historia de GNU HURD<i>Este articulo fue originalmente escrito para el monográfico de <a href="http://www.panicoenelnucleo.com/" target="_blank">Pánico en el Núcleo</a> <a href="http://www.panicoenelnucleo.com/2013/01/panico-en-el-nucleo-3x07-hard-herd-hird-hord-hurd/" target="_blank">3x07</a>, podcast en el que colaboro. Aprovechando la labor de investigación, esta es una versión modificada, extendida y adaptada para este blog.</i><br />
<br />
Hoy en día tenemos muchas distros para elegir, que no son más que distintas formas de montar un mismo sistema operativo: GNU/Linux.<br />
<br />
<a href="https://www.gnu.org/" target="_blank">GNU</a> es el sistema operativo de la <a href="https://www.fsf.org/" target="_blank">Free Software Foundation</a> que comenzó a crear <a href="http://stallman.org/#serious" target="_blank">Richard M. Stallman</a> en el año 1983. Por otra parte, <a href="https://www.kernel.org/" target="_blank">Linux</a> es un núcleo (kernel) de sistema operativo creado por <a href="https://es.wikipedia.org/wiki/Linus_Torvalds" target="_blank">Linus B. Torvalds</a> en el año 1991. Juntos hacen un sistema operativo libre y completo, a parte de otras muchas bondades técnicas.<br />
<br />
Pero en un principio, la idea era que el núcleo de GNU fuese <a href="https://www.gnu.org/software/hurd/" target="_blank">HURD</a>. Lo que sucedió es que HURD fue un proyecto que duró muchos años y avanzó muy poco, y Linux le quitó el puesto, realmente sin pretenderlo. Entonces, ¿qué pasó con HURD? ¿Por qué nunca llegó a nada? ¿Y cual es su estado a día de hoy? Bien, estas son las preguntas que trato de responder en este artículo.<br />
<a name='more'></a><br />
<h4>
La búsqueda de un kernel para GNU</h4>
Como decíamos al comienzo, GNU se inició en 1983 para crear una alternativa libre a UNIX (recordad que GNU’s not UNIX), reemplazando en un principio cada uno de sus componentes por versiones libres, pero siempre funcionando sobre un UNIX comercial. Cuando GNU tuvo suficientes piezas de software para formar un sistema operativo, el siguiente paso era conseguir un kernel libre para tener un sistema operativo GNU completo. En vez de crearlo de cero, la idea de Richard Stallman era buscar alguno que ya existiera y que fuera software libre, para después simplemente adaptarlo a lo que querían.<br />
<br />
En 1986, Richard Stallman optó por el núcleo de TRIX como kernel para GNU. TRIX era un sistema compatible con la versión 7 de UNIX, ya era software libre, y se había desarrollado a finales de los 70 en el MIT (donde Stallman había estado estudiando y trabajando). Pero en menos de un año se dieron cuenta de que necesitaban algo más grande y mejor que TRIX, y Richard Stallman ya tenía el ojo puesto en Mach, desarrollado en la Universidad Carnegie Mellon.<br />
<br />
Mach es un microkernel, que a diferencia de un kernel monolítico, es un núcleo que solo ofrece servicios básicos de gestión de memoria, IPC (comunicación entre procesos), y poco más. El resto de servicios tales como drivers de dispositivos o sistemas de ficheros, típicos de un kernel, los debería proporcionar uno o más programas llamados servidores, y que funcionan en espacio de usuario como cualquier otro proceso. Desde el punto de vista de la ingeniería del software y el desarrollo de sistemas operativos, este modelo era mucho mejor que el tradicional, teóricamente, al permitir desarrollar y probar cada servidor de manera independiente.<br />
<br />
En la FSF querían usar el modelo de microkernel y servidores para el núcleo de GNU, usando el microkernel Mach y desarrollando ellos los servidores. Era un proyecto muy ambicioso, algo que no se había hecho nunca hasta la fecha. Además pretendía dar libertad al usuario sobre ciertos límites habitualmente impuestos por los administradores de sistemas, como poder usar sus propios sistemas de ficheros, ejecutando sus propios servidores del núcleo sin necesidad de permisos especiales.<br />
<br />
Siguiendo con la historia, el desarrollo de Mach iba muy lento, y antes de poder distribuirlo junto con GNU, había que aclarar las condiciones de la licencia con los abogados de la Universidad Carnegie Mellon. Por este motivo todavía se estaban barajando otras posibilidades. TRIX no se había descartado del todo, y entraba en juego el kernel de Sprite, otro sistema operativo desarrollado en la Universidad de Berkeley. Había llegado 1990 y la Free Software Foundation no estaba trabajando todavía en ningún kernel porque Richard Stallman tenía aun la esperanza de poder utilizar el microkernel Mach.<br />
<br />
Por fin, en 1991 se llegó a un acuerdo con la Universidad Carnegie Mellon y la FSF se puso a trabajar en Mach: el núcleo de GNU estaba de camino. Richard Stallman le puso el nombre Alix al núcleo, por la novia que tenía en aquel momento, pero Thomas Bushnell, principal desarrollador del núcleo, lo cambió por HURD.<br />
<br />
HURD significa “Hird of Unix-Replacing Daemons”, y Hird significa “Hurd of Interfaces Representing Depth”, un doble acrónimo recursivo. Tanto Hird como HURD se pronuncian como la palabra inglesa <i>herd</i> (manada). La traducción seria "Manada de servidores que reemplazan a Unix" para HURD, y "Manada de interfaces que representan profundidad" para Hird.<br />
<br />
En 1992, Linus Torvalds publicó el kernel Linux como software libre, aunque en aquel momento solo funcionaba sobre i386 y prácticamente era un hobby. En la FSF se enteraron de la existencia de Linux tiempo después de su creación, pero estaba muy lejos de ser el núcleo que necesitaban (no era portable), y por supuesto mucho más lejos de lo que HURD prometía ser. La FSF lo descartó como un posible kernel para GNU y siguió trabajando en HURD.<br />
<br />
<h4>
El declive de HURD</h4>
Como era un proyecto muy complejo, el desarrollo era lento y surgieron muchos problemas. Todas las supuestas ventajas de usar un microkernel con múltiples servidores quedaron ocultas bajo todos los problemas que producía. El rendimiento era pobre debido a las comunicaciones entre los servidores y Mach; además era muy difícil depurar problemas cuando varios servidores de HURD están implicados.<br />
<br />
Durante la década de los 90, Linux creció rápidamente, mientras que HURD parecía estancarse. Linux tenía la ventaja de funcionar en ordenadores domésticos, lo que le permitió conseguir muchos seguidores. Empezaron a aparecer las primeras distribuciones, y en 1993 aparecieron Slackware y Debian. Finalmente Linux cubrió el hueco de HURD como el núcleo para GNU, y HURD quedó relegado a un proyecto de poca importancia. El propio Richard Stallman reconoció en 1999 que GNU/Linux es un buen sistema operativo, completo y libre.<br />
<br />
Stallman estaba preocupado porque los usuarios de GNU/Linux lo usaran por motivos técnicos, sin ni siquiera conocer los ideales de libertad que hay tras el proyecto GNU. Thomas Bushnell piensa que todo habría sido diferente si Stallman le hubiera dejado utilizar el kernel de 4.4BSD-Lite para crear HURD; Thomas conocía el código, sabía como hacerlo, y cree que habría tenido éxito.<br />
<br />
A pesar de todo, HURD todavía continuó su desarrollo. En 2002 HURD se modificó para que funcionase sobre L4, otro microkernel de nueva generación que simplificaba la comunicación entre HURD y el microkernel, pero en 2005 se descartó porque no se adaptaba bien a las características de HURD. En 2006 se inició un proyecto para portarlo al microkernel Coyotos, pero se abandonó la idea antes de escribir ni una sola línea de código por las diferencias en los fundamentos del diseño de ambos proyectos.<br />
<br />
Después del 2006, los desarrolladores de HURD llegaron a la conclusión de que utilizar un microkernel existente acabaría nuevamente en desastre porque el diseño del microkernel estaba muy ligado al diseño de todo el sistema. Neal Walfield, desarrollador de HURD, creó el microkernel Viengoos a modo experimental basándose en la experiencia con los anteriores, pero en 2009 dejó el proyecto abandonado por falta de tiempo.<br />
<br />
En 2010 Stallman dijo que no era muy optimista con HURD porque requería resolver muchos problemas, y terminar el desarrollo ya no es crucial para GNU porque Linux ya proporciona un kernel libre con muy buen soporte de hardware. Richard Stallman ha reconocido su error al querer usar Mach en su momento, decisión que les hizo perder muchísimo tiempo en negociaciones con la Universidad Carnegie Mellon, y posteriormente ralentizó el desarrollo.<br />
<br />
<h4>
HURD en la actualidad</h4>
A día de hoy HURD es usable pero no es apto para producción y todavía sigue utilizando oficialmente el microkernel Mach. Soporta aplicaciones gráficas usando X y es autónomo e independiente, es decir, un sistema GNU/HURD se puede compilar entero sobre un sistema GNU/HURD. Por contra, la interfaz POSIX no está completa y el soporte para dispositivos de caracteres (como tarjetas de sonido) prácticamente no existe.<br />
<br />
Pero aunque HURD no está vivo, tampoco está muerto del todo. Si eres un nostálgico, un seguidor de Stallman y de la FSF, o un curioso al que le gusta probar cosas nuevas, todavía puedes probar HURD usando alguna de las distribuciones que lo incluyen:<br />
<br />
<ul>
<li><a href="http://www.debian.org/ports/hurd/" target="_blank">Debian GNU/Hurd</a></li>
<li><a href="http://www.archhurd.org/" target="_blank">Arch Hurd</a></li>
<li><a href="http://hydra.nixos.org/job/gnu/hurd-master/qemu_image" target="_blank">NixOS</a> (solo imágenes para Qemu)</li>
</ul>
<br />
<br /><div class="blogger-post-footer"><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es"><img alt="Licencia Creative Commons" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png" /></a></div>Raul Moraleshttp://www.blogger.com/profile/09319604893149735458noreply@blogger.com0tag:blogger.com,1999:blog-6022173623041948840.post-78462642953681467382012-12-30T20:08:00.000+01:002012-12-30T20:08:27.696+01:00Problema con almacenamiento USB en LinuxAlguna vez me he vuelto loco con dispositivos de almacenamiento masivos USB (discos duros, pendrives, dispositivos MP3, etc) porque mientras los estoy usando se resetean y dejan de funcionar. Ejecutando <span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><i>dmesg</i></span> se puede observar un mensaje de error parecido al siguiente:<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>[30672.408131] usb 1-7: reset high speed USB device using ehci_hcd and address 7</code></pre>
<a name='more'></a><br />
La causa es que Linux le está enviando mas datos de golpe de los que son capaces de gestionar, y reaccionan bloqueándose y se reseteandose. Por suerte es un parámetro que puede verse y modificarse a través del fichero <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/sys/block/sdb/device/max_sectors</span> (suponiendo que el dispositivo sea <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/dev/sdb</span>)<br />
<br />
La solución es escribir en el fichero un valor lo suficientemente pequeño para que el dispositivo no se bloquee. Habitualmente se soluciona con el valor 64, pero se puede utilizar cualquier múltiplo de 8.<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code># echo 64 > /sys/block/sdb/device/max_sectors</code></pre>
<br />
El valor modificado del fichero se pierde en cuanto desconectamos el dispositivo del ordenador y hay que volver a escribirlo cuando lo volvamos a conectar. Esto también se puede automatizar con la configuración adecuada de <i><a href="https://www.kernel.org/pub/linux/utils/kernel/hotplug/udev/udev.html" target="_blank">udev</a></i>.<br />
<br />
<h3>
Referencias</h3>
<a href="http://www.linux-usb.org/FAQ.html#i5" target="_blank">Linux USB FAQ</a><div class="blogger-post-footer"><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es"><img alt="Licencia Creative Commons" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png" /></a></div>Raul Moraleshttp://www.blogger.com/profile/09319604893149735458noreply@blogger.com0tag:blogger.com,1999:blog-6022173623041948840.post-31764007554407794032012-11-12T09:00:00.000+01:002012-11-12T09:00:18.631+01:00Casi todo sobre eCryptfs<i><a href="http://ecryptfs.org/" target="_blank">eCryptfs</a></i> es un un sistema de ficheros encriptado que está integrado en el kernel Linux. Es lo que utiliza Ubuntu cuando activamos el directorio Home encriptado. Y funciona como una herramienta a medio camino entre <i>GnuPG</i> y <i>Cryptsetup</i>.<br />
<br />
<a name='more'></a><i>GnuPG</i> nos permite encriptar ficheros uno a uno, y <i>Cryptsetup</i> nos permite encriptar todo el contenido del disco duro (o la partición) de manera transparente en GNU/Linux, incluyendo el sistema de ficheros.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv5_rSTZ96svx7DtI5WQULxdu8lYvbdVJ1e47xpGqlnLsOBGKEVT45rGj_W3mvB2UBv1DXW4qohZy7j3wFY_Plx8a0zrxm-FG_jRJKZ5p1yYJOsWAq525Gjjp7U8y2mY-uDoiD1Wn2Ofo/s1600/cryptsetup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv5_rSTZ96svx7DtI5WQULxdu8lYvbdVJ1e47xpGqlnLsOBGKEVT45rGj_W3mvB2UBv1DXW4qohZy7j3wFY_Plx8a0zrxm-FG_jRJKZ5p1yYJOsWAq525Gjjp7U8y2mY-uDoiD1Wn2Ofo/s1600/cryptsetup.png" height="256" width="320" /></a></div>
<br />
<i>eCryptfs</i> funciona sobre un sistema de ficheros POSIX como ext4, también de forma transparente, encriptando cada fichero de manera individual y con toda la información necesaria sobre el cifrado incluida en el propio fichero. Se podría coger un solo fichero encriptado, enviarse a otro PC, y acceder a la información de ese fichero usando la misma contraseña.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBf0bEAE0QBGCMGz8tHCr8CrKIjkG8sfIxjHtILult_n_0t77nDv4zillR-Jq9F8Vnf11NtDRUmG_RlaFO7JIWMZiGhLPmZ_lhGgCsVJ925pEc8bK1zO4N4oLJRcW__oKAQKC_3SaiYHM/s1600/ecryptfs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBf0bEAE0QBGCMGz8tHCr8CrKIjkG8sfIxjHtILult_n_0t77nDv4zillR-Jq9F8Vnf11NtDRUmG_RlaFO7JIWMZiGhLPmZ_lhGgCsVJ925pEc8bK1zO4N4oLJRcW__oKAQKC_3SaiYHM/s1600/ecryptfs.png" height="245" width="320" /></a></div>
<br />
Para utilizarlo hay que instalar el paquete <i>ecryptfs-utils</i>, y su uso mas sencillo es el siguiente:<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ sudo mount -t ecryptfs <dir. origen> <dir. destino></code></pre>
De manera interactiva, nos pedirá la clave que queremos utilizar seguida de una serie de preguntas que podemos dejar en sus opciones por defecto pulsando <i>enter</i>. Una vez montado, todos los archivos que escribamos en el directorio destino aparecerán en directorio origen pero con el contenido encriptado.<br />
<br />
Es habitual usar el mismo directorio como origen y destino. Por ejemplo:<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ sudo mount -t ecryptfs /dir/enc /dir/enc</code></pre>
Antes del comando <i>mount</i>, el contenido del directorio son los ficheros cifrados; después de <i>mount</i> estos se quedan ocultos y solo podremos ver los ficheros desencriptados, hasta que volvamos a usar <i>umount</i>.<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ sudo umount /dir/enc</code></pre>
<br />
Las preguntas que nos hace eCryptfs de manera interactiva son las siguientes:<br />
<ul>
<li>Introducir la <b>passphrase</b>, es decir, la contraseña de encriptación.</li>
<li>El <b>algoritmo de cifrado</b>, que por defecto es AES.</li>
<li><b>Tamaño de la clave</b>, que por defecto es de 16 bytes (128 bits).</li>
<li>Si queremos activar el <b>plaintext passthrough</b>, que es acceder a ficheros que no estén cifrados.</li>
<li>Si queremos <b>encriptar los nombres de los ficheros</b>. Por defecto solo se encripta el contenido.</li>
</ul>
<br />
Si hay ficheros sin cifrar en el directorio origen, al activar <b>plaintext passthrough</b> tendremos acceso al contenido de estos ficheros desde el directorio destino. Por defecto está desactivado y se producirá un error al intentar acceder a estos ficheros.<br />
<br />
Al activar el <b>cifrado de los nombres de ficheros</b> también nos preguntará por la firma de la clave que queremos usar, que por defecto es la misma que para cifrar el contenido. En raras situaciones hace falta cambiarla. Con esta opción activada los nombres de los ficheros aparecerán en el directorio origen como largas cadenas de caracteres pseudo-aleatorias.<br />
<br />
Además, la primera vez que utilicemos una clave nos avisará de que no se ha utilizado antes, y nos preguntará si queremos continuar. Hay que estar seguro de haber escrito correctamente la clave, entonces le decimos <i>yes</i>. Seguidamente nos preguntará si queremos guardar la firma de la clave en el fichero <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/root/.ecryptfs/sig-cache.txt</span> para que no nos vuelva hacer estas dos últimas preguntas. Si le decimos <i>yes</i> y nos vuelve a salir este aviso en el futuro, es que no hemos escrito correctamente la clave.<br />
<br />
<h2>
Automatizando opciones</h2>
El comando <i>mount</i> nos mostrará un texto similar a este:<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>Attempting to mount with the following options:
ecryptfs_unlink_sigs
ecryptfs_key_bytes=16
ecryptfs_cipher=aes
ecryptfs_sig=7511300c76c56697</code></pre>
Son opciones que se pueden pasar a <i>mount</i> para responder las preguntas de manera no interactiva. Por ejemplo, si tenemos la firma de la clave metida de antemano en <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/root/.ecryptfs/sig-cache.txt</span>, el siguiente comando sólo nos pedirá la clave<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ sudo mount -t ecryptfs /dir/enc /dir/enc -o ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_passthrough=no,ecryptfs_fnek_sig=7511300c76c56697</code></pre>
<br />
Las opciones que se le pueden pasar a mount son las siguientes:<br />
<ul>
<li><b>ecryptfs_cipher=<i>aes</i></b> o el algoritmo elegido</li>
<li><b>ecryptfs_key_bytes=<i>16</i></b> ó 24 ó 32</li>
<li><b>ecryptfs_passthrough</b> o <b>ecryptfs_passthrough=no</b> para activar o desactivar <i>plaintext passthrough</i></li>
<li><b>ecryptfs_fnek_sig=<i><sig></i></b> o <b>ecryptfs_enable_filename_crypto=no</b> para activar o desactivar el cifrado de nombres de ficheros</li>
<li><b>no_sig_cache</b> para desactivar la comprobación de la firma en <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/root/.ecryptfs/sig-cache.txt</span></li>
</ul>
<br />
Para automatizarlo completamente podemos añadir una opción con la clave al resto de opciones usando una de estas dos alternativas:<br />
<ul>
<li><b>key=passphrase:passwd=<i>miclave</i></b></li>
<li><b>key=passphrase:passfile=<i>/tmp/clave</i></b></li>
</ul>
En este último caso, el fichero <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/tmp/clave</span> tiene que existir su contenido tiene que ser<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>passphrase_passwd=miclave</code></pre>
Aunque no es muy buena idea guardar un fichero con la clave en el mismo sitio que están los datos encriptados.<br />
<br />
En caso de crear una entrada dentro de <span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/etc/fstab</span> es recomendable añadir también <i>noauto</i> si es previsible que nos pida algún dato de manera interactiva.<br />
<br /><div class="blogger-post-footer"><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es"><img alt="Licencia Creative Commons" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png" /></a></div>Raul Moraleshttp://www.blogger.com/profile/09319604893149735458noreply@blogger.com0tag:blogger.com,1999:blog-6022173623041948840.post-13813063934439197452012-11-03T13:19:00.000+01:002012-11-03T13:26:46.990+01:00Mini-manual basico de GitActualmente trabajo de administrador de sistemas y durante estos años he programado muy poco y en raras ocasiones. De mi época de programador tengo la costumbre de utilizar <a href="http://es.wikipedia.org/wiki/Control_de_versiones" target="_blank">sistemas de control de versiones</a> cuando tengo que picar código, por pequeño que sea lo que voy a programar. Me ayuda a centrarme en un pequeño sub-problema, resolverlo bien, y me facilita retroceder sobre mis pasos si no me gustan los últimos cambios que he hecho y quiero descartarlos.<br />
<br />
Aunque personalmente me siento mas cómodo con <a href="http://bazaar.canonical.com/" target="_blank">Bazaar</a> porque estuve varios años trabajando con <a href="http://subversion.apache.org/" target="_blank">Subversion</a> y pasar del uno al otro me pareció trivial, lo cierto es que <a href="http://git-scm.com/" target="_blank">Git</a> está mucho más extendido (gracias a <a href="https://github.com/" target="_blank">GitHub</a>) y conviene saber manejarlo.<br />
<br />
<a name='more'></a><h3>
<span style="color: orange;">Referencias</span></h3>
Para información completa y más avanzada sobre el uso de Git:<br />
<ul>
<li>El <a href="http://git-scm.com/book" target="_blank">libro Pro Git</a>, de Scott Chacon.</li>
<li>La <a href="https://help.github.com/" target="_blank">ayuda de GitHub</a>.</li>
</ul>
Y por supuesto, en la ayuda de Git
<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git help</code></pre>
<br />
<h3>
<span style="color: orange;">Bases de Git</span></h3>
Git es un sistema de control de versiones distribuido, lo que significa que el cliente guarda una copia completa del repositorio del servidor. También puede usarse en un solo directorio en modo <i>stand-alone</i>, que es como vamos a explicar en este mini-manual.<br />
<br />
El repositorio es una secuencias de instantáneas (<i>snapshots</i>) de los ficheros de un directorio con una serie de metadatos que permiten saber quien y cuando ha hecho las modificaciones entre instantáneas.<br />
<br />
El directorio de trabajo es el directorio del sistema de ficheros donde trabajamos creando, borrando o modificando ficheros. Tiene una copia de los ficheros de una instantánea concreta (generalmente la última) del repositorio. Los ficheros modificados se mandan al índice antes de ser enviados al repositorio.<br />
<br />
El índice o <i>staging area</i> es una instantánea de los ficheros del directorio de trabajo, que todavía no se ha enviado al repositorio. Todas las modificaciones guardadas en el índice se mandan juntas al repositorio al hacer <i>commit</i>, junto con los metadatos.<br />
<h3>
<span style="color: orange;"><br /></span></h3>
<h3>
<span style="color: orange;">Configurar Git</span></h3>
Git almacena la configuración global del usuario en <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">~/.gitconfig</span>, y es la que se modifica al añadir la opción <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><i>--global</i></span>. La configuración especifica para un repositorio está en <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">.git/config</span>.<br />
<br />
Configurar el nombre y el e-mail para los <i>commits</i>
<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git config --global user.name "Nombre Apellido"
$ git config --global user.email username@example.com</code></pre>
Activar el coloreado del texto mostrado en algunos comandos
<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git config --global color.ui True</code></pre>
Configurar el editor de texto que se utiliza en algunos comandos<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git config --global core.editor vim</code></pre>
Listar las opciones de configuración<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git config --list</code></pre>
Editar el fichero de configuración del repositorio y el global respectivamente
<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git config --edit
$ git config --global --edit</code></pre>
<br />
Los ficheros <span style="font-family: 'Courier New', Courier, monospace;">.gitignore</span> y <span style="font-family: 'Courier New', Courier, monospace;">.git/info/exclude</span> tienen una lista de los ficheros que son ignorados del directorio de trabajo. El primero puede añadirse en el propio repositorio y se propaga en las copias (clones) que se hagan.<br />
<br />
<h3>
<span style="color: orange;">Crear los repositorios</span></h3>
Para empezar a trabajar hace falta tener un repositorio. Si empezamos a trabajar desde cero, podemos utilizar un directorio vacío y crear un nuevo repositorio en el, o para trabajar en un proyecto que ya existe podemos clonar el repositorio del proyecto para tener nuestro propio repositorio.<br />
<br />
Crear un nuevo repositorio en el directorio actual o el especificado
<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git init [directorio]</code></pre>
Crear un repositorio como copia de otro<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git clone <url> [directorio]</code></pre>
<h3>
<span style="color: orange;"><br /></span></h3>
<h3>
<span style="color: orange;">Directorio de trabajo</span></h3>
Para ver el estado del directorio de trabajo y algunas pistas sobre lo que podemos hacer con Git<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git status</code></pre>
Añadir nuevos ficheros y modificaciones al índice<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git add <ficheros></code></pre>
Borrar ficheros<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git rm <ficheros> #Borrar del índice y del directorio de trabajo
$ git rm --cached <ficheros> #Borrar solo del índice</code></pre>
Renombrar un fichero<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git mv <fichero> <nuevofichero> #Equivalente a la siguiente secuencia
$ git rm --cached <fichero> #Borrar del índice
$ mv <fichero> <nuevofichero> #Renombrar en el sistema de ficheros
$ git add <nuevofichero> #Añadir al índice</code></pre>
Convertir el <i>staging area</i> en la ultima instantánea (<i>commit</i>)<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git commit -m "mensaje"</code></pre>
Deshacer los cambios<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git reset <fichero> #Descarta las modificaciones guardadas en el índice
$ git checkout <fichero> #Descarta las modificaciones del directorio de trabajo
</code></pre>
Reemplazar el último <i>commit</i> por el <i>staging area</i> actual. También reemplaza el comentario.<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git commit --amend -m "nuevo mensaje"</code></pre>
Mostrar las modificaciones<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git diff #Diferencias entre el directorio de trabajo y el índice
$ git diff --cached #Diferencias entre el índice y el último commit</code></pre>
<br />
<h3>
<span style="color: orange;">Logs</span></h3>
Mostrar un histórico de los <i>commits</i>
<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git log</code></pre>
Hay muchas formas de mostrar los logs (ver <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><i>git help log</i></span>)<br />
<pre style="background-color: #cccccc; border: 1px dashed rgb(153, 153, 153); color: black; font-size: 12px; line-height: 14px; padding: 5px; width: 100%;"><code>$ git log -p #muestra diffs entre commits
$ git log --stat #indica el número de lineas modificadas
$ git log --graph #muestra un grafo de las modificaciones
$ git log -<n> # solo muestra los ultimas n commits
$ git log --pretty=[oneline|short|full|fuller]</code></pre>
<div class="blogger-post-footer"><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es"><img alt="Licencia Creative Commons" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png" /></a></div>Raul Moraleshttp://www.blogger.com/profile/09319604893149735458noreply@blogger.com0tag:blogger.com,1999:blog-6022173623041948840.post-46915703060661510862012-10-29T23:20:00.000+01:002012-10-30T21:27:09.883+01:00Presentación del Nexus 4A pesar de haber cancelado el evento de presentación en Nueva York por el peligro del huracán, <a href="http://googleblog.blogspot.com.es/2012/10/nexus-best-of-google-now-in-three-sizes.html" target="_blank">Google ha presentado hoy</a>, entre otras cosas, el nuevo teléfono Android de la compañía: <a href="http://www.google.es/nexus/4/" target="_blank">el Nexus 4</a>.<br />
<div>
<br /></div>
<div>
No voy a entrar en las nuevas características de Android 4.2, que les llegará igual al resto de terminales; lo bueno del software de este terminal es que al ser de Google, se actualiza <u>de verdad</u> a las nuevas versiones de Android. Aunque para mi lo mas interesante es el hardware, y éstas son las características publicadas:<br />
<a name='more'></a></div>
<div>
<ul>
<li>Fabricado por LG </li>
<li>Procesador quad-core Qualcomm Snapdragon (TM) Pro S4</li>
<li>2 GB de RAM</li>
<li>Cámara de fotos de 8 MP, y cámara frontal de 1.3 MP </li>
<li>Pantalla de 4.7" (1280x768) y cristal Gorilla Glass</li>
<li>Conectores MicroUSB, SlimPort HDMI y Jack de 3.5 mm</li>
<li>Tamaño de 133.9 x 68.7 x 9.1 mm y peso de 139 g</li>
<li>Posibilidad de cargarse sobre una alfombrilla cargadora inalámbrica</li>
<li>Versión de 8 GB por 300€ y 16 GB por 350€</li>
<li>A partir del 13 de noviembre se podrá comprar en la <a href="https://play.google.com/store/devices" target="_blank">Google Play Store</a></li>
</ul>
<div>
Después de HTC con el Nexus One, y Samsung con el Nexus S y el Galaxy Nexus, LG es el tercer fabricante de la familia Nexus. Con un procesador de 4 núcleos y 2 GB de RAM es mucho mas de lo que se necesita a día de hoy, pero esperemos que tarde unos años en quedarse obsoleto. La cámara no es tope de gama, pero si la óptica es buena es mas que suficiente para reemplazar una cámara compacta. </div>
<div>
<br /></div>
<div>
Lo que no parece tener es ampliación con tarjetas microSD, y 8 GB se pueden quedar cortos con la cantidad de información que se mueve a día de hoy.</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div class="blogger-post-footer"><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es"><img alt="Licencia Creative Commons" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png" /></a></div>Raul Moraleshttp://www.blogger.com/profile/09319604893149735458noreply@blogger.com0tag:blogger.com,1999:blog-6022173623041948840.post-27311340953180534292012-10-26T19:31:00.000+02:002012-10-26T19:31:06.745+02:00Hola Mundo!Hoy estreno este blog alojado en blogger.<div class="blogger-post-footer"><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es"><img alt="Licencia Creative Commons" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png" /></a></div>Raul Moraleshttp://www.blogger.com/profile/09319604893149735458noreply@blogger.com2