Der Logical Volume Manager (LVM) stellt verschiedene Funktionen zur Verfügung, um den Plattenplatz auf einem Linux System effizienter zu verwalten. Man kann Dateisysteme nachträglich vergrößern oder verkleinern, Ausfallsicherheit oder eine bessere Performance durch Einsatz mehrerer physikalischer Festplatten erreichen (RAID0, RAID1 oder RAID5) oder während des Betriebs defekte Festplatten austauschen.

Auch wenn man auf die Ausfallsicherheit oder Performance verzichtet, ist der Einsatz von LVM eine nützliche Sache. Allein schon die Möglichkeit, nachträglich Dateisysteme zu vergrößern oder bei Festplattenproblemen die Daten leicht auf eine neue Platte kopieren zu können, rechtfertigt den Einsatz von LVM.

Das geschieht in den folgenden Schritten:

  1. LVM installieren
  2. Dem LVM werden alle freien Partitionen auf den vorhandenen Festplatten mitgeteilt.
  3. Alle Partitionen in einer "Volume Group" zusammenfassen. Falls sich später herausstellt, dass insgesamt noch mehr Plattenplatz erforderlich ist, kann man nachträglich weitere Festplatten bzw. Partitionen der Volume Group hinzufügen.
  4. "Logical Volumes" erstellen. Auch hier ist es möglich, im nachhinein ein Logical Volume zu vergrößern oder zu verkleinern. Der benötigte Plattenplatz wird dabei aus einer Volume Group angefordert bzw. zurückgegeben.

Anwendungsszenarien

Nachträgliche Vergrößerung von Dateisystemen

Sofern man noch nicht den gesamten Platz in einer Volume Group verbraucht hat, kann man mit "lvresize" oder "lvextend" ein Dateisystem vergrößern. Nach der Änderung der Partition muss dann noch das Dateisystem selbst vergrößert werden. Bei den verbreiteten ext2 oder ext3 Dateisysteme unter Linux macht man das mit "resize2fs".

Nachträgliches Hinzufügen weiterer Festplatten

Zusätzliche Festplatten können leicht mit "vgextend" zu eine Volume Group hinzugefügt werden.

Ersatz defekter Festplatten

Festplatten halten bekanntlich nicht ewig. Wenn man Hinweise auf Fehlfunktionen hat, sollte man die Festplatte austauschen. Dazu fügt man eine neue Festplatte hinzu und bindet sie mit "pvcreate" und "vgextend" in den LVM ein. Sodann verschiebt man mit "pvmove" alle Daten von der defekten Platte auf die neue. Die fehlerhafte Platte kann dann mit "vgreduce" aus der Volume Group entfernt und ausgebaut werden.

Festplatten partitionieren

Es ist nicht möglich, sämtliche Partitionen eines Linux Systems mit LVM zu verwalten. Zumindest der Kernel muss sich auf einer normalen Partition befinden (meistens ist das /boot), da die üblichen Boot Loader keinen LVM Support haben.

Weiterhin sollte man sich überlegen, was man im Fehlerfalle (z.B. bei einem Absturz) zu tun gedenkt. Falls man einen Rootserver hat, ist man auf das vom Anbieter zur Verfügung gestellte "rescue system" angewiesen. Enthält das Rescue System keine LVM Utilities, dann kann man die Partitionen nicht mounten und man kommt an die Daten nicht mehr so ohne weiteres ran.

Bei einem Rootserver ist es daher empfehlenswert, alle für den Systemstart benötigten Dateisysteme auf die herkömmliche Art und Weise anzulegen und nur die Anwender-Dateisysteme mit LVM zu verwalten.

LVM installieren

Um LVM zu nutzen, braucht man einen Kernel mit den LVM-Erweiterungen (sind bei den meisten Distributionen schon drin) sowie die LVM Utilities.

Auf einem Debian System wird LVM so installiert:

apt-get install lvm-common lvm2

Physical Volumes anlegen

Der erste Schritt ist, freien Speicherplatz zur Benutzung mit LVM zu markieren. Dazu wird der Befehl 'pvcreate' benutzt. Man kann sowohl Disk-Partitionen als auch ganze Festplatten oder sonstige block devices verwenden.

'pvscan' prüft alle vorhanden block devices, ob physical LVM volumes vorhanden sind.

'pvdisplay' zeigt wichtige Informationen über die vorhandenen physical volumes an.

server03:~# fdisk /dev/sda

The number of cylinders for this disk is set to 38913.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): p

Disk /dev/sda: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1       36481   293033601    5  Extended
/dev/sda5               1           8       64197   83  Linux
/dev/sda6               9         259     2016126   83  Linux
/dev/sda7             260         322      506016   83  Linux
/dev/sda8             323         573     2016126   83  Linux
/dev/sda9             574        1074     4024251   83  Linux
/dev/sda10           1075       36481   284406696   8e  Linux LVM

Command (m for help): q

server03:~# pvcreate /dev/sda10
  Physical volume "/dev/sda10" successfully created

