Der Logical Volume Manager

(Last Updated On: 27. Januar 2016)

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.

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

2015-08-26_13h55_31

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:

2015-08-26_13h58_26

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:

2015-08-26_14h07_06

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.

 

 

 

 

 

Andreas Loibl ist SAP-Berater, Ethical Hacker und Online Marketing Manager und schreibt auf seinem Blog DaFRK Blog über verschiedene Themen in den Sektoren Projektmanagement, Informationstechnik, Persönlichkeitsentwicklung, Finanzen und Zeitmanagement.

DaFRK

Andreas Loibl ist SAP-Berater, Ethical Hacker und Online Marketing Manager und schreibt auf seinem Blog DaFRK Blog über verschiedene Themen in den Sektoren Projektmanagement, Informationstechnik, Persönlichkeitsentwicklung, Finanzen und Zeitmanagement.

Das könnte Dich auch interessieren …

2 Antworten

  1. 18. Juni 2015

    […] RAID funktioniert am besten immer in Kombination mit dem Logical Volume Manager, den ich hier bereits schon einmal vorgestellt habe. Wenn ihr euch den Post zum LVM durchgelesen habt, wisst ihr, […]

  2. 31. Mai 2016

    […] Der erste Schritt, um einen kompletten Stillstand des Systems bei übergroßen Logdateien zu verhindern, ist eine ordentliche Partition des systems. Die typischen Verzeichnisse, an denen sich Log-dateien ansammeln, solllten in extra Partitionen oder bestenfalls Logical Volumes gepackt werden. Lesen Sie hierzu meinen Post über den Linux Logical Volume Manager. […]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.