Mode d'emploi pour faire un RamDisk sous linux
Je ne vois pas bien l'intérêt. Selon l'utilisation du ramdisk le système peut utiliser plus de mémoire, puis devenir plus lent, puis instable, puis inutilisable. Je n'imagine pas un seul cas où cela serait utile.
La fonction du ramdisk sous linux est :
- de démarrer sur une image disk
- de débugger des systèmes de fichier
Le ramdisk n'est pas censé être une optimisation.
De façon générale (et très simplifiée) quant on a un volume (block device) /dev/disk, formaté en SFS (super file system) par la commande :
mksfs /dev/disket un montage créé par
mount /dev/disk /mnt/diskquand on écrit un fichier toto dans /mnt/disk, le contenu du fichier toto est présent :
- en RAM dans le cache de pages
- sur le périphérique /dev/disk
En cas de lecture du fichier, les données seront directement prises dans le cache de pages. L'espace consacré au cache de pages n'est pas limité et il peut occuper quasiment toute la RAM libre de la machine. Mais ces données en cache peuvent rapidement être libéré si un programme a besoin de mémoire, ou si d'autres données doivent être mises en cache.
Avec le ramdisk c'est la même chose : les données sont présentes dans le cache de pages et sur le disque, qui est en RAM par définition.
Les données sont donc présentes deux fois en RAM dont une fois de façon stable et une fois de façon temporaire.
Si le système n'a plus assez mémoire (par exemple à cause de l'augmentation de la taille des données du ramdisk), il devra libérer de la place dans le cache (par exemple la copie des données qui sont sur le ramdisk). Si ces données là doivent être lues par un autre programme,
le système devra les recopier à nouveau à partir du ramdisk.
La pression exercée par l'occupation RAM du ramdisk pourrait aussi forcer à supprimer des données mise en cache à partir d'un vrai disque dur, et donc à diminuer d'autant les performances du système. C'est d'autant plus probable que la taille des fichiers sur le ramdisk est du même ordre que la taille de la RAM de la machine.
Cela n'est pas un problème une petite image disque au démarrage ou pour faire des tests, mais pour manipuler de gros fichiers c'est sous optimal.
Je n'arrive pas à voir comment le montage d'un ramdisk pourrait être plus efficace que l'usage d'un répertoire temporaire (comme /tmp).
### DEBUT CREATION RAMDISK ###
mkdir /tmp/ramdisk0
mke2fs /dev/ram0
mount /dev/ram0 /tmp/ramdisk0
chmod ugoa+rwx /tmp/ramdisk0
### FIN CREATION RAMDISK ###
exit 0
Pour modifier la taille max du RamDisk (par default le ramdisk est limité à 64 Mo) à 1,5 Go sous linux, ()
Bien sûr 64 Mo ce n'est pas assez pour rendre la machine instable ou inutilisable. Alors qu'avec la possibilité de prendre 1,5 Go de RAM au système, on augmente les chances.
Si tu veux un outil potentiellement dangereux, je te suggère plutôt
ramfs : le contenu d'un système de fichier ramfs est entièrement en RAM, donc en mettant de trop gros fichier tu as aussi la possibilité le rendre instable voir inutilisable le système, mais par contre en effaçant les fichiers la mémoire est bien sûr libérée, donc c'est totalement réversible.
Pour modifier la taille max du RamDisk (par default le ramdisk est limité à 64 Mo) à 1,5 Go sous linux, on doit modifier le fichier de menu ( /boot/grug/menu.lst ) de grub, l'utilitaire qui permet de démarrer linux :
sudo nano -w /boot/grub/menu.lst
Après de nombreuses lignes de commentaires vous avez le menu de démarrage :
## ## End Default Options ##
title Ubuntu 9.04, kernel 2.6.28-11-generic
uuid 40c76d23-89f7-4844-b3f7-00c5cb6cfb09
kernel /boot/vmlinuz-2.6.28-11-generic root=UUID=40c76d23-89f7-4844-b3f7-00c5cb6cfb09 ro quiet splash
initrd /boot/initrd.img-2.6.28-11-generic
quiet
title Ubuntu 9.04, kernel 2.6.28-11-generic (recovery mode)
uuid 40c76d23-89f7-4844-b3f7-00c5cb6cfb09
kernel /boot/vmlinuz-2.6.28-11-generic root=UUID=40c76d23-89f7-4844-b3f7-00c5cb6cfb09 ro single
initrd /boot/initrd.img-2.6.28-11-generic
title Ubuntu 9.04, memtest86+
uuid 40c76d23-89f7-4844-b3f7-00c5cb6cfb09
kernel /boot/memtest86+.bin
quiet
### END DEBIAN AUTOMAGIC KERNELS LIST
Il faut rajoutez à la fin de la ligne ramdisk_size=1500000 sur la ligne kernel utilisée :
(1 500 000 donnant un RamDisk d'une taille maximum de 1,5 Go)
Ligne kernel avant modification :
kernel /boot/vmlinuz-2.6.28-11-generic root=UUID=40c76d23-89f7-4844-b3f7-00c5cb6cfb09 ro quiet splash
Ligne kernel aprés modification :
kernel /boot/vmlinuz-2.6.28-11-generic root=UUID=40c76d23-89f7-4844-b3f7-00c5cb6cfb09 ro quiet splash ramdisk_size=1500000
Si la démarche pour modifier la dimension (ou le nombre, ou le nombre de partitions) d'un disque ramdisk est aussi lourde, c'est que les concepteurs n'ont jamais pensé que le ramdisk était un volume d'usage habituel. C'est un outil très spécifique que la plupart des utilisateurs ne sont pas censés utiliser.
Information importante : Sous linux un RamDisk ne prend de la place en RAM qu'a hauteur des fichiers copiés dessus. La création de ce RamDisk de taille maximum de 1,5 Go ne prendras pas de place en RAM tant que vous n'y mettrez pas de fichiers.
Pas tout à fait. Il prend de la place en fonction du nombre des secteurs modifiés. Rien que le formatage va copier le bloc principal en des milliers d'exemplaire, chaque copie occupant de la place en mémoire.
En fonction de la stratégie d'allocation du système de fichier (ici ext2), si des fichiers sont supprimés, selon leur taille, leur position, et leur fragmentation éventuelle, la place libre de ces fichiers supprimés sera ou pas réutilisée pour les nouveaux fichiers.
La suppression de tous les fichiers de /tmp/ramdisk0 ne libérera pas un seul octet de mémoire utilisée par /tmp/ramdisk0 (par contre cela libère immédiatement la mémoire éventuellement utilisée par le cache d'inode, le cache de dentry, et le cache de pages pour ces fichiers).
Le démontage de /tmp/ramdisk0 ne libérera pas un seul octet de mémoire utilisée par /tmp/ramdisk0 (par contre cela libère immédiatement la mémoire pour le point de montage lui-même).
La mémoire utilisée par /tmp/ramdisk0 est de la RAM, non swapable, monopolisée par le périphérique.
Bien sûr, le redémarrage détruit le contenu du ramdisk et donc "libère" la mémoire.