linux:lvm

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
linux:lvm [2018/04/03 15:57] – [LVM deaktivieren] stlinux:lvm [2020/01/15 11:37] (aktuell) st
Zeile 1: Zeile 1:
 +====== 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.
 +<code bash>
 +pvscan -v
 +vgscan -v
 +vgchange -ay</code>
 +
 +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)
 +<code bash>vgchange -a n /dev/volg1</code>
 +
 +
 +==== PV löschen  ====
 +
 +<code bash>vgremove /dev/pvdevice</code>
 +(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: <code bash>vgchange -a n VG-NAME</code>
 +  - mit cfdisk die LVM-Partition löschen und größer (mit Typ 8e) anlegen
 +  - das PV auf die neue Größe einstellen: <code bash>pvresize /dev/PV-DEVICE</code>
 +  - VG aktivieren: <code bash>vgchange -a y VG-NAME</code>
 +  - wieder alles wie vorher mounten mit <code bash>mount -a</code>
 +
 +
 +==== 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:<code bash>lvremove -f LV_NAME</code>
 +  - anschließend wird das PV aus der VG abgemeldet:<code bash>vgreduce VG_NAME PV_device</code> alternativ können (wenn das PV schon nicht mehr als device im system existiert) alle fehlenden PVs gelöscht werden:<code bash>vgreduce --removemissing VG_NAME</code>
 +
 +
 +==== 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):
 +
 +<code bash>vgextend VG_NAME /dev/sdd1</code> Anschließend erscheint die Erfolgsmeldung:<file>Volume group "VG_NAME" successfully extended</file>
 +
 +==== 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
 +
 +<file>
 +  --- 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
 +</file>
 +
 +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:
 +
 +<file>
 +  --- 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
 +</file>
 +
 +
 +
 +=== 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. 
 +
 +<code bash>
 +#!/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
 +</code>
 +
 +
 +===== Beispielkonfiguration /etc/mdadm.conf =====
 +
 +<file>
 +# 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 <system>
 +
 +# 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
 +</file>