net-it.de

Dieses Dokument ist für Menschen gedacht, die mit dem Gedanken spielen, LVM auf einem Computer zu implementieren, aber vorher mehr darüber wissen möchten. Dieses Dokument versteht sich nicht als HOWTO, sondern soll anhand von Beispielen über die Fähigkeiten des Linux LVM informieren.

1. Was ist LVM?

LVM ist die Abkürzung für "Logical Volume Manager". Der LVM entspringt einem Konzept zur Abstraktion von Speicherorten für Dateien von den eigentlichen Datenträgern (z.B. Partitionen auf physischen Festplatten). Statt konventionell echte Partitionen zu formatieren und zu benutzten, stellt der LVM den ihm zugeordneten Speicherplatz in sogenannten "Logical Volumes" (LV, vergleichbar mit klassischen Partitionen) für das Betriebssystem bereit.

1.1 Wie geht das?

Der LVM kann man vereinfacht als Schicht verstehen, die sich zwischen die Prozesse und die Festplattenpartitionen schiebt.

Der LVM schematisch dargestellt als Schicht zwischen Prozessen und physischen Festplattenpartitionen

Da jetzt die physischen Datenträger dem direkten Zugriff entzogen sind, kann der LVM bei gleichbleibender Partitionierung den Speicherplatz unabhängig davon vergeben.

1.2 Wozu braucht man das?

  • Zusammenfassung des Speicherplatzes mehrerer Datenträger z.B. zu einem großen LV
  • dynamische Eingliederung und Ausgliederung von Datenträgern im laufenden Betrieb
  • flexibles Addieren und Reduzieren von Speicherplatz im laufenden Betrieb
  • Verschieben von belegten Speicherblöcken zwischen verschiedenen Datenträgern im laufenden Betrieb ohne Änderungen an der Dateisystemstruktur
  • Vorrätighalten von Speicherplatz bis zu seiner Anforderung

1.3 Was braucht man?

Der LVM wurde von Heinz Muehlshagen für Linux implementiert und besteht aus zwei Teilen: dem Kernelteil, in Form eines Moduls mit dem Namen lvm-mod.o (LVM 1) bzw. dm-mod.o (LVM 2) oder fest einkompiliert, und einer großen Zahl von Kommandozeilenprogrammen (Tools). Seit der Kernelversion 2.4 ist LVM Version 1 fester Bestandteil des Linuxkernels.Mit dem Kernel 2.6 wurde der Übergang zu LVM Version 2 vollzogen.

Die Existenz dieser beiden Komponenten lässt sich einfach überprüfen. Existiert das Verzeichnis /proc/lvm (LVM 1) und/oder lässt sich das Modul mit

# modprobe lvm-mod.o

für den 2.4-Kenel bzw.

# modprobe dm-mod.o

für den 2.6-Kernel laden, so ist die Kernelunterstützung vorhanden. Durch Aufruf von

# vgscan

lässt sich klären, ob die Kommandozeilenprogramme installiert sind. Moderne Versionen von Linux-Distributionen sollten beides enthalten. ältere Distributionen lassen sich gegebenenfalls über Updates auf den gewünschten Stand bringen. Eine vollständige Installation von LVM über den Quellcode mit der dazu gehörenden Kernel-Neukompilierung ist die aufwändigste Variante.

2. Vorgehensweise

2.1 Physical Volume(s)

Zunächst muss dem LVM physischer Speicherplatz in Form von "Physical Volumes" (PV) zur Verfügung gestellt werden. Dieser kann aus Partitionen, ganzen Festplatten, ganzen RAID-Systemen, loop-devices oder md's bestehen. Festplatten, die als ganzes zur Verfügung stehen sollen, dürfen nicht partitioniert sein - gegebenenfalls ist der erste physische Sektor zu überschreiben. Partitionen müssen die Kennung "8e" tragen - diese kann z.B. "fdisk" setzen. Mit

