Wie kann ich die Anzahl und Größe der Linux-RAM-Disks (/ dev / ram0 - / dev / ram15) ändern?

27

Unter Linux habe ich beim Booten automatisch 16 16-MB-RAM-Disks. Ich möchte jedoch eine wirklich große RAM-Disk erstellen, um einige Software zu testen.

Ich fand heraus, dass ich die Größe der bereits auf dem System vorhandenen RAM-Disks mit dem Kernel-Boot-Parameter anpassen kann ramdisk_size, dies macht jedoch alle 16 RAM-Disks (/ dev / ram0 - / dev / ram15) zu der angegebenen Größe. Wenn ich also eine RAM-Disk mit 1 GB erstellen möchte, benötige ich 16 GB Arbeitsspeicher.

Grundsätzlich möchte ich eine 10 GB RAM-Disk erstellen, die / dev / ram0 wäre. Wie würde ich das machen? Ich nehme an, es gibt einen Kernel-Boot-Parameter, aber ich habe ihn einfach nicht gefunden.

Kevin S.
quelle

Antworten:

18

Kernel-Kompilierungszeit

Es gibt zwei Optionen für die Kernelkonfiguration, die Sie in Ihrer .configDatei festlegen können :

CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=10485760

Dadurch wurde mein Kernel so konfiguriert, dass beim Booten eine Ramdisk mit 10G erstellt wurde.

Anmerkungen:

  • CONFIG_BLK_DEV_RAM_SIZE ist in KB.
  • Geben Sie nicht mehr Speicher an, als tatsächlich RAM auf Ihrem Computer vorhanden ist.
  • Im menuconfigBlick unter Geräten Fahrer-> Block Devices.

Startzeit

Sie können die Größe der von Ihnen erstellten RAM-Festplatten über den Kernel-Boot-Parameter festlegen ramdisk_size. Beispielsweise:

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

Jetzt kann ich meine Maschine booten und ein Dateisystem darauf erstellen, es mounten und genau wie ein Blockgerät verwenden.

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

Quellen:

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

Verwenden Sie stattdessen tmpfs .

mount -t tmpfs -o size=10g none /mnt/point
Ignacio Vazquez-Abrams
quelle
Kann ich ein Dateisystem auf einem tmpfs erstellen? Ich benötige ein Blockgerät im Speicher, auf dem ich ein Dateisystem erstellen kann. Kann ich das auf einem tmpfs machen?
Kevin S.
tmpfs ist ein Dateisystem. Es ist einfach so, dass es im Gedächtnis bleibt.
Ignacio Vazquez-Abrams
3
Ich schätze die Antwort und normalerweise würde ein tmpfs den Trick tun, aber ich muss ein xfs-Dateisystem auf dem Teil des Speichers erstellen, auf den ich schreibe.
Kevin S.
Das Problem mit tmpfs ist, dass es durch Swap gesichert ist. Wenn Sie Swap verwenden, verlieren Sie die Vorteile des reinen Arbeitsspeichers. Außerdem bevorzugen einige Leute einen Bereich, der nicht für Kryptoanwendungen gesichert ist.
Drudru
Zugehörige Antworten und Details finden Sie hier: unix.stackexchange.com/questions/66329/…
jocull
7

So erstellen Sie nach dem Booten eine große RAM-Festplatte, ohne mit den Kernel-Parametern herumzuspielen. Verwenden Sie tmpfs, erstellen Sie eine Datei, mounten Sie sie über eine Schleife und mounten Sie sie über ein Dateisystem:

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/

Wahrscheinlich ein bisschen Leistungseinbußen durch mehrere verschiedene Ebenen ... aber zumindest funktioniert es.

user39725
quelle
6

Eine andere Option ist die Verwendung der Loop-Geräte (im Gegensatz zu der zuvor erwähnten Loobpack-Funktion von mount):

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

