FreeBSD possède en standard tout ce qu'il faut pour créer un disque virtuel. Un disque virtuel, en RAM, est beaucoup plus rapide qu'un disque physique et dans certains cas, pour disposer d'une amélioration des performances, il peut être utile de créer un disque virtuel.

Le montage

Pour monter un disque virtuel, il suffit d'utiliser la commande :

mdmfs -s 256M md10 /mnt/ramdisk

Dans cet exemple, on créé un disque virtuel de 256M sur le périphérique md10, monté sur le répertoire /mnt/ramdisk (s'il n'existe pas, il faut le créer).

Cependant, il faut ajouter quelques contrôles, surtout si le disque est destiné à un montage automatique. Il faut par exemple vérifier que la quantité de RAM disponible soit suffisante. Pour cela, il suffit de s'inspirer de cette astuce, en ne récupérerant que la partie mémoire disponible :

FileTemp="/tmp/sysctl.txt"

sysctl -a > ${FileTemp}
page_size=`cat ${FileTemp} | grep hw.pagesize | awk -F":" '{ print $2 }'`
mem_inactive=`cat ${FileTemp} | grep vm.stats.vm.v_inactive_count | awk -F":" '{ print $2 }'`
mem_cache=`cat ${FileTemp} | grep vm.stats.vm.v_cache_count | awk -F":" '{ print $2 }'`
mem_free=`cat ${FileTemp} | grep vm.stats.vm.v_cache_count | awk -F":" '{ print $2 }'`

mem_avail=$(($mem_inactive*$page_size+$mem_cache*$page_size+$mem_free*$page_size))

La variable mem_avail contient la quantité de mémoire vive non utilisée. Il faut donc que la quantité demandée pour le disque virtuelle soit inférieure à cette valeur.

if [ ${mem_dem} -lt ${mem_avail} ]
then
[...]
else
echo "La quantité de mémoire est insuffisante pour créer un disque virtuel de ${2}M" >&2
exit 1
fi

Il faut aussi vérifier que le disque n'existe pas déjà (ici md10).

if [ -e /dev/md10 ]
then
echo "Le disque virtuel existe déjà." >&2
exit 1
fi

Le démontage

Si le disque virtuel est déjà monté et qu'on veut le démonter, il faut exécuter la commande :

umount /mnt/ramdisk
mdconfig -d -u 10

Le script final

Le script final encapsule l'ensemble des commandes de base dans un ensemble de contrôle et de paramètres. Il faut pouvoir par exemple définir la quantité de RAM qu'on veut utiliser.

#!/bin/sh
# Montage/démontage d'un disque en mémoire vive sous freeBSD 6.0 et supérieur

case ${1} in
start)
# Détermine la quantité maximal de RAM disponible
FileTemp="/tmp/sysctl.txt"

sysctl -a > ${FileTemp}
page_size=`cat ${FileTemp} | grep hw.pagesize | awk -F":" '{ print $2 }'`
mem_inactive=`cat ${FileTemp} | grep vm.stats.vm.v_inactive_count | awk -F":" '{ print $2 }'`
mem_cache=`cat ${FileTemp} | grep vm.stats.vm.v_cache_count | awk -F":" '{ print $2 }'`
mem_free=`cat ${FileTemp} | grep vm.stats.vm.v_cache_count | awk -F":" '{ print $2 }'`

mem_avail=$(($mem_inactive*$page_size+$mem_cache*$page_size+$mem_free*$page_size))
mem_dem=$((${2}*1024*1024))
if [ -e /dev/md10 ]
then
echo "Le disque virtuel existe déjà." >&2
exit 1
fi


if [ ${mem_dem} -lt ${mem_avail} ]
then
#Monte le disque virtuel en RAM
mdmfs -s ${2}M md10 /mnt/ramdisk
echo "Le disque virtuel de ${2}MB est créé sur/dev/md10 et monté sur /mnt/ramdisk"
exit 0
else
echo "La quantité de mémoire est insuffisante pour créer un disque virtuel de ${2}M" >&2
exit 1
fi
;;

stop)
if [ -e /dev/md10 ]
then
umount /mnt/ramdisk
mdconfig -d -u 10
echo "Le disque virtuel est démonté de /mnt/ramdisk et supprimé"
fi

;;

*)
echo "Usage: `basename $0` {start|stop} {AmountOfRAM} " >&2
exit 64
;;

esac

Pour utiliser ce script, il suffit de :

Remarque

Ce script est limité à un seul disque virtuel, utilisant /dev/md10. Nous pourrions modifier le script de façon à ce qu'il gère automatiquement les périphériques virtuels et pouvoir créer plusieurs disques...

Bien entendu, ce script peut être employé pour monter automatiquement un disque au démarrage du système, en plaçant un script dans le répertoire rc.d