KVM VMs mit Bonding und VLANs und Cisco Switchen auf CentOS 6/7 bridgen

Wer große Rechner mit KVM und vielen VMs hat kommt vielleicht an einen Punkt an dem Ihm das Gigabit Interface nicht mehr reicht. Dann gibt es verschiedene Varianten die Bandbreite zu erhöhen.

Eine einfache Variante ist es auf ein 10 Gigabit Interface zu nutzen. Schnell einfach und schön, wenn man die Möglichkeit hat.

Alternativ kann man auch einzelne Gigabit Interfaces nutzen und die Rechner darauf verteilen. Das ist einfach und benötigt wenig Konfiguration, ist allerdings auch nur wenig flexibel und man muss immer aufpassen auf welchen Interface man einen Rechner anlegt.

Es gibt aber auch eine schicke Lösung für dieses Problem. Das Zusammenfassen von Interfacen. Dabei agieren <N> Interface wie ein einzelnes, erhöhen dabei aber die Gesamtbandbreite und sind untereinander Fehlertolerant. Ein entsprechendes Setup soll hier anhand von Cisco Switchen erläutert werden.

Weiterlesen

Eine Ramdisk unter Linux erstellen und verwenden

Eine Ramdisk erstellen

Hier beschreibe ich wie man unter den gängigen Linux Distributionen eine Ramdisk erstellt. Das kann an vielen Stellen ganz nützlich sein.

Was ist eine Ramdisk?

Eine Ramdisk ist ein Teil des flüchtigen Arbeitsspeichers (RAM –> Random Access Memory), auf welchen man wie auf eine Festplatte zugreift. Großer Vorteil der Ramdisk ist, das diese erheblich schneller ist als eine Festplatte. Während man von modernen Festplatten bis ca. 150 MB/s lesen kann, kann dies bei einer Ramdisk leicht mit über 1 GB/s passieren. Großer Nachteil an einer Ramdisk ist, das der Inhalt in einem flüchtigen Speicher liegt und bei jedem Reboot oder bei jedem abschalten der Maschine verloren geht. D.h. die Ramdisk muss bei jedem starten neu „beladen“ werden bzw. durch temporären Inhalt versorgt werden.

Wie erstellt man eine Ramdisk

Ein Ramdisk kann man heute unter jeder aktuellen Linux Distribution erstellen. Der Support für Ramdisks ist im Kernel integriert. Ich beschreibe hier alle Schritte die nötig sind um eine Ramdisk zu erstellen und diese als „Plattenersatz“ zu verwenden.

Kerneloptionen konfigurieren

Zum Erstellen einer Ramdisk muss man dem Kernel eine Option mitgeben diese zu erstellen. Das tut man in der Regel in seinem Bootloader. Auf dem meisten gängigen Distributionen ist dies Grub. Die Konfigurationsdatei befindet sich bei den meisten Distributionen unter /boot/grub/menu.lst. In dieser ist der zu bootende Kernel aufgeführt und seine Parameter. Erkennen kann man das an dem vorgestelltem Wort kernel. Wir fügen an diese Zeile einfach den Parameter ramdisk_size=xxxxxx an, wobei xxxxxxx durch eine Anzahl 1024KB Blöcke ersetzt wird. D.h. wenn ich 10 Megabyte Ramdisk haben möchte setze ich den Wert auf 10 * 1024 = 10240. Damit erhalte ich eine 10 MB Ramdisk. 300 MB Ramdisk sind dann entsprechend 307200. Ein Beispiel einer Ramdisk mit 976,5625 MB .

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-53.1.21.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-53.1.21.el5 ro root=LABEL=/ ramdisk_size=1000000
        initrd /initrd-2.6.18-53.1.21.el5.img

Ist der Parameter hinzugefügt worden muss gebootet werden. Damit der Kernel die Option bei Starten auswerten kann. Im Anschluß an den boot Vorgang kann man sich mit dem Befehl dmesg das Log des Kernels anschauen und folgendes entdecken:

Diese Ausgabe kommt nicht bei jeder Distribution …

Kernel command line: ro root=LABEL=/ ramdisk_size=1000000

Diese Ausgabe sollte man aber immer sehen, die Zahlen beziehen sich auf das Beispiel mit der 976,5625 MB Ramdisk.

RAMDISK driver initialized: 16 RAM disks of 1000000K size 4096 blocksize

Das sagt uns das jetzt prinzipiell 16 RAM disks mit 1000000K große zur Verfügung stehen. Das ist ein bischen viel, weil 16 * 1000000 K = 15625 MB = 15.2587890625 GB. Zuviel für die meisten Rechner. Den Rechner den ich hier verwende hat auch nur 8 GB RAM. Also hätten wir ein Problem, da uns der RAM nicht reicht. Aber keine Angst, wir haben nun nur die Möglichkeit 16 Ramdisks in der größe verwendet, der Speicher wird erst dann verbraucht wenn wir diese auch tatsächlich nutzen. Ich benötige nur eine und hab damit noch genug ram frei.