server03:~# pvcreate /dev/sdb2
  Physical volume "/dev/sdb2" successfully created

server03:~# pvscan
  PV /dev/sda10         lvm2 [271.23 GB]
  PV /dev/sdb2          lvm2 [277.55 GB]
  Total: 2 [548.78 GB] / in use: 0 [0   ] / in no VG: 2 [548.78 GB]

server03:~# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda10
  VG Name               disk
  PV Size               271.23 GB / not usable 0
  Allocatable           yes
  PE Size (KByte)       4096
  Total PE              69435
  Free PE               69435
  Allocated PE          0
  PV UUID               PfI4Gs-18uX-jmvV-JrG6-pPcv-NrxN-I1q5RH

  --- Physical volume ---
  PV Name               /dev/sdb2
  VG Name               disk
  PV Size               277.55 GB / not usable 0
  Allocatable           yes
  PE Size (KByte)       4096
  Total PE              71053
  Free PE               71053
  Allocated PE          0
  PV UUID               RoqRsm-fgaf-WKk0-RbJ4-3Y20-YYq3-YLPZKL

Volume Groups anlegen

Eine Volume Group verwaltet den Speicherplatz von mindestens einem physical volume. Man kann nachträglich weitere physical volumes hinzufügen.

server03:~# vgcreate disk /dev/sda10
  Volume group "disk" successfully created

server03:~# vgextend disk /dev/sdb2
  Volume group "disk" successfully extended

server03:~# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "disk" using metadata type lvm2

server03:~# vgdisplay
  --- Volume group ---
  VG Name               disk
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               548.78 GB
  PE Size               4.00 MB
  Total PE              140488
  Alloc PE / Size       0 / 0
  Free  PE / Size       140488 / 548.78 GB
  VG UUID               KEYgjn-jPuz-W6wb-YDWL-clhj-FbSt-I4ibnZ

Logical Volumes anlegen

Ein logical volume verhält sich im wesentlichen genau so wie eine Disk Partition. Man kann es mit einem beliebigen Dateisystem formatieren. Der Unterschied ist, dass man ein logical volume auch nachträglich noch vergrößern kann, z.B. wenn man mehr Speicherplatz benötigt als zunächst erwartet. Bei einer Disk Partition ist das nur sehr schwer möglich; wenn man die eine Partition vergrößert, muss man die darauffolgende Partition verkleinern, was sehr aufwändig ist. Eine Disk Partition kann auch nie größer als die Festplatte sein, auf der sie liegt.

Diese Einschränkungen gibt es für logical volumes nicht.

server03:~# lvcreate --size 100G --name v0300 disk
  Logical volume "v0300" created

server03:~# lvscan
  ACTIVE            '/dev/disk/v0300' [100.00 GB] inherit

server03:~# lvdisplay
  --- Logical volume ---
  LV Name                /dev/disk/v0300
  VG Name                disk
  LV UUID                js11uX-rtDI-cXa0-QGYE-H53R-2GYs-yL93MI
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                100.00 GB
  Current LE             25600
  Segments               1
  Allocation             inherit
  Read ahead sectors     0
  Block device           254:0

File Systems erstellen

Die verbreitetsten File Systeme sind ext3, reiserfs und evtl. xfs. Die meisten Distributionen verwenden inzwischen das ext3 File System, das einen guten Kompromiss zwischen Datensicherheit und Performance bietet. Für weitergehende Informationen ist der folgende Artikel hilfreich: http://www.linux-user.de/ausgabe/2006/01/046-dateisysteme/index.html.