# pvcreate /dev/hda5
# pvcreate /dev/hdb1
# pvcreate /dev/sda

werden z.B. zwei Partitionen und eine Festplatte für den LVM vorbereitet. Dabei wird auf diese ein sogenannter "Volume Group Descriptor" (VGDA) geschrieben und eventuell vorhandene Daten zerstört.

schematische Darstellung von zwei Partitionen und einer ganzen Festplatte, die als PV initialisiert wurden

2.2 Volume Group(s)

Die PV's können nun zu einer "Volume Group" (VG) zusammengefasst werden. Dabei wird die Größe des kleinsten, durch den LVM verwalteten Teils des Speicherplatzes festgelegt. Diese "Physical Extends" (PE) sind sozusagen die "Sektoren" des LVM. Mit

# vgcreate -s 32M vg01 /dev/hda5 /dev/hdb1 /dev/sda
# vgchange -a y

z.B. werden 3 PV's einer VG mit dem Namen "vg01" und einer PE-Grösse von 32 MB zugewiesen. Da eine VG unter LVM 1 maximal 65535 PE's enthalten kann, muss die PE-Größe so gewählt werden, das die beabsichtigte Maximalgröße der VG möglich ist. Eine nachträgliche Änderung der Größe der PE's ist nicht möglich - alle später einer VG hinzuzufügenden PV's werden automatisch mit dieser PE-Grösse verwaltet.

Die Konfiguration der VG's wird in /ect/lvmtab, /etc/lvmtab.d und /etc/lvmconf abgelegt.

schematische Darstellung von drei PV's, die in einer VG zusammengefasst wurden

2.3 Logical Volume(s)

Die VG stellt die Kapazität aller ihr zugewiesenen PV's in Form von PE's bereit. Mit

# lvcreate -i 2 -I 8 -L 100M vg01
# lvcreate -L 2G vg01
# lvcreate -L 7G vg01

werden diese PE's dann drei "Logical Volumes" (LV) mit den vom LVM vorgesehenen Namen (lvol1, lvol2 und lvol3) zugeordnet. In Bezug auf die LV's werden aus den PE's dann "Logical Extends" (LE). Die Größe der LV's ist immer ein ganzes Vielfaches der Größe der Extends.

Der LVM teilt die PE's in drei verschiedenen Belegungsarten zu: Beliebig (normal bzw. inherit), fortlaufend (contigous) oder auf mehrere Datenträger verteilt (striped).

schematische Darstellung von drei LV, die den Platz der VG in Form von LE's belegen

Diese LV's können nun formatiert und über mount-Befehle in das Dateisystem aufgenommen werden. Der LVM stellt dazu die LV's in der Form /dev/VolumegroupName/LogicalVolumeName als "devices" bereit.

3. Besonderheiten

Bisher wurde nur gezeigt, dass der LVM in der Lage ist, Speicherplatz abweichend von den Grenzen der physischen Datenträger zu verwalten. Der LVM hat jedoch noch mehr zu bieten.

3.1 Größenänderungen von VG und LV

Mit den Programmen vgextend, vgreduce, lvextend und lvreduce lassen sich die Größen von VG's und LV's im laufenden Betrieb verändern. Eine VG wird dabei durch Hinzufügen oder Entfernen ganzer PV's vergrößert oder verkleinert. Ein LV kann durch Hinzufügen von nicht zugewiesenen PE's bzw. Abgabe von unbelegten LE's vergrößert bzw. verkleinert werden. Die Größe des auf dem LV verwendeten Dateisystems muss entsprechend vor dem Verkleinern bzw. nach dem Vergrößern des LV angepasst werden - je nach verwendetem Dateisystem geht das auch ohne Deaktivieren des LV!

3.2 Verlagerung von PE's

