[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:Editor: Einen Texteditor benutzen] [:Rechte: Rechte für Dateien und Ordner ändern] [:mount: Ein Dateisystem einhängen] }}} [[Inhaltsverzeichnis(5)]] [[Bild(Wiki/Icons/Oxygen/media-flash.png, 48, align=left)]] Als [wikipedia: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 [:mount: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. {{{#!vorlage 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 [:USV: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 [:Daten_sicher_löschen: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 [:Swap: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. {{{#!vorlage 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): [[Vorlage(Befehl, "sudo mount -t tmpfs none /PFAD/ZUM/EINHÄNGEPUNKT")]] * Relativ (20% des Arbeitsspeichers): [[Vorlage(Befehl, "sudo mount -t tmpfs -o size=20% none /PFAD/ZUM/EINHÄNGEPUNKT")]] * Absolut (200 MiB): [[Vorlage(Befehl, "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 [:fstab:/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: {{{#!vorlage Befehl 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: {{{#!vorlage 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). [[Anker(ext2)]] = 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 {{{#!vorlage 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: {{{#!vorlage Befehl sudo mount /dev/ram0 /PFAD/ZUM/EINHÄNGEPUNKT }}} Also beispielsweise: {{{#!vorlage Befehl 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 {{{#!vorlage Befehl 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 {{{#!vorlage Befehl 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/Konfiguration#Variable-fuer-Kernelzeilen: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: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 [[Vorlage(Befehl, "sudo mke2fs -t ext4 -O extents -L "RAMDISK" -vm0 /dev/ram0 2G")]] * Ordner ''ramdisk'' anlegen: [[Vorlage(Befehl, "sudo mkdir /media/ramdisk")]] * Gerätedatei '''/dev/ram0''' in '''/media/ramdisk''' einhängen: [[Vorlage(Befehl, "sudo mount /dev/ram0 /media/ramdisk")]] * Berechtigung für Lesen, Schreiben, Ausführen hinzufügen: [[Vorlage(Befehl, "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: [[Vorlage(Befehl, "sudo mke2fs -t ext4 -O extents -L "RAMDISK" -vm0 /dev/ram0 2G")]] * Ordner '''ramdisk''' anlegen: [[Vorlage(Befehl, "sudo mkdir /media/ramdisk")]] * Gerätedatei '''/dev/ram0''' in '''/media/ramdisk''' einhängen: [[Vorlage(Befehl, "sudo mount /dev/ram0 /media/ramdisk")]] * Benutzer und Gruppe von ''root'' nach ''BENUTZENAME'' ändern: [[Vorlage(Befehl, "sudo chown --verbose BENUTZENAME:BENUTZENAME /media/ramdisk")]] * Berechtigung für Lesen, Schreiben, Ausführen hinzufügen: [[Vorlage(Befehl, "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) {{{#!code bash #!/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) {{{#!code bash #!/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 [:Cron/#Cronjobs-manuell-einrichten: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 mittels `mount | 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 ===== {{{#!vorlage Befehl sudo umount /dev/ram0;sudo rm /dev/ram0;sudo rmdir /media/ramdisk }}} ===== Ausführlich ===== {{{#!vorlage Befehl sudo umount /dev/ram0 sudo rm /dev/ram0 sudo rmdir /media/ramdisk }}} [[Anker(ramfs)]] = 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: {{{#!vorlage Befehl 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 [:fstab:/etc/fstab] hinzu: {{{ ramfs /media/ramdisk ramfs defaults 0 0 }}} {{{#!vorlage Warnung 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 = * [http://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt Kerneldokumentation zu tmpfs] {en} * [http://www.thegeekstuff.com/2008/11/overview-of-ramfs-and-tmpfs-on-linux/ Overview of RAMFS and TMPFS on Linux] {en} - Blogbeitrag, 11/2008 * [:System#Dateisystem-und-Datentraeger:Dateisystem und Datenträger] - Artikelübersicht # tag: System