# mke2fs -j /dev/disk/backup
mke2fs 1.40-WIP (14-Nov-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
90849280 inodes, 181676032 blocks
9083801 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
5545 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information:
done

This filesystem will be automatically checked every 37 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

Partitionen und Dateisysteme vergrößern oder verkleinern

Ein Dateisystem stellt den Speicherplatz einer Partition oder eines logical volumes so zur Verfügung, dass man darauf Dateien abspeichern kann. Es ist normalerweise genauso groß wie die darunterliegende Partition bzw. logical volume, aber man kann es auch nachträglich vergrößern oder verkleinern.

Dabei ist folgendes zu berücksichtigen: Will man das Dateisystem vergrößern, muss zuerst die Partition vergrößert werden. Will man es verkleinern, darf die Partition erst nach der Verkleinerung des Dateisystems verkleinert werden. Ist ja auch irgendwie logisch.

Beim Hantieren mit Dateisystemen sollte man immer daran denken, dass ein Fehler häufig zum Totalverlust sämtlicher Daten führt. Also vorher ein Backup machen, wenn irgend möglich! Und die Kommandozeile nochmal genau überprüfen, bevor man auf die Returntaste drückt.

Dateisystem verkleinern

Hier die Anweisungen, um eine Partition von 200 GByte auf 50 GByte zu verkleinern:

server04:~# resize2fs /dev/disk/space 50G
resize2fs 1.40-WIP (14-Nov-2006)
Please run 'e2fsck -f /dev/disk/space' first.

server04:~# e2fsck -f /dev/disk/space
e2fsck 1.40-WIP (14-Nov-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/disk/space: 15/26214400 files (6.7% non-contiguous), 8611356/52428800 blocks

server04:~# resize2fs /dev/disk/space 50G
resize2fs 1.40-WIP (14-Nov-2006)
Resizing the filesystem on /dev/disk/space to 13107200 (4k) blocks.
The filesystem on /dev/disk/space is now 13107200 blocks long.

server04:~# e2fsck -f /dev/disk/space
e2fsck 1.40-WIP (14-Nov-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/disk/space: 15/6553600 files (6.7% non-contiguous), 7992506/13107200 blocks

Logical Volume verkleinern

Um das darunterliegende logical volume zu verkleinern, verwendet man den Befehl "lvresize":

server04:~# lvresize --size 50G /dev/disk/space
  WARNING: Reducing active logical volume to 50.00 GB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce space? [y/n]: y
  Reducing logical volume space to 50.00 GB
  Logical volume space successfully resized

Logical Volumes auf definierte Laufwerke verschieben

Ein logical volume stellt Speicherplatz eines oder mehrerer physischer Laufwerke bereit. Falls nun eines dieser Laufwerke ausfällt, ist das gesamte logical volume beschädigt. Man verringert also die Datensicherheit, wenn mehrere physische Laufwerke in einem einzigen logical volume zusammengefasst werden. Es wäre also wünschenswert, wenn der Speicherplatz eines logical volumes sich möglichst auf einer einzigen Festplatte befindet.

Auch beim Austausch eines Laufwerkes müssen die darauf enthaltenen logical volumes auf andere physical volumes verschoben werden.

Dies geht sehr einfach mit dem "pvmove" Befehl. Das schöne daran ist, dass der Verschiebevorgang während des laufenden Betriebs erfolgen kann: der pvmove Befehl spiegelt die betroffenen logical volumes einfach auf ein anderes physical volume. Schreibvorgänge werden nun sowohl auf dem alten als auch auf dem neuen physical volume ausgeführt. Nachdem die Spiegelung abgeschlossen wurde, d.h. nachdem sämtliche Daten auf das neue physical volume übertragen wurden, wird die Zuordnung des alten physical volumes zum logical volume aufgehoben.

Hier ein Beispiel: es sind zwei Festplatten vorhanden. Auf der ersten Festplatte sind 50 GByte allokiert, auf der zweiten sind 100 GByte allokiert. Die erste Festplatte soll nun entfernt werden, dazu soll der LVM sämtliche Daten, die auf dem physical volume /dev/sda10 enthalten sind, auf eine andere Platte kopieren.

Nach der Ausführung des pvmove-Befehls zeigt pvdisplay an, dass die Partition /dev/sda10 nunmehr leer ist. Man könne sie nun mit vgreduce vom LVM abmelden und die Platte ausbauen.

server04:~# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda10
  VG Name               disk
  PV Size               271.23 GB / not usable 0
  Allocatable           yes
  PE Size (KByte)       4096
  Total PE              69435
  Free PE               56635
  Allocated PE          12800
  PV UUID               PfI4Gs-18uX-jmvV-JrG6-pPcv-NrxN-I1q5RH

  --- Physical volume ---
  PV Name               /dev/sdb2
  VG Name               disk
  PV Size               277.55 GB / not usable 0
  Allocatable           yes
  PE Size (KByte)       4096
  Total PE              71053
  Free PE               45453
  Allocated PE          25600
  PV UUID               RoqRsm-fgaf-WKk0-RbJ4-3Y20-YYq3-YLPZKL

server04:~# pvmove /dev/sda10
  /dev/sda10: Moved: 0.9%
  /dev/sda10: Moved: 1.7%
  /dev/sda10: Moved: 2.5%
  /dev/sda10: Moved: 3.4%
  ...
  /dev/sda10: Moved: 100.0%

server04:~# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda10
  VG Name               disk
  PV Size               271.23 GB / not usable 0
  Allocatable           yes
  PE Size (KByte)       4096
  Total PE              69435
  Free PE               69435
  Allocated PE          0
  PV UUID               PfI4Gs-18uX-jmvV-JrG6-pPcv-NrxN-I1q5RH

  --- Physical volume ---
  PV Name               /dev/sdb2
  VG Name               disk
  PV Size               277.55 GB / not usable 0
  Allocatable           yes
  PE Size (KByte)       4096
  Total PE              71053
  Free PE               32653
  Allocated PE          38400
  PV UUID               RoqRsm-fgaf-WKk0-RbJ4-3Y20-YYq3-YLPZKL

server04:~# vgreduce disk /dev/sda10
  Removed "/dev/sda10" from volume group "disk"

server04:~# pvremove /dev/sda10
  Labels on physical volume "/dev/sda10" successfully wiped