Création d'un disque virtuel sous Linux

70

J'ai une machine avec 62 Go de RAM et une malle de 7 Go seulement, alors j'ai pensé créer un disque RAM et la compiler à cet endroit. Je ne suis pas un expert Linux. J'ai trouvé des instructions sur Internet pour créer le disque RAM:

mkfs -q /dev/ram1 8192

mais j'ai changé le 8192 en 16777216 dans une tentative d'allouer 16 Go de disque RAM.

J'ai eu l'erreur suivante:

mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n) 

À quel point je me suis effrayé et renfloué.

sudo dmidecode --type 17 | grep Size

montre

8x8192MB + 2048MB = 67584 MB

mais dusur /devdonne 804K.

Est-ce le problème? Puis-je surmonter cette /devtaille?

Franc
la source
15
Avez-vous essayé tmpfs? C'est un système de fichiers en RAM, pas besoin d'ext2. mount -o size=16G -t tmpfs none /mnt/tmpfs
T-8ch
Ça a marché! Merci! Mais jusqu'à présent, pas beaucoup de vitesse: je pense que les outils que j'utilise pour construire utilisent toujours le disque standard. Je vais mettre plus de choses sur le disque RAM.
Frank
3
Placer les outils eux-mêmes sur le disque mémoire ne devrait pas faire beaucoup de différence, car le noyau les mettra de toute façon en cache dans la mémoire vive.
T-8ch
1
@goldilocks C'est une preuve anecdotique, mais lors de la compilation de nos projets Java avec Maven, l' accélération de l'utilisation d'un disque mémoire est très importante . Je suppose cependant que c'est plus à cause du temps de recherche que du temps de lecture.
Orthographe le
1
/ dev / shm, en réalité / run / shm , peut être utilisé; c'est presque toujours là.
Camille Goudeseune

Réponses:

78

Le meilleur moyen de créer un disque virtuel sur Linux est tmpfs. Il s’agit d’un système de fichiers hébergé par un ram, il n’est donc pas nécessaire d’ext2. Vous pouvez créer un fichier tmpfs de 16 Go avec:

mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch
la source
2
sur mon système, avec rien dans / mnt, il est écrit: ls: impossible d'accéder à / mnt / tmpfs: aucun fichier ou répertoire de ce type ne doit être monté: le point de montage / mnt / tmpfs n'existe pas. Est-ce quelque chose à craindre? Si je ne fais que mkdir / mnt / tmpfs, est-ce que cela va à l’encontre du but recherché (en créant des tmpfs sur le disque normal - s’il n’ya pas de flammes, je suis un débutant ici).
Frank
9
Vous avez besoin d'un point de montage (répertoire) comme cible. Ainsi, après avoir créé ce répertoire (vous pouvez utiliser n'importe quel répertoire, le contenu existant est masqué), vous pouvez le monter à l'aide de la commande de la réponse.
T-8ch
1
tmpfspeut utiliser swap, ce que vous ne voulez probablement pas dans un disque RAM pur.
palswim
2
@RomanSusi tmpfs est le type de fichier (passé après -t). "aucun" est le périphérique de support ("disque") qui n'existe pas pour les tmpfs
t-8ch
1
Il peut être intéressant de noter que la spécification de la taille est facultative. La valeur par défaut est la moitié de la RAM. Il n'est pas inutile de spécifier une taille supérieure, cela ne fait que fixer un plafond, afin de vous protéger contre l'utilisation accidentelle de toute votre mémoire vive et la destruction du système.
sourcejedi
20

Linux est très efficace dans l'utilisation de la RAM. Il n’ya guère de surprise que vous ne constatiez que peu, voire aucune accélération tmpfs. Les plus gros éléments à lire en mémoire (et donc capables de ralentir le processus) sont les outils (compilateur, assembleur, éditeur de liens), et makeils seront chargés en mémoire au démarrage et ne le quitteront jamais. Ce qui reste est en train de lire dans le source (l'écriture des résultats ne vous ralentira pas, à moins que la mémoire ne soit sérieusement contrainte). Encore une fois, les fichiers d’en-tête resteront, seule la source de l’utilisateur devra être lue. Et il est peu probable que ce soit plus que quelques mégaoctets. Créer un grand disque RAM (ou même beaucoup d’utilisation tmpfs) peut très bien ralentir les choses (en rendant la mémoire de construction contrainte, les fichiers sur le disque RAM ou sur tmpfs ne peuvent pas être utilisé directement à partir de là).

vonbrand
la source
1
Quoi! Comment ne peuvent-ils pas être utilisés directement à partir de là?
Kazark
Ils sont en RAM, mais pas dans un format directement utilisable.
vonbrand
2
Vraiment! Comment? (Pardon ma lenteur.)
Kazark
8
@Kazark, pour gérer les exécutables en mémoire, des structures de données spéciales sont utilisées. Comme les RAMdisks tmpfsne sont pas utilisés couramment pour stocker des exécutables (les RAMdisks sont un vestige du bon vieux temps des disquettes extrêmement lentes et ainsi de suite, tmpfspour des données temporaires très strictes), personne n’a jugé suffisamment important d’ajouter les horribles hacks nécessaires.
vonbrand
7
J'ai essayé d'exécuter mon code de rails à partir d'un système de fichiers tmpfs (RAM), et je ne voyais aucune différence. J'espérais vraiment faire une différence notable mais j'ai été déçu par la qualité de linux.
Khaja Minhajuddin
6

Le problème est que la taille maximale d'un disque mémoire, plus précisément de la taille de la mémoire accessible via le pilote du disque mémoire, est configurée à la compilation, elle peut être écrasée à la première heure, mais reste fixe une fois le noyau chargé en mémoire. La valeur par défaut est probablement mesurée en mégaoctets. Si je me souviens bien, la mémoire d’un disque RAM est réservée correctement lorsque le pilote est chargé. Tous les disques RAM ont la même taille et il en existe 16 par défaut. Donc, même vous ne voulez pas une taille de disque mémoire de 16 Go :-)

Comme indiqué dans l’autre réponse, tmpfs est ce que vous voulez utiliser. De plus, vous ne gagnerez pas beaucoup en ayant votre système d'exploitation complet dans un disque virtuel / tmpfs. Copiez simplement votre builddir dans un fichier tmpfs et compilez-le ensuite. Vous devrez peut-être vous assurer que tous les résultats temporaires sont également écrits dans un emplacement situé dans les fichiers tmpfs.

Bananguin
la source
En réalité, ils n'utilisent aucune mémoire tant que vous ne leur écrivez rien. La limite de temps de démarrage est juste la limite. Même après en avoir rempli un, vous pouvez libérer la mémoire de sauvegarde blockdev --flushbufs.
psusi
@ psusi: pouvez-vous nous donner plus d'informations à ce sujet? Je ne peux que trouver des déclarations indiquant qu'une fois revendiquée par le disque mémoire, la mémoire n'est jamais récupérée, par exemple Documentation/blockdev/ramdisk.txtdans les sources du noyau. Et sur ma réponse: ce fichier indique également que le disque mémoire augmente à mesure que la mémoire est utilisée, de sorte qu'il ne soit pas alloué en une seule fois.
Bananguin
Quel genre d'information? Vous exécutez la commande et libère le bélier, à condition de ne pas l'avoir toujours montée.
Psusi
Comment savez-vous que le commandement fait ce que vous dites qu'il fait? Sa page de manuel ne le confirme pas et la documentation de l'arbre source du noyau peut être interprétée comme étant en contradiction avec vos informations.
Bananguin
6
J'ai lu le code source et l'ai vérifié en l'essayant.
Psusi
3

Cela semble fonctionner si vous créez un grand disque virtuel après le démarrage, sans modifier 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
mount /dev/loop0 temp2/

Probablement un peu de performance en passant par plusieurs couches différentes ... mais au moins ça marche.

utilisateur39725
la source
3

Par ailleurs tmpfset ramfs, une autre option est le /dev/ram0dispositif de bloc. Sur les versions récentes d'Ubuntu, ce périphérique n'existe pas par défaut, mais peut être créé via modprobe brd.

Cette approche est plus prévisible, car elle crée un ext4système de fichiers réel et ne dépasse jamais la limite spécifiée. Mais la configuration nécessite plus d’étapes et la mémoire vive est utilisée moins efficacement.

Utilisation du module de noyau brd (/ dev / ram0)

Pour créer et initialiser un disque RAM de 4 Go:

mkdir /ramdisk

modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk

Le rd_nrparamètre spécifie le nombre de disques RAM à créer (par défaut, il en crée 16, c'est- /dev/ram0à- dire par le biais /dev/ram15). Le rd_sizeparamètre est la taille en kilo-octets . La $(( ... ))syntaxe vous permet de faire de l'arithmétique dans le shell.

Pour désallouer le disque RAM, démontez-le et retirez le brdmodule du noyau:

umount /ramdisk
modprobe -r brd

Créer un périphérique bloc à l'intérieur ramfs

Sinon, vous pouvez créer un périphérique bloc à l'intérieur de ramfs:

mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage

truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk

La truncatecommande crée un fichier vide d’une taille donnée de sorte qu’il soit initialisé (c’est-à-dire qu’il consomme de la mémoire) à la demande.

Pour désallouer le disque RAM, démontez-le et supprimez l’image disque:

umount /ramdisk
rm /ramdisk-storage/ramdisk.img

Comparaison avec tmpfsetramfs

Bien tmpfset ramfssont plus efficaces que d' utiliser un dispositif de bloc, ci - dessous quelques - unes de leurs inconvénients.

tmpfspeut permuter sur le disque. Ceci est plus efficace, mais vous voudrez peut-être parfois un disque purement RAM:

  • Les fichiers avec lesquels vous travaillez sont sensibles (par exemple, les fichiers d'une partition cryptée).
  • Vous effectuez des tests de performances et vous ne voulez pas que les E / S de disque jouent un rôle important (les temps d'écriture sur les disques SSD peuvent varier beaucoup).
  • Vous décompressez un fichier volumineux et vous ne voulez pas utiliser votre disque SSD.

ramfsest facile à configurer, récupère de l’espace une fois les fichiers supprimés et utilise la RAM plus efficacement (le système ne met pas les fichiers en mémoire tampon, car il sait qu’ils sont dans la RAM). Mais il a ses propres inconvénients et surprises:

  • L' dfutilitaire ne rapporte pas l'utilisation de l'espace:

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • Il n'y a pas de paramètre de limite de taille. Si vous mettez trop dans le disque mémoire, votre système se bloquera.

  • Les fichiers fragmentés peuvent devenir épargnés lorsque vous vous y attendez le moins. Ce matin, j'ai copié une image de machine virtuelle (150G, mais 49G utilisée sur le disque) vers ramfs(j'ai 128G de RAM). Ça a marché. Mais quand j'ai copié de la ramfsà la destination, mon système est devenu insensible. L' cputilitaire a apparemment comblé les lacunes en lecture , mais pas en écriture.

Les deux tmpfset ramfspeuvent se comporter différemment d'un vrai ext4système de fichiers. Créer un périphérique bloc dans la RAM et l’initialiser avec ext4évite cela.

Pour une comparaison plus approfondie: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

Joey Adams
la source
1

OP la quantité de RAM est exprimée en MB. Donc tout ce dont vous avez besoin pour entrer est le 16384. Et voila, vous seriez dans les affaires

CyberWolf64
la source
1
Nan. "Si fs-size n’a pas de suffixe, il est interprété comme une puissance de deux kilo-octets." - hommemkfs.ext2
sourcejedi
1

Vous pouvez monter un ramfssystème de fichiers, y copier votre projet et y travailler. Cela garantit que vos fichiers d'entrée sont chargés dans la RAM et qu'ils ne seront pas relus à partir du lecteur de disque beaucoup plus lent. Cependant, comme vous l'avez découvert, cette stratégie n'est généralement pas utile. Vous obtenez déjà exactement le même avantage.

Ramfs est un système de fichiers très simple qui exporte les mécanismes de mise en cache du disque de Linux (le cache de pages et le cache de dentry) en tant que système de fichiers RAM redimensionnable.

- https://github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt

Vous pouvez déjà avoir confiance que vos fichiers d’entrée sont mis en cache dans la RAM, lors de leur première lecture. Vos fichiers de sortie sont également mis en cache afin que vous n'attendiez pas qu'ils soient écrits sur le disque.

Il n'y a pas de limite artificielle à la quantité de mémoire cache que vous pouvez mettre en cache, combien de temps elle reste en cache, etc. Le cache qui est déposé en premier est choisi par des algorithmes extrêmement élaborés. La première approximation est que nous décrivons comme moins récemment utilisé. Voir Quels algorithmes de remplacement de page sont utilisés dans le noyau Linux pour le cache de fichiers du système d'exploitation?

Notez que votre éditeur de texte fsync()enregistrera explicitement les fichiers sur le disque.

Si vous exécutez des tests d'un programme impliquant fsync(), leur exécution dans un système de fichiers comme ramfspeut les accélérer. Une autre stratégie consiste à essayer de désactiver fsync()avec eatmydata/ nosync.so.

Certains autres systèmes d'exploitation peuvent avoir des limitations spécifiques, qui peuvent être contournées à l'aide d'un disque mémoire. À une extrémité, l'absence de toute mise en cache de fichiers est pourquoi ramdisks étaient populaires sur DOS .

tmpfs

tmpfsfonctionne de la même manière que ramfs, sauf qu’il peut utiliser l’espace de permutation si vous en avez un. Par exemple, si vous avez besoin de RAM pour autre chose, les algorithmes les moins récemment utilisés peuvent sélectionner des blocs de données dans tmpfs et les échanger sur le disque.

La plupart des gens s'en tiennent à cela tmpfs, car cela vous permet également de limiter la taille totale et d'afficher l'espace utilisé correctement, par exemple dans la dfcommande. Je ne sais pas pourquoi cette différence existe. La limite de taille tmpfsvous évite de remplir accidentellement toute votre RAM et de tuer votre système. La valeur par défaut est la moitié de votre RAM.

Autres raisons pour lesquelles les écritures peuvent ralentir

Ce qui précède est une simplification adaptée à votre cas. Les écritures dans les fichiers de votre cas ne devraient pas avoir besoin d'attendre le disque. Cependant, il y a quelques cas d'écritures qui le font. Voir l'excellent article de blog Pourquoi les écritures tamponnées sont parfois bloquées . Le cas le plus surprenant est une modification récente de Linux appelée "écritures de pages stables".

sourcejedi
la source