Ramdisk nutzen

Nachdem wir nun erfolgreich die Ramdisk(s) initialisiert haben, können wir diese nun nutzen. Dazu müssen wir ein Dateisystem auf der Ramdisk erstellen, damit wir auch Dateien abspeichern können. Die Ramdisk steht uns unter einer Device Adresse zur Verfügung, ähnlich wie eine Festplatte. /dev/ram0 ist die erste Ramdisk in einem System /dev/ram1 die zweite und so weiter, in meinem Fall bis /dev/ram15, also die 16te Ramdisk. Ich brauche ja nur eine, nehme also die /dev/ram0. Auf dieser Ramdisk benötigen wir kein tolles Filesystem mit Journaling oder ähnlichem, da es sowieso bei jedem booten verloren geht. Also entscheide ich mich für das klassiche ext2 Dateisystem, dies ist recht ausgereift und auf ner Ramdisk ausreichend performant. Wir verwenden also folgenden Befehl: mkfs.ext2 -m /dev/ram0. Damit erstellen wir das Dateisystem auf dem Device /dev/ram0, die Option -m bewirkt das wir das Dateisystem im vollen Umfang nutzen können und kein Platz für den Benutzer root reserviert wird (weil das brauchen wir hier ja nicht). Und schon ist unsere Ramdisk fertig. Wir können Sie nun mounten und verwenden. mount /dev/ram0 /mnt.

Zu Beachten

  • Die Erzeugung des Filesystems und das mounten muss nach jedem reboot wiederholt werden. Ich verwende dafür ein init script, mann kann es natürlich auch anders machen.
  • Auch zu beachten ist, das man jetzt eine hochperformante Platte hat, von der Daten schnell gelesen und in die Daten schnell geschrieben werden können. Es kann durchaus dazu kommen, das Prozesse die zuvor an zu langsamen Platten gescheitert sind, nun plötzlich an nicht ausreichender Prozessorperformance scheitern, bzw. den Rechner enorm auslasten. Das muss man im Einzelfall testen.

Software Raid unter Linux

Bei den meisten Distributionen kann direkt bei der Installation eine Software Raid angelegt werden. Sehr praktisch ist dies wenn man nicht das Geld oder die Möglichkeiten hat ein Hardware-Raid zu implementieren.

Über ein cat /proc/mdstat kann man sich den aktuellen Status eines Array anschauen. Das ganze sieht dann folgendermaßen aus:

Personalities : [raid1]
md1 : active raid1 sdb1[1] sda1[0]
      104320 blocks [2/2] [UU]

md3 : active raid1 sdb2[1] sda2[0]
      8385856 blocks [2/2] [UU]

md2 : active raid1 sdb3[1] sda3[0]
      4192896 blocks [2/2] [UU]

md0 : active raid1 sdb4[1] sda4[0]
      148151360 blocks [2/2] [UU]

unused devices: <none>

Das hier gezeigte Raid Array befindet sich in einem optimalen Zustand, alle Bestandteile des Array sind up and running. Im Fehlerfall sieht das ganze dann so aus: (Anderer Rechner!)

cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid5] [multipath] [raid6] [raid10]
md1 : active raid1 hda14[0] sda11[2](F)
      2803200 blocks [2/1] [U_]

In diesem Fall ist die Platte/Partition sda11 gestorben/aus dem tritt geraten. Diese sollte nun entfernt und wieder hinzugefügt oder durch ein anderes Device ersetzt werden. Im ersten Fall muss man mit großer Wahrscheinlichkeit das System booten, ansonsten ist das Devie busy und läßt sich nicht aus dem Verbund lösen. Im zweiten Fall kann man einfach ein Ersatzdevice angeben und einbinden.

Im Fall zwei entfernt man das Device mit folgendem Befehl aus dem Verbund:

mdadm -r /dev/md1 /dev/sda11

ein.

Im Fall eins sollte das Device nach dem booten automatisch entfernt worden sein und man kann es mit folgenden befehl erneut hinzunehmen:

mdadm -a /dev/md1 /dev/sda11

in beiden Fällen sollte nach dieser Aktion ein Rebuild beginnen, welcher folgendermaßen aussieht:

Personalities : [linear] [raid0] [raid1] [raid5] [multipath] [raid6] [raid10]
md1 : active raid1 sda11[2] hda14[0]
      2803200 blocks [2/1] [U_]
      [>....................]  recovery =  4.7% (132096/2803200) finish=1.0min #speed=44032K/sec

Ist der Rebuild abgeschlossen kann das Array wieder benuzt werden.

Hinweis: Das erneute hinzufügen einer Platte sollte nur dann passieren, wenn man sich sicher ist, das diese nicht wirklich defekt ist. Bei der hohen Belastung des Rebuilds ist es nicht unmöglich, das die zweite Platte ebenfalls ausfällt. Generell ersetzt gerade ein Softwareraid keine Datensicherung und es ist auch kein 100%tiger Schutz gegen Hardwareausfälle! Ein günstiges Hardwareraid aber auch nicht.