LVM steht für Logical Volume Manager und bietet eine intelligente Abstraktionsschicht zwischen Festplatten, Partitionen und Dateisystemen. Das ermöglicht es dem Administrator eines Systems mit einer viel größeren Flexibilität an die Verwaltung von Speicher heranzugehen als mit herkömmlichen Partitionen. Die sogenannten Logical Volumes (kurz LV) bieten einige Vorteile im Vergleich zu herkömmlichen Partitionen:
- Man kann sie leicht vergrößern und verkleinern (vorausgesetzt das Dateisystem unterstütz eine derartige Funktion ebenfalls).
- Sie können sich über mehrere physikalische Partitionen und sogar Festplatten erstrecken.
- Sie können von einer Festplatte auf eine andere verschoben werden, womit sich Hot-Plug & Play Systeme realisieren lassen.
- Man kann Spiegelungen ähnlich wie RAID 0 vornehmen (Daten werden simultan auf mehreren Festplatten gespeichert, womit sich die Ausfallsicherheit erhöhen lässt).
- Mithilfe von Snapshots kann man nahezu Augenblicklich große Datenmengen backupen.
- Durch die Benennung von Logical Volumes (den “Partitionen” eines LVM) lässt sich das System einfacher administrieren.
In diesem Artikel möchte ich auf die Grundlagen eines LVM2-Setups eingehen, zeigen, wie man LVMs erstellt und verwaltet. Ich gehe dabei von einem aktuellen Linux-System (ich werde in den Beispielen Arch Linux verwenden) mit einem halbwegs aktuellen 2.6 Kernel aus. Kernel 2.4 unterstützt zwar ebenfalls LVM, allerdings nur eine veraltete Version, mit der sich nicht alle oben genannten Features nutzen lassen. Wer möchte, kann auch seine gesamte Linux Distribution mithilfe von LVM installieren. Da sich der Setup aber von Distribution zu Distribution unterscheidet, gehe ich hier nicht auf ein derartiges System ein.
Terminologie und Struktur
Im Zusammenhang mit LVM gibt es einige wichtige Begriffe (und Abkürzungen) die man sich merken muss, um das System verstehen zu können. Ein LVM ist in Schichten aufgebaut. Einige dieser Schichten lassen sich direkt auf Festplatten und Partitionen übertragen, einige dieser Schichten werden durch das LVM eingeführt und sind somit nur “virtuell” oder “logisch” vorhanden. Am interessantesten sind diese “virtuellen Schichten”, von denen es insgesamt drei gibt:
- Physical Volume (PV) repräsentieren Partitionen, Raid-Devices oder andere physisch existierende blockorientierte Geräte.
- Volume Group (VG) fassen eine Vielzahl von Physical Volumes zu einer logischen Einheit zusammen.
- Logical Volume (LV) sind die “Partitionen” eines LVM. Sie gehören direkt einer Volume Group an, und können sich über mehrere Physical Volumes erstrecken.
Ein weiterer wichtiger Begriff sind die Physical Extents. Sie beschreiben die Speichereinheit, in der die Daten in den Volume Groups organisiert werden. Man kann sie somit mit Sektorgrößen einer Partition vergleichen. Die Größe einer Logical Volume muss immer ein Vielfaches eines Physical Extents sein. Standardmäßig beträgt die Größe eines Physical Extents 4MB, lässt sich aber mit verschiedenen Parametern verändern.
Planung
Bevor man mit dem Erstellen eines LVM beginnt, sollte man sich überlegen, was man damit erreichen möchte. Für mein Beispiel verwende ich einen kleinen Home-Server mit 4 Festplatten für den LVM-Setup:
Partition |
Kapazität |
Infos |
---|
sda3 |
98 GiB |
Freier Speicher auf der Systemplatte |
sdb1 |
149 GiB |
Komplette Festplatte mit einer einzigen Partition |
sdc2 |
1160 GiB |
Teil einer 1,5 TB Festplatte |
sdd1 |
232 GiB |
Noch eine Festplatte mit nur einer Partition |
Mein Plan ist, ein ca. 300 GiB großes Logical Volume für meine Disk-Images anzulegen, ein weiteres ca. 140 GiB gespiegeltes LV für meine privaten Dateien. Weiters möchte ich ein 500 GiB großes Volume für meine MythTV-Recordings. Im Gegensatz zu einem Setup mithilfe von Partitionen, sind diese Werte allerdings nicht starr. Solange noch Platz vorhanden ist, lassen sich die Logical Volumes jederzeit vergrößern, und wenn einmal alle Festplatten voll sind, lassen sich leicht weitere hinzufügen.
LVM erstellen
Physical Volumes
Zu Beginn müssen die Physical Volumes erstellt werden. Das geschieht ganz einfach mit folgendem Befehl:
# pvcreate /dev/sda3 /dev/sdb1 /dev/sdc2 /dev/sdd1
Das System sollte den Vorgang mit folgender Ausgabe bestätigen:
Writing physical volume data to disk "/dev/sda3"
Physical volume "/dev/sda3" successfully created
Writing physical volume data to disk "/dev/sdb1"
Physical volume "/dev/sdb1" successfully created
Writing physical volume data to disk "/dev/sdc2"
Physical volume "/dev/sdc2" successfully created
Writing physical volume data to disk "/dev/sdd1"
Physical volume "/dev/sdd1" successfully created
Um eine Übersicht über die neu erstellten PVs zu bekommen reicht der Befehl
# pvs
Die dazugehörige Ausgabe lautet wie folgt:
PV VG Fmt Attr PSize PFree
/dev/sda3 lvm2 a-- 98,67g 98,67g
/dev/sdb1 lvm2 a-- 149,05g 149,05g
/dev/sdc2 lvm2 a-- 1,16t 1,16t
/dev/sdd1 lvm2 a-- 232,89g 232,89g
Die wichtigsten Befehle zur Verwaltung von Physical Volumes zeigt die nachfolgende Tabelle:
Befehl |
Bedeutung |
---|
pvs |
Informationen über PV anzeigen. Attribute: (a)llocatable; kein Attribut: nicht verfügbar |
pvs -v |
Mehr Informationen über PV (inkl. UUID) anzeigen. |
pvdisplay |
Sehr detaillierte Informationen zu den PVs anzeigen |
pvcreate #devicefile# |
Legt ein neues PV auf dem Datenträger an. |
pvchange -x n #devicefile#
pvchange -x y #devicefile# |
PV als nicht verfügbar markieren (entfernt Attribute (a))
PV als verfügbar markieren (Attribute (a)llocatable) |
pvmove -v #fromDevicefile# #toDevicefile# |
Verschiebt alle Inhalte eines PVs auf ein anderes PV, etwa um es anschließend entfernen zu können |
pvremove #devicefile# |
Entfernt ein nicht benutztes PV (darf keiner Volume Group angehören) |
Volume Groups
Nachdem man die Physical Volumes erstellt hat, muss man sie in Volume Groups (VG) zusammenfassen. Man kann beliebig viele Volume Groups erstellen, in den meisten Fällen reichen aber ein bis zwei Volume Groups völlig aus (etwa eines für das System selbst, und eines für alle Daten (die nicht an das System gebunden sind)). Eine Volume Group erstellt man mit folgendem Befehl:
vgcreate vgStorage /dev/sda3 /dev/sdb1 /dev/sdc2 /dev/sdd1
Das System sollte die neu erstellte Volume Group (mit dem Namen “vgStorage”) wie folgt quittieren:
Volume group "vgStorage" successfully created
Das System legt für jede Volume Group automatisch einen neuen Ordner mit dem Namen der VG im Ordner /dev an. In diesem Ordner werden anschließend die einzelnen Logical Volumes als Gerätedateien angelegt.
Die wichtigsten Befehle zur Verwaltung von Volume Groups zeigt die nachfolgende Tabelle:
Befehl |
Bedeutung |
---|
vgs |
Informationen über VG anzeigen. |
vgs -v |
Mehr Informationen über VG (inkl. UUID) anzeigen. |
vgdisplay |
Sehr detaillierte Informationen zu den VGs anzeigen |
vgcreate #vgName# #pvsfile# … #pvsfile# |
Legt eine neue VG mit den PVs an |
vgreduce #vgName# #pvsfile# |
Entfernt ein nicht benutztes PV aus der VG |
vgextend #vgName# #pvsfile# |
Fügt ein PV der VG hinzu. |
vgremove #vgName# |
Entfernt eine nicht benutze Volume Group |
vgrename #vgName# #vgNameNew# |
Benennt eine Volume Group um |
Wichtig zu wissen ist auch, dass Volume Groups nicht immer automatisch vom System erkannt werden. Bootet man etwa von einer LiveCD und benötigt Zugriff auf die Daten in einer LVM, so muss man die Volume Group zuerst suchen und aktivieren. Das geht aber relativ einfach mit den Befehlen:
vgscan
vgchange -ay
Logical Volumes
Der letzte Schritt eines LVM Setups besteht aus dem Anlegen der einzelnen Logical Volumes. Der Prototyp des Befehls lautet wie folgt:
lvcreate -L #size# -n #name# #vgName#
Die Größe ist dabei standardmäßig in MB, kann aber durch Anhängen eines Suffix (K für Kilobytes, M für Megabytes, G für Gigabytes, T für Terabytes, P für Petabytes oder E für Exabytes) verändert werden. Um nun mein Logical Volume für meine Disk-Images und MythTV-Recordings anzulegen, benutze ich folgenden Befehl:
lvcreate -L 300G -n images vgStorage
lvcreate -L 500G -n movie vgStorage
Um zu sehen ob meine Logical Volumes auch tatsächlich angelegt wurden und auf welchen Geräten sie liegen, hilft der folgende Befehl:
lvs -a -o +devices
Die Ausgabe lautet wie folgt:
LV VG Attr LSize
images vgStorage -wi-a- 300,00g
movie vgStorage -wi-a- 500,00g
Die beiden letzten Schritte beim Setup eines LVM sind nun nicht mehr sehr LVM spezifisch: Anlegen eines Dateisystems und mounten via mount/fstab. Man kann mit einem LVM jedes beliebige Dateisystem betreiben, muss allerdings beachten, dass dann eventuell nicht alle Funktionen zur Verfügung stehen. So lassen sich Logical Volumes leicht vergrößern und verkleinern, aber nicht alle Dateisysteme unterstützen eine vergrößern/verkleinern.
Dateisystem |
Grow |
Shrink |
---|
ext4 |
Ja |
Ja |
---|
ext3 |
Ja |
Ja |
---|
ext2 |
Ja |
Ja |
---|
xfs |
Ja |
Nein |
---|
btrfs |
ja |
ja |
---|
jfs |
Ja |
Nein |
---|
reiserfs |
Ja |
Ja |
---|
Persönlich bevorzuge ich ext4, da es meiner Meinung nach besser erprobt ist als btrfs und das Vergrößern/Verkleinern auch “online” (also im während das Dateisystem in Benutzung ist) unterstützt. Um nun die Dateisysteme anzulegen genügt folgender Befehl:
mkfs.ext4 /dev/vgStorage/images
mkfs.ext4 /dev/vgStorage/movie
Anschließend lassen sich die Logical Volumes wie herkömmliche Festplatten über mount/fstab in das System einhängen:
mount /dev/vgStorage/images /media/images
mount /dev/vgStorage/movie /media/movie
Die wichtigsten Befehle zur Verwaltung von Logical Volumes zeigt die nachfolgende Tabelle:
Befehl |
Bedeutung |
---|
lvs |
Informationen über LVs anzeigen. |
lvs -v |
Mehr Informationen über LV (inkl. UUID) anzeigen. |
lvs -a -o +devices |
Alle LV samt zugehörigem PV anzeigen |
lvcreate -L #size# -n #name# #vgName# |
Erstellt eine neues LV |
lvremove #lvDevicefile# |
Entfernt eine nicht benutztes Logical Volume |
lvrename #LVDevice# #LVDeviceNew# |
Benennt ein LV um |
Erweiterte Techniken
Vergrößern / Verkleinern
Nachdem das LVM nun eingerichtet ist und funktioniert, wird es Zeit, ein paar fortgeschrittene Techniken zu begutachten. Eine der wichtigsten Funktionen von LVM ist das Vergrößern/Verkleinern von Logical Volumes und den dazugehörigen Dateisystemen. Richtet man eine LVM ein, sollte man immer ein bisschen Freiraum lassen, um später verschiedene LV bei Bedarf vergrößern zu können. Der ganze Prozess ist recht einfach:
lvcreate -L 100M -n lvSmall vgStorage
mkfs.ext4 /dev/vgStorage/lvSmall
mount /dev/vgStorage/lvSmall /media/lvSmall/
lvextend -L500M /dev/vgStorage/lvSmall
resize2fs /dev/vgStorage/lvSmall
Wie man sieht, benötigt es genau zwei Zeilen Code, um das LV und das Dateisystem auf 500 MB zu vergrößern. Es ist auch möglich, statt absoluten Angaben, relative Größenangaben zu geben:
lvextend -L+1G /dev/vgStorage/lvSmall
resize2fs /dev/vgStorage/lvSmall
In diesem Beispiel wurde das LV und das Dateisystem um insgesamt 1GB auf nunmehr 1,5 GB vergrößert. Der Befehl “resize2fs” ist übrigens ext2/ext3/ext4 spezifisch und andere Dateisysteme benötigen andere Befehle um sie zu vergrößern, Google hilft hier weiter.
Etwas komplizierter wird das verkleinern einer Logical Volume. Meines Wissens ist es nicht möglich, ein ext4 System “online” sprich im eingehängten Zustand zu verkleinern (im Gegensatz zum Vergrößern). Das Dateisystem muss daher zuvor ausgehängt werden, auf eventuelle Fehler überprüft werden und anschließend mittels “resize2fs” verkleinert werden, bevor man die Größe des LV verändern darf:
umount /media/lvSmall
e2fsck -f /dev/vgStorage/lvSmall
resize2fs /dev/vgStorage/lvSmall 1200M
lvreduce -L-200M /dev/vgStorage/lvSmall
mount /dev/vgStorage/lvSmall /media/lvSmall
Auch hier ist der Vorgang mit anderen Dateisystemen eventuell komplizierter oder auch gar nicht möglich.
PV im laufenden Betrieb entfernen
Mit LVM ist es möglich, Festplatten (sofern es auch von der Hardware unterstützt wird) im laufenden Betrieb zu entfernen. Das Problem ist, dass eventuell bereits Daten auf dem dazugehörigen PV gespeichert wurden. Der Prozess ist grundsätzlich wie folgt:
- Alle Physical Extents (PE) von der Physical Volume (PV) auf andere PVs verschieben
- PV aus der Volume Group entfernen
- PV löschen
Ich gehe im Folgenden davon aus, dass ich die Festplatte /dev/sda aus dem System entfernen möchte. Zuerst muss festgestellt werden, welche Partitionen dieser Festplatte im LVM integriert sind:
pvs | grep sda
/dev/sda3 vgStorage lvm2 a-- 98,66g 95,66g
Die Ausgabe sagt, dass es genau eine PV gibt, die auf der Festplatte /dev/sda liegt und von den 98,66GB 95,66GB frei sind also rund 3GB mit LVs belegt sind. Alle Physical Extents auf diesem Physical Volume müssen nun verschoben werden. Das erledigt der folgende Befehl:
pvmove /dev/sda3
War der Befehl erfolgreich, sollten nun keine für das LVM benötigten Daten mehr auf der phyischen Festplatte /dev/sda vorhanden sein. Das PV kann nun aus der Volume Group entfernt und anschließend gelöscht werden:
vgreduce vgStorage /dev/sda3
pvremove /dev/sda3
Diese Festplatte ist nun nicht mehr im LVM vermerkt und kann, sofern das System es unterstützt, direkt entfernt werden. Das tolle daran ist, dass der gesamte Prozess “online” erfolgen kann. Also während das Dateisystem gemounted ist und Zugriffe erfolgen.
Spiegeln von Logical Volumes
Das Spiegeln von Logical Volumes ist im Prinzip ganz ähnlich zu einem RAID 0, dass mithilfe von Software emuliert wird. Jedes Byte wird dabei synchron auf verschiedene Logical Volumes geschrieben (meist zwei, wobei die Technik aber auch mit mehreren Kopien funktioniert). Ein zusätzliches Log Volume wird dabei automatisch erstellt, um über den aktuellen Synchronisationszustand Buch zu führen. Damit das Mirroring auch Ausfallsicherheit bringt, sollte man sicherstellen, dass sich die LVs jeweils auf verschiedenen physischen Festplatten befinden. Um das Spiegeln mit einer Logical Volume sicher zu gestalten, benötigt man also mindestens drei verschiedene Festplatten (obwohl es technisch gesehen auch nur mit einer einzigen geht, macht es einfach keinen Sinn, da dadurch die Ausfallsicherheit gleich 0 geht).
Um ein Logical Volume im Spiegelsetup einzurichten benötigt man folgenden Befehl:
# lvcreate -L 140G -n homeEXT -m1 vgStorage
Neu ist der Parameter “-m1″, der dafür zuständig ist, dass die Logical Volume genau 1x gespiegelt wird (es ist wie gesagt möglich, die LV auch öfter zu spiegeln).
Um nun herauszufinden, auf welchen PVs das gespiegelte LV liegt, benutzt man am Besten folgenden Befehl:
# lvs -a -o +devices
Die gekürzte Ausgabe sieht ungefähr so aus, und gibt Aufschluss darüber, dass sich die beiden Mirrors (auch Logical Extents genannt) auf den PVs /dev/sdb1 und /dev/sdc2 befinden und die Log-Daten auf /dev/sdd1 gespeichert werden.
LV VG Attr LSize Convert Devices
[homeEXT_mimage_0] vgStorage Iwi-ao 140,00g /dev/sdb1(0)
[homeEXT_mimage_1] vgStorage Iwi-ao 140,00g /dev/sdc2(0)
[homeEXT_mlog] vgStorage lwi-ao 4,00m /dev/sdd1(0)
Wichtig zu wissen ist auch, dass die gespiegelten Logical Volumes gleich nach dem Erstellen synchronisiert werden (der Fortschritt wird im Abschnitt “Copy” angezeigt). Dieser Prozess kann je nach Größe relativ lange dauern, wird allerdings nur ein einziges Mal durchgeführt.
Zusammenfassung
So nun endet der “kurze” Artikel zu LVM und es gäbe doch noch einiges zu sagen und zu erklären. Es lohnt sich auf alle Fälle einmal einen Blick auf das Logical Volume Managment zu werfen und wer noch weitere Informationen braucht, findet diese garantiert im LVM HOWTO. Eventuell werde ich in einem späteren Beitrag noch auf das Setup eines Snapshots zu sprechen kommen, bis dahin, viel Spaß mit LVM!