Jetzt ist / dev / loop ein legitimes Block-Gerät, auf das Ihre App wie auf ein physisches Gerät oder eine Ramdisk reagiert, mit der Ausnahme, dass es dateibasiert ist. Sie können es irgendwo einhängen oder Ihre App auf den Geräteknoten einwirken lassen, der die Standardblock-Ioctls implementiert. Speichert Ihren System-RAM und ist nützlich, um ihn für Testfälle usw. aufzubewahren.

(Sie können sogar myfs.img fdisk, Partitionen darauf erstellen und --offset und --sizelimit mit losetup verwenden, um jedes / dev / loopX auf bestimmte Partitionen im Image zu verweisen, sodass loop0, loop1 genau wie sdc1, sdc2 usw. Werden )

David Mirabito
quelle
+1, da der Kernel nicht neu kompiliert werden muss
m-ric
3

Sie könnten stattdessen eine Schleifendatei verwenden. Erstellen Sie einfach eine Schleifendatei in der gewünschten Größe (wenn Sie sie in eine tmpfs-Ramdisk einfügen möchten, in Ordnung), formatieren Sie die Schleifendatei und hängen Sie sie ein.

dd if=/dev/zero of=myfile bs=1G count=10
mkfs.xfs -d file myfile
mount -t xfs -o loop myfile mymntpoint
KFro
quelle
Ich habe es tatsächlich versucht, bevor ich meine Frage gestellt habe. Es ist eine großartige Lösung, aber die Software, die ich teste, verhält sich anders, wenn es sich um eine Datei und nicht um ein Blockgerät handelt. Aus diesem Grund habe ich die Ramdisk-Option ausgewählt. Vielen Dank.
Kevin S.
2
Loopback-Geräte sind Blockgeräte, ich bin mir also nicht sicher, wie das möglich ist?
pjc50
2

Das Ziel eines Ramdrive ist die Geschwindigkeit. Tmpfs ist kein Laufwerk. Loop-Geräte sind keine Laufwerke, aber Sie können ein Laufwerksabbild auf einem Loop-Gerät ablegen. RAM-Datenträger sind Laufwerke und sehr schnelle Laufwerke. Versuche es mit:

hdparm -t /dev/sda 

und dann:

hdparm -t /dev/ram0

Du wirst sehen, was ich meine! Aber hdparm zerstört manchmal den RAM-Antrieb. Also musst du es wieder schaffen.

Manchmal gibt es keine / dev / ram-Geräte. Um eins zu machen:

mknod -m 0777 /dev/ram0 b 1 0 

aber es wird keine Größe haben. Um es Größe zu geben:

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

und es stoppt, wenn das Laufwerk voll ist. Die maximale Größe wird durch die Kernel - Konfiguration Parm bestimmt: CONFIG_BLK_DEV_RAM_SIZE.

Dann formatieren Sie es einfach, dh

mke2fs /dev/ram0

Und montiere es:

mount /dev/ram0 /mnt/ramdrive

Ein Favorit von mir ist das Debuggen von Code, der auf einem RAM-Laufwerk gespeichert ist. Bei den Kompilierungen wird mindestens die 10-fache Codegeschwindigkeit auf einer Festplatte gespeichert. Auf RAM-Laufwerk gespeicherte Datenbanktabellen fliegen ebenfalls, aber Sie müssen über ein Skript verfügen, das regelmäßig auf die Festplatte schreibt. Die meisten Administratoren haben nicht den Mut, Daten auf RAM-Festplatten zu speichern. Und einige Tische sind zu groß.

Schwert
quelle
1

Auf Lighthouse 64 (Puupy Linux basierend auf Slackware) habe ich das gemacht;

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/

Dort haben Sie eine Ramdisk als Verzeichnis gemountet, /mnt/dvdin das Sie kopieren und speichern können. Tun Sie alles, was Sie in einem HD-Verzeichnis tun würden, außer in RAM. Denken Sie daran, Ihre Dateien vor dem Herunterfahren auf HD zu speichern.

Marcos
quelle