miércoles, 12 de julio de 2017

Recuperar disco LVM

Hoy he tenido un problema con un disco LVM, que tras una reinstalación del sistema (sin haber tocado ese disco) no me lo reconocía como LVM así que no podía recuperar las copias de seguridad. Trasteando, rezando y con un par de cafés, he conseguido recuperar la partición y restaurar los datos en el Proxmox.

Resulta que hay una carpeta con copias de seguridad de la información de los LVMs por si pasa algo como esto en /etc/lvm/backup y /etc/lvm/archive. Si somos capaces de tener esos archivos (bien porque se ha roto sin haber reinstalado o bien porque tenemos una copia) es relativamente sencillo:

pvcreate --uuid "XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXX" --restorefile /etc/lvm/archive/vg01_0000X-XXXXXXXXX.vg /dev/sdd1

Eligiendo el archivo correspondiente a nuestra partición a recuperar que sea más reciente.

Ahora bien, como yo he reinstalado el sistema, esa carpeta la perdí. Rebuscando información para ver como recuperar la información para poder hacer ese archivo a mano, encontré en los foros de ubuntu una ayuda (no tengo ahora mismo el enlace pero si alguna vez lo lees, ¡gracias!). Con el comando string podemos ver un volcado en texto plano de algunos datos del disco. En mi caso, no se si siempre es así, los datos correspondientes al LVM me aparecían al principio y por desgracia no estaban completos, aunque tuve suerte ya que lo que necesitaba sí estaba.

En mi caso tenía una VG llamado vg1 con dos LVMs: "backup" y "data". En este caso la que me importaba recuperar era backup. En mi caso esta es la info (editada) que conseguí recuperar:

LABELONE
LVM2 001bIgag30QmYiGlP3Z3yB4WdBP0983IAKnG
 LVM2 x[5A%r0N*>
vg1 {
id = "XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXX"
seqno = 4
format = "lvm2"
status = ["RESIZEABLE", "READ", "WRITE"]
flags = []
extent_size = 8192
max_lv = 0
max_pv = 0
metadata_copies = 0
physical_volumes {
pv0 {
id = "YYYYYY-YYYY-YYYY-YYYY-YYYY-YYYY-YYYYYY"
device = "/dev/sdd1"
status = ["ALLOCATABLE"]
flags = []
dev_size = 7814035087
pe_start = 2048
pe_count = 953861
logical_volumes {
backup {
id = "ZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZ"
status = ["READ", "WRITE", "VISIBLE"]
flags = []
creation_host = "localhost"
creation_time = 1463086567
segment_count = 1
segment1 {
start_extent = 0
extent_count = 681575
type = "striped"
stripe_count = 1
stripes = [
"pv0", 262144

Así que me generé un fichero en /etc/lvm/archive con esos datos:

contents = "Text Format Volume Group"
version = 1

description = "Created *before* executing 'lvconvert --type thin-pool pve/data'"

creation_host = "localhost"  # Linux sd16 4.10.15-1-pve #1 SMP PVE 4.10.15-15 (Fri, 23 Jun 2017 08:57:55 +0200) x86_64
creation_time = 1499844119      # Wed Jul 12 09:21:59 2017

vg1 {
        id = "XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXX"
        seqno = 4
        format = "lvm2"                 # informational
        status = ["RESIZEABLE", "READ", "WRITE"]
        flags = []
        extent_size = 8192              # 4 Megabytes
        max_lv = 0
        max_pv = 0
        metadata_copies = 0

        physical_volumes {

                pv0 {
                        id = "YYYYYY-YYYY-YYYY-YYYY-YYYY-YYYY-YYYYYY"
                        device = "/dev/sdd1"     # Hint only

                        status = ["ALLOCATABLE"]
                        flags = []
                        dev_size = 7814035087   # 893.626 Gigabytes
                        pe_start = 2048
                        pe_count = 953861       # 893.625 Gigabytes
                }
        }

        logical_volumes {

                backup {
                        id = "ZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZ"
                        status = ["READ", "WRITE", "VISIBLE"]
                        flags = []
                        creation_time = 1463086567      # 2017-07-12 08:10:32 +0200
                        creation_host = "localhost"
                        segment_count = 1
           
                        segment1 {
                                start_extent = 0
                                extent_count = 681575     # 15 Gigabytes

                                type = "striped"
                                stripe_count = 1        # linear

                                stripes = [
                                        "pv0", 262144
                                ]
                        }
                }

        }

}

Una vez hechora podemos ejecutar:

pvcreate --uuid "XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXX" --restorefile /etc/lvm/archive/vg01_0000X-XXXXXXXXX.vg /dev/sdd1

Y restaurar y activar el VG:

vgcfgrestore -f /etc/lvm/archive/vg01_0000X-XXXXXXXXX.vg vg1
vgchange -ay vg1


Que ya me dejó en mi caso el LV backup disponible para restaurar, ¡Yay!