RAM-Disk erstellen
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
Als RAM-Disk wird ein virtuelles Laufwerk bezeichnet, welches aus einem Teil des im System befindlichen Arbeitsspeichers (RAM) besteht. Dabei wird statisch oder auch dynamisch Speicherplatz im RAM belegt, mit einem Dateisystem formatiert und schließlich eingehängt. Der abgezweigte Speicherplatz steht dem System logischerweise nicht mehr zur Verfügung.
Wenn eine SSD zum Einsatz kommt, sind weitere Hinweise im Artikel SSD/Auslagerung zu finden.
Hinweis:
Zu bedenken ist, dass RAM bekanntlich zu den flüchtigen Speichermedien zählt und somit die sich auf der RAM-Disk befindlichen Dateien, ebenso wie der restliche RAM-Inhalt, bei Unterbrechung der Stromzufuhr verschwinden. Daher sollten auf der RAM-Disk keine wichtigen Daten abgelegt werden, sofern nicht die unterbrechungsfreie Stromversorgung des Computers gewährleistet ist. Weiterhin sollten vor dem Ausschalten des Computers evtl. noch benötigte Dateien gesichert werden (z.B. automatisiert per Skript).
Anwendungsgebiete¶
Der Arbeitsspeicher ist hinsichtlich der Lese- und Schreibvorgänge wesentlich schneller und weniger von Verschleiß betroffen als konventionelle Festplatten und erst recht als Flash-Speicher. Ein Paradebeispiel ist hier der Betrieb eines "RAM-Servers", der Dank der schnelleren Zugriffe besonders geschwind anfragende Clients bedienen kann. Die schnelleren Reaktionszeiten nützen natürlich nichts, wenn der Flaschenhals gar nicht von einem langsamen Speichermedium ausgeht, sondern z.B. von einer ausgelasteten CPU oder einer langsamen Netzwerkverbindung. Dies sollte also festgestellt werden, bevor man sich die Mühe macht.
Eine RAM-Disk kann auch ein Weg sein, das Löschproblem unter journalisierenden Dateisystemen wie ext3 oder 4 zu umgehen. Prekäre Dateien werden also nicht auf die mit ext3/4 formatierte Festplatte kopiert, sondern in das nicht-journalisierende Dateisystem der ohnehin vergänglichen RAM-Disk. In diesem Szenario muss natürlich darauf geachtet werden, dass die Dateien nicht versehentlich doch auf die Festplatte gelangen, z.B. weil das System swapt oder die Dateien mit einem Programm geöffnet werden, welches auf der Festplatte ungefragt zwischenspeichert oder Sicherungen anlegt.
Methode 1 - Mit tmpfs-Dateisystem¶
Die Verwendung vom tmpfs ist ein sehr einfacher Weg zur Erstellung einer RAM-Disk.
Hinweis:
Das tmpfs-Dateisystem ist kein reines RAM-Dateisystem, sondern schreibt Daten in den Festplatten-Swap, sobald der Speicherplatz im RAM knapp wird. Diese Eigenschaft könnte eventuell die oben genannten Vorteile zunichte machen.
Die folgenden Befehle [1][4] richten eine RAM-Disk ein:
Standardeinstellung (max. 50% des Arbeitsspeichers):
sudo mount -t tmpfs none /PFAD/ZUM/EINHÄNGEPUNKT
Relativ (20% des Arbeitsspeichers):
sudo mount -t tmpfs -o size=20% none /PFAD/ZUM/EINHÄNGEPUNKT
Absolut (200 MiB):
sudo mount -t tmpfs -o size=200M none /PFAD/ZUM/EINHÄNGEPUNKT
erstellen ohne weiteren Aufwand eine direkt nutzbare RAM-Disk. Dabei werden dynamisch immer so viele Ressourcen abgezweigt, wie gerade benötigt werden. Ist das Laufwerk also leer, belegt es auch keinen Platz im RAM. Es ist möglich, diese Partition standardmäßig beim Systemstart einzubinden, wenn man dauerhaften Zugriff darauf haben möchte. Hierzu muss man lediglich eine Zeile in die /etc/fstab einfügen [2]. Diese kann zum Beispiel so aussehen:
tmpfs /media/ramdisk tmpfs defaults,size=20% 0 0
Hierzu muss natürlich das Verzeichnis /media/ramdisk/ zuvor erstellt und ihm Rechte [3] zugewiesen werden:
sudo mkdir /media/ramdisk sudo chmod 777 /media/ramdisk
Jetzt sollte die Platte beim Systemstart automatisch eingebunden werden. Manuell [4] erfolgt dies mit dem Befehl:
sudo mount tmpfs
Anstatt /media/ramdisk kann auch ein beliebiger anderer Ort eingefügt werden, an dem die Partition eingebunden werden soll. Die Option size=X%
legt den maximal abgezweigten Anteil des RAMs fest, den man belegen darf und kann individuell angepasst werden. Anstatt Prozent kann man auch eine absolute Zahl angeben (z.B. size=50m
). Man sollte bedenken, nicht zu viel RAM freizugeben, da man ansonsten Gefahr läuft, ein System sehr stark auszubremsen (und zu viel auf die SWAP-Partition ausgelagert werden muss).
Methode 2¶
Mit ext2-Dateisystem - ältere Variante¶
Die Vorgehensweise entspricht der bei der Formatierung einer Festplatte, mit dem einzigen Unterschied, dass als Ziel ein Bereich des RAMs ausgewählt wird. Man öffnet zunächst ein Terminal [1]. Mit dem Befehl
sudo mke2fs -m 0 /dev/ram0
bewirkt man, dass der Teil des RAMs, der vom System mit ram0 angesprochen wird, mit dem ext2-Dateisystem formatiert wird. Die Option -m 0
stellt sicher, dass auf der Partition kein Speicherplatz für den Root-Benutzer reserviert wird, was ansonsten unnötig Platz kosten würde. Zu beachten ist, dass der erstellte Teil damit effektiv den Systemressourcen entzogen wird, der verfügbare Arbeitsspeicher also, solange die Partition besteht, kleiner wird.
Als Ergebnis existiert jetzt eine beschreibbare Partition im RAM, die ganz normal eingebunden [4] werden kann:
sudo mount /dev/ram0 /PFAD/ZUM/EINHÄNGEPUNKT
Also beispielsweise:
sudo mkdir /media/ramdisk sudo mount /dev/ram0 /media/ramdisk
erstellt werden. Falls die RAM-Disk zwar korrekt eingebunden wird, aber nicht gelesen/beschrieben werden kann, sollte man überprüfen, ob man die erforderlichen Berechtigungen [3] hat. Diese müssen gegebenenfalls mit
sudo chown BENUTZERNAME /media/ramdisk sudo chmod u+rwx /media/ramdisk
erteilt werden. Damit sollte man eine funktionierende RAM-Disk erstellt haben.
Größe einstellen¶
Mit
dmesg | grep RAMDISK
kann man sich die momentane Größe der so erstellten RAM-Disk ausgeben lassen. Ist diese unpassend, kann diese mit der Option GRUB_CMDLINE_LINUX=ramdisk_size=x
des Boot-Managers GRUB_2 bzw. in der Datei /etc/default/grub angepasst werden.
Erstellen eines Skriptes¶
Da die RAM-Disk bei jedem Neustart verschwindet, ist es unter Umständen praktisch, ein Skript für die obigen Befehle zu erstellen, was einem die Arbeit abnimmt, alles jedes mal von Neuem eintippen zu müssen.
Hierzu wird zunächst mit einem Editor [2] eine Datei erstellt und folgender Inhalt eingefügt:
#!/bin/sh sudo mke2fs /dev/ram0 sudo mount /dev/ram0 /media/ramdisk sudo chown BENUTZERNAME /media/ramdisk sudo chmod u+rwx /media/ramdisk
Dann speichert man die Datei ab und gibt ihr noch Ausführrechte [3]. Beim Ausführen dieses Skriptes wird nun automatisch eine RAM-Disk erstellt und benutzbar gemacht. Das Erstellen der RAM-Disk kann über eine Systemd-Unit automatisiert werden.
Neue Variante mit ext4¶
Einzelschritt¶
Nicht sensible Daten¶
In dieser Variante werden folgende Dinge getätigt (Für alle Benutzer mit nicht sensibleren Daten)
die Gerätedatei ram0 mit einer Dateigröße von 2 GB mit ext4-Dateisystem im Ordner /dev erstellt
im Ordner /media wird ein neuer Ordner ramdisk angelegt, welcher später als Einhängepunkt dient
Berechtigung, damit alle Benutzer Zugriff haben
Im Terminal folgendes nach und nach eingeben:
Gerätedatei mit Bezeichnung und einer Dateigröße von 2 GB anlegen
sudo mke2fs -t ext4 -O extents -L , RAMDISK, -vm0 /dev/ram0 2G
Ordner ramdisk anlegen:
sudo mkdir /media/ramdisk
Gerätedatei /dev/ram0 in /media/ramdisk einhängen:
sudo mount /dev/ram0 /media/ramdisk
Berechtigung für Lesen, Schreiben, Ausführen hinzufügen:
sudo chmod --verbose a+rwx /media/ramdisk
Sensible Daten¶
In dieser Variante werden folgende Dinge getätigt (Für einen Benutzer mit sensibleren Daten):
die Gerätedatei ram0 mit einer Dateigröße von 2 GB mit ext4 im Ordner /dev erstellt
Im Ordner /media wird ein neuer Ordner ramdisk angelegt, welcher später als Einhängepunkt dient
dem aktuelle Benutzer wird die Berechtigung des Ordners ramdisk gegeben
es wird eine weitere Berechtigung des Ordners gegeben
Im Terminal folgendes nach und nach eingeben - Hinweis dazu: BENUTZERNAME
mit dem gewünschten Namen ändern. Der eigene Benutzer kann auch im Terminal mit echo $USER
angezeigt werden.
Gerätedatei mit Bezeichnung und einer Dateigröße von 2 GB anlegen:
sudo mke2fs -t ext4 -O extents -L , RAMDISK, -vm0 /dev/ram0 2G
Ordner ramdisk anlegen:
sudo mkdir /media/ramdisk
Gerätedatei /dev/ram0 in /media/ramdisk einhängen:
sudo mount /dev/ram0 /media/ramdisk
Benutzer und Gruppe von root nach BENUTZENAME ändern:
sudo chown --verbose BENUTZENAME:BENUTZENAME /media/ramdisk
Berechtigung für Lesen, Schreiben, Ausführen hinzufügen:
sudo chmod --verbose a-rwx,u+rwx /media/ramdisk
Skript-Datei¶
Nicht sensible Daten¶
Alle Benutzer dürfen auf die RAM-Disk zugreifen (benötigt keinen spezifischen Benutzernamen)
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/bin/bash + RAMDISK_SIZE='2' # Größeneinstellung in Gigabyte… if [ -d "/media/ramdisk/lost+found/" ] then clear echo 'RAM-Disk „/media/ramdisk“ existiert bereits, das Script wird nun beendet!' else clear mkdir /media/ramdisk mke2fs -t ext4 -O extents -vm0 /dev/ram0 ${RAMDISK_SIZE}G -L 'RAMDISK' mount /dev/ram0 /media/ramdisk chmod --verbose a+rwx /media/ramdisk fi |
Sensible Daten¶
Es darf nur ein Benutzer auf die RAM-Disk zugreifen (alle anderen Benutzer haben keinen keinerlei Zugriff)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/bin/bash + USERNAME='BENUTZERBAME'; # bitte nur einen Benutzernamen eingeben, welcher die RAM-Disk nutzen darf RAMDISK_SIZE='2' # Größeneinstellung in Gigabyte… if [ -d "/media/ramdisk/lost+found/" ] then clear echo 'RAM-Disk „/media/ramdisk“ existiert bereits, das Script wird nun beendet!' else clear mkdir /media/ramdisk mke2fs -t ext4 -O extents -vm0 /dev/ram0 ${RAMDISK_SIZE}G -L 'RAMDISK' mount /dev/ram0 /media/ramdisk chmod --verbose a-rwx,u+rwx /media/ramdisk chown --verbose $USERNAME:$USERNAME /media/ramdisk fi |
Permanente Einbindung¶
Crontab¶
Für Crontab wird der gesamte Code als Einzeiler verwendet. Crontab öffnen und ggf. Editor auswählen:
sudo crontab -e
Nicht sensible Daten¶
Am Ende der Datei folgendes hinzufügen und Größe in GB anpassen:
@reboot RAMDISK_SIZE='2'; if [ -d "/media/ramdisk/lost+found/" ]; then clear;echo 'RAM-Disk „/media/ramdisk“ existiert bereits, das Script wird nun beendet!'; else clear;mkdir /media/ramdisk;mke2fs -t ext4 -O extents -vm0 /dev/ram0 ${RAMDISK_SIZE}G -L 'RAMDISK';mount /dev/ram0 /media/ramdisk;chmod --verbose a+rwx /media/ramdisk;fi
SensibleDaten¶
Am Ende der Datei folgendes hinzufügen und BENUTZERNAME durch den aktuellen eintragen und Größe in GB anpassen:
@reboot USERNAME='BENUTZERNAME';RAMDISK_SIZE='2'; if [ -d "/media/ramdisk/lost+found/" ]; then clear;echo 'RAM-Disk „/media/ramdisk“ existiert bereits, das Script wird nun beendet!'; else clear;mkdir /media/ramdisk;mke2fs -t ext4 -O extents -vm0 /dev/ram0 ${RAMDISK_SIZE}G -L 'RAMDISK';mount /dev/ram0 /media/ramdisk;chmod --verbose a-rwx,u+rwx /media/ramdisk;chown --verbose $USERNAME:$USERNAME /media/ramdisk;fi
Status abfragen¶
sudo systemctl status cron.service
Aktivieren¶
sudo systemctl enable cron.service
Jobs Auflisten¶
sudo crontab -l
Nach einem Neustart steht die RAM-Disk zur Verfügung.
Job pausieren/löschen¶
Soll der erstellte Crontab wieder entfernt werden, einfach die Schritte erneut durchführen, entweder die gesamte Zeile mit den Einträgen löschen, oder mit dem Zeichen # auskommentieren, welches am Anfang steht.
Alternativ kann der gesamte Job mit crontab -r
gelöscht werden.
Nach der Erstellung¶
In der Regel wird in einem Dateimanager wie Dolphin die eingehängte RAM-Disk mit der Bezeichnung „RAMDISK“ angezeigt…
Die aktuelle Größe mit weiteren Infos der erstellten RAM-Disk kann mittels
lsblk | grep -i 'ramdisk'
angezeigt werden…Informationen aus
mount
kann mittelsmount | grep -i 'ramdisk'
angezeigt werden…Informationen über noch verfügbaren Speicherplatz:
df -h /media/ramdisk
, mit Dateisystem:df -Th /media/ramdisk
Informationen über den belegten Speicherplatz:
du -ach /media/ramdisk
, in Byte:du -abc /media/ramdisk
Die UUID, Blockgröße und das Dateisystem kann mit
blkid | grep -i 'ramdisk'
angezeigt werden…
Aushängen¶
Manuelles Aushängen der RAM-Disk (alle Daten werden unwiderruflich gelöscht)
Vorgang: Aushängen, Gerätedatei ram0 und Ordner ramdisk löschen
Als Einzeiler¶
sudo umount /dev/ram0;sudo rm /dev/ram0;sudo rmdir /media/ramdisk
Ausführlich¶
sudo umount /dev/ram0 sudo rm /dev/ram0 sudo rmdir /media/ramdisk
Methode 3 - Mit ramfs-Dateisystem¶
Das ramfs-Dateisystem unterscheidet sich vom tmpfs-Dateisystem vor allem dadurch, dass es keine Daten in den Swap auslagert, also ein reines RAM-Dateisystem ist. Die Vorgehensweise ist hier noch simpler:
sudo mkdir /media/ramdisk sudo mount -t ramfs ramfs /media/ramdisk
Damit erhält man eine RAM-Disk, die sich (wie tmpfs) dynamisch der benötigten Größe anpasst. Um die Partition beim Systemstart automatisch einzuhängen, öffnet man einen Editor mit Root-Rechten und fügt folgende Zeile in die /etc/fstab hinzu:
ramfs /media/ramdisk ramfs defaults 0 0
Achtung!
Das ramfs-Dateisystem hat im Gegensatz zu tmpfs leider keine Mountoptionen und bietet somit auch keine Möglichkeit, die Größe zu limitieren. Das bedeutet, dass im Extremfall das System keinen freien Hauptspeicher mehr zur Verfügung hat und nur noch auf die Festplatte auslagern kann.
RAM-Disk-Größe vs. verfügbares RAM¶
Grundsätzlich kann man die RAM-Disk - egal nach welcher Methode erstellt - beliebig groß halten. Zu beachten ist jedoch, dass dem System noch ausreichend "normaler" Arbeitsspeicher zu Verfügung steht, da ansonsten zu oft auf den Auslagerungsspeicher (Swap) zugegriffen werden muss, was den Geschwindigkeitsvorteil der RAM-Disk komplett wieder zunichte macht. Für Ubuntu sollte z.B. mindestens 1 GiB "normales" RAM verfügbar sein.
Links¶
Overview of RAMFS and TMPFS on Linux 🇬🇧 - Blogbeitrag, 11/2008
Dateisystem und Datenträger - Artikelübersicht