lvconvert –merge / defekte LVM volumes retten

Ein interessantes Feature in den neuen LVM- Versionen ist das Zusammenfügen von LVM volumes mit Hilfe des Befehls “lvconvert –merge” und daraus erstellten snapshots.

Mikolas Patocka schrieb hierzu in der Ankündigung des Features (http://kerneltrap.org/mailarchive/linux-kernel/2008/8/4/2812934)

The snapshot merging allows you to merge snapshot content back into the
original device. The most useful use for this feature is the possibility
to rollback state of the whole computer after failed package upgrade,
administrator’s error or so.

Und die man- page von lvconvert schreibt:

–merge

Merges a snapshot into its origin volume. If both the origin and snapshot volume are not open the merge will start immediately. Otherwise, the merge will start the first time either the origin or snapshot are activated and both are closed. Merging a snapshot into an origin that cannot be closed, for example a root filesystem, is deferred until the next time the origin volume is activated. When merging starts, the resulting logical volume will have the origin’s name, minor number and UUID. While the merge is in progress, reads or writes to the origin appear as they were directed to the snapshot being merged. When the merge finishes, the merged snapshot is removed. Multiple snapshots may be specified on the commandline or a @tag may be used to specify multiple snapshots be merged to their respective origin.

Ein bestehender Snapshot kann also mit “lvconvert — merge” wieder in das volume integriert werden. Dabei wird der Datenstand des Snapshots auf dem volume wieder her gestellt und der Snapshot im Anschluß aufgelöst. (Praktisch ein “rollback” zum Zeitpunkt des Snapshots). Das gefährliche an dem Befehl ist allerdings die fehlende Unterstützung in älteren Kernel- Versionen. So wird auch im (noch) aktuellen Debian Squeeze (Kernel Version 2.6.32) das Zusammenführen von volume und snapshot nicht unterstützt. Ob der aktuell eingesetzte Kernel das Feature unterstützt kann man leicht mit dem Befehl “dmsetup targets” heraus finden. Wenn hier die Augabe von “snapshot-merge” auftaucht, sollte es keine Probleme geben.

Fehlende Unterstützung von LVM merge auch in aktuellen Distributionen

Das große Problem an der eventuell fehlenden Unterstützung ist allerdings nicht nur, dass dieses hilfreiche Feature nicht verwendet werden kann, sondern auch, dass beim Versuch der Zusammenführung die bestehenden LVM- Volumes beschädigt werden. lvconvert gibt in diesem Fall eine Fehlermeldung mit Hinweis auf den fehlenden Kernel- Support aus (“Can’t expand LV test: snapshot target support missing from kernel?”) und bricht die Operation scheinbar ab. Leider wurden zu diesem Zeitpunkt schon die Metadaten angepasst – und weil diese erst beim aktivieren der volumes wieder benötigt werden, macht sich das oftmals erst beim nächsten Neustart bemerkbar.

Damit die Daten auf den LVM volumes wieder gelesen werden können, müssen die Metadaten wieder hergestellt werden.

Wiederherstellung defekter LVM volumes

Zuerst benötigen wir die genaue Lage der volumes in der volume group:


server /home # lvs -o +seg_pe_ranges
...
sr1-ucspdc-root vg0 Owi-d- 1.00g /dev/md0:2580-2587
sr1-ucspdc-srv vg0 Owi-d- 20.00g /dev/md0:3180-3339
sr1-ucspdc-usr vg0 Owi-d- 5.00g /dev/md0:2532-2571
sr1-ucspdc-var vg0 Owi--- 5.00g /dev/md0:1844-1883
...

Diese Partitionen lassen sich im aktuellen Zustand nicht mounten. das “d”- Flag steht für “device present without tables”

Um die Metadaten neu zu erstellen, müssen die bestehenden LVM devices gelöscht werden. Wenn die Metadaten später korrekt wieder her gestellt werden, sollten dabei keine Daten verloren gehen. Eine vorherige Datensicherung ist wie immer wenn an Dateisystemen (oder wie in diesem Fall noch darunter liegenden Schichten) gearbeitet wird essentiell!

lvremove /dev/vg0/sr1-ucspdc-root
lvremove /dev/vg0/sr1-ucspdc-srv
lvremove /dev/vg0/sr1-ucspdc-usr
lvremove /dev/vg0/sr1-ucspdc-var

Damit die bestehenden Daten nicht verloren gehen, müssen die LVM volumes an exakt der selben Stelle wieder angelegt werden. Hierzu können die Angaben zu den Extends (siehe oben) verwendet werden. Wichtig ist auch die Verwendung des Schalters “–zero n”. Dieser verhindert, dass die bestehenden Daten beim initialisieren der neuen LVM volumes überschrieben werden

lvcreate --zero n -L 1G -n sr1-ucspdc-root vg0 /dev/md0:2580-2587
lvcreate --zero n -L 20G -n sr1-ucspdc-srv vg0 /dev/md0:3180-3339
lvcreate --zero n -L 5G -n sr1-ucspdc-usr vg0 /dev/md0:2532-2571
lvcreate --zero n -L 5G -n sr1-ucspdc-var vg0 /dev/md0:1844-1883

Im Anschluß können die LVM volumes wieder aktiviert und normal verwendet werden. Wenn die Informationen zu den LVM extends der Partitionen bekannt sind, köbnen auf diesem Wege z. B. auch versehentlich gelöschte LVM devices ohne Datenverlust wieder hergestellt werden.

Quellen

  • http://www.tcpdump.com/kb/os/linux/lvm-attributes/intro.html
  • http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=612439
  • man- pages: lvs, lvcreate

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.