Breve guida all'uso dei ramdisk su Linux

Autore: Matteo Lucarelli
ultima versione su: matteolucarelli.altervista.org
NOTA: quanto nel seguito vale ed è stato verificato su kernel della serie 2.6.

GENERALITA'

La tecnica dei ramdisk permette di utilizzare una parte della RAM disponibile al sistema esattamente come se fosse una nuova risorsa di memoria di massa, ovvero di simulare un hard disk (o meglio una partizione) tramite la RAM. Il comportamento di un ramdisk montato replicherà quindi esattamente quello di una normale partizione, in modo totalmente trasparente alle applicazioni che lo utilizzano.

I vantaggi sono collegati sostanzialmente alla maggiore velocità (la RAM è più veloce di qualsiasi hard disk) ed alla volatilità delle informazioni, visto che tali informazioni spariscono senza lasciare traccia all'arresto del sistema.

Gli svantaggi sono ovviamente collegati alla scarsa disponibilità della risorsa RAM, ovvero alle sue, inevitabilmente, limitate dimensioni.

Si noti che il kernel di Linux utilizza comunque la tecnica della cache mantenendo in RAM le informazioni di utilizzo più frequente per permetterne un accesso più rapido. Anche per tale motivo l'occupazione di memoria conseguente all'utilizzo di un ramdisk, in particolare per piccole quantità, non è sempre immediatamente percepibile, visto che il sistema gestisce la RAM in modo elastico, quindi la quantità richiesta poteva già essere disponibile in quella di cache del sistema.

Per quanto detto dovrebbe risultare chiaro che la tecnica sia da utlizzarsi esclusivamente per informazioni temporanee, visto che verranno irremediabilmente perdute all'arresto del sistema.

Tra gli utilizzi più frequenti:

TIPOLOGIE DISPONIBILI

Le tipologie di implementazione dei ramdisk nei moderni kernel sono sostanzialmente due:

L'implementazione /dev/ram è la più antica (già disponibile nei primi kernel) e la meno elastica.

Le principali differenze sono riassunte nella seguente tabella:
/dev/ramtmpfsramfs
Dimensione variabile no
Dimensione limitabile no
Necessita formattazione no no
Swappabile no no
Si conserva fino al riavvio si no no

Come si vede ramfs è sostanzialmente il template di tmpfs, rispetto al quale richiede l'implementazione di controlli aggiuntivi. Ramfs infatti non pone nessun limite massimo e non usa lo swap. In caso di utilizzo incauto può quindi facilmente saturare la RAM bloccando il sistema.

I /dev/ram

La configurazione dei /dev/ram deve essere scelta all'avvio del sistema oppure, nel raro caso in cui il supporto sia compilato come modulo del kernel, al momento del caricamento del modulo. La loro dimensione massima non sarà quindi normalmente modificabile runtime. I /dev/ram richiedono inoltre la formattazione, prima di poter essere utilizzati come ramdisk.

Sono normalmente accessibili tramite i device file /dev/ram[0-15] oppure /dev/ramdisk[0-15]. Il numero di device presenti è ovviamente variabile da sistema a sistema.

Se i device non fossero presenti sarà necessario controllarne la creazione tramite il comando:

dmesg | grep RAMDISK
ed eventualmente provvedere tramite:
mknod /dev/ramX b 1 X
oppure:
cd /dev
./MAKEDEV ram

se ancora non funzionassero si dovrà procedere alla ricompilazione del kernel abilitando l'opzione CONFIG_BLK_DEV_RAM.

Anche per aumentarne il numero è necessario modificare i sorgenti del kernel:

#define NUM_RAMDISKS" in drivers/block/rd.c
e ricompilare.

Per modificarne la dimensione è necessario aggiungere ai parametri di avvio del kernel (in /boot/grub/menu.lst o in /etc/lilo.conf):

ramdisk_size=nnnnn 
dove n è espresso in Kbyte.

Il supporto rd può inoltre essere stato compilato come un modulo. E' possibile verificarlo tramite il comando:

lsmod | grep rd
In tal caso la dimensione può essere decisa al caricamento inserendo in /etc/conf.modules:
options rd rd_size=10000
oppure al momento del caricamento del modulo con il comando:
insmod rd rd_size=10000

La gestione della RAM utilizzata è comunque dinamica, quindi i ramdisk non occupano spazio finchè non vengono effettivamente utilizzati.

Come già detto i ramdisk /dev/ram vanno formattatti prima dell'utilizzo, ad esempio tramite il comando:

mke2fs -m 0 -i ibyte /dev/ram0

dove:
-m 0      : non riservare spazio a root
-i ibyte  : crea un inode ogni ibyte (se ci sono molti file piccoli può essere utile per ottimizzare)
-q        : quiet (utile negli script)
-c        : verifica i blocchi
Naturalmente il filesystem scelto può anche essere differente, anche se ext2 dovrebbe essere sufficiente vista l'inutilità del journaling.

Prima del mount è possibile ottimizzare i parametri del filesystem tramite:

tune2fs -i 0

dove
-i 0   : disabilita le verifiche temporanee
-l     : lista le caratteristiche (senza modificare nulla)

Fatto ciò si potrà montare il nuovo filesystem, ad esempio tramite i comandi:

mkdir /mnt/ramdisk
mount /dev/ram0 /mnt/ramdisk -o mode=777

Si noti che, a causa delle strutture del filesystem la dimensione ottenuta non è mai effettiva al 100%.

TMPFS e RAMFS

Come già visto l'uso di tmpfs pone dei vantaggi sostanziali in quanto la dimensione massima può essere scelta al momento del mount, e anche modificata successivamente. La dimensione massima di default è stabilita in metà della memoria fisica disponibile. Il limite inoltre può essere superiore alla memoria disponibile, in tal caso verrà utilizzato lo swap.

Il device tmpfs, non necessitando di formattazione, è immeditamente disponibile tramite il comando di mount:

mount -t tmpfs tmpfs /path -o size=dimensione_in_byte
la dimensione può anche essere specificata in unità maggiori utlizzando i suffissi k=kilo, m=mega e g=giga, inoltre ammette specifica in percentuale della memoria disponibile (il default è quindi size=50%)

Un filesystem tmpfs può inoltre essere ridimensionato al volo tramite il comando:

mount -o remount ...

Anche nel caso di tmpfs la memoria è utilizzata in modo dinamico, quindi ne viene fisicamente occupata solo la quantità effettivamente utilizzata. A differenza dei /dev/ram però la memoria utilizzata tornerà immediatamente disponibile al termine dell'uso (a seguito del comando umount).

Il nome del device di mount, sia per tmpfs che ramfs, è arbitrario, quindi può essere usato come ID nel caso di utilizzi multipli:

mount -t ramfs primoramdisk /dir

I permessi possono al solito essere decisi al momento del mount tramite le opzioni:

mode=permessi_ottale,uid=user_id,gid=group_id

Quanto detto per tmpfs vale sostanzialmente identico per ramfs, con la differenza che non è necessario, nè possibile, specificarne la dimensione massima.

matteolucarelli.altervista.org
©opyright info