Der Logical Volume Manager ist eine Software, die es ermöglicht, mehrere physikalische Partitionen zu einer einzigen logischen (Logical Volume) zusammenzufügen. Man kann theoretisch eine Partition auf /dev/sda und eine Partition auf /dev/sdb zu einem logischen Mountpoint /testordner zusammenfügen. Das Schreiben und Lesen der Daten wird für den Benutzer unersichtlich abstrahiert, es ändert sich für ihn nichts im Vergleich zur Nutzung gewöhnlicher physikalischer Partitionen. Im Hintergrund wird durch den LVM die Bewegung der Schreib- und Leseköpfe optimiert, indem die Daten gleichmäßig auf beide Platten verteilt werden. Das darf nicht mit einem RAID verwechselt werden. Der LVM dient der Performanceverbesserung, ein RAID dient vordergründig der Ausfallsicherheit. Aus diesem Grund ist der LVM besser für seine Aufgabe geeignet, da er keinen zusätzlichen Datenoverhead erzeugt, was beim RAID jedoch wiederum der Fall ist. Dafür erzeugt die RAID-Technologie Redundanzen durch Paritätsbildung, die beim Ausfall einer der Platten zur Weiterverwendung des Systems genutzt werden können. LVM und RAID lassen sich jedoch miteinander kombinieren, was wir de fakto in einem späteren post auch noch machen werden, um ein Optimum beider Vorteile genießen zu können. Mehrere logical Volumes lassen sich zudem in eine Logical Volume Group zusammenfassen. In so eine Logical Volume Group können wir beispielsweise ein Logical Volume stecken, auf das wir unser /tmp-Verzeichnis einhängen, und ein anderes Logical Volume, auf welches wir unser /var-Verzeichnis einhängen. Dabei könnten theoretisch an beiden Einhängepunkten mehrere physiaklische Partitionen auf unterschiedlichen Festplatten beteiligt sein.
Nun haben wir noch den Vorteil, dass die einzige der oben besprochenen Partitionen, die sich außerhalb einer LVG befinden muss, die Partition /boot ist, da diese den Kernel enthält und dieser bereits arbeiten muss, bevor der Logical Volume Manager geladen werden kann. Die restlichen Logival Volumes, also die Einhängepunkte für /var, /tmp usw., können auf einer Logical Volume Group sitzen..
Wenn wir zwei Festplatten haben und derzeit kein Grund für die Aufteilung in mehrere Logical Volume Groups besteht, allokieren wir den gesamten restlichen verfügbaren Speicherplatz einer der beiden Platten nach Abzug von /boot unserer ersten platte als neue Logical Volume Group – diese können wir später bei Bedarf schließlich ganz einfach wieder aufsplitten, in der Praxis braucht manj edoch nur eine einzige Logical Volume Group, die alle Logical Volumes des Systems enthält. Diese erste Platte lassen wir dann beispielsweise per RAID1-Mirroring auf die zweite Platte spiegeln. Die Stärken dieser Konfiguration sind die durch den LVM erhaltene Flexibilität in der Dateisystemgestaltung, die Abstrahierung des Imaging des Servers dank der Snapshot-Funktion von LVM, und die erhaltene Ausfallsicherheit dank der Redundanz im RAID1-Verbund.
Contents
- 1 Installation
- 2 Konfiguration und Anlegen von LVs
- 3 Sinnvolle Logical Volume Konfiguration
- 4 Daten mit LVM innerhalb einer LVG von einer platte auf die andere schieben
- 5 Sonderexkurs: LVM im Hetzner Robot
- 6 Striped volumes
- 7 Entfernen von physical Volumes aus einem Logical Volume bzw. aus einer Volume Group
- 8 Weiteres Troubleshooting
Installation
Installation mit dem Betriebssystem
Viele Linux/Unix-Serverdistributionen bieten bereits bei der Installation die Option an, den Logical Volume Manager mitzuinstallieren. Ubuntu Server ist eine davon. Diese Option sollten Sie nutzen, um sich den Aufwand der manuellen installation zu sparen. Diese Variante ist der nachträglichen Installation auf jeden Fall vorzuziehenn.
Nachträgliche Installation
Wenn Sie LVM nachträglich installieren, haben Sie derzeit das Problem, dass Sie jetzt eine oder mehrere physikalische Partitionen auf Ihrem System haben, die den gesamten Platz der Festplatte einnehmen. Meistens haben Sie hier eine Partition für /boot, eine Partition für den Swap-Speicher und eine Partition für den Rest. Eventuell haben Sie aber auch mehrere Partitionen, es spielt keine Rolle.
Was Sie machen müssen, ist, eine GParted Live-CD zu erstellen und den Server von dieser zu booten. In Gparted verkleinern Sie die bestehende Systempartition auf den minimalen Speicherplatz, den das System benötigt. Ein Linux-System im Auslieferungszustand braucht meistens um die 4,5 GB. Wichtig ist, dass bei Free space preceeding (MiB) eine 0 steht, da wir die Virtual Volume Group nach der physikalischen Partition erstellen wollen.
Jetzt rechtsklicken wir in GParted auf unallocated und wählen New. Wir ändern File System auf lvm2 pv. Die Standardeinstellung sollte den gesamten zur Verfügung stehenden restlichen speicher enthalten. Wir fügen dei Partition hinzu und klicken Apply all Operations. Danach starten wir den server neu in das Betriebssystem.
Konfiguration und Anlegen von LVs
Am Anfang einer jeden LVM-Installation steht die Erstellung einer Logical Volume Group. Wie wir bereits weiter oben erklärt haben, braucht man in der Praxis immer nur eine Logical Volume Group, die alle Logical Volumes des Systems enthält.
Wenn Sie bei der installation des Betriebssystems bereits LVM vorinstallieren haben lassen, dann besteht in der Regel bereits die Logical Volume Group vg0. Sie können sich bestehende Volume Groups anzeigen lassen, indem Sie den Befehl
vgs #oder vgdisplay
eingeben. Die befehle
lvs #oder lvscan
Zeigen ihnen informationen über die LVs an. Mit dem Kommando
pvs
können wir nachsehen, welche physikalischen Laufwerke zu welcher Logical Volume Group gehören. Über das physikalische laufwerk bekommen wir noch ein paar informationen mit dem Befehl
pvdisplay
Als erstes müssen wri die Festplatte zum LVM hinzufügen.
pvcreate /dev/sda
Wenn es noch keine Logical Volume Group gibt, weil Sie LVM nachträglich installiert haben, dann erstellen wir eine neue über das Kommando
vgcreate vm /dev/sda2
wobei /dev/sda2 die Partition ist, die wir bei der nachträglichen Bearbeitung der Partitionen über GParted eingerichtet haben.
Wenn wir nun eine zweite Festpaltte in die Logical Volume Group hinzufügen wollen, müssen wir diese erst wieder mit pvrreate zum LVM hinzufügen und dann mit vgextend hinzufügen
pvcreate /dev/sdb vgextend vm /dev/sdb
entfernen können wir die Platten wieder über
vgreduce vm /dev/sdb
Nun haben wir eine Logical Volume Group, die jedoch noch keine Logical Volumes hat. Das ändern wir über
lvcreate -L 10G -n lv0 vm
oben stehende Befehl erstellte ein Logical Volume mit Namen lv0 in der Logical Volume Group vm. Die Größe ist 10 GB. Dieses Logical Volume ist ab sofort ansprechbar über die Gerätedatei /dev/mapper/vm-lv0.
mit dem Kommando
lvdisplay
Könnt ihr euch informationen über alle Logical Volumes anzeigen lassen.
Mit dem Befehl
lvs -a -o +devices
Könnt ihr euch ansehen, auf welchen physikalischen Volumes ein logisches Volume drauf liegt. Wenn ihr wissen wollt, ob ein Physical Volume überhaupt von irgendeinem logical volume genutzt wird, könnt ihr das einfahc über pvdisplay festellen oder alternativ
vgs -a -o +devices
Nachdem ein logisches Volume erstellt wurde, muss auf dieses ein Dateisystem aufgespielt werden. Der folgende Befehl formatiert das Logical Volume mit dem Dateisystem ext4
mkfs.ext4 /dev/mapper/vm-lv0
Jetzt können wir das Logical Volume irgendwo mounten, etwa unter /testordner
mount -o /dev/mapper/vm-lv0 /testordner
Wenn wir irgendwann aus welchem Grund auch immer ein Logical Volume löschen wollen, entfernen wir es erst aus der Logical Volume group und löschen dann das Logical Volume selbst..
vgreduce vm /dev/sdb lvremove vm/lv0 Do you really want to remove active logical volume testlv? (y/n): y
Zu guter letzt können Sie eine Volume Group entfernen würde
vgremove vm
Nachträgliches Verkleinern eines Logical Volumes
Ein Vorteil von LVM ist natürlich, dass Sie die Volumes nachträglich je nach Bedarf vergrößern oder verkleinern können. In diesem Schritt zeige ich Ihnen das Verkleinern eines Logical Volumes.
Das Verkleinern eines Logical Volumes geschieht in zwei Schritten: als erstes muss das Dateisystem aus dem Logical Volume verkleinert werden und danach erst das logische Volume selbst. Wenn wir es umgekehrt machen, wäre das, als würden wir einen Teil des Dateisystems „abschneiden“, was zu Datenverlust führen könnte. Verkleinern geht ürbigens nicht mit allen Dateisystemen. Zuerst also recherchieren, ob das Dateisystem dies unterstützt.
Grundsätzlich ist es empfohlen, vor dem Verkleinern eines Dateisystems eine Sicherungskopie seiner Daten zu machen, da ein Hardwarefehler während des Verkleinerungsvorgangs (auch beim vergrößern) nie ganz ausgeschlossen werden kann.
Übrigens: Beim Vergrößern eines Logical Volumes geht man umgekehrt vor: Man vergrößert ERST das Logical Volume und danach erst das Dateisystem! Sonst würde das Logical Volume „überlaufen“.
Sie können im Live-Betrieb nur solche Logical Volumes verkleinern, die man während des laufenden Betriebs unmounten kann. Sie können also keine Logical Volumes verkleinern, die Systemdateien enthalten, also beispielsweise Logical Volumes, in denen wichtige Systemordner wie /usr, /dev, /bin usw. drin liegen. Wenn Sie solche Logical Volumes Vergörßern oder Verkleinern wollen, dann müssen Sie das System von einer Live-CD starten, danach Ihre Festplatte mounten undn von der Live-CD aus die Logical Volumes vergrößern oder verkleinern.
Jetzt verkleinern wir. Wir loggen uns in einer SSH-Session wieder auf den Server ein. Nach einem Login als root geben wir in die Konsole ein:
#unmounten des dateisystems umount /dev/mapper/vm-lv0 #checken des Dateisystems e2fsck f /dev/mapper/vm-lv0 #verkleinern des Dateisystems
resize2fs -p /dev/mapper/vm-lv0 7G #verkleinern des Logical Volumes
lvreduce -L7G /dev/mapper/vm-lv0
#neu mounten des dateisystems mount -o /dev/mapper/vm-lv0 /testordner
das Vergrößern eines LVs geht entsrpechend so
umount /testordner lvextend -L +2G vm/lv0
erweitert erst das Logical Volume um 2G. Jetzt müssen wir das Dateisystem erweitern über
e2fsck f /dev/mapper/vm-lv0 resize2fs -p /dev/mapper/vm-lv0 9G mount -o /dev/mapper/vm-lv0 /testfolde
Ein PRoblem haben Sie, wenn Sie kein ext-basiertes DAteisystem auf dem Logical Volume haben, sondern ein XFS-DAteisystem. Hier werdne Sie feststellen, dass man ein XFS-DAteisystem so ohne wieteres nicht verkleinern kann. Stattdessen müssen Sie diesen Umweg gehen
1. First, backup the data using xfsdump (-f stands for where to save the dump file and the /home stands for which mount to backup):
xfsdump -f /tmp/home.dump /home
2. Unmount the partition:
cd /
umount /home
3. Delete the partition:
lvremove /dev/vg00/home
4. Recreate it with a smaller size:
lvcreate –name home -L 2GB vg00
5. Mount the /home partition:
mount /dev/vg00/home /home
6. Restore the data using xfsrestore:
xfsrestore -f /tmp/home.dump /home
Sinnvolle Logical Volume Konfiguration
Wie Sie oben bereits kennengelernt haben, ist es sehr umständlich, nachträglich Logical Volumes zu vergrößern oder zu verkleinern, die Systemdateien enthalten. Sie sollten also den Platz für diese LVs entsprechend dimensionieren, so dass diese auch nach einem Update noch nicht überlaufen. Andere LVs hingegen können Sie total schmerzfrei vergrößern oder verkleinern.
Eine ordentliche Grundpartitionierung eines Unix/Linux-Systems habe ich Ihnen bereits in meinem Post Einen VServer absichern gezeigt. Bis auf die Partition /boot können Sie alle dort geschilderten Partitionen über LVs realisieren. Diese LVs können Sie dann noch um weitere LVs für die Software, die Sie installieren wollen, ergänzen. Dabei sollten Sie am Ende ein logisches Volume für das Wurzelverzeichnis / erstellen. Dieses logische Volume deckt dann alle Verzeichnisse unterhalb von / ab, für die (versehentlich) kein logisches volume erstellt wurde. Wenn Sie sich an die empfehlung des verlinkten posts halten, haben Sie beispielsweise keine LV für das Verzeichnsi /bin erstellt. Dieses würde dann in dem logischen Volume unterkommen, welches wir in das Verzeichnis / einbinden würden. in unserem Beispiel würde das Logical Volume lv0-root heißen.
Sie sollten alle LVs grundsätzlich mit einem realistischen Speicherplatz dimensionieren. Dabei sollte Ihnen am Ende noch etwas speihcerplatz auf der Festplatte über bleiben. Diesen Speicherplatz sollten Sie nicht einfach blind in das Logical Volume lv0-root werfen, welche später in den Mountpoint /, also in das Wurzelverzeichnis, eingehängt wird. Denn dieses Logical Volume können Sie später nicht im Live-Betrieb des Systems verkleinern. Wenn Sie aber freien Speicherplatz von diesem Logical Volume auf ein anderes Logical Volume übertragen wollen, welches ihn nötiger brauchen würde, dann müssen Sie genau das tun. Das würde bedeuten, dass Sie den Server herunterfarhen und in ein Live-System booten müssen, um das Logical Volume lv0-root zu verkleinern und somti Speicherplatz auf das andere Logical Volume zu übertragen.
Stattdessen sollten Sie ein Logical Volume lv0-free machen und dieses beispielsweise in das Verzeichnis /free auf dem System mounten. Von diesem Verzeichnis können Sie später dann auch im laufenden Betrieb Speicherplatz wegnehmen und ihn auf andere LVs übertragen.
Daten mit LVM innerhalb einer LVG von einer platte auf die andere schieben
Sie können Daten innerhalb einer Logical Volume Group ganz einfach zwischen Platten, die sich in dieser LVG befinden, hind und her schieben. Mit dem kommando
pvs
können sie sich beispielsweise anzeigen lassen, welche platten zusammen in eienr Logical Volume Group sind und wie viel freien Paltz die Platten haben. Sie können den Inhalt einer sterbenden Platte beispielsweise zu einer anderen verschieben über
pvmove <Quellplatte> <Zielplatte>
Sonderexkurs: LVM im Hetzner Robot
Wenn Sie einen VServer von der Hosting-Firma Hetzner haben, können Sie auch dort bei der installation eines Servers bereits im Vornherein LVM einrichten. Bei Hetzner rufen Sie dazu ein sogeannntes Installimage-Skript auf. Dort werden sie dann am Anfang gebeten, eine Konfigurationdatei zu bearbeiten, in der Sie unter anderem die physikalische Partitionierung und zusätzlich die Konfiguration von logischen Volumes festlegen können. Hier eine Beispielkonfiguration für dieses installimage:
#Beginn der physikalischen PArtitionierung
PART /boot ext3 512M
PART lvm vg0 all # definiert den resltichen Speicherplatz als Virtual Volume Group
#Beginn der logischen Partitionierung
LV vg0 swap swap swap 4G
LV vg0 tmp /tmp ext4 4G
LV vg0 var /var ext4 4G
LV vg0 home /home ext4 20G
LV vg0 root / ext4 4.5G LV vg0 free /free ext4 all
Wenn beim Versuch, die Konfiguration zu speichern der Fehler „Partition size all must be on the last partition“ kommt, dann ist der fehler wahrscheienlich, dass weiter unten vom skript die standard partitionierung übersehen wurde und man darüber die eigene Partitionierung hingeschrieben hat, ohne es zu merken.
Striped volumes
Striped Volumes sind sozusagen logische Volumes, die Daten über merhere physikalische Volumes verteilen, um damit einen ähnlichen Effekt wie bei einem RAID 0 zu erreicehn, also einen Performancegewinn, weil mehrere Platten zusammenarbeiten.
Wenn ihr ein striped volume erstellt, gebt ihr die Anzahl der „STreifen“ mit dem Parametr -i beim lvcreate-Kommando an. dies bestimmt über wie viele physiaklsiche Datenträger die Daten vertielt werden sollen. Die Anzahl an STreifen kann nicht größer sein als die anzahl der physiaklsciehn Volumes in einer volume Group.
Wenn die physikalischen Datenträger in einer logical volume group verschiedene Görßen haben, wird die amxiamle Größe der striped volumes bestimmt durch das kleinste darunterliegende gerät. Bei einem dreistreifigen logical volume ist dessen größe also die dreifache Größe des kleinsten devices.
Das folgende Kommando erstellt ein striped logical Volume über zwei physiaklsiche Geräte mit einem Stripe von 64 kB. Das logishce volume hat eine Görße von 50 GB, grägt den namen gfslv und befinde tsich in der volume group vg0.
lvcreate -L 50G -i2 -I64 -n gfslv vg0
Anstatt eine simple Größe anzugeben könnt ihr auch extents angeben. Das folgende kommando erstellt ein striped volume von 100 extens größe ide über zwei geräte verteilt werden. Der name sit stripelv, die volume group testvg. Der Stripe nutzt die Sekteoren 0-49 von /dev/sda1 und die sektoren 50-99 von /dev/sdb1
lvcreate -l 100 -i2 -nstripelv testvg /dev/sda:0-49 /dev/sdb1:50-99
Erweitern von Striped volumes
um ein striped logical volume zu vergrößern, muss genügnd freier Speicherplatz auf verschiedenen physiaklscihen volumes hinzugefügt werden, um den STripe fortführen zu können. Beispiel: Ihr habt eine logical Volume Group namens vg mit zwei physikalischen Datenträgern, wie es euch der folgende command ausgibt
$>vgs VG #PV #LV #SN Attr VSize VFree vg 2 0 0 wz--n- 271.31G 271.31G
Wie ihr seht, befinden sich im logical volume derzeit zwei physical volumes.
Eventuell erstellt ihr jetzt in eurer logical Volume Group ein striped logical Volume über diese bieden Datenträger, welches den gesamten Speicherplatz der beiden physiaklscihenD Atenträger nutzt. Das würdet ihr machen über
lvcreate -n stripe1 -L 271.31G -i 2 vg
Wenn ihr jetzt das Kommando vgs eingebt, bekommt ihr angezeigt, dass kein freier speicherplatz mehr zur Verfügung steht
$>vgs VG #PV #LV #SN Attr VSize VFree vg 2 0 0 wz--n- 271.31G 0
Jetzt könntet ihr auf die Idee kommen, dass ihr ein weiteres physikalsiches volume /dev/sdc1 mit 135 GB freiem Speicherplatz zur logival colume group hinzufügt.
$>vgextend vg /dev/sdc1 Volume group "vg" successfully extended $>vgs VG #PV #LV #SN Attr VSize VFree vg 3 1 0 wz--n- 406.97G 135.66G
Wenn ihr jetzt versucht, das striped logical volume auf die Größe 3*150GB zu vergörßern, werdet ihr auf die Nase fallen. Vorher müssen wir natürlich das logical volume aushängen, wir nehmen an, dass das logical volume derzeit im ordner /stripe eingehgangen ist
#>umount /stripe
#> lvextend vg/stripe1 -L 406G
Using stripesize of last segment 64.00 KB
Extending logical volume stripe1 to 406.00 GB
Insufficient suitable allocatable extents for logical volume stripe1: 34480
more required
um das striped logical volume erweitern zu könen, müssen wir also einen weiteren physikalischen Datenträger /dev/sdd1 einbinden, erst dann können wir die Größe auf 4*150GB erhöhen.
$>vgextend vg /dev/sdd1 $>lvextend vg/stripe1 -L 540G
Wenn ihr nicht wisst, ob ein Logical Volume ein striped LV ist und falls ja, welche Anzahl von Streifen das Striped LV hat und wie klein ein solcher Streifen jeweils ist, könnt ihr das rausfinden über
lvs --segments
Weitere mögliche Probleme beim Erweitern von Stripes
Weitere mögliche Probleme beim Vergörßern von Striped Logical Volumes zeige ich hier auf. Es kann ja sein, dass euch auf einem Striped Logical Volume irgendwann der speicherpaltz ausgeht und ihr versucht, das Logical Volume zu vergörßern. Was ihr also macht ist, ein neues physical Volume (/dev/xvdt) in das System einzubinden und es der Logical Volume Group hinzuzufügen.
pvcreate /dev/xvdt vgextend vgcal /dev/xvdt
Ihr unmountet
Jetzt versucht ihr, euer striped logical volume (vgcal/sysfiles) zu vergrößern
lvextend -L+150G vgcal/sysfiles
dabei bekommt ihr dann folgenden Fehler
Using stripesize of last segment 64.00 KiB Extending logical volume sysfiles to 298.88 GiB Insufficient suitable allocatable extents for logical volume sysfiles: 38388 more required
und ihr denkt euch: ha, den Fehler hatten wir doch schon weiter oben. ich muss also einfach nur einen weiteren Datenträger mit der angegebenen Speichermenge hinzufügen. ihr rechnet die 38388 Extents * die Physical Extent Size, die Physical Extent Size bekommt ihr über
$>vgdisplay --- Volume group --- VG Name vgcal System ID Format lvm2 Metadata Areas 13 Metadata Sequence No 28 VG Access read/write VG Status resizable MAX LV 0 Cur LV 4 Open LV 3 Max PV 0 Cur PV 13 Act PV 13 VG Size 839.95 GiB PE Size 4.00 MiB Total PE 215027 Alloc PE / Size 138216 / 539.91 GiB Free PE / Size 76811 / 300.04 GiB VG UUID 01GCbq-a9aA-EnCy-lKgq-Eoj0-N4v0-d8Y2pC
Ihr rechnet also 38388 * 4 MB= 150 GB. Ihr fügt also eine weiteres physical Volume (/dev/xdvu) mit 150 GB hinzu. Wenn ihr jedoch den Befehl erneut eingebt, stoßt ihr wieder auf den gleichen.
#>pvcreate /dev/xvdu #>vgexcent vgcal /dev/xvdu #>lvextend -L+150G vgcal/sysfiles Using stripesize of last segment 64.00 KiB Extending logical volume sysfiles to 298.88 GiB Insufficient suitable allocatable extents for logical volume sysfiles: 38388 more required
Was ist nun das Problem?
Ein mögliches Problem könnt sein, dass auf den anderen Physical Volumes der speicherplatz zu knapp wird. Führt mal aus
pvdisplay -m --- Physical volume --- PV Name /dev/xvdq VG Name vgcal PV Size 45.00 GiB / not usable 4.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 11519 Free PE 1 Allocated PE 11518 PV UUID dAeXlz-3lMR-yrHh-Ub2A-cCKT-3AXQ-fJf0Zz --- Physical Segments --- Physical extent 0 to 5418: Logical volume /dev/vgcal/dbdata Logical extents 0 to 65027 Physical extent 5419 to 6122: Logical volume /dev/vgcal/dblog Logical extents 0 to 8447 Physical extent 6123 to 7082: Logical volume /dev/vgcal/sysfiles Logical extents 0 to 11519 Physical extent 7083 to 9301: Logical volume /dev/vgcal/back Logical extents 0 to 26627 Physical extent 9302 to 11517: Logical volume /dev/vgcal/sysfiles Logical extents 11520 to 38111 Physical extent 11518 to 11518: FREE --- Physical volume --- PV Name /dev/xvdr VG Name vgcal PV Size 45.00 GiB / not usable 4.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 11519 Free PE 1 Allocated PE 11518 PV UUID WhHhtq-BdlM-AsYS-7pbH-uoXD-c8tq-eDb2rp --- Physical Segments --- Physical extent 0 to 5418: Logical volume /dev/vgcal/dbdata Logical extents 0 to 65027 Physical extent 5419 to 6122: Logical volume /dev/vgcal/dblog Logical extents 0 to 8447 Physical extent 6123 to 7082: Logical volume /dev/vgcal/sysfiles Logical extents 0 to 11519 Physical extent 7083 to 9301: Logical volume /dev/vgcal/back Logical extents 0 to 26627 Physical extent 9302 to 11517: Logical volume /dev/vgcal/sysfiles Logical extents 11520 to 38111 Physical extent 11518 to 11518: FREE --- Physical volume --- PV Name /dev/xvds VG Name vgcal PV Size 45.00 GiB / not usable 4.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 11519 Free PE 1 Allocated PE 11518 PV UUID wUq02K-aQcn-mzJe-6mSP-HoHC-yal5-GLer9H --- Physical Segments --- Physical extent 0 to 5418: Logical volume /dev/vgcal/dbdata Logical extents 0 to 65027 Physical extent 5419 to 6122: Logical volume /dev/vgcal/dblog Logical extents 0 to 8447 Physical extent 6123 to 7082: Logical volume /dev/vgcal/sysfiles Logical extents 0 to 11519 Physical extent 7083 to 9301: Logical volume /dev/vgcal/back Logical extents 0 to 26627 Physical extent 9302 to 11517: Logical volume /dev/vgcal/sysfiles Logical extents 11520 to 38111 Physical extent 11518 to 11518: FREE
Die wichtigen Stellen habe ich markiert.
Ihr seht hier einen Ausschnitt meiner Ausgabe von vgdisplay -m. Dabei seht ihr immer, dass die physicla volumes /dev/xvdq – /dev/xvds bereits verschiedene streiten des striped logical volumes vgcal/sysfiles enthalten. Und in den anderen fett amrkierten Stellen seht ihr, dass nur noch ein Extent frei ist, nämlich immer das letzte
Physical extent 11518 to 11518: FREE
eien eifnachere Ansicht des freien Speicherplatz auf den einzelnen phisical volumes bekommt ihr über
#>pvs /dev/xvdq vgcal lvm2 a-- 45.00g 4.00m /dev/xvdr vgcal lvm2 a-- 45.00g 4.00m /dev/xvds vgcal lvm2 a-- 45.00g 4.00m /dev/xvdt vgcal lvm2 a-- 300.00g 300.00g
Was passiert jetzt, wenn ihr das physical volume /dev/xvdt hinzufügt und versucht, das logical volume um 150 GB zu erweitern?
Um das beantworten zu können, müsst ihr euch visualisieren, wie das striping beim Logical Volume Manager funktioniert. Hier die Aufteilung unsere Daten im Logical Volume, bevor das PV /dev/xvdt dem Logical Volume hinzugefügt werden soll

