Cómo recuperar el volumen lógico eliminado con lvremove

12

Estoy en CentOS 5.5 y estoy ejecutando Xen. Tengo un gran grupo de volúmenes en el que creo volúmenes lógicos al usar lvcreate. Hoy tuve un cliente que canceló su cuenta y luego cambió de opinión aproximadamente una hora más tarde. Desafortunadamente, ya había eliminado el LVM en el que residía su imagen Xen. (solo usando un lvremove estándar). No ha habido otra actividad LVM en este disco desde entonces (nada más agregado o eliminado). ¿Es posible "deshacer" un movimiento de lvre o recuperar un volumen lógico? Si es así, ¿cómo lo haría?

John P
fuente

Respuestas:

13

LVM hace una copia de seguridad de sus metadatos en /etc/lvm/backupy /etc/lvm/archive. En la parte superior de cada archivo, le indicará la hora / datos cuando se generó el archivo, por lo que es probable que tenga una copia de los metadatos anteriores tal como estaba antes de eliminar el LV. Creo que la copia de seguridad es automática cada vez que cambian los metadatos.

Lo siguiente puede ser peligroso y destructivo, así que tenga mucho cuidado y, si es posible, tenga una copia de seguridad completa.

El comando para restaurar estas copias de seguridad de metadatos de grupos de volúmenes es vgcfgrestore. Asegúrese de hacer una copia actual de la configuración de trabajo existente usando el vgcfgbackupcomando con el indicador -f para especificar un archivo diferente para la salida para que no altere ningún archivo que esté en / etc / lvm / backup o / etc / lvm / carpetas de archivo. Asegúrese de diferenciar la configuración actual con la configuración que desea restaurar para verificar que los únicos cambios que está a punto de aplicar son recrear el LV recientemente eliminado. Tener una copia de seguridad completa de sus datos probablemente tampoco sea una mala idea. También puede considerar ponerse en contacto con su proveedor de Linux para obtener soporte / orientación si tiene un contrato de soporte antes de continuar, ya que nunca tuve que hacerlo yo mismo.

Buena suerte.

3dinfluence
fuente
1
Leyendo más profundamente en el vgcfgrestore, parece que necesitaría apagar cada VM en esa caja antes de intentar esto, o arriesgarme a corromper toda la matriz. Parece que sus instrucciones funcionarían, así que acepto la respuesta, pero no vale la pena arriesgar los datos. Gracias
John P
@ John P Sí, pensé que con las máquinas virtuales y todo eso sería algo difícil de hacer en un entorno como ese. Supongo que una conclusión es que, en el futuro, tal vez el procedimiento para eliminar una cuenta debería incluir un período de 30 días sin eliminación.
3dinfluence
18

"¿Podría ser más específico acerca de encontrar EFROM y ETO en el archivo de respaldo? : 06 "

Ok, seré muy específico ... con la forma más simple de recuperar un volumen lógico.

Ejemplo:

1 - ¡He eliminado mi volumen lógico!

$ sudo lvremove /dev/vg1/debian.root

2 - Lo primero que debe hacer es buscar el archivo en /etc/lvm/archive/vg1_(xxxxx).vg. ¡Puedo hacer eso, solo mirando la fecha en que eliminé el volumen lógico!

$ sudo ls -l /etc/lvm/archive |more

3- ¡Lo encontré!

-rw------- 1 root root 16255 Mar 20 14:29 vg1_00223-235991429.vg
-rw------- 1 root root 16665 Mar 20 16:49 vg1_00224-748876387.vg
-rw------- 1 root root 17074 Mar 20 16:49 vg1_00225-931666169.vg
-rw------- 1 root root 17482 Mar 20 16:50 vg1_00226-1238302012.vg
-rw------- 1 root root 18081 **Mar 20 21:57 vg1_00227-2048533959.vg**

Fecha en que hice el lvremove !!! ... fue hace unos minutos ...

4 - ¡Veamos el archivo!

$ sudo head /etc/lvm/archive/vg1_00227-2048533959.vg
*# Generated by LVM2 version 2.02.95(2) (2012-03-06): Thu Mar 20 21:57:58 2014
contents = "Text Format Volume Group"
version = 1
description = **"Created *before* executing 'lvremove /dev/vg1/debian.root'"**
creation_host = "server"    # Linux server 3.8.0-35-generic #50-Ubuntu SMP Tue Dec 3 01:24:59 UTC 2013 x86_64
creation_time = 1395363478  # Thu Mar 20 21:57:58 2014*

5 - ¡Haz una prueba antes de recuperarla!

$ sudo vgcfgrestore vg1 --test -f /etc/lvm/archive/vg1_00227-2048533959.vg
Test mode: Metadata will NOT be updated and volumes will not be
(de)activated.   **Restored volume group vg1**

