====== 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]] ===== 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