Verrückte Anwendungen für Raid, /dev/ram, und ramfs

ArticleCategory:

Kernel Corner

AuthorImage:

[Photo of the Author]

TranslationInfo:[Author and translation history]

original in en Mark Nielsen

en to de Katja Socher 

AboutTheAuthor:

Mark arbeitet als unabhängiger Consultant und spendet seine Zeit für Dinge wie GNUJobs.com, Artikel schreiben, Schreiben freier Software und Arbeiten als Freiwilliger bei eastmont.net.

Abstract:

RamFs ist ein sehr einfaches Dateisystem mit einigen interessanten Aspekten. Es ist neu im 2.4 Kernel.

ArticleIllustration:[This is the title picture for your article]

[illustration]

ArticleBody:

Einführung in RamDisk

Die etwas älter "ramdisk" genannte implementation einer Ram Disk unter Linux ist in meinem ursprünglichen Artikel beschrieben. Er befindet sich hier: linuxfocus/English/November1999/article124.html Ich werde auf die alte Methode von ramdisk in diesem Artikel nicht detailliert eingehen.

Was ist eine RamDisk? Eine RamDisk ist ein Teil des Speichers, den man alloziert, um ihn als pseudo Plattenpartition zu benutzen. Oder, in anderen Worten, man nimmt ein bißchen Speicher und tut so als sei es ist die Festplatte, die man formatieren, mounten, worauf man Dateien speichern kann etc..

Es gibt zwei Typen von Ram Disks, über die wir reden werden. Das erste ist eine Ram Disk, die man formatieren und mounten kann. Das zweite ist eine Ram Disk, die man nicht formatieren kann, die aber einige nette Features hat. Hier ist eine Auflistung:

Die /dev/ram1 Methode:

  1. SCHLECHT: Die Größe der ramdisk ist auf das boot-up fixiert.
  2. GUT: Man kann die ramdisk so wie man will formatieren.
  3. SCHLECHT: Einmal formatiert (ich glaube nicht, daß man sie mounten muß) belegt es einen Teil deines Speichers und ich weiß nicht, wie man das wieder rückgängig machen kann.
  4. GUT: Man kann mehr als eine ramdisk zur selben Zeit haben.
Die neue ramdisk "ramfs":
  1. SCHLECHT: Man kann ramfs nicht formatieren, da es direkt auf der VFS (virtual file system) Ebene in Linux aufsetzt.
  2. GUT: Man kann mehr als eine haben.
  3. GUT: Man kann die maximale Größe auf der Kommandozeile verändern.
  4. SEHR GUT: Es benutzt nur soviel Speicher, wie es benötigt. In anderen Worten, man hat vielleicht 64 megs ram allokiert, aber wenn es nur 2k an Dateien hat, benutzt es auch nur 2k des Speichers. Sobald eine Datei gelöscht ist, hat man sofort mehr Speicher für seinen Computer.
  5. SCHLECHT: Nun, es ist nicht wirklich ihre eigene Schuld. Versuche nicht zwei ramfs zu füllen oder du bläst deinen ganzen Speicher weg. Mehr dazu später.

Wie man RamDisk auf die alte Weise benutzt

Bitte lies diesen Artikel: Wie man eine Ramdisk unter Linux benutzt.

Um deinen Kernel 2.0 und 2.2 ramdisks zu benutzen, tippe einfach die drei Befehle:

mkfs -t ext2 /dev/ram1
mkdir -p /RAM1
mount /dev/ram1 /RAM1
als root und du bist fertig. Auf den meisten Systemen ist die Größe auf 4 megs begrenzt. Dies kann zur Bootzeit verändert werden oder wenn du den Kernel rekompilierst, aber lies meinen alten Artikel hierfür. Du kannst auch noch mehr hinzufügen wie dies,
mkfs -t ext2 /dev/ram2
mkdir -p /RAM2
mount /dev/ram2 /RAM2

Wie man RamDisk mit ramfs für Kernel 2.4 benutzt

Zuerst nehme ich an, daß du einen Kernel 2.4 laufen hast, der ramfs in sich kompiliert hat. Die meisten größeren Distributionen, die den neuen Kernel 2.4 benutzen, sollten ramfs darin kompiliert haben. Ich habe RedHat 7.1 für diesen Artikel benutzt.