Die Daten werdne in Blöcken (oder Extents, je nachdem, wie man es nennen will) über die verschiedenen Physical Volumes verteilt, hier angedeutet in roten Kästchen. Was passiert jetzt, wenn wir das gesamte Lgoical Volume um 150 GB vergörßern wollen? dann versucht dre Logical Volume manager folgendeS:

das heißt, der Logical Volume Manage rversucht beim Vergrößern eines Triped Logical Volumes, auf allen physical Volumes gleichmäßig zusätzliche Extents für das Logical Volume zu besetzen. Während auf unserem letzten Device, /dev/xvdt genug Speicherplatz frei wäre, sind die anderen physicales volumes ja voll, weshalb euch die Fehlermeldugn ausgespuckt wird.
Ihr habt nun ein paar zwei mögliche Lösungsansätze, da es euch in der Regel nicht möglich sein wird, die Größe der Physical volumes nachträglich zu erhöhen.
Der erste Lösungsansatz ist der, den Logical Volume Manager dazub zu zwingen, alle neuen Extents auf der letzten platte zu erzeugen, das würde grafisch dann so aussehen – hierbie gebt ihr allerdings euer Striping auf:

Der Befehl hierzu wäre
lvextend -i1 -l+100%Free vgcal/sysfiles
aus irgendeinem mir unerfindlichen Grund ging auch das bei mir nicht, ich bekam dann die fehlermeldung SEgmentation fault, obwohl es rein logisch betrachtet würde gehen müssen.
Die andere Möglichkeit, di ihr habt ist, ein zweites logical volume zu erzeugen, welches aus physical volumes besteht, die genügend freien speicherplatz haben, um die Daten aufzunehmen, und dann die bereits geschriebenen Daten vom alten Logical Volume auf das neue zu übertragen. Dazu erstellen wir in der Volume Group vgcal erstmal ein neues Logical Volume. Je nachdem, ob ihr wieder Striping machen wollt, oder euer Striping nun aufgeben wollt, könnt ihr entweder ein Logical Volume mit oder ohne Striping erstellen. wenn ihr ein Logical Volume mit Striping erstellt, müssen die Physicla Volumes natürlich jeweils gleich groß sein, damit die Gesamtgröße von in diesem Fall 250 GB gleichmäßig auf diese platten verteilt werden kann, ohne dass eine Platte voll läuft. Im Beispiel erstelle ich jetzt einfach ein Logical volume namens sysfiles-new komplett ohne Striping
lvcreate -L 250G -n sysfiles-new vgcal
gehen Sie desweiteren sicher, dass das alte Logical Volume vgcal/sysfiles wieder gemountet ist, falls Sie es vorher unmountet haben. im Beispiel war vgcal/sysfiles gemountet unter /stripe1, also schauen wir, ob unter /stripe1 Daten vorhanden sind.
Dann könnt ihr die Daten vom alten Logical Volume snapshoten und dann den Snapshot in das neue Logical Volume einspielen.
lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/vgcal/sysfiles
dd if=/dev/volume-group/snapshot-name of=/dev/vgcal/sysfiles-new
Jetzt sind die Daten im neuen Logical Voluem drin. Jetzt könnt ihr das alte Logical Volume unmounten udn das neue logical Volume an die selbe Stelle reinmounten. Wenn alels geht und ihr euch sicher seid, dass die Daten sauber übertragen wurden, könnt ihr das alte logical volume löschen.
Entfernen von physical Volumes aus einem Logical Volume bzw. aus einer Volume Group
Es kann sein, dass ihr ein Physical Volume aus einem logischen Volume bzw. aus einer Volume Group entfernen wollt. Gründe könnten sein
- ihr habt mehr als eine Volume Group konfiguriert und wollt das PV in einer naderen Volume Group verwenden
- ihr wollt das Physical Volume durch ein größeres Physical Volume ersetzen, welches mehr Speicherkapazität hat.
Als erstes müsst ihr schauen, ob das Physical Volume gerade für ein logisches Volume verwendet wird, also ob Daten von einem logischen Volume auf dem Physical Volume liegen. Das geht über
lvs -a -o +devices
Ist dem so, müsst ihr die Daten erst von diesem Physical Volume auf ein anderes Physicla Volume verschieben, welches noch Platz für die Daten hat. Das geht über
sudo modprobe dm-mirror # Treiber laden sudo pvmove /dev/<Partition>
Damit wird der inhatl von /dev/<Partition> auf die restlichen Logischen Volumes in der volume Group verteilt.
Danach könnt ihr das Physical Volume ganz normal wie oben schonmal beschrieben über vgreducre aus der volume Group entfernen.
Weiteres Troubleshooting
Es kann aus irgendeinem Grund einmal sein, dass ihr in der Vergangenheit mal im Logical Volume Manager ein Physical Volume hinzugefügt habt, welches ihr aus irgendeinem Grund nachträglich entfernt habt, ohne das volume sauber aus dem Logical Volume Manager zu entfernen. Dann bekommt ihr einen Fehler vom Logical Volume Manager
Couldn’t find device with uuid hYkSyt-dhXR-nrLL-itfG-hyKN-vplX-g3wJ95
Das Problem ist, dass euch der Logical Volume Manager dann auch andere Aktionen verweigern wird wie beispielsweise lvcreate, der LVM wird sich dann beschweren mit einer fehlermeldung wie etwa
Couldn’t find device with uuid hYkSyt-dhXR-nrLL-itfG-hyKN-vplX-g3wJ95.
Cannot change VG vgcal while PVs are missing.
Achtung: Diesen Fehler bekommt ihr auch, wenn das Physical Volume ausgefallen ist oder sogar beschädigt wurde / kaputt gegangen ist. In diesem Fall könnt ihr nicht die hier geschilderte lösung verwenden, weil euch ja Daten fehlen, die ihr ersetzen müsst. In diesem Fall müsst ihr die ausgefallene Festplate entweder wieder zum Laufen kriegen oder durch eien neue Ersetzen und die Daten durch ein Recovery zurückspielen.
Wenn ihr euch hingegen sicher seid, dass der LVM lediglich eine nicht mehr gefundene Festplatte anmeckert, die ihr nicht mehr braucht, könnt irh die fehlenden Festplatten entfernen lassen über
vgreduce --removemissing vgcal
dann werden die nicht mehr gefundenen Platten entfernt und ihr könnt wieder alle Befehle des Logical Volume Managers verwenden.
Ein sehr gutes Cheat Sheet für den Logicla Volume Manager bietet die Red Hat Dokumentation.
Wenn dir dieser Post gefallen hat, teile ihn doch auf Social Media, abonniere und verfolge mich per E-Mail, RSS-Feed, Social Media oder registriere dich auf meiner Seite. Wenn du registriert bist, like den Post bitte, wenn er dir gefallen hat!
Ein Gedanke zu „Der Logical Volume Manager“