Wenn ein PV bzw. eine Festplatte zu alt oder zu langsam wird bzw. ein Defekt droht, kann der LVM alle benutzten PE's auf diesem PV in andere PV's verschieben. Dazu müssen nur genügend unbenutzte PE's in der betroffenen VG vorhanden sein. Mit

# pvchange -x n /dev/sda
# pvmove /dev/sda
# vgreduce vg01 /dev/sda

wird z.B. zunächst die Neuzuweisung von PE's auf /dev/sda unterbunden, anschließend alle benutzen PE's auf andere PV's verlagert und schließlich das PV aus der VG entfernt. Die Festplatte /dev/sda kann dann ausgebaut werden.

3.3 gestreifte LV's

Aus Performance-Gründen kann es sinnvoll sein, ein LV über mehrere unabhängige Datenträger (bzw. PV's) zu verteilen. Mit der Option "-i 2" z.B. wird lvcreate angewiesen, ein sogenanntes "Striped LV" auf zwei verschiedenen PV's anzulegen. Die Daten werden dann in Form von "Streifen" fester Größe gleichmäßig und abwechselnd auf die LE's der beteiligten PV's verteilt. Ein Striped LV kann unter LVM 1 jedoch nicht über die Grenzen eines der beteiligten PV's hinaus vergrößert werden!

3.4 Schnappschüsse

Wenn man von einem vielbenötigten LV ein Backup anfertigen muss oder einen bzw. mehrere alte Zustände eines LV konservieren will, kann man mit Hilfe des LVM sogenannte "Snapshot-LV" von anderen LV's anlegen. Mit

# lvcreate -L 1G -s -n snap2 /dev/vg01/lvol2

wird z.B. ein einen Gigabyte großes Snapshot-LV mit dem Namen "snap2" von "lvol2" angelegt. Das Snapshot-LV kann dann gemounted werden und stellt im Nur-Lesen-Modus den Zustand von "lvol2" zum Zeitpunkt seiner Erzeugung dar. Da mit "lvol2" normal weiter gearbeitet werden kann, scheint folgende Situation vorzuliegen (R: Lesezugriffe, W: Schreibzugriffe):

schematische Darstelllung des scheinbaren Schreib/Lese-Zugriffs auf ein LV und sein Snapshot-LV

Da das Snapshot-LV um einiges kleiner sein darf als sein Vorbild (nur ca. 15-20%) kann das technisch nicht so sein. In Wirklichkeit bleibt der Zustand von "lvol2" eingefroren und "snap2" nimmt alle Änderungen auf:

schematische Darstelllung der realen Schreib/Lese-Zugriffe auf ein LV und sein Snapshot-LV

Das hat eine ganze Reihe von Auswirkungen, die beim Umgang mit Snapshot-LV's beachtet werden müssen:

  • Die Größe des Snapshot-LV muss so bemessen sein, das alle Änderungen am Original über die gesamte Existenzdauer Platz darin finden. Mit lvextend kann ein Snapshot-LV vergrößert werden.
  • Wenn die Speicherkapazität des Snapshot-LV erschöpft ist, funktioniert auch das Original nicht so, wie es soll. lvdisplay zeigt daher den Belegungsgrad eines Snapshot-LV an.
  • Dem Programm lvremove kommt beim Snapshot-LV eine besondere Bedeutung zu: Es muss alle Änderungen wieder in das Original LV zurückschreiben. Ein Verlust des Snapshot-LV hat den Verlust aller Änderungen am Original zur Folge.

3.5 LVM Impex

Sollte es notwendig sein, eine ganze VG in einen anderen Rechner zu überführen, muss mit den Programmen vgexport und vgimport gearbeitet werden. Mit vgexport wird eine VG für den Ausbau präpariert und kann nicht mehr benutzt werden. Auf dem Zielrechner muss sie dann mit vgimport zur Nutzung vorbereitet werden.

zuletzt geändert am 8.11.2004: joerg trawinski

Valid XHTML 1.1! Valid CSS!

© 2004 net-it.de impressum