Dynamische Dateisysteme mit LVM
!!! Zielgruppe: Experten !!!
Bereits während der Installation eines Linux-Systems muss man sich auf eine feste Partitionierung der Festplatte festlegen.
Stellt man nach einigen Monaten/Jahren fest, dass die gewählten Partitionen falsch dimensioniert sind, kommt man schnell ins Grübeln.
Soll ein Backup angefertigt und das aufwändig eingerichtete Linux-System neuinstalliert werden oder kauft man eine zusätzliche Festplatte?
Wurde bereits bei der Installation der Logical Volume Manager (LVM) eingesetzt, kann man dieser Situation etwas entspannter entgegensehen.
So funktioniert der Logical Volume Manager:
Nachdem eine Festplattenpartition für den LVM vorbereitet wurde, wird eine Volume Gruppe (VG) erzeugt.
Innerhalb dieser Volume Gruppe können ein oder mehrere Logical Volumes (LV) erzeugt werden, die mit dem Dateisystem ReiserFS formatiert werden. Die Logical Volumes können mitsamt Dateisystem im laufenden Betrieb vergrößert werden.
1. Kernel konfigurieren und compilieren
Im Kernel „2.4.18-bf2.4“ (von Debian) ist bereits der Logical Volume Manager (Modul „lvm-mod“) und das Dateisystem ReiserFS (Modul „reiserfs“) enthalten. Möchte man hingegen einen neueren Kernel verwenden (z. B. 2.4.23), so müssen bei der Kernel-Konfiguration die folgenden Parameter aktiviert werden:
Multi-device support (RAID and LVM) —> [*] Multiple devices driver support (RAID and LVM) <M> Logical volume manager (LVM) supportFile systems —> <M> Reiserfs support
Danach muss der Kernel compiliert und installiert werden.
2. Software installieren
Zur Administration müssen mit dem folgenden Kommando zwei Debian-Pakete installiert werden:
apt-get install lvm10 reiserfsprogs yast -i lvm yum install lvm
3. Festplatte partitionieren
Der Logical Volume Manager benötigt eine eigene große Festplattenpartition vom Typ „8e“. Diese muss ggf. noch mit fdisk erzeugt werden (hier: /dev/hda3).
$ fdisk -l /dev/hdaDisk /dev/hda: 255 heads, 63 sectors, 9729 cylindersUnits = cylinders of 16065 * 512 bytes Device Boot Start End Blocks Id System/dev/hda1 1 122 979933+ 82 Linux swap/dev/hda2 * 123 244 979965 83 Linux/dev/hda3 245 9729 76188262+ 8e Linux LVM
</code>
4. LVM initialisieren
Mit dem folgenden Kommando werden die Dateien /etc/lvmtab und /etc/lvmtab.d/* erzeugt:
vgscan
5. Partition vorbereiten
Wurde der LVM initialisiert, kann die bei Schritt 3 erzeugte Partition als Physical Volume initialisiert werden:
pvcreate /dev/hda3
6. Volume Gruppe „vg0“ erzeugen
In diesem Beispiel wird auf die Spiegelung der Daten verzichtet und nur eine Partition der Volume Gruppe hinzugefügt.
vgcreate vg0 /dev/hda3 # So wird die Gruppe vg0 in 4MB PE's geteilt vgcreate -s 32M vg0 /dev/hda3 # So wird die Gruppe vg0 in 32MB PE's geteilt
PE Aufteilung hängt mit performance zusammen.
Bei größeren und kleineren Anzahl von Dateien ist es besser eine Höhere PE einzurichten.
7. Logical Volume erzeugen
Für diese Anleitung habe ich in der Volume Gruppe „vg0“ ein Logical Volume namens „lvopt“ erzeugt. Den Namen des Logical Volumes kann man zwar frei wählen, allerdings sollte er die spätere Verwendung widerspiegeln. Das folgende Kommando erzeugt ein 1000 MByte großes Logical Volume „lvopt“:
lvcreate --size 1000M --name lvopt vg0
Als Ausgabe erscheinen folgende Zeilen:
lvcreate -- doing automatic backup of "vg0"lvcreate -- logical volume "/dev/vg0/lvopt" successfully created
8. Dateisystem auf logischem Volume „lvopt“ anlegen
Nun existiert ein neues Logical Volume, welches mit dem Dateisystem ext3 formatiert wird:
mkfs.ext3 /dev/vg0/lvopt
9. Eintrag in /etc/fstab
Damit das Logical Volume /dev/vg0/lvopt bei jedem Neustart automatisch als /opt eingebunden wird, muss die folgende Zeile an die Datei /etc/fstab gehängt werden:
/dev/vg0/lvopt /opt ext3 defaults 1 2
10. Logical Volume einbinden
Mit dem folgenden Befehl kann das Logical Volume „lvopt“ als „/opt“ eingebunden werden.
mount /opt
Und wie gehts weiter?
Die Schritte 7 bis 10 können für alle weiteren Dateisysteme wiederholt werden. Im Folgenden möchte ich demonstrieren, wie einfach das Dateisystem „/opt“ vergrößert werden kann. Das Vergrößern besteht immer aus zwei Schritten: Zunächst muss das Logical Volume vergrößert werden, anschließend das Dateisystem.
DiskFree aufrufen (vorher)
$ df /optFilesystem 1k-blocks Used Available Use% Mounted on/dev/vg0/lvopt 1023964 32840 991124 4% /opt
Logical Volume vergrößern:
Stellt man fest, dass die Größe von „/opt“ nicht ausreicht und deshalb um 1 GByte vergrößert werden muss, so erweitert man das Logical Volume „lvopt“ mit dem Befehl:
lvextend --size +1G /dev/vg0/lvopt
Ausgabe des Programms:
lvextend – extending logical volume „/dev/vg0/lvopt“ to 1.98 GBlvextend – doing automatic backup of volume group „vg0“
lvextend – logical volume „/dev/vg0/lvopt“ successfully extended
Dateisystem vergrößern:
Wie bereits angedeutet muss nun noch das Dateisystem /dev/vg0/lvopt vergrößert werden:
resize2fs /dev/vg0/lvopt
Je nach OS und Kernel Stand kann die FS Erweiterung online oder offline (gemountet oder umountet) durchgeführt werden.
Bis jetzt wurden die bestene Erfahreungen mit FS Type xfs gemacht.
mit
xfs_growfs /dev/vg0/lvopt
wird xfs FS auch online erweitert.
DiskFree aufrufen (nachher)
$ df /optFilesystem 1k-blocks Used Available Use% Mounted on/dev/vg0/lvopt 2072508 32840 2039668 2% /opt
Hier sieht man sofort die Änderung: Vorher war knapp 1 GByte verfügbar, hinterher etwa 2 GByte.
Weitere Kommandos
Hier möchte ich noch schnell zwei weitere nützliche Kommandos vorstellen.
Mit vgdisplay kann man sich allgemeine Informationen zur Volume Group vg0 anzeigen lassen:
vgdisplay vg0
Ausgabe des Programms:
--- Volume group ---VG Name vg0VG Access read/writeVG Status available/resizableVG # 0MAX LV 256Cur LV 6Open LV 6MAX LV Size 255.99 GBMax PV 256Cur PV 1Act PV 1VG Size 72.65 GBPE Size 4 MBTotal PE 18599Alloc PE / Size 7626 / 29.79 GBFree PE / Size 10973 / 42.86 GBVG UUID UGJaHg-zJl0-1CK3-KSJK-yI9Q-5XWC-4TIFL2
Die vorletzte Zeile „Free PE / SIZE“ gibt Aufschluss über den verfügbaren Speicherplatz (hier 42,86 GByte).
Das zweite Kommando lvdisplay zeigt einige Informationen zum angegebenen Logical Volume an:
lvdisplay /dev/vg0/lvopt
Ausgabe des Programms:
--- Logical volume ---LV Name /dev/vg0/lvoptVG Name vg0LV Write Access read/writeLV Status availableLV # 6# open 1LV Size 1.98 GBCurrent LE 506Allocated LE 506Allocation next freeRead ahead sectors 1024Block device 58:5
Logical Volume verkleinern:
Zum Schluss möchte ich noch anmerken, dass man zurzeit Logical Volumes vergrößern, aber (noch) nicht sicher verkleinern kann.
Wer es trotzdem ausprobieren möchte, kann wie folgt verfahren:
Zunächst müsste man das Dateisystem unmounten, das Dateisystem verkleinern (Größe A), anschließend das Logical Volume um etwas weniger als A verkleinern (Größe B), dann das Dateisystem an die tatsächliche Größe (B) anpassen und schließlich das Dateisystem wieder einbinden. Achtung: Datenverlust nicht ausgeschlossen !!!
umount /opt lvreduce --size -950M /dev/vg0/lvopt resize2fs /dev/vg0/lvopt mount /opt
Weitere Überblick über LVM Befehle:
Commands und Beschreibungen:
LVM == Logical Volume Manager
PV == Reale Festplatte oder Partition (Physical Volume)
PE == Physical Extend: Belegungseinheit des PV
VG == Volume Group (Pool des gesamten Speicherplatzes)
LV == Logical Volume (virtuelle Partition) innerhalb der VG, z.B. /dev/VGName/LVName
LE == Logical Extend: Belegung des LV
VGDA == Volume Group Descriptor Area. Reservierter Bereich auf dem PV
für die DB mit den PE <==> LE Zuordnungen
Folgende Commands sind unerlässlich für den täglichen Umgang mit LVs:
pvcreate: Anlegen eines PV
vgcreate: Anlegen einer VG
lvcreate: Anlegen eines LV
pvdisplay: Anzeige einer PV, Option -v
vgdisplay: Anzeige einer VG, Option -v
lvdisplay: Anzeige einer LV, Option -v
pvmove: Verschieben der PE von einer PV zu einer anderen innerhalb einer VG
lvextend: eine LV in der Größe ändern (macht beim Filesystem noch keinen Sinn)
vgchange -a y: Aktivieren von VG's
vgchange -a n: Deaktivieren von VG's
vgscan: Suche alle potentiellen Devices nach VG's ab
vgexport: Eine VG aus dem System entfernen (ohne Löschen)
vgimport: Eine exportierte VG im System einbinden
Von LVM benutzte Partitionen mit fdisk anlegen. Der Typ der Partitionen muss 8e sein (0x8e = Linux LVM)
Danach vgscan ausführen. Dieser Befehl aktiviert die LVM-Funktionalität im Kernel, das heisst die LVM-DB wird angelegt. vgscan ermittelt alle LVM-PVs und legt das File /etc/lvmtab sowie das Verzeichnis /etc/lvmtab.d an - oder aktualisiert diese, falls sie bereits vorhanden sind.
vgscan
pvcreate legt den VGDA Block auf dem PV an. Falls bereits einmal ein Block angelegt wurde, muss dies geforced werden, indem dem Command das Attribut -f oder -ff mitgegeben wird.
pvcreate /dev/hdb1
Mit vgcreate kann eine Volumegroup, in diesem Beispiel mit dem Namen vg01 aus zwei PVs, angelegt werden.
vgcreate vg01 /dev/hdb1 /dev/hdc1
vgchange ändert die Attribute einer VG. Mit -a y werden alle bekannten VGs auf einem System aktiviert. Dies sollte nach einem vgscan ausgeführt werden. Deaktiviert wird eine VG mit vgchange -a n. Sollte immer vor dem Shutdown durchgeführt werden, damit die Konsistenz der Partition erhalten bleibt.
vgchange -a [y|n]
lvcreate erstellt im nächsten Beispiel das logische Volume lvol1 in der VG vg01 mit einer Grösse von 1500MB.
lvcreate -L 1500M -n lvol1 vg01
Die LVs können wie statische Partitionen über ihre Device Files angesprochen werden. Mit mke2fs werden ext2- Filesysteme auf dem LV angelegt, für ext3 kann mkfs -t ext3 verwendet werden.
mke2fs /dev/<VG>/<LVName> mkfs -t ext3 /dev/<VG>/<LVName>
Eine so erstellte Partition müsste danach natürlich auch noch in der /etc/fstab eingetragen werden.
Der Eintrag sähe etwa so aus:
/dev/<VGName>/<LVName> /Mountpoint ext3 defaults 1 2
Daneben gibt es noch die Befehle zum ändern bestehender Volume Groups und Logival Volumes:
vgrename vg01 NeuerVGName
Umbenennen einer VG. Dazu zuerst mit vgchange -a n <VGName> die umzubenennende VG deaktivieren.
vgextend vg01 /dev/hdc1
Fügt der vg01 das Device hdc1 hinzu (Nachdem dieses mit pvcreate /dev/hdc1 erstellt wurde, natürlich)
vgremove vg01
Entfernt die Volumegroup mit dem Namen vg01. Bevor dies getan werden kann, muss die VG mit dem Kommando vgchange -a n vg01 deaktiviert werden.
vgreduce vg01 /dev/hdc5
Entfernt hdc5 aus der VG vg01.
Davor unbedingt mit pvdisplay /dev/hdc1 sicherstellen, dass die physische Disk nicht mehr von logischen Laufwerken belegt wird.
lvextend -L+100M /dev/<VG>/<LVName>
Vergrössert <LVName> um 100MB
lvextend -L2000M /dev/<VG>/<LVName>
Vergrössert <LVName> auf 2000MB
Nach dem ändern der Grösse der Partition muss auch das Filesystem angepasst werden.
Dazu je nach benutztem FS-Typ eine der folgenden Befehlssequenzen verwenden:
umount /dev/vg01/optlv resize2fs /dev/vg01/optlv mount /dev/vg01/optlv /opt
Verkleinern lässt sich eine ext3 Partition folgendermassen:
umount /opt e2fsadm -L-1G /dev/vg01/optlv mount /opt
Zum Schluss noch zwei kleine Beispiele:
Nummer Eins zeigt den Vorgang, um ein Logical Volume umzubenennen:
lvchange -an /dev/<VG>/<LV> lvrename /dev/<VG>/<LV> /dev/<VG>/<LVNeuerName> lvchange -ay /dev/<VG>/<LVNeuerName>
…und Beispiel Zwei zeigt den Vorgang, um eine SWAP-Partition auf einer LV anzulegen:
lvcreate -L512M -n swap vg01 mkswap /dev/vg01/swap swapon /dev/vg01/swap
~~UP~~