Disco RAM en Linux

Hace mucho que Linux (y otros sistemas operativos) permiten el empleo de discos RAM como espacio de trabajo no persistente de alta velocidad a costa de invertir en ellos memoria RAM.

No voy a describir por qué nos puede interesar un disco RAM y cuáles son sus inconvenientes. Para eso tenéis la página de la Wikipedia. La forma de trabajar con disco RAM en Linux ha ido cambiando también con el paso del tiempo; aquí voy a tratar la forma contemporánea. Antiguamente había que crear los discos RAM en la configuración de arranque de Linux, de forma estática. Afortunamente hemos superado eso.

Hoy en día hay dos maneras básicas de usar la memoria de un ordenador Linux como disco RAM:

  • Creando un dispositivo de bloques en memoria RAM, particionándolo y formateándolo para el uso que necesitemos. Este sistema tiene una mayor sobrecarga y es más inflexible, pero su ventaja fundamental es que Linux puede emplear ese dispositivo para cualquier uso válido de un dispositivo de bloques general. Por ejemplo, se puede usar como espacio de intercambio o swap.

    Algunos ejemplos de esta aproximación son ZRAM y ZSWAP. No los voy a tratar en este artículo.

  • Creamos un dispositivo disco RAM con semántica directa de sistema de ficheros. No simula un dispositivo de bloques sobre el que creamos un sistema de ficheros, sino que implementa el sistema de ficheros directamente en memoria RAM.

    Este enfoque es mucho más eficiente y práctico. Una ventaja clara es que cuando se borra un fichero del disco RAM se reduce el espacio ocupado. Naturalmente, este dispositivo solo sirve para almacenar ficheros, no simula ni se puede utilizar como un dispositivo de bloques.

En un linux moderno hay dos implementaciones de disco RAM del segundo tipo:

  • tmpfs: Permite darle un tamaño máximo en espacio (si no se indica nada, tmpfs estará limitado a la mitad de tu memoria RAM) y número de inodes, permisos, etc. Emplea la memoria RAM como un proceso más y el contenido menos usado puede acabar en el espacio de intercambio para hacer sitio a otras cosas más importantes.

    Esto último tiene impacto en seguridad si estamos usando el tmpfs para almacenar contenido temporal delicado, como claves criptográficas, emails confidenciales, etc.

    La ventaja es que un tmpfs puede contener ficheros ocupando más espacio que la memoria RAM del ordenador, si se dispone de espacio de intercambio suficiente.

    • La descripción oficial.

    • Ejemplo de uso:

      # mount -t tmpfs -o size=10G,nr_inodes=10k,mode=700 none /mytmpfs
      

      Este código crea un disco RAM de tipo tmpfs con un tamaño máximo de 10 gigabytes, un máximo de 10.000 inodes y permisos solo para el administrador o root.

  • ramfs: La implementación técnica es muy diferente a tmpfs. Es simple y eficiente. Funciona bloqueando páginas de memoria en RAM, de forma que a) su contenido no acaba nunca en el espacio de intercambio y b) el uso de este tipo de disco RAM resta memoria al ordenador en función de los ficheros que estemos utilizando. No se puede definir un tamaño máximo, por lo que puede ser un mecanismo de ataque si permitimos que usuarios maliciosos puedan escribir en un ramfs. Pueden tumbar el sistema con toda facilidad.

    • Ejemplo de uso:

      # mount -t ramfs none /path/to/location
      

En ambos casos, cuando desmontamos el disco RAM o reiniciamos el ordenador, su contenido se pierde.

Por supuesto, podemos montar dispositivos de disco RAM automáticamente con el arranque del ordenador editando /etc/fstab o equivalente en tu sistema operativo.

Algunos enlaces describiendo las diferencias entre tmpfs y ramfs: