Volumen LVM con MBR corrupto: ¿cómo montar y recuperar datos de él?

3

Soy nuevo en LVM y particionamiento en general, y entonces, estoy en una situación aquí.

La situación:

Accidentalmente sobrescribí MBR de un disco LVM creado por Fedora 16.

Ahora, todo lo demás en este disco está intacto; solo el MBR ha sido dañado (y eso también, solo los primeros 446 de sus 512 bytes). Había corrompido el MBR al emitir accidentalmente:

$ dd if=/the/wrong/446-byte-file.txt of=/dev/sda

Este disco (con MBR corrupto), que inicialmente era / dev / sda en el Sistema A, ahora está conectado a mi sistema actual, el Sistema B, como un disco secundario /dev/sdb, con el propósito de recuperar el sistema de archivos / datos. Actualmente no se puede montar en el Sistema B.

Aquí está la fdisk -lsalida en el Sistema B:

$ fdisk -l
Disk /dev/sda: 250.1 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders, total 488397168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x8e678e67

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048   475813887   237905920   83  Linux
/dev/sda2       475813888   488396799     6291456   82  Linux swap / Solaris

Disk /dev/sdb: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders, total 156301488 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *        2048     1026047      512000   83  Linux
/dev/sdb2         1026048   156301311    77637632   8e  Linux LVM

Pregunta: Con / dev / sda ejecutando una configuración saludable y no LVM de Fedora 16, ¿cómo puedo montar / dev / sdb (con MBR corrupto) en algún lugar dentro del Sistema B para poder recuperar todos los datos? (Los datos, por cierto, se almacenan en un sistema de archivos ext4 dentro).

Lo que he probado hasta ahora:

a) Emití pvsy obtuve esto:

(¡Observe cómo la columna VG está vacía!)

$ pvs
  PV         VG   Fmt  Attr PSize  PFree 
  /dev/sdb2       lvm2 a--  74.04g 74.04g

b) emití pvscan, obtuve esto:

$ pvscan
  PV /dev/sdb2                      lvm2 [74.04 GiB]
  Total: 1 [74.04 GiB] / in use: 0 [0   ] / in no VG: 1 [74.04 GiB]

c) Tengo el contenido /etc/lvm/backup/vg_XYZdisponible de una copia de seguridad anterior. Pero no sé cómo inferir / construir el Nombre del Volumen y las Rutas del Volumen a partir de este archivo (Tenga en cuenta que, en este archivo, / dev / sda2 es la partición de interés que ahora se ha convertido en / dev / sdb2 en el sistema actual, Sistema B ):

# Generated by LVM2 version 2.02.84(2) (2011-02-09): Tue Oct 25 22:10:55 2011

contents = "Text Format Volume Group"
version = 1

description = "Created *after* executing 'vgchange -a y --sysinit'"

creation_host = "XYZ"   # Linux XYZ 2.6.38.6-26.rc1.fc15.i686.PAE #1 SMP Mon May 9 20:36:50 UTC 2011 i686
creation_time = 1319560855      # Tue Oct 25 22:10:55 2011

vg_XYZ {
        id = "WN8593-xRnx-dn29-rcpb-tRAm-Bs5R-93DGWw"
        seqno = 3
        status = ["RESIZEABLE", "READ", "WRITE"]
        flags = []
        extent_size = 65536             # 32 Megabytes
        max_lv = 0
        max_pv = 0
        metadata_copies = 0

        physical_volumes {

                pv0 {
                        id = "voQHGq-9m5t-u39a-UBWP-1qKM-sS4M-t3EPYG"
                        device = "/dev/sda2"    # Hint only

                        status = ["ALLOCATABLE"]
                        flags = []
                        dev_size = 155275264    # 74.041 Gigabytes
                        pe_start = 2048
                        pe_count = 2369 # 74.0312 Gigabytes
                }
        }

        logical_volumes {

                lv_swap {
                        id = "Osi18q-409G-iG1s-Mdb2-00Lt-wtQV-WpF2mN"
                        status = ["READ", "WRITE", "VISIBLE"]
                        flags = []
                        segment_count = 1

                        segment1 {
                                start_extent = 0
                                extent_count = 126      # 3.9375 Gigabytes

                                type = "striped"
                                stripe_count = 1        # linear

                                stripes = [
                                        "pv0", 0
                                ]
                        }
                }

                lv_root {
                        id = "Wc8qdx-sYKi-qFeM-Bv48-YvZC-ClGU-VrYl4W"
                        status = ["READ", "WRITE", "VISIBLE"]
                        flags = []
                        segment_count = 1

                        segment1 {
                                start_extent = 0
                                extent_count = 2243     # 70.0938 Gigabytes

                                type = "striped"
                                stripe_count = 1        # linear

                                stripes = [
                                        "pv0", 126
                                ]
                        }
                }
        }
}

Su pronta ayuda sería muy apreciada, de lo contrario, estoy en un verdadero problema.

Muchas gracias de antemano...

/ HS

Acosar
fuente
¿No podría simplemente dd if=/the/right/446bytefile of=/dev/sdb, o está perdido en / dev / sdb y no puede acceder a él?
Rob
@Rob No tengo el archivo correcto. :-( Desearía haberlo hecho.
Harry

Respuestas:

3

Pruebe los siguientes pasos en orden.


EDITAR (por Harry)

  1. Tuve que hacer un vgcfgrestorepara que el resto de los comandos enumerados a continuación (comenzando con vgscan) tuvieran efecto.

    vgcfgrestore vg_XYZ

  2. También tuve que an e2fsck -y /dev/vg_XYZ/lv_rootpara que la montura tuviera éxito.

Detalles descritos en esta publicación comp.os.linux.setup aquí .


Como ya ha hecho un pvscan, proceda a vgscan:

vgscan --partial --mknodes --verbose

Con suerte, que debe descubrir el grupo de volúmenes vg_XYZen /dev/sdb2, y crear los nodos de dispositivos necesarios en /dev.

A continuación, haga que el grupo de volúmenes esté disponible:

vgchange -a y vg_XYZ

Sigue eso con un lvscan:

lvscan --verbose

Y finalmente, haga que el volumen lógico esté disponible:

lvchange -a y vg_XYZ/lv_root

Ahora debería poder montar en lv_rootalgún lugar para acceder a sus datos, p. Ej.

mkdir -p /mnt/rescue
mount -t ext4 -o ro /dev/vg_XYZ/lv_root /mnt/rescue

¡Buena suerte!

Steven Monday
fuente
El vgscan --partial --mknodes --verbosedio un 'No hay grupos de volúmenes encontrados'.
Harry
1
Dang ¿Hace vgimport --verbose vg_XYZalgo?
Steven lunes
Da: Grupo de volumen "vg_XYZ" no encontrado
Harry
2

la Parted Magic LiveCD / USB tiene todo tipo de herramientas que podrían ser capaces de recuperar el MBR desde ese disco. testdiskes uno , y sé que hay otros. Me ha salvado la piel varias veces de comandos mal escritos, hay una razón por la cual ddes apodado disk destroyer.

Robar
fuente
1

Es posible que pueda crear el dispositivo manualmente utilizando los números que se encuentran en el archivo de copia de seguridad.

dmsetup create foo --table "0 146997248 linear /dev/sdb2 8259584"
mount -o ro /dev/mapper/foo /mnt

Los números se calculan como:

146997248 = extent_count * extent_size = 2243 * 65536
8259584 = pe_start + 126 * extent_size = 2048 + 126 * 65536

Esto no se ha probado. Si la copia de seguridad no proporciona una imagen precisa de la configuración actual (o si me equivoqué en los cálculos, los he reproducido por analogía con la configuración local en lugar de una comprensión suficientemente profunda de LVM), entonces no funcionará .

Richard Kettlewell
fuente
El dmsetupcomando falla diciendo "Número incorrecto de argumentos". Estoy usando Fedora 16. Probé la versión del comando table_file (colocando '0 146997248 linear / dev / sdb2 8259584' table.txty especificando dmsetup create foo --table table.txt), y obtuve "Formato no válido en la línea 1 de la tabla. El comando falló".
Harry
1
Oh, lo siento, el argumento de la tabla debería citarse. Lo he actualizado.
Richard Kettlewell
El mountcomando da "monte: debe especificar el tipo de sistema de archivos".
Harry
1
Esa no es una señal muy alentadora, ya que si en realidad hay un sistema de archivos, el montaje generalmente puede determinar el tipo automáticamente. La sintaxis a usar para decirlo explícitamente se da en la respuesta de Steven, de todos modos.
Richard Kettlewell
Cuando lo intenté, decía: "montar: tipo fs incorrecto, mala opción, superbloque incorrecto en / dev / mapper / foo, falta página de código o programa auxiliar u otro error. En algunos casos se encuentra información útil en syslog - trydmesg | cola más o menos "¿Qué hacer ahora?
Harry