Kernel 2.6.28

Una de las noticias importantes del mes pasado, que la que no le habíamos dedicado espacio en este blog aún, fue la publicación del Kernel de Linux 2.6.28 para la noche buena del 2008 (2008-12-24 23:45 UTC, que para Linus, si estaba en Helsinki, debían ser la 01:45 del 25).

GNU/Linux

GNU/Linux

Lo interesante de esta nueva versión es que incluye soporte para el sistema de archivos Ext4, que hasta el momento estaba marcado como en estado “experimental”. Según Linux Hispano, el paso entre Ext3 y Ext4 es más significativo que el experimentado entre Ext2 y Ext3. En aquel último pasaje, la característica fundamental que se incorporó fue el journaling o transacciones, capaces de restaurar la información en caso de que ocurra un error durante una de ellas. Ext4, en cambio, implica una modificación importante en la estructura de datos orientada a mejorar la performance y la estabilidad del filesystem. Además, Ext3 soportaba un tamaño máximo del sistema de archivos de 16 TB (Terabytes) con un tamaño máximo por archivo de 2 TB. Ext4 eleva esos límites a 1 EB (Exabyte) para todo el filesystem y 16 TB para los archivos. También, la cantidad de subdirectorios dentro de cada uno es ahora ilimitada (antes era de 32.000 con Ext3).

Para mayor información sobre Ext4, hay otro artículo interesante en Linux Hispano: Ext4. Y, por supuesto, su versión original en inglés en Kernelnewbies.org

Personalmente, aunque me parecen muy interesantes estas características, aún tengo ganas de probar ZFS.

Por qué no gritarle a tu array de discos

Veo en Slashdot un post muy sorprendente. Brendan Gregg del laboratorio de Fishworks de Sun, publicó el siguiente video que muestra muy claramente el efecto que las vibraciones tienen en la performance de un array de discos, incrementando la latencia entre otras cosas.
Lo dejo para que juzguen por ustedes mismos.

Shouting in the Datacenter

Instalar mod_python para Apache 2.2

Apache Web Server

Revisando mis favoritos en busca de alguna guía interesante para publicar, encontré estos pequeños pasos para instalar mod_python para Apache 2.2. La guía original dice que es para instalar mod_python en servidores con Directadmin, pero lo cierto es que no tiene nada específico para este panel de control. La misma guía también advierte que estas instrucciones solamente sirven para Apache 2.2. La verdad es que yo lo probé únicamente para esa versión y no he intentado averiguar cómo hacerlo sobre otra versión.

cd /usr/local/src
wget http://www.apache.org/dist/httpd/modpython/mod_python-3.3.1.tgz
tar -zxvf mod_python-3.3.1.tgz
cd mod_python-3.3.1
./configure
make
make install
mod_python

mod_python

Luego hay que editar el httpd.conf, agregando la siguiente línea para cargar el módulo. Una buena práctica sería colocarlo a continuación de donde se carga el módulo de PHP.

LoadModule python_module /usr/lib/apache/mod_python.so

Para probar el funcionamiento del módulo debemos hacer lo siguiente. En primer lugar, vamos a necesitar definir un handler de python para los requests en un .htaccess. Allí escribimos algo como lo siguiente:

AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonOption session DbmSession
PythonOption session_dbm /home/user/domains/test.com/session.dbm
PythonOption ApplicationPath /
PythonDebug On ## Turn this off when done with debugging

DirectoryIndex index.py

Por supuesto, habrá que ajustar los datos a lo que sea necesario.
Luego, creamos el índice de nuestro sitio, en este caso en /home/user/domains/test.com/public_html/index.py con el siguiente código:

## index.py
from mod_python import apache

def index(req):
req.content_type = 'text/plain'
req.write('Hello from mod_python\n')
return apache.OK

Luego accedemos a http://test.com/ y si vemos “Hello from mod_python”, es que hemos instalado correctamente mod_python.

Fuentes:

Estándar de jerarquía del sistema de archivos en Unix (FHS)

GNU/Linux

GNU/Linux

Para cualquiera de nosotros que empezamos a aprender computación cuando Microsoft ya dominaba el mercado y que conocimos las maravillas de Unix de grandes, la jerarquía del sistema de archivos puede resultar bastante confusa al principio. Además, los usuarios de Linux sabemos que, por lo general, cada distribución (o por lo menos cada familia de distribuciones), mete las cosas donde más le gusta.

Es interesante darle una mirada al FHS (Filesystem Hierarchy Standard), un estándar desarrollado por iniciativa de Linux, el cual otros SOs Unix suelen ignorar, pero que intenta una definición de los distintos directorios principales de un filesystem. Dejo el siguiente cuadro tomado de la versión en español del mismo artículo.