6 - Ok, ahora repite la línea de comando, sin el (--test)

$ sudo vgcfgrestore vg1 -f /etc/lvm/archive/vg1_00227-2048533959.vg
**Restored volume group vg1**

7 - ¡Compruébalo!

$ sudo lvscan |grep debian
ACTIVE            '/dev/vg1/debian.root' [7,81 GiB] inherit

8 - Si la lógica no estaba activa, ¡hazlo!

$ sudo lvchange -a y /dev/vg1/debian.root 

Es todo

¡Espero que esto pueda ayudar a otras personas que buscan esta solución!

Rafael Cristaldo
fuente
5

Lo más fácil de recuperar de lvremove (suponiendo que no haya escrito en la medida en que residía el LV) es:

Simplemente encuentre la copia de seguridad de sus metadatos en / etc / lvm / archive y descubra

a) en qué extensión residía el LV (EFROM, ETO)
b) en qué PV residía su LV y cuál se extiende en ese PV que estaba usando (PFROM, PTO)

Después de tener esta información, crea un nuevo LV del mismo tamaño exactamente en el mismo PV que se extiende sin borrar los primeros 8kB del LV:

lvcreate --extents EFROM-ETO --zero n --name customer007 YOUR-VG-NAME /dev/yourpv:PFROM-PTO
termomán
fuente
1
¿Podría ser más específico al encontrar EFROM y ETO en el archivo de copia de seguridad? Todos los lv tienen un "start_extend" de 0 en mi archivo de copia de seguridad, así que estoy un poco perdido :) ¡Gracias!
3

(Como respondió Thermoman anteriormente), la forma más fácil de recrear un volumen LVM eliminado es crearlo con lvcreate sin poner a cero y asegurarse de que esté en la misma posición en el disco. (El comando de la respuesta de Thermoman no funcionó).

Verifique el tamaño y la posición del volumen lógico eliminado tal como estaban antes de la eliminación leyendo los archivos en / etc / lvm / archive. El tamaño del volumen está en extent_countel segment1(o la suma de segment*/extent_countlos valores si tuviera varias extensiones). La posición está en la stripessección después del alias de volumen físico (por ejemplo pv0).

Por ejemplo, la sección de volumen podría verse así:

    physical_volumes {
            pv0 {
                    device = "/dev/somedisk" # Hint only
                    ...
            }
    }

    logical_volumes {
            ...
            example {
                    ...
                    segment_count = 1

                    segment1 {
                            start_extent = 0
                            extent_count = 1024     # 4 Gigabytes

                            type = "striped"
                            stripe_count = 1        # linear

                            stripes = [
                                    "pv0", 30720
                            ]
                    }
            }
            ...
    }

El tamaño de este examplevolumen era 1024 y estaba ubicado en / dev / somedisk a partir de la extensión 30720.

Calcule la última extensión como inicio + tamaño -1 = 30720 + 1024 - 1 = 31743. Para recrear ese problema de volumen siguiente:

lvcreate --extents 1024 --zero n --name example vgname /dev/somedisk:30720-31743
Tuomas
fuente
¡Esta respuesta me salvó la noche de ayer! Tenía un XenServer roto que estaba eliminando un LV incorrecto debido a un error de API ...: o
Elektordi
2

Tuve una situación similar. Tenía todos los PV que contenían los LV deseados, pero mi VG mostraba falta de PV y 0 LV. Me recuperé haciendo lo siguiente:

  1. Hazte root
  2. Ejecutar pvspara recopilar UUID para todas las unidades.
  3. Revise los archivos en / etc / lvm / archive hasta que encuentre uno que enumere todos los mismos UUID.
  4. Haga una copia de trabajo del archivo de configuración archivado y comience a editar.
  5. En la physical_volumessección, configure las device =líneas para que coincidan con el dispositivo / UUID actual que informa pvs, borre las "MISSING"marcas y elimine las pvNsecciones que realmente faltaban.
  6. En la logical_volumessección, elimine cualquier listado que tenga franjas en las pvNsecciones que ya no existían.
  7. Eso fue todo, luego corrí

    vgcfgrestore --test vg -f /root/dangerously_edited.vg

  8. Cuando eso funcionó, volví a correr sin la --testopción.

Logré mi situación particular extendiendo el VG con PV sdg y sdh. Luego creé un nuevo LV, especificando /dev/sdg /dev/sdhen la línea de comando para que supiera que el nuevo LV estaba en esas unidades. Luego moví solo esas unidades a una nueva máquina. La vieja máquina estaba muy molesta por las unidades faltantes, y cuando las quité por la fuerza, también eliminó TODOS los LV. Gorrón.

La próxima vez, por supuesto, crearé un nuevo VG para evitar este problema.

norte
fuente