Cómo usar un ramdisk bajo Linux

ArticleCategory: [Choose a category for your article]

Applications

AuthorImage:[Here we need a little image form you]

[Photo of the Author]

TranslationInfo:[Author and translation history]

original in en Mark Nielsen en to es Lluis Hernández

AboutTheAuthor:[A small biography about the author]

El autor (home page) trabaja en The Computer Underground, Inc. como limpiador de ficheros y como consultor profesional en 800linux.com. En su tiempo libre, se dedica a trabajos voluntarios, como escribir documentos como éste, que ha sido editado usando NEdit junto con ispell.

Abstract:[Here you write a little summary]

Este artículo muestra como usar la memoria RAM como un disco virtual.

ArticleIllustration:[This is the title picture for your article]

[Illustration]

ArticleBody:[The article body]

Intoducción a ramdisk

Esto es un artículo corto acerca de cómo instalar un ramdisk en una máquina con RedHat Linux 6.0. El proceso debería ser similar para otras distribuciones de Linux.

Pero primero... ¿Qué es un ramdisk? Es una parte de memoria que puede ser asignada para usarla como si fuese una partición de disco. Consiste, en otras palabras, en reservar una cierta cantidad de memoria y acceder a ella como si fuese una unidad de disco. ¿Qué motivos puede haber para querer usar un ramdisk? Cuando un grupo de archivos va a ser accedido de forma intensiva, guardar esos archivos en memoria incrementará la velocidad de acceso debido a la gran diferencia de velocidad que existe entre la memoria y un disco duro. Un ejemplo de estos casos podría ser intentar acelerar el acceso a las páginas de un servidor de web. Si además, le gusta el riesgo y tiene un PII a 550Mhz con 1 Gb de memoria pero con un disco no muy grande, como 500Mb, puede hacer uso de esta técnica para incrementar el espacio disponible. De hecho, tener una máquina sin disco duro tampoco sería ninguna locura, despues de todo.

Algunas referencias útiles:

  1. http://metalab.unc.edu/LDP/HOWTO/Kernel-HOWTO.html
  2. http://metalab.unc.edu/LDP/HOWTO/mini/LILO.html
  3. /usr/src/linux/Documentation/ramdisk.txt

Como usar un ramdisk

La verdad es que es muy fácil. En primer lugar, la distribución RedHat ya viene con soporte para ramdisk, así que todo lo que hay que hacer es formatear el ramdisk y montarlo en un directorio. El comando para obtener una lista de los ramdisks disponibles es "ls -al /dev/ram". Los ramdisks que se listan están listos para ser usados, pero no ocupan memoria mientras no se usan por primera vez (por ejemplo, al darles formato). Éste es un ejemplo de como usar un ramdisk:
# Crear el directorio donde montaremos el ramdisk
mkdir -p /tmp/ramdisk0
# Crear un sistema de ficheros en el disco (formatearlo)
mkfs -t ext2 /dev/ram0
# Montar el ramdisk en el directorio elegido:
mount /dev/ram0 /tmp/ramdisk0
Esta secuencia de comandos creará un directorio donde montar el ramdisk, dará formato al ramdisk (por defecto con un tamaño de 4 Mb) y lo montará. Ya está: se puede usar ese directorio como cualquier otra partición... ¡adelante!

Si no le permite formatear el ramdisk, es probable que el kernel no esté compilado con soporte para ramdisk. La opción de configuración del kernel que permite activarlo se llama CONFIG_BLK_DEV_RAM.

Como hemos visto, el tamaño por defecto del ramdisk es 4 Mb = 4096 bloques. Puede ver de qué tamaño es el ramdisk que ha obtenido observando la salida de mke2fs: mke2fs /dev/ram0 debería haber escrito algo parecido a lo siguiente:

mke2fs 1.14, 9-Jan-1999 for EXT2 FS 0.5b, 95/08/09
Linux ext2 filesystem format
Filesystem label=
1024 inodes, 4096 blocks
204 blocks (4.98%) reserved for the super user
First data block=1
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1 block group
8192 blocks per group, 8192 fragments per group
1024 inodes per group
La orden df -k /dev/ram0 le permite saber cuanto de ese espacio es realmente utlizable (el sistema de ficheros ocupa una pequeña parte del espacio total)
>df -k /dev/ram0
Filesystem  1k-blocks  Used Available Use% Mounted on
/dev/ram0        3963    13      3746   0% /tmp/ramdisk0

Pero cuidado, hay que tener en cuenta algunas cosas... Por ejemplo, cuando el ordenador se reinicia, todo el contenido del ramdisk se borra, así que no guarde allí datos que no estén salvados en un disco "de verdad" si son importantes. También hay que tener presente que si se modifica algún fichero del ramdisk y no quiere perder los cambios deberá grabarlo también en otro sitio.

Eligiendo el tamaño de su ramdisk

Para usar un ramdisk, necesita activar la opción correspondiente en la configuración del kernel. Puede incluirlo en el kernel o compilarlo como módulo. Esta última opción tiene la ventaja que le permite cambiar el tamaño del ramdisk sin tener que recompilar el kernel.

Vamos a ver pues qué formas hay de cambiar ese tamaño por defecto de 4Mb:

Primero la forma difícil: consiste en añadir la siguiente línea al fichero de configuración de lilo (lilo.conf):
ramdisk=10000
A partir del momento en que se reinicie el ordenador (ejecutar antes lilo), el tamaño por defecto para los ramdisk será de 10 Mb. Como ejemplo, este es mi fichero lilo.conf

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
image=/boot/vmlinuz-2.2.5-15
	label=linux
	root=/dev/hda2
	read-only
	ramdisk=10000
Con esta configuración, el tamaño utilizable del ramdisk es un poco más de 9 Mb.

En cambio, si ha compilado el soporte para ramdisk como módulo, entonces puede decidir que tamaño desea que tenga en el momento de cargar el módulo. Esto se puede hacer tanto con una opción en el fichero /etc/conf.modules:

options rd rd_size=10000
como pasando los parámetros adecuados al llamar a insmod desde la línea de comandos:
insmod rd rd_size=10000
Por ejemplo, para usar el módulo, seguiríamos los siguientes pasos:
  1. Desmontar el ramdisk montado en el capítulo anterior, umount /tmp/ramdisk0
  2. Eliminar de memoria el módulo (fue cargado automaticamente en el capítulo anterior), rmmod rd
  3. Cargar de nuevo el módulo y darle un tamaño de 20Mb, insmod rd_size=20000
  4. Crear un sistema de ficheros, mke2fs /dev/ram0
  5. Montarlo, mount /dev/ram0 /tmp/ramdisk0

Ejemplo: uso de ramdisk en un servidor de web.

Este ejemplo muestra como configurar 3 ramdisks para un servidor de web. Comprobamos que la instalación por defecto de Apache para RedHat 6.0 no usa más de 9 Mb. para sus cgis, páginas html y archivos de iconos. Bien, pues vamos a ello...
En primer lugar, ejecutamos estos comandos para trasladar el contenido del home directory del webserver a un sitio diferente, al que llamaremos /home/httpd_real. También creamos los directorios para montar los ramdisks:
mv /home/httpd/ /home/httpd_real
mkdir /home/httpd
mkdir /home/httpd/cgi-bin
mkdir /home/httpd/html
mkdir /home/httpd/icons
A continuación, añadimos estos comandos al fichero /etc/rc.d/rc.local

### Make the ramdisk partitions (damos formato a los ramdisks)
/sbin/mkfs -t ext2 /dev/ram0
/sbin/mkfs -t ext2 /dev/ram1
/sbin/mkfs -t ext2 /dev/ram2

### Mount the ramdisks to their appropriate places (los montamos)
mount /dev/ram0 /home/httpd/cgi-bin
mount /dev/ram1 /home/httpd/icons
mount /dev/ram2 /home/httpd/html

### Copying real directory to ramdisks (copiamos los datos en los ramdisks)
tar -C /home/httpd_real -c . | tar -C /home/httpd -x

#### Restarting the webserver (iniciamos el servidor de web)
/etc/rc.d/init.d/httpd restart	

Para que los cambios tengan efecto, reiniciamos el ordenador. Se puede evitar reiniciarlo simplemetne ejecutando de nuevo el script rc.local que hemos modificado:
/etc/rc.d/rc.local

Comentarios a tener en cuenta

  1. Por favor, acuérdese de COPIAR LOS DATOS A UN SITIO SEGURO SI LOS MODIFICA, ya que cuando reinicie su ordenador, el contenido de los ramdisk se perderá. Una forma de hacerlo automáticamente es a través de una tarea de cron que cada 5 minutos compruebe si se ha modificado algún archivo en el directorio del ramdisk y grabe los cambios en un sitiio seguro. Hay otras formas mejores de hacer esto, pero no voy a entrar en ello. Otra forma de hacer las cosas, mucho más segura, es realizar los cambios sobre el directorio real (el que está guardado en un disco de verdad) en vez de hacerlos en el ramdisk y a continuación copiar los cambios al ramdisk.
  2. Una utilidad para los ramdisks sería usar un ramdisk de, por ejemplo 256 Mb para el directorio /tmp. Si tiene una máquina con 1 Gb de RAM se lo puede permitir: en caso que haya muchos procesos que usen el /tmp, aceleraría el sistema. De paso, el /tmp se borrará automáticamente al reiniciar el equipo, cosa que puede ser interesante.
  3. Linux usa toda la memoria que no está ocupada por programas como cache general de disco, pero mi experiencia es que los ramdisks dan, a pesar de todo, un aumento significativo de velocidad.