Directorio Descripción Simple
/ Jerarquía primaria, la raíz o root, y directorio raíz del sistema de jerarquía completo.
/bin/ Comandos y programas binarios esenciales necesarios para que estén disponibles para una sesión de usuario único, o para todos los usuarios (multiusuario), por ejemplo, cat, ls, cp, rm, mk, etc.).
/boot/ Archivos cargadores de arranque (por ejemplo, los núcleos, el initrd). A menudo en una partición separada.
/dev/ Contiene los Dispositivos esenciales (por ejemplo, /dev/null), incluso los que no se les ha asignado (montado) un directorio. Contiene también dispositivos que no sirven de almacenamiento (p.e. terminales de sonido y vídeo, micrófonos, impresoras, etc).
/etc/ Contiene archivos de configuración del sistema específicos del Host de todo el sistema. El nombre proviene de “etcétera”).
/etc/opt/
Archivos de configuración para los programas alojados dentro del directorio /opt.
/etc/X11/
Archivos de configuración para el X Window System, versión 11.
/etc/sgml/
Archivos de configuración para SGML.
/etc/xml/
Archivos de configuración para XML.
/home/ Contiene los directorios de los usuarios, home de los usuarios, excepto del superusuario administrador (root); contiene archivos guardados, ajustes personales, etc. Ofrece. A menudo en una partición separada.Si existe más de un usuario de un computador/ordenador o servidor, por ejemplo los usuarios usuario1 y usuario2, estos poseerían los directorios /home/usuario1 y /home/usuario2, respectivamente.
/lib/ Contiene todas las bibliotecas (mal traducidas como librerías) esenciales compartidas de los programas alojados, es decir, para los binarios en /bin/ y /sbin/. Contiene también las bibliotecas para el núcleo.
/media/ Contiene los puntos de montaje de los medio removibles de almacenamiento, tales como lectores de CD-ROM (aparecido en la versión 2.3 de FHS), Pendrives (memoria USB), e incluso sirve para montar otras particiones del mismo disco duro, por ejemplo alguna partición desde otro sistema operativo.
/mnt/ Sistema de archivos montados temporalmente. Es una directorio semejante a /media, pero es usada mayormente por los usuarios. Sirve para montar discos duros y particiones de forma temporal en el sistema.
/opt/ Contiene Paquetes de programas opcionales de aplicaciones estáticas, es decir, que pueden ser compartidas por los usuarios. Estas aplicaciones, utilizan el directorio de usuario para guardas sus configuraciones, y de esta forma, cada usuario puede tener una configuración diferente, de la misma aplicación.
/proc/ Contiene principalmente archivos de texto, sistema de archivos virtuales que documentan al núcleo y el estado de los procesos como archivos de texto (por ejemplo, uptime, network).
/root/ Directorio raíz del usuario root.
/sbin/ Sistema de binarios esencial, comandos y programas exclusivos del superusuario (root), por ejemplo, init, route, ifup).
/srv/ Lugar específico de datos, los cuales son servidos por el sistema.
/tmp/ Archivos temporales (véase también /var/tmp).
/usr/ jerarquía secundaria de los datos de usuario; contiene la mayoría de las utilidades y aplicaciones multiusuario. En otras palabras, contiene los archivos compartidos de solo lectura. Este directorio puede incluso se compartido con otras computadoras.
/usr/bin/
Comandos binarios no esenciales (no necesarios en el modo de usuario único); para todos los usuarios.
/usr/include/
Archivos de cabecera (Header files o Include files), es decir, archivos de inclusión estándar
/usr/lib/
bibliotecas compartidas de los binarios en /usr/bin/ y /usr/sbin/.
/usr/sbin/
Sistema de binarios no esencial (por ejemplo demonios para varios servicios de red.
/usr/share/
Arquitectura independiende, compartida de datos. En otras palabras, contiene los datos compartidos que no dependen de la arquitectura del sistema. Esto puede incluir imágenes, sonidos, etc., para la disponibilidad en el sistema.
/usr/src/
Códigos fuente, por ejemplo, el código fuente (es decir, programas y bibliotecas sin compilar) del núcleo con sus archivos de cabecera, (Header files o Include files).
/usr/X11R6/
Sistema X Window System, Versión 11, Release 6.
/usr/local/
Jerarquía terciaria para los datos locales, específicos a este host. Usualmente tiene subdirectorios, por ejemplo bin/, lib/, share/, de datos compartidos de sólo lectura específicos del ordenador o servidor que los comparte.
/var/ Archivos variables, tales como logs, archivos spool, bases de datos, archivos de e-mail temporales, y archivos temporales en general.
/var/cache/
Cache de las aplicaciones.
/var/crash/
Se depositan datos e información, referentes a las caídas o errores del sistema operativo.
/var/games/
Datos variables de los juegos del sistema. Este directorio no es imprescindible.
/var/lock/
Archivos Lock. Archivos que hacen el seguimiento de los recursos que se utilizan actualmente.
/var/log/
Archivos de registro, Log. Varios registros, logs.
/var/mail/
Buzón correos o mensajes de los usuarios.
/var/opt/
Posee los datos variables de /opt.
/var/run/
Información acerca del funcionamiento del sistema desde el último arranque. Por ejemplo, los usuarios actualmente registrados o logueados, que han ingresado; y los demonios que están corriendo.
/var/spool/
Bobinas o carretes (Spool), de tareas a la espera de ser procesados (por ejemplo, colas de impresión y correo no leído).
/var/spool/mail/
Ubicación de los correos de usuario desaprobados.
/var/tmp/
Archivos temporales que, a diferencia de /tmp, no se borran entre sesiones o reinicios del sistema.

Prevenir hotlinking con .htaccess en Apache

El hotlinking (también conocido como inline linking y por otros varios sinónimos) es el uso de una imagen alojada en un sitio A para ser mostrada en un sitio B. Por ejemplo, yo podría en este blog incluir una imagen del sitio de Dataweb Hosting, pero en vez de descargarla y subirla a mi servidor, poner directamente el link a la imagen en el servidor de Dataweb, por ejemplo:

<img src="http://www.datawebhosting.com.ar/img/logo_dataweb_hosting.jpg">

Entonces, cuando alguien entre al blog, el browser automáticametne va a ir a buscar esa imagen al servidor de Dataweb. Esto es algo absolutamente “legal” y es de gran ayuda en muchos casos. De hecho, esto mismo se puede hacer con cualquier archivo que uno incluya en un sitio web (una imagen, un video, un script de Javascript, una hoja de estilos CSS, etc.). Esto nos permite, por ejemplo, incluir en nuestros sitios videos de YouTube, los scripts de publicidad de Google AdSense, etc.

Apache Web Server

Apache Web Server

Por supuesto, al incluir un recurso de esta forma, se genera tráfico en el servidor de orígen. En algunos casos puede ser un problema, porque si yo tengo alojado mi sitio en un servidor chico y una persona publica una imagen de mi servidor en un sitio muy concurrido, mi tráfico se puede incrementar a niveles que quizás no sea capaz de manejar. En ese momento el hotlinking resulta nocivo.

Afortunadamente, Apache tiene muchos features interesantes y jugando un poco con mod_rewrite podemos evitar el hotlinking. Para ello debemos tener en cuenta que los requests de estas imágenes van a llevar siempre un HTTP Referer que va a ser igual a la URL donde éstas están incluidas. En el ejemplo anterior, al servidor de Dataweb le llegaría un request del archivo logo_dataweb_hosting.jpg con un referer que podría ser “http://www.tail-f.com.ar/”. Entonces, en nuestro archivo .htaccess hacemos lo siguiente:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

En este caso, cuando venga un request que tenga como referer una URL de un dominio diferente al mío (específicamente diferente de mi dominio principal y cualquier subdominio), que sea de un archivo con extensión jpeg, jpg, gif, bmp o png, se devolverá la imágen “nohotlink.jpg”.

Otra opción es bloquear el hotlinking por parte de dominios específicos. Por ejemplo:

RewriteEngine On
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?myspace\.com/ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?blogspot\.com/ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?livejournal\.com/ [NC]
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

En este caso, similar al anterior, lo que se bloquean son todos los requests que vengan de myspace.com, blogspot.com y livejournal.com.

Para cerrar debo decir que no estoy muy de acuerdo con estos métodos por una serie de razones. En primer lugar, por una cuestión de principios, siempre prefiero compartir mis imágenes (así como espero que los demás las compartan conmigo) a prohibir su uso. En segundo lugar, y más importante, este método dista mucho de ser ideal. De hecho, aunque usándolo el hotlinking resulte inútil para la persona del otro sitio que quiera usar nuestras imágenes, no dejamos de transferir la imagen nohotlink.jpg. Con lo cual, aunque se pudiera reducir el tráfico (suponemos que nohotlink.jpg sería una imagen muy liviana), no se reduciría la cantidad de requests que de por sí pueden resultar muy pesados para el servidor.

Una opción más interesante, porque evita transferir una imágen, es devolver un código de error HTTP, por ejemplo 403 (Forbidden). Para ello, en el código anterior reemplazaríamos:

RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

por

RewriteRule .*\.(jpe?g|gif|bmp|png)$ - [F]

Sin embargo, me pareció un ejemplo interesante para publicar porque da más ideas sobre cómo usar mod_rewrite y puede aportar en la solución creativa de problemas similares.

Fuente: altlab.com