Máquina Linux en la nube Amazon gratis por 1 año

Un apunte rápido pero muy interesante: Amazon ha decidido que a partir del 1 de Noviembre, las instancias de máquinas virtuales Linux en la modalidad micro (613 MB de RAM y plataforma 32 o 64 bits), sean gratis por un año. Es decir, una instancia de máquina por cada nuevo usuario. Y sí, tienes que ser un nuevo usuario. En concreto, se considera nuevo usuario todo aquel que se haya dado de alta en AWS (Amazon Web Services) a partír del 20 de Octubre.

Puedes ver la letra pequeña (realmente son 750 horas de CPU al mes y hay algunas otras limitaciones de tamaño, por ejemplo «sólo» 5GB de disco S3!!) pero la oferta me parece impresionante. Yo ya me he dado de alta, aprovechando el enlace que Oier M. me pasó donde se explica paso a paso, con pantallazos, cómo crear tu primera instancia EC2 🙂 En ese tutorial falta el comienzo, donde realmente tienes que dar tus datos personales, tarjeta de crédito (por si acaso sobrepasas las limitaciones que he comentado antes) y número de teléfono.

El número de teléfono que introduzcas en el formulario de alta debe ser real, porque al enviarlo, AWS te mostrará un número en pantalla y en ese momento, te llamará un «robot», diciéndote que teclees el número que ves en pantalla en el teclado de tu móvil. En cuanto lo hagas, se activará la cuenta y ya podrás seguir el tutorial indicado (me ha gustado el método de confirmación de identidad móvil…)

Update: ojo, el EBS (Elastic Block Storage) que ofrece Amazon en esta oferta es de 10 GB. Teniendo en cuenta que las máquinas virtuales en general vienen con 15GB, si eliges una de éstas, tendrás que pagar 0,5$ al mes. No es dinero, pero ya no es «gratis total» (a no ser que elijas una máquina virtual con menos de 15GB)

Disección del sistema de archivos ext3

He leído mucho sobre el funcionamiento interno del sistema de archivos ext3 y la verdad, hay muchos detalles que en distintos documentos no cuadran. Por otra parte, siendo uno de los sistemas de archivos más usados en el mundo Linux, creo que merece la pena dedicarle un artículo intentado poner por escrito, con un poco de orden y concierto, toda la información de la que dispongo.

Estructura interna de ext3

Antes de meternos en harina, conviene explicar algunos conceptos. El primero es el de inodo. Un inodo es una estructura de datos, asociada a cada fichero del sistema, que tiene el siguiente aspecto:

Original: http://www.sans.org/reading_room/whitepapers/forensics/advantage-ext3-journaling-file-system-forensic-investigation_2011
Ejemplo de inodo (Fuente: www.sans.org)

La estructura de un inodo ocupa 128 bytes y se usa para guardar metainformación sobre el fichero, directorio o enlace simbólico. En concreto:

* por una parte, algunos metadatos de un fichero (tiempos de acceso, creación, modificación), usuario y grupo al que pertenece, tamaño, y algunos datos más que no aparecen en la figura. Si el lector siente curiosidad, puede hurgar en el fichero /usr/src/linux-headers-2.6.32-24/include/linux/ext3_fs.h , en la estructura ext3_inode.

Nota: Ahí verá también que si el inodo representa un directorio, éste se trata como un fichero cuyo contenido es una lista ligada de (nombre de fichero del directorio, inodo de dicho fichero).

* por otra, punteros a los bloques de datos, es decir, al contenido propiamente dicho del fichero.
El lector aventajado seguro que se ha hecho la siguiente pregunta: «¿si un inodo sólo ocupa 128 bytes, cómo demonios podemos guardar punteros a los bloques de contenidos de aquellos ficheros realmente grandes? ¡No hay espacio!»

La solución es sencilla: indirección. En la imagen podemos ver que un inodo contiene 12 punteros directos a bloques. Es decir, los primeros 12*4096 bytes son directamente accesible. Pero a partir de ahí, tenemos que fijarnos en el siguiente bloque, el que tiene la etiqueta «Single indirect block pointer». Ese puntero apunta a un bloque que en sus líneas contiene no el contenido del fichero, sino punteros al resto de los bloques de contenido. Es decir, es una indirección de primer nivel. ¿Que todavía no nos llega porque el fichero es grande de narices? No problem, en el inodo, tras el puntero al bloque de indirección de primer nivel, hay un puntero al bloque de indirección de 2º nivel. Es decir, apunta a un bloque que en sus líneas tiene punteros… pero no a contenido, sino a bloques con punteros, esta vez sí, a contenido. ¿Que no llega? Bueno, entonces habría que tirar del puntero de indirección de nivel 3. Y no hay más, así que más vale que ahora llegue 🙂

