Comment puis-je changer la quantité et la taille des disques virtuels Linux (/ dev / ram0 - / dev / ram15)?

27

Sous Linux, lorsque je démarre, j'ai automatiquement 16 disques RAM de 16 Mo. Cependant, je voudrais créer un très grand disque virtuel pour tester certains logiciels.

J'ai trouvé que je peux ajuster la taille des disques virtuels déjà sur le système avec le paramètre de démarrage du noyau ramdisk_size, cependant, cela fait des 16 disques virtuels (/ dev / ram0 - / dev / ram15) la taille spécifiée. Donc, si je veux créer un disque virtuel de 1 Go, j'aurais besoin de 16 Go de mémoire.

Fondamentalement, je veux créer un disque virtuel de 10 Go qui serait / dev / ram0. Comment pourrais-je procéder? Je suppose qu'il existe un paramètre de démarrage du noyau, mais je ne l'ai tout simplement pas trouvé.

Kevin S.
la source

Réponses:

18

Temps de compilation du noyau

Il existe deux options de configuration du noyau que vous pouvez définir dans votre .configfichier:

CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=10485760

Cela a configuré mon noyau pour créer un disque virtuel de 10 Go au démarrage.

Remarques:

  • CONFIG_BLK_DEV_RAM_SIZE est en Ko.
  • Ne spécifiez pas plus de mémoire que vous n'en avez réellement sur votre ordinateur.
  • Dans menuconfigregardez sous Pilotes de périphériques-> Bloquer les périphériques.

Temps de démarrage

Vous pouvez spécifier la taille des disques RAM que vous créez via le paramètre de démarrage du noyau ramdisk_size. Par exemple:

kernel /vmlinuz-2.6.32.24 ro root=LABEL=/ rhgb quiet ramdisk_size=10485760

Maintenant, je peux démarrer ma machine et créer un système de fichiers dessus, la monter et l'utiliser exactement comme un périphérique bloc.

# mkfs.xfs /dev/ram0
# mount /dev/ram0 /mnt/ramdisk

Sources:

  1. http://www.vanemery.com/Linux/Ramdisk/ramdisk.html [mort]
  2. https://www.kernel.org/doc/Documentation/blockdev/ramdisk.txt
Kevin S.
la source
16

Vous devriez plutôt utiliser tmpfs pour cela.

mount -t tmpfs -o size=10g none /mnt/point
Ignacio Vazquez-Abrams
la source
Puis-je créer un système de fichiers sur un tmpfs? J'ai besoin d'un périphérique bloc qui réside en mémoire sur lequel je peux créer un système de fichiers. Puis-je le faire sur un tmpfs?
Kevin S.
tmpfs est un système de fichiers. Il se trouve que cela réside dans la mémoire.
Ignacio Vazquez-Abrams
3
J'apprécie la réponse et normalement un tmpfs ferait l'affaire, mais je dois créer un système de fichiers xfs sur la partie de la mémoire dans laquelle j'écris.
Kevin S.
Le problème avec tmpfs est qu'il est soutenu par swap. Si vous commencez à utiliser le swap, vous perdez les avantages d'être en pure RAM. De plus, certaines personnes préfèrent avoir une zone qui n'est pas sauvegardée pour les applications de cryptographie.
drudru
Les réponses et détails connexes sont ici: unix.stackexchange.com/questions/66329/…
jocull
7

Pour créer un grand disque RAM après le démarrage sans déconner avec les paramètres du noyau. Utilisez tmpfs, créez un fichier, montez-le via une boucle et montez-le via un système de fichiers:

mount -t tmpfs -o size=200M tmpfs temp/
cd temp/
dd if=/dev/zero of=disk.img bs=1M count=199
losetup /dev/loop0 disk.img
mkfs.ext4 /dev/loop0
cd ..
mount /dev/loop0 temp2/

Probablement un peu de pénalité de performance en passant par plusieurs couches différentes ... mais au moins cela fonctionne.

user39725
la source
6

