====== LVM ======
Der [[wpde>Logical Volume Manager (LVM)]] ist eine hauptsächlich im UNIX- und [[linux:Linux]]-Umfeld verbreitete Abstraktionsebene zwischen Festplatten und Dateisystemen sowie der Name der Linux-Implementation derselben.
* Festplatten (Physical Volume, PV) werden zu
* einem Pool (//Volume Group//, VG) zusammengefasst, aus dem dynamisch
* "Partitionen" (//Logical Volume//, LV) angefordert werden können. Auf diesen Logical Volumes werden die Dateisysteme angelegt.
===== Vorteile von LVM =====
Es lassen sich im laufenden Betrieb Partitionen
* anlegen,
* vergrößern
* und verkleinern.
* zu einer einzigen (großen) Partition zusammenfassen.
* einen so genannten Snapshot eines Dateisystems erstellen (konsistente Zustandssicherung des Dateisystems z.B. für ein Backup)
* damit auch RAID-0 realisieren.
Kombinationen mit anderen Möglichkeiten, beispielweise [[linux:Festplattenverschlüsselung]], wie als Installationsoption bei der Alternate-Version von [[ubuntu:Ubuntu]] 7.10 angeboten, sind zusätzlich möglich.
===== Verwaltungstools =====
^ Befehl ^ Beschreibung ^
^ Befehle für physical volumes ^^
| pvcreate | Erzeugen eines PV |
| pvdisplay | Anzeigen der Attribute von PVs |
| pvscan | Suchen nach vorhandenen PVs |
| pvchange | Ändern von Attributen von PVs |
| pvresize| PV Vergrößern |
^ Befehle für volume groups ^^
| vgcreate | Erzeugen einer neuen VG |
| vgremove | Löschen einer leeren VG ohne LVs |
| vgextend | Erweitern einer VG um weitere PVs |
| vgreduce | Verkleinern einer VG um leere PVs |
| vgdisplay | Anzeigen von Attributen von VGs |
| vgrename | Umbenennen einer VG |
| vgscan | Suchen nach vorhandenen VGs |
| vgchange | Ändern von Attributen und Aktivieren/Deaktivieren von VGs |
^ Befehle für logical volumes ^^
| lvcreate | Erzeugen eines LV |
| lvremove | Löschen von inaktiven LVs |
| lvextend | Vergrößern eines LV |
| lvreduce | Verkleinern eines LV |
| lvdisplay | Anzeigen von Attributen von LVs |
| lvrename | Umbenennen eines LV |
| lvscan | Suchen nach allen vorhandenen LVs |
| lvchange | Ändern von Attributen eines LV |
**Erweiterte Befehle**
^ Befehl ^ Beschreibung ^
| pvdata | Debug-Anzeigen der Attribute von PVs |
| pvmove | LV-Daten online verlagern |
| vgcfgbackup | Metadatensicherung von VGs durchführen |
| vgcfgrestore | Metadatenrestauration auf PVs einer VG durchführen |
| vgck | Überprüfung der Metadatenkonsistenz von VGs |
| vgexport | VG abmelden, um deren PVs auf ein anderes System zu verlagern |
| vgimport | Verlagerte VG am Zielsystem bekannt machen |
| vgmerge | Zwei VGs zu einer verbinden |
| vgmknodes | Neuanlegen der Gerätedateien von VGs |
| vgsplit | Eine VG in zwei aufteilen |
| e2fsadm | LV und Ext2-Dateisystem in der Größe ändern |
| lvmchange | LVM zurücksetzen |
| lvmsadc | Statistikdaten sammeln |
| lvmsar | Gesammelte Statistikdaten anzeigen |
| lvmcreate_initrd | Initial-RAM-Disk zum Booten mit Root-Dateisystem auf LV erzeugen |
| lvmdiskscan | Nach als PV unterstützten Geräten suchen |
Quelle: [[http://tobias.schroepf.de/doku/doku.php?do=show&id=linux%3Alvm|tobias.schroepf.de]] mit Lizenz [[http://creativecommons.org/licenses/by-nc-sa/3.0/|CC BY-NC-SA 3.0]].
==== evms ====
[[http://evms.sourceforge.net/|evms (Enterprise Volume Management System)]] bietet eine Verwaltung von LVMs über verschiedene grafische Oberflächen (Kommandozeile: cli oder ncurses und grafisch).
==== ivman ====
* [[http://gentoo-wiki.com/HOWTO_ivman|HOWTO ivman]]
* [[http://www.linux-user.de/ausgabe/2005/05/080-ivman/index.html|Wechselmedien einbinden mit Ivman - Reaktion vorprogrammiert]]
* [[http://www.linux.com/articles/56016|Triggering software events from hardware changes with HAL and Ivman]]
* [[http://www.linux-magazin.de/heft_abo/ausgaben/2006/09/backup_ueber_bande| Ivman steuert per Hotplug beliebige Jobs - Backup über Bande]]
===== Links =====
* [[http://www.selflinux.org/selflinux/html/lvm.html|Dokument Linux LVM-HOWTO]]: sehr gute (deutschsprachige) LVM-Anleitung.
* [[http://www.ibm.com/developerworks/library/l-lvm2/?ca=dgr-lnxw02LinuxLVM2&S_TACT=105AGX59&S_CMP=GR|Logical volume management - Build and manage volumes, snapshot a backup, and more with the LVM2 tool]]
* [[http://linuxhelp.blogspot.com/2005/04/creating-lvm-in-linux.html|Creating a LVM in Linux]]
* [[http://linuxhelp.blogspot.com/2005/04/resizing-logical-volumes.html|Resizing Logical Volumes]]
* [[http://www.heise.de/ct/projekte/machmit/ctserver/wiki/lvmextend|Kurzanleitung zum Vergrössern einer Partition]]
* [[http://forum.ubuntuusers.de/topic/151003/|LVM-verschlüsseltes System mounten]]
* [[http://www.heise.de/open/meldung/Parted-Magic-bringt-GParted-mit-LVM-Support-1706910.html|Parted Magic bringt GParted 0.13.1 mit LVM-Support]]
===== Konfiguration =====
==== Ceph und ZFS Volumes nicht scannen ====
/etc/lvm/lvm.conf
devices {
# added by pve-manager to avoid scanning ZFS zvols and Ceph rbds
# global_filter=["r|/dev/zd.*|"]
global_filter=["r|/dev/zd.*|","r|/dev/rbd.*|"]
}
===== Bedienung =====
==== Unterstützung im System ====
Vorraussetzungen
- es muss das Paket lvm2 installiert sein (alternativ ist evms möglich)
- der devicemapper (dm_mod) muss geladen sein; siehe [[kernel#Kernelmodule laden]]
==== LVM aktivieren ====
Falls ein Gerät beim booten nicht aktiv war sind auch das darauf enthaltene LVM-Geräte nicht automatisch erkannt worden.
pvscan -v
vgscan -v
vgchange -ay
Ohne den letzten Befehl verbleibt das logical volume im Status "inactive".
==== Volumegroup inaktiv schalten ====
Der folgende Befehle schaltet eine volume-group auf inaktiv (es wird nichts gelöscht)
vgchange -a n /dev/volg1
==== PV löschen ====
vgremove /dev/pvdevice
(ebenso lvremove, vgremove)
==== LVM neu einrichten ====
=== PV erstellen ===
- eine Partition mit der Partitions-ID 8e (für LVM) erstellen, siehe partitionierung
- vgscan -v
- pvcreate /dev/PART
=== VG erstellen ===
vgcreate NAME_DER_VG /dev/PART_MIT_PV
Beispiel:
vgcreate vg_daten /dev/sda1
=== LV erstellen ===
lvcreate -L GRÖSSE -n NAME_DER_NEUEN_LV NAME_DER_VG
Beispiel:
lvcreate -L 52G -n lv_root vg_daten
==== LV vergrößern und verkleinern ====
Wie schon gesagt lässt sich mit LVM eine Partition nachträglich vergrößern und auch verkleinern. Möchte man das zuvor angelegte Logical Volume mit der Größe von 1000 Megabyte **vergrößern**, kann man dies mit ''lvextend'' erledigen. Dazu gibt man einfach die neue Größe mit der Option -L direkt an. Alternativ könnte man auch mit -L+300M die neue Größe relativ zur bestehenden Größe angeben. Aufgrund der Größe von 4 Megabyte der Physical Extents, können die tatsächlisch erzeugten Größen der Logical Volumes etwas abweichen, da die erzeugten Logical Volumes damit immer nur ein Vielfaches von 4 MB groß sein können. Um diese Abweichung zu umgehen, können Sie beim Anlegen einer Volume Group die Größe der Physical Extents explizit kleiner angeben. Sehen Sie dazu auch den Abschnitt "Volume Group mit spezieller PE-Größe".
lvextend -L 1300M /dev/volg1/logv1
Alternativ den gesamten freien Speicher hinzufügen:
lvextend -l +100%FREE /dev/volg1/logv1
Jetzt wurde erst die virtuelle Partition, also das Logical Volume vergrößert (T als Abkürzung für Terrabyte wäre auch möglich). Zusätzlich muss man nun auch das darin enthaltene Dateisystem vergrößern. Zuvor muss es allerdings mit umount aus dem Verzeichnisbaum entfernt und noch mit e2fsck auf Fehler überprüft werden.
umount /lvm-test
e2fsck -f /dev/volg1/logv1
resize2fs /dev/volg1/logv1
Umgekehrt können Sie mit resize2fs das Dateisystem auch **verkleinern**, indem Sie die neue Größe in Blöcken (per Default 1024 Byte) angeben. Im Beispiel wird das Logical Volume wieder von 1300 Megabyte auf 1000 Megabyte verkleinert.
:!: Achtung: Erst das Dateisystem und danach das Logical Volume mit lvreduce verkleinern! Würden Sie erst das Logical Volume mit lvreduce verkleinern, gehen die darin enthaltenen Daten verloren!
umount /lvm-test
e2fsck -f /dev/volg1/logv1
resize2fs /dev/volg1/logv1 1000M
lvreduce -L1000M /dev/volg1/logv1
:!: Alternativ wäre eine relative Veränderung der Größe um einen bestimmten Speicherplatz möglich, dabei muss man aber genau rechnen (das nicht zu viel weggenommen wird), da resize2fs die Größe immer absolut haben möchte.
lvreduce -L-300M /dev/volg1/logv1
Um komfortabler zu arbeiten, gibt es das Kommando e2fsadm, das alle vorher beschriebenen Schritte wie lvextend, lvreduce, e2fsck und resize2fs zusammen ausführt. Wie der Name schon andeutet, funktioniert das Programm nur bei dem Dateisystem ext2. Falls das Programm nicht in Ihrer Distribution enthalten ist, können Sie es unter http://e2fsprogs.sourceforge.net/ downloaden. Das folgende Kommando vergrößert zum Beispiel das Logical Volume auf 1300 Megabyte. Zuvor muss es allerdings wieder mit umount ausgehängt werden.
umount /lvm-test
e2fsadm -L 1300M /dev/volg1/logv1
Bei der Verkleinerung verfährt man in gleicher Weise:
umount /lvm-test
e2fsadm -L 1000M /dev/volg1/logv1
==== PV vergrößern ====
Auch physikalische Volume (PV) können sich verändern (z. B. Image vergrößert).
**vergrößern**:
- alle Logical Volumes (LV) der Volume Group (VG) unmounten, wenn Swap-Partitionen als LVs enthalten sind, diese mit swapoff deaktivieren
- VG für die Vergrößerung inaktiv schalten: vgchange -a n VG-NAME
- mit cfdisk die LVM-Partition löschen und größer (mit Typ 8e) anlegen
- das PV auf die neue Größe einstellen: pvresize /dev/PV-DEVICE
- VG aktivieren: vgchange -a y VG-NAME
- wieder alles wie vorher mounten mit mount -a
==== PV aus VG entfernen ====
Wenn eine Volume-group (VG) aus mehreren physical volumes (PV) muss früher oder später auch mal eine PV aus der VG entfernt werden.
- Damit das funktioniert müssen zuerst alle logical volumes (LV) entfernt werden die von diesem PV abhängen. Die Daten sind damit natürlich auch gelöscht:lvremove -f LV_NAME
- anschließend wird das PV aus der VG abgemeldet:vgreduce VG_NAME PV_device
alternativ können (wenn das PV schon nicht mehr als device im system existiert) alle fehlenden PVs gelöscht werden:vgreduce --removemissing VG_NAME
==== PV zu einer VG hinzufügen ====
Wenn eine Volume group (VG) durch eine oder mehrere physical volumes (PV) erweitert werden soll (hier im Beispiel hat die neue PV ''/dev/sdd1'', diese muss vorher mit Typ 8e partioniert worden sein):
vgextend VG_NAME /dev/sdd1
Anschließend erscheint die Erfolgsmeldung:Volume group "VG_NAME" successfully extended
==== VG vergrößern und verkleinern ====
Da auch der Speicherplatz der Volume Group irgendwann belegt ist und man damit kein Logical Volume mehr anlegen oder **vergrößern** kann, ist es möglich, auch eine Volume Group mit dem Befehl ''vgextend'' zu **vergrößern**. Man muss nur eine beliebige freie Partition wie in Abschnitt "PV einrichten" als Physical Volume einrichten und es der Volume Group zufügen.
pvcreate /dev/sdb1
vgextend volg1 /dev/sdb1
Möchte man eine Volume Group **verkleinern**, kann man mit dem Befehl
vgreduce -a volg1
alle freien Physical Volumes aus der Volume Group entfernen. Um ein bestimmtes Physical Volume zu entfernen, muss man den genauen Pfad dessen angeben. Vorher kann man, falls erwünscht, mit dem Befehl pvdisplay -v überprüfen, ob das betreffende Physical Volume Daten enthält oder nicht.
pvdisplay -v /dev/hdb7
vgreduce volg1 /dev/hdb7
Voraussetzung ist immer, dass auf dem betreffenden Physical Volume keine Daten enthalten sind. Mit dem Kommando pvmove kann man vorher gegebenenfalls die Daten auf ein anderes Physical Volume verschieben.
==== Snapshots ====
Ein Snapshot ist eine Momentaufnahme der Daten eines Logical Volumes, das die vollständigen Daten enthält, aber seperat eingehängt werden kann.
Nach einer angegebenen Datenmenge von Unterschieden wird es ungültig.
=== Snapshot erstellen ===
Vorraussetzungen:
- lvm-System
- ausreichend freier Speicherplatz (extents) in der VG
Beispiel:
lvcreate -L 100G --snapshot -n backup /dev/vg_data/lv_file
* ''-L 100G'': nach 100 GB Unterschied zum aktuellen Datenstand wird der Snapshot ungültig.
* ''-n backup'': der Name des Snapshots
* ''/dev/vg_data/lv_file'': LV von dem ein Snapshot gemacht wird.
Der Snapshot kann nun wie ein normales Blockdevices benutzt werden u. a. sind **mounts** (hier schreibgeschützt) möglich:
mount -o ro /dev/vg_data/backup /media/snapshot
Die **aktuelle Belegung** anzuzeigen (Überprüfung: Wann wird der Snapshot ungültig?) :
lvdisplay /dev/mapper/vg_data-backup
--- Logical volume ---
LV Name /dev/vg_data/backup
VG Name vg_data
LV UUID 21eCPd-qrfR-THpQ-6DCc-SxXU-pbNh-hvYKS1
LV Write Access read/write
LV snapshot status active destination for /dev/vg_data/lv_file
LV Status available
# open 1
LV Size 5,86 TB
Current LE 1536340
COW-table size 100,00 GB
COW-table LE 25600
Allocated to snapshot 26,96%
Snapshot chunk size 4,00 KB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:3
Aktuell sind demnach 26,96% (von 100GB) schon veränderte Daten. Nachdem 100 GB veränderte Daten vorliegen, ist der Snapshot nicht mehr verfügbar. In diesem Fall wird er als "INACTIVE" angezeigt und lässt sich auch nicht mehr mounten:
--- Logical volume ---
LV Name /dev/vg_data/backup
VG Name vg_data
LV UUID 21eCPd-qrfR-THpQ-6DCc-SxXU-pbNh-hvYKS1
LV Write Access read/write
LV snapshot status INACTIVE destination for /dev/vg_data/lv_file
LV Status available
# open 0
LV Size 5,86 TB
Current LE 1536340
COW-table size 100,00 GB
COW-table LE 25600
Snapshot chunk size 4,00 KB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:3
=== snapshot löschen ===
lvremove /dev/vg_data/backup
Wenn der Befehl innerhalb eines Shellscriptes ausgeführt werden soll (oder die interaktive Sicherheitsabfrage unerwünscht ist) dann muss -f angefügt werden:
lvremove -f /dev/vg_data/backup
Mit folgendem Shellscript (abspeichern z. B. als ''lvm_snapshots_remove_all_inactive.sh'') werden alle inaktiven Snapshots gelöscht. Unbedingt erstmal im testmode ausführen und schauen ob alles funktioniert.
#!/bin/sh
error=0
# change to 0 after test!
testmode=1
inact_dev=`lvdisplay | grep -A 0 -B 5 'INACTIVE destination for ' | grep "LV Name" | sed s/"LV Name"// | sed "s/ //g"`
if [ -z $inact_dev ];then
if [ $testmode -eq 1 ];then
echo "Debug: no inactive devices found"
fi
exit
fi
for dev in "$inact_dev"; do
if [[ -e $dev ]]; then
if [ $testmode -eq 1 ];then
echo "Testmode activated, i would delete $dev (call: lvremove -f $dev)"
else
lvremove -f $dev
fi
if [ $? -ne 0 ]; then
echo "could not delete $dev"
error=1
fi
else
echo "not a valid device $dev"
fi
done
if [ $error -eq 1 ]; then
echo "there was an error at some point."
exit 1
else
exit 0
fi
===== Beispielkonfiguration /etc/mdadm.conf =====
# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#
# by default, scan all partitions (/proc/partitions) for MD superblocks.
# alternatively, specify devices to scan, using wildcards if desired.
DEVICE partitions
# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes
# automatically tag new arrays as belonging to the local system
HOMEHOST
# instruct the monitoring daemon where to send mail alerts
MAILADDR root
MAILFROM SERVER2 - mdadm
# mdadm --detail --scan >> /etc/mdadm/mdadm.conf :
ARRAY /dev/md0 metadata=1.2 name=server2:0 UUID=1a025409:07a31a54:3381e050:de36be19