http://blogs.sans.org/computer-forensics/2008/12/24/understanding-indirect-blocks-in-unix-file-systems/
Indirección de bloques (Fuente: blog.sans.org)

No, en serio, un fichero de 4TB+ parecía algo de ciencia ficción cuando se ideó EXT3 – que tampoco hace tanto, Nov 2001 – , pero al parecer hoy en día ya no es ninguna tontería… (ahora mismo me viene a la cabeza alguna Rainbow Table que no andaría muy lejos)

Ooook, ya sabemos lo que es un inodo. ¿Pero dónde se guardan? ¿Cuántos hay en total?

Bien, sigamos profundizando. Si analizamos al detalle el contenido de un dispositivo (digamos una partición de disco) formateado con ext3, veremos al comienzo una estructura como la siguiente:

 estructura de un dispositivo con EXT3
Detalle de la estructura de un dispositivo con EXT3 (Fuente: cosecha propia). Pulsar para ampliar.

El superbloque ocupa normalmente 1024 bytes y está situado un poco después del comienzo de la partición (en concreto, a un offset o desplazamiento de 2*512 bytes = 1024 bytes) El superbloque guarda meta información sobre el dispositivo ext3: tamaño total, número de bloques, números inodos, tamaño de cada bloque, tamaño de cada grupo de bloques…

En esa última frase han aparecido nuevos conceptos. Uno de ellos es el de bloque. En ext3 tanto los metadatos como el contenido de los ficheros se guarda en bloques. El tamaño del bloque está definido en el superbloque pero suele ser de 4K (4.096 bytes).

La utilidad ext3grep se torna imprescindible si queremos «diseccionar» la partición desde la línea de comandos:

$ ext3grep $IMAGE --superblock | grep 'size:'
Block size: 4096
Fragment size: 4096

Por cuestiones de rendimiento, los bloques se agrupan en lo que se denomina grupos de bloques. Un grupo de bloques puede estar compuesto por miles de bloques, aunque el número exacto viene determinado en el superbloque.

$ ext3grep $IMAGE --superblock | grep 'Blocks per group'
# Blocks per group: 32768

Cada grupo de bloques comienza normalmente con una copia de respaldo del superbloque. Esto se hace así por seguridad: como hemos visto el superbloque contiene meta-información muy importante, y por tanto, ha de ser redundante (de otro modo, si se perdiera o corrompiera la única copia del superbloque perderíamos el control del dispositivo).

Si vemos el disco como una serie de bloques consecutivos, ¿en qué número de bloque comienza cada grupo de bloques? Bien, para responder a esa pregunta, tras el superbloque se sitúa la llamada «Tabla de Descriptores de Grupo». Se puede ver como un array de grupos de 3 punteros: 1 puntero al primer bloque de cada grupo (o sea, un puntero al block bitmap), un puntero al segundo bloque de cada grupo (o sea, un puntero al inodes bitmap) y un tercer puntero al tercer bloque de cada grupo (o sea, a donde empieza realmente a guardarse información de cada fichero).

La siguiente figura puede aclararnos un poco este embrollo:

Tabla de Descriptores de Grupo
Tabla de Descriptores de Grupo (Fuente: cosecha propia)

Es decir, en la zona de descriptores guardamos, para cada grupo de bloques 3 punteros.

Para aquellos que lo vean mejor desde la línea de comandos, pueden probar con:

 $ ext3grep /dev/hdaX

y verá algo como

[...]
Number of groups: 75
 Group	0: block bitmap at 598, inodes bitmap at 599, inode table at 600
	   4 free blocks, 16278 free inodes, 1 used directory
 Group	1: block bitmap at 33366, inodes bitmap at 33367, inode table at 33368
	   30510 free blocks, 16288 free inodes, 0 used directory
[...]

A continuación, y ya que lo hemos citado varias veces, en cada grupo de bloques, tenemos un bitmap de bloques, que guarda 1 bit por cada bloque de ese grupo. Ese bit indica si el bloque está asignado o no. Lo mismo ocurre con el bitmap de inodos, indicando si el inodo está asignado o no. Aquí hay que aclarar que dado que un inodo ocupa 128 bytes (tamaño fijo), y que un bloque ocupa 4096 bytes, habrá 4096/128 = 32 inodos por bloque. Por otro lado, dado que el bloque «inode bitmap» puede guardar como máximo 4096 bytes * 8 bits/byte = 32768 bits, asumiendo que cada bit nos dice si un inodo está siendo usado o no, tendremos que en cada grupo hay, como máximo, 32768 posibles inodos. A 32 inodos/bloque salen 1024 bloques de inodos. ¿Y el resto de los bloques – hasta completar los 32768 posibles- ? El resto son bloques de datos.

Buff! si has llegado hasta aquí es que realmente te interesa el tema (¡y tienes buen café a mano!).

Lo siguiente que trataré es el archivo de Journaling, una excelente característica que aportó el sistema de archivos ext3 a su predecesor ext2 para conseguir mantener la consistencia del sistema de archivos ante «apagados fortuítos» de la forma  más eficiente posible. Pero eso será en el próximo capítulo 🙂

Referencias

El mejor documento sobre las tripas de ext3 que he visto es el de Carlo Wood, autor de la utilidad ext3grep, que usaremos en este artículo. Sin embargo, el documento de Wood no tiene ni un sólo gráfico explicativo, y tampoco se mete en mucho detalle al hablar del Journal (ya veremos qué es esto en el 2º capítulo). Otros documentos de interés y complementarios son:

How ext3grep can save you hours of work

Recovering deleted files with ext3grep

Why recovering a deleted ext3 file is difficult

Understanding indirect blocks in Unix File Systems

Taking advantage of Ext3 Journaling file system in a forensic investigation

Cómo recuperar datos en ext3

Tuning the Linux file system Ext3

Configurar vsftpd como servidor FTP

Os dejo con un nuevo artículo de Aitor Cuartango:

«Queremos tener un servidor ftp que tenga un acceso anónimo y además acceso a las cuentas que queramos del sistema.

Además queremos que las cuentas locales con acceso ftp no puedan hacer login en el servidor (por si acaso, ya que las contraseñas por ftp van en claro)

Tampoco queremos que los usuarios ftp sean curiosos y puedan leer todos los directorios del sistema para los que haya acceso en lectura a todos los usuarios. Queremos que se quede la sesión de ftp en el directorio home del usuario ftp. Esto es, que vsftp cree una jaula chroot para los usuarios que se conecten.

Manos a la obra:

– Instalamos el vsftpd (un servidor de ftp muy ligero y seguro)

apt-get install vsftpd

– Ahora configuramos el vsftpd con su fichero de configuración: /etc/vsftpd.conf dejándolo como a continuación:

#Para habilitar el servicio ftp
listen=YES
#Para el acceso anónimo
anonymous_enable=YES
#Para que los usuarios locales puedan entrar
local_enable=YES
#Para poder escribir si tienes permisos.
write_enable=YES
#Para que el usuario anónimo pueda escribir
anon_upload_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
# Para crear una jaula chroot por cada conexión que deje al usuario aislado en su propio home.
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/vsftpd.pem

Ahora creamos un usuario local:

$ sudo useradd  miusuario

Y le cambiamos el shell editando el /etc/passwd  dejando el shell asignado al usuario como /bin/false :
aitor:x:1009:1009::/home/aitor:/bin/false

Ahora añadimos el shell /bin/false a los shells admitidos por el sistema añadiendo «/bin/false» al fichero /etc/shells

Y arrancamos el servicio:

/etc/init.d/vsftpd start

et voilá, un servidor de ftp ligero y seguro en un santiamén!

Motorola Milestone: free the Android!

Como decía en el anterior artículo, tras el accidente con el móvil ADP1, y forzado por un enorme síndrome de abstinencia, decidí investigar el mercado en busca de otro móvil Android con teclado físico. Realmente ya había hecho mis deberes antes, pues en mi grupo de investigación necesitábamos usar un móvil con soporte de Flash 10.1…  a ser posible con Android. Bien, sólo encontré en su día 2 móviles que cumpliera con mis requerimientos (lo cual no quiere decir que sólo hubiera 2  😉  : Motorola Milestone y Motorola Droid. Realmente el Google Nexus One también indicaba que soportaría Flash 10.1 pero carecía (y carece) de teclado físico. El Motorola Milestone y el Droid son prácticamente idénticos en lo que a especificaciones HW se refiere, siendo una de las diferencias fundamentales que el Droid tiene soporte para su uso en las redes de telefonía de USA, frente al Milestone, con soporte para redes de telefonía de Europa y América Central. Soooo, si son iguales y el Milestone está preparado «de serie» para ser usado por estos lares, compremos el Milestone, me dije.

Primero la parte buena: es un excelente móvil, con amplia pantalla, muy buena resolución, buena batería (dentro del enorme consumo que Android sigue haciendo de las baterías) y un teclado que, a pesar de las críticas que he leído por ahí – dicen que no se distingue con el tacto una tecla de la otra-, a mí me basta y me sobra.  El Milestone viene de serie con algunas cutre-aplicaciones de Motorola (un navegador tipo TomTom y una aplicación para marcación por voz, por ejemplo). También tiene soporte multi-touch en el navegador y un visor de documentos MS Office. Hasta aquí los bonus-points.

Ahora la parte negativa: el bootloader del Motorola Milestone, a diferencia de su hermano Motorola Droid, comprueba que el firmware que va a arrancar está firmado digitalmente por Motorola.  Si no lo está, no arranca. Esto, que parece una tontería, hace que sea IMPOSIBLE instalar ROMs no oficiales. Por ejemplo, actualmente no es posible instalar Cyanogen ni ninguna otra ROM que sí es instalable en Droid.

Alguien podría decir que bueno, que alguien, algún día, lo conseguirá. Realmente hay serios esfuerzos para conseguirlo, y en esta Wiki se han reunido los mejores hackers de Motorola para intentarlo, pero por ahora no ha habido éxito.  La idea principal para intentar la instalación de una ROM no oficial es muy ingeniosa: consiste en programar un módulo kexec para que el propio kernel oficial de Motorola cargue, en caliente, otro kernel no oficial, sin pasar por el bootloader 🙂   (como sabéis, kexec permite cargar un kernel sin parar el actualmente en uso, muy útil para aplicar parches de seguridad al kernel en sistemas críticos que no permiten ser parados).

También hay un grupo en Facebook para presionar en lo posible a Motorola, pero no ha tenido mucho éxito…

Yo creo que lo mejor entenderá Motorola es ésto: NO compréis un Milestone.  Si os gusta este móvil (a mí me parece de lo mejorcito que hay) entonces esperad hasta agosto y pillaros el Motorola Droid 2 (que vendrá con Froyo) o comprad el Motorola Droid por eBay (que permite instalar nuevas ROMs sin problemas).

Nota: que no puedas cargar ROMs no oficiales no quiere decir que no haya un hack para conseguir ser root en Milestone (por defecto eres un usuario mondo y lirondo, sin permisos para hacer prácticamente nada). Por ejemplo,  el equipo de G.O.T. te ayudará a conseguirlo de forma cómoda (hoy publican un update para la versión española del Milestone 🙂

OpenMeetings: video-reuniones virtuales libres

Seguro que el lector conocerá Adobe Connect, un sistema de video conferencia web, propietario, con cliente Flash y servidor alojado en la infraestructura de Adobe. A través de ese sistema puedes participar online y en tiempo real en web-conferencias, usando recursos como audio (micro), vídeo (webcam), presentaciones (en PDF o PPT que se convierten a Flash), compartición de la pantalla de tu ordenador, o pizarra digital compartida. He participado en varias reuniones online con Adobe Connect y la verdad es que funciona estupendamente. La última vez que lo probé no funcionaba aún la compartición de pantalla en máquinas Linux, pero por lo demás, se oía y se veía bien, haciendo uso del plugin de Flash más moderno. Incluso cuando no podía acudir a alguna reunión, o bien quería recuperarla más adelante para revisar alguna cosa, Adobe Connect me permitía ver una grabación de lo que ocurrió. Como si de un vídeo de YouTube se tratara.

Espectacular. Bueno. Pero software cerrado, propietario hasta la médula, y de pago (bastante asequible, eso sí, para licencias de menos de 100 usuarios). La cuestión es que me apetecía comprobar si era posible montar algo similar basado en soluciones opensource. Que el servidor estuviera bajo mi control y que pudiera afinarlo para soporte de múltiples usuarios concurrentes. Que pudiera traducirlo (al euskera, por ejemplo) Y ya puestos a pedir, que se integrara con Moodle.

La parte buena: hay varias opciones en el mercado opensource. La parte mala: hay que trabajarse la instalación, configuración y puesta a punto de cada una de ellas. Pero hey! Con un buen café al lado todo es posible 🙂

Empecemos por la opción, en mi opinión, más potente: OpenMeetings. El código y los manuales están alojados en Google Project Hosting. También han montado un host con la aplicación instalada para demostración de capacidades.

¿Funcionalidades de OpenMeetings? Las mismas de Adobe Connect que he comentado (pizarra compartida, audio y video-conferencia, posibilidad de subir y convertir a formato Flash presentaciones PDF , PPT o ODP, panel de administración, posibilidad de grabar las sesiones….) y una más: soporte multiplataforma total. Es decir, aparte de poder grabar las sesiones, puedes compartir tu escritorio también desde una máquina Linux. Lo mejor de todo es que todo el paquete OpenMeetings está basado en software libre. Hace uso de Red5 para guardar y emitir vídeo y audio, gestionar las «rooms» de conferencias, etc. Para la conversión de documentos a formato Flash, hace uso de OpenOffice.org en modo servidor. Los vídeos los manipula haciendo uso de FFMPEG. El audio lo manipula con sox, y las imágenes con imagemagick. La parte cliente se ha desarrollado en Flash haciendo uso de OpenLaszlo (yo hubiera preferido Flex 4, pero … )

Por si todo esto fuera poco, el autor no para y ha desarrollado un módulo de integración con SugarCRM y otro de integración con Moodle. Por cierto, en la Moodle Moot de este viernes hablaré sobre las posibilidades de integrar plataformas de vídeo opensource con este sistema de eLearning :-), pero si quieres probar por tu cuenta, también hay una web de demostración disponible.

Bueno, a la chicha: ¿Cómo se instala OpenMeetings? Hay varias formas: compilar las fuentes, usar una máquina virtual o bien hacer uso de los binarios. Yo he usado los binarios (que San Ignucius me perdone). En concreto, la r3087. Descargamos el zip, descomprimimos y veremos que hay una carpeta red5. Dentro, daremos permisos de ejecución al script red5.sh.

Requisitos a tener en cuenta antes de proceder con la instalación propiamente dicha: necesitamos tener lanzado OpenOffice en modo servidor:

/path/to/openoffice/program/soffice.bin -headless -nofirststartwizard -accept="socket,host=localhost,port=8100;urp;StarOffice.Service"

Esto nos permitirá convertir ficheros de formato ODP o PDF (entre otros) a Flash, a través del interfaz de OpenMeetings.

También necesitaremos Ghostscript (yo lo tenía instalado de serie en Ubuntu 10.04), ImageMagick (ídem) y SWFTools. Éste último paquete no lo tenía y tampoco lo encontré vía APT, así que, me bajé los fuentes (versión 0.9.1.tar.gz), y tras descomprimir lancé el conjuro mágico:

./configure
make
sudo make install

FFmpeg y Sox ya los tenía. Sólo queda configurar MySQL (o el SGBD que uses) para OpenMeetings.
Buscamos dentro de red5/ el fichero mysql_hibernate.cfg.xml y lo renombramos como hibernate.cfg.xml
(normalmente situado en /webapps/openmeetings/conf/hibernate.cfg.xml)

Editamos el xml anterior y cambiamos tres líneas (lo que está en mayúscula, para ajustarlo a nuestra configuración):

  <property name="connection.username">LOGIN_DB</property>
                <property name="connection.password">PASS_DB</property>
                <property name="connection.url">jdbc:mysql://YOUR_HOSTNAME/YOUR_DATABASE</property>

Ahora lanzamos Red5 (haciendo uso del script ./red5.sh) y entramos desde el navegador al proceso de instalación:

http://localhost:5080/openmeetings/install

Interesante para la Universidad: hay una pestaña para soporte LDAP. Así que la posible integración de OpenMeetings con Moodle, haciendo uso de LDAP, sería más manejable …

Tras un rato (se tira unos minutos instalando las tablas de la BBDD necesarias) ya está todo listo para empezar a jugar 🙂 Eso lo dejo para mañana, ahora corto y cierro.