Une autre option consiste à utiliser les périphériques de boucle (par opposition à la fonction loobpack de mount comme mentionné précédemment):

dd if=dev/zero of=myfs.img bs=1M count=1024
losetup /dev/loop0 myfs.img
mkfs.xfs /dev/loop0

Maintenant / dev / loop est un périphérique de bloc légitime sur lequel votre application agirait comme un périphérique physique ou un disque virtuel, sauf qu'il est sauvegardé sur fichier. Vous pouvez monter quelque part ou faire appliquer votre application sur le nœud de périphérique, qui implémente les ioctls de bloc standard. Enregistre votre RAM système et utile pour rester dans les tests, etc.

(Vous pouvez même fdisk myfs.img, créer des partitions dessus et utiliser --offset et --sizelimit avec losetup pour pointer chaque / dev / loopX vers des partitions spécifiques de l'image, donc loop0, loop1 deviennent exactement comme sdc1, sdc2, etc. )

David Mirabito
la source
+1 car cela n'a pas besoin de recompiler le noyau
m-ric
3

Vous pouvez utiliser un fichier de boucle à la place. Créez simplement un fichier de boucle de la taille souhaitée (si vous souhaitez le placer dans un ramdisk tmpfs, très bien), puis formatez le fichier de boucle et montez-le.

dd if=/dev/zero of=myfile bs=1G count=10
mkfs.xfs -d file myfile
mount -t xfs -o loop myfile mymntpoint
KFro
la source
J'ai en fait essayé avant de poster ma question. C'est une excellente solution, mais le logiciel que je teste agit différemment lorsqu'il s'agit d'un fichier et non d'un périphérique bloc, c'est pourquoi je cherchais l'option ramdisk. Merci.
Kevin S.
2
Les appareils en boucle sont des appareils en bloc, donc je ne sais pas comment cela est possible?
pjc50
2

L'objet d'un ramdrive est la vitesse. Tmpfs n'est pas un lecteur. Les périphériques en boucle ne sont pas des lecteurs, mais vous pouvez placer une image de lecteur sur un périphérique en boucle. Les disques RAM "sont" des lecteurs et des lecteurs très rapides. Essayez de courir:

hdparm -t /dev/sda 

et alors:

hdparm -t /dev/ram0

Vous verrez ce que je veux dire! Mais hdparm détruit parfois le lecteur RAM. Donc, vous devez recommencer.

Parfois, il n'y a pas de périphérique / dev / ram. Pour en faire un:

mknod -m 0777 /dev/ram0 b 1 0 

mais il n'aura aucune taille. Pour lui donner de la taille:

dd if=/dev/zero of=/dev/ram0

et il s'arrêtera lorsque le lecteur sera plein. La taille maximale est déterminée par le noyau config parm: CONFIG_BLK_DEV_RAM_SIZE.

Ensuite, formatez-le simplement, c'est-à-dire

mke2fs /dev/ram0

Et montez-le:

mount /dev/ram0 /mnt/ramdrive

Un de mes préférés est le débogage du code stocké sur un lecteur RAM. Les compilations sont au moins 10 fois plus rapides que le code stocké sur un disque dur. Les tables de base de données stockées sur ramdrive volent également, mais vous devez disposer d'un script qui écrit régulièrement sur le disque dur. La plupart des administrateurs n'ont pas le courage de mettre des données sur des disques RAM. Et certaines tables sont trop grandes.

Swansword
la source
1

Sur lighthouse 64 (puupy linux basé sur slackware), je l'ai fait;

mke2fs /dev/ram1 4096000 # nearly 4G ramdisk, choose the size of ramdisk less than actual ram!
mount /dev/ram1 /mnt/dvd # dvd on my laptop is unused choose your device from /mnt/

Là vous avez un ramdisk monté en tant que répertoire /mnt/dvdoù vous pouvez copier coller enregistrer tout faire comme vous le feriez dans un répertoire hd sauf dans ram. n'oubliez pas d'enregistrer vos fichiers sur hd avant l'arrêt.

Marcos
la source