Sehr einfach. Erstelle ein Verzeichnis und mounte ramfs dort.

mkdir -p /RAM1
mount -t ramfs none /RAM1
Wenn du eine zweite haben willst, sehr einfach. Erstelle ein Verzeichnis und mounte ramfs dort.
mkdir -p /RAM2
mount -t ramfs none /RAM2

Verändern der Größe von ramdisks und andere Optionen.

Hier ist ein Beispiel, um eine 10 meg ramdisk zu erstellen.

mkdir -p /RAM1
mount -t ramfs none /RAM1 -o maxsize=10000
direkt übernommen von: http://www.linuxhq.com/kernel/v2.4/patch/patch-2.4.3-ac2/linux.ac_Documentation_filesystems_ramfs.txt.html
+       ramfs - An automatically resizing memory based filesystem
+
+
+  Ramfs is a file system which keeps all files in RAM. It allows read
+  and write access. In contrast to RAM disks, which get allocated a
+  fixed amount of RAM, ramfs grows and shrinks to accommodate the
+  files it contains.
+
+  You can mount the ramfs with:
+      mount -t ramfs none /mnt/wherever
+
+  Then just create and use files. When the filesystem is unmounted, all
+  its contents are lost.
+
+  NOTE! This filesystem is probably most useful not as a real
+  filesystem, but as an example of how virtual filesystems can be
+  written.
+
+Resource limits:
+
+By default a ramfs will be limited to using half of (physical) memory
+for storing file contents, a bit over that when the metadata is
+included. The resource usage limits of ramfs can be controlled with
+the following mount options:
+
+       maxsize=NNN
+               Sets the maximum allowed memory usage of the
+filesystem to NNN kilobytes. This will be rounded down to a multiple
+of the page size. The default is half of physical memory. NB.  unlike
+most of the other limits, setting this to zero does *not* mean no
+limit, but will actually limit the size of the filesystem data to zero
+pages. There might be a use for this in some perverse situation.
+       
+       maxfilesize=NNN
+               Sets the maximum size of a single file on the
+filesystem to NNN kilobytes. This will be rounded down to a multiple
+of the page size. If NNN=0 there is no limit. The default is no limit.
+
+       maxdentries=NNN
+               Sets the maximum number of directory entries (hard
+links) on the filesystem to NNN. If NNN=0 there is no limit. By
+default this is set to maxsize/4.
+
+       maxinodes=NNN
+               Sets the maximum number of inodes (i.e. distinct
+files) on the filesystem to NNN. If NNN=0 there is no limit. The
+default is no limit (but there can never be more inodes than dentries).

Laufende Dienste in RamDisk

Ich habe einen Gedanken. Also höre genau zu. Wäre es nicht cool, wenn du deine Dienste (wie einen Webserver, einen Datenbankserver oder einen DNS Server) auf einer ramdisk laufen lassen könntest? Normalerweise hat ein Standardwebserver keine riesigen Dateien in sich. Normalerweise hat ein DNS Server nicht viele Dateien in sich. Du könntest sogar einen Datenbankserver in den Speicher stellen, wo du nur temporäre Daten abspeichern mußt.

Ram ist heutzutage billig. Ich bekam kürzlich 128 megs ram für $120 und ich gehe davon aus, daß der Preis weiter fallen wird. Für 128 megs ram kann ich sehr leicht jeden meiner Webserver in ihn stellen. Wenn mein Webserver riesige Daten hat, kann ich httpd.conf so konfigurieren, daß es in einem anderen Verzeichnis schaut, nicht in der ram disk. Mein DNSserver ist sehr klein. Mein größter Datenbankserver hat nur 28 megs. In Anbetracht der Tatsache, daß man einen 1 gig memory computer heutzutage wirklich billig bekommt, denke ich, es wäre cool, alles, was ich habe, im ram laufen zu lassen. Der einzige trickreiche Teil mit dem Datenbankserver ist, daß du zuerst alle deine Einträge in einem getrennten Datenbankserver speichern mußt, bevor du sie in deinen Datenbankserver im ram schreibst. Dies ist langsam, aber wenn man bedenkt, daß man die meiste Zeit liest und nicht schreibt, sollte es die Performance erhöhen. Vielleicht, wenn wir eine ram disk auf eine Festplatte spiegeln könnten

Ich habe das schon in meinem anderen Artikel erklärt, deshalb lies es bitte hier: http://www.gnujobs.com/mark/articles/Ramdisk.html#Example. Ersetzt einfach nur diese Befehle

        ### Make the ramdisk partitions
/sbin/mkfs -t ext2 /dev/ram0
/sbin/mkfs -t ext2 /dev/ram1
/sbin/mkfs -t ext2 /dev/ram2

        ### Mount the ramdisks to their appropriate places

mount /dev/ram0 /home/httpd/cgi-bin
mount /dev/ram1 /home/httpd/icons
mount /dev/ram2 /home/httpd/html

durch diese Befehle (erhöhe die Anzahl, wenn 10 megs nicht ausreichend sind):
mount -t ramfs none /home/httpd/cgi-bin -o maxsize=10000
mount -t ramfs none /home/httpd/icons -o maxsize=10000
mount -t ramfs none /home/httpd/html -o maxsize=10000

Ramdisk und Raid

Warum sollte man eine Festplattenpartition und eine ram disk in einer raid partition kombinieren wollen? Ich weiß es nicht. Aber es gibt vielleicht eine Anwendung dafür auf lange Sicht. Intelligente Betriebssysteme implementieren etwas nicht, nur weil es keinen sofortigen Nutzen hat. Dies ist der Grund, warum viele kommerzielle Betriebssysteme unpopulär werden und warum freie Softwareapplikationen Applikationen, die von Idioten, die nur am Geld und nicht an der Technologie interessiert sind, ersetzen.

Es gibt drei Probleme beim Verbinden einer ramdisk mit einer Festplattenpartition.

  1. Ich weiß nicht, wie man es mit ramfs macht, aber ich kann es mit, /dev/ram machen. Vielleicht könnte man es machen, wenn man eine Festplattenpartition mit den Dateisystem ramfs Anwendungen formatieren könnte. Ich habe keine Idee, was die VFS Ebene ist, weshalb ich es mir später genauer ansehen werde.
  2. Wenn das gespiegelte Raidsystem wirklich parallel läuft, dann hilft die zusätzliche Gewschwindigkeit der Memory nichts. Ich weiß nicht, ob es möglich ist, ein gespiegeltes Raidsystem dazuzubringen, nur von der ramdisk zu lesen. In diesem Fall, wenn das möglich wäre, würde es einen Nutzen bringen.
  3. Bei einem reboot muß man die ramdisk neu konstruieren.
Um das Raidsystem aufzusetzen, habe ich mein /etc/raidtab wie folgt konfiguriert.
  raiddev /dev/md3
          raid-level      1
          nr-raid-disks   2
          nr-spare-disks  0
          chunk-size     4
          persistent-superblock 1
          device          /dev/hdb6
          raid-disk       1
          device          /dev/ram3
          raid-disk       0
Dann habe ich das folgende ausgeführt
mkraid /dev/md3
mkfs -t ext2 /dev/md3
mkdir -p /RAID1
mount /dev/md3 /RAID1
Problem beim Reboot, die ramdisk gerät durcheinander. Daher beim Reboot
raidstart /dev/md3
raidhotadd /dev/md3 /dev/ram3
mount /dev/md3 /RAID1
Erinnere dich jetzt, wenn du die alten ramdisks nicht rekonfigurierst, damit sie größer als 4 megs sind, ist es nutzlos für deine Festplattenpartition größer als 4 megs zu sein.

Es wäre wirklich cool, ein gespiegeltes Raidsystem mit 3 Partitionen zu haben. 1 davon die ramdisk und 2 davon Festplattenpartitionen und es auch so zu machen, daß die ramdisk nur für Lesezyklen gelesen wird. Ich weiß nicht, ob es möglich ist, Lesezugriffe auf nur eine der Partitionen in einem Raidsystem zu isolieren, aber es wäre cool, wenn man das könnte.


Kommentare

Die ist wahrscheinlich der wichtigste Abschnitt in diesem Artikel. Ich liebe Linux, weil es dir erlaubt, dir selber in den Fuß zu schießen. Es gibt nichts wie diesen Schmerz, denn er bringt dich zum Lernen.
  1. Per default belegt Ramfs die Hälfte deines physikalischen Speichers (kein swap space). Daher, wenn du 2 von diesen Dingen erstellst und sie füllst, hat dein Computer nicht mehr genügend Speicher und setzt aus, so wie es meiner gemacht hat. BITTE spezifiziere den maximalen Betrag an Speicher, den die ramdisk haben sollte, wie oben beschrieben.
  2. Ich glaube, ramfs ist sein eigenen Dateisystem und nicht ext2, deshalb, wenn du dort Dateien hin- und herkopierst und rsync oder tar benutzt, erwarte nicht, daß die Dateien exakt identisch sind oder die gleiche Größe haben. Du wirst sehr wahrscheinlich keine großen Unterschiede beim Benutzen von ihnen finden, aber da es nicht ext2 ist, können die Eigenschaften auf einer bestimmten Ebene unterschiedlich sein.
  3. Ich habe die docs für ramfs im Kernel gelesen und es scheint nicht so zu sein, daß ramfs für den weiten Gebrauch vorgesehen war, aber ich verstehe nicht warum. Es hat so funktioniert, wie ich es wollte.
Ich bin mit ramdisks noch nicht fertig.
  1. Ich werde sehen, ob ich ramfs mit einer Festplatte raiden kann.
  2. Wenn ich es so machen kann, möchte ich Lesezugriffe zu einem Raidsystem isoliert zu einer der Partitionen machen.
  3. Einen Dienst, wie einen Webserver in die ramdisk mit Raidsystem stellen. Der Trick hier ist, das Raidsystem so zu benutzen, daß, wenn Änderungen auftreten, man sie nicht verliert. Dies ist der Grund, warum das Raidsystem so schrecklich wichtig für mich ist ---- Ich werde in der Lage sein, Dienste SICHER in den Ram zu stellen und gewinne die gesamte Performancegeschwindigkeit über die Festplatte, angenommen:
  4. Aufsetzen eines Computers, um von cdrom zu booten, einen Dienst zu starten, Änderungen aus dem Netzwerk runterzuladen. Keine Festplatte erforderlich. Das wäre cool. Da könnte man einen Webserver (oder etwas anderes) auf einem Computer laufen haben ohne Festplatte und nur einer CDRom mit Speicher. Wenn du deinen Speicher auf 1 gig aufrüstest, sehe ich nicht, warum du dein System nicht völlig aus einer Cd heraus laufen können lassen kannst. Dies wäre aus Sicherheitsgründen gut. Reboote einfach nur den Rechner, laß ihn irgendwelche Änderungen (Sicherheitsfixes) von einer sicheren Quelle laden, dann starte die Dienste und dein Computer ist nett und sauber und läuft hackfrei. Der Webserver sollte niemals irgendetwas auf dem lokalen Computer speichern, außer sicheren logs, und Informationen zu einem getrennten Computer über eine sichere Verbindung oder internes Netzwerk übertragen. Ich habe in der Vergangenheit bootbare vernetzte CDRoms mit ramdisks gemacht. Es wäre nett, meine früheren Projekte miteinzubeziehen, um dies zu erreichen.

Quellen

  1. http://www.linuxhq.com/kernel/v2.4/patch/patch-2.4.3-ac2/linux.ac_Documentation_filesystems_ramfs.txt.html
  2. http://genericbooks.com/LDP/HOWTO/Software-RAID-HOWTO.html
  3. Beschleunigung kleiner Datenbanken unter Linux
  4. Wie man eine Ramdisk unter Linux benutzt
  5. Wenn sich dieser Artikel ändert, ist er hier verfügbar: http://www.gnujobs.com/Articles/21/Ramdisk2.html

Dank an Katja für einige Hilfe!

Copyright © 4/2001 Mark Nielsen
Article Version 1.3 : Date Last Changed Sat May 19 06:04:06 2001