Come recuperare il volume logico cancellato con lvremove


12

Sono su CentOS 5.5 e sto eseguendo Xen. Ho un grande gruppo di volumi che creo volumi logici usando lvcreate. Oggi un cliente ha cancellato il suo account, quindi ho cambiato idea circa un'ora dopo. Purtroppo avevo già rimosso l'LVM su cui risiedeva l'immagine di Xen. (solo usando un lvremove standard). Da allora non ci sono state altre attività LVM su questo disco (nient'altro aggiunto o eliminato). È possibile "annullare" un lvremove o ripristinare il volume logico? Se è così, come potrei farlo?

Risposte:


13

LVM esegue il backup dei suoi metadati su /etc/lvm/backupe /etc/lvm/archive. Nella parte superiore di ogni file ti dirà l'ora / i dati quando il file è stato generato, quindi è probabile che avrai una copia dei metadati più vecchi com'era prima di eliminare LV. Credo che il backup sia automatico ogni volta che cambiano i metadati.

Quanto segue può essere pericoloso e distruttivo, quindi fai molta attenzione e, se possibile, disponi di un backup completo.

Il comando per ripristinare questi backup dei metadati del gruppo di volumi è vgcfgrestore. Assicurati di fare una copia corrente della configurazione di lavoro esistente usando il vgcfgbackupcomando con il flag -f per specificare un file diverso per l'output in modo da non alterare alcun file che si trova in / etc / lvm / backup o / etc / lvm / cartelle di archivio. Assicurati di differenziare la configurazione corrente con la configurazione che desideri ripristinare per verificare che le uniche modifiche che stai per applicare siano quella di ricreare il LV eliminato di recente. Avere un backup completo dei dati probabilmente non è neanche una cattiva idea. Potresti anche considerare di contattare il tuo fornitore Linux per supporto / guida se hai un contratto di supporto prima di procedere poiché non ho mai dovuto farlo da solo.

In bocca al lupo.


1
Leggendo più a fondo nel vgcfgrestore, sembra che dovrei chiudere tutte le macchine virtuali su quella scatola prima di tentare questo, o rischiare di corrompere l'intero array. Sembra che le tue istruzioni funzionino, quindi accetto la risposta, ma i dati non valgono il rischio. Grazie
John P

@John P Sì, ho pensato che le macchine virtuali sarebbero state una cosa difficile da fare in un ambiente del genere. Immagino che uno di questi aspetti sia che in futuro la procedura per la rimozione di un account dovrebbe comportare un periodo di 30 giorni senza cancellazione.
3dinfluenza

18

"Potresti per favore essere più preciso nel trovare EFROM ed ETO dal file di backup? Tutti i LV hanno un" start_extend "da 0 nel mio file di backup, quindi sono un po 'perso :) Grazie! - user186975 24 agosto 13 alle 13 : 06 "

Ok, sarò molto specifico ... con il modo più semplice per ripristinare un volume logico.

Esempio:

1 - Ho rimosso il mio volume logico!

$ sudo lvremove /dev/vg1/debian.root

2 - La prima cosa da fare è cercare il file di archivio in /etc/lvm/archive/vg1_(xxxxx).vg. Posso farlo, solo guardando la data in cui ho rimosso il volume logico!

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

3- L'ho trovato!

-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**

Data in cui ho fatto il lvremove !!! ... è stato un minuto fa ..

4 - Vediamo il file!

$ 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 - Fai un test prima di recuperarlo!

$ 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, ora ripeti la riga di comando, senza il (--test)

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

7 - Controllalo!

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

8 - Se la logica non era attiva, fallo!

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

È tutto

Spero che questo possa aiutare altre persone che cercano questa soluzione!


5

La cosa più semplice da recuperare da lvremove (supponendo che tu non abbia scritto nella misura in cui risiedeva LV) è:

Basta trovare il backup dei metadati in / etc / lvm / archive e capire

a) quale estensione in cui risiedeva il LV (EFROM, ETO)
b) su quali PV risiedeva sul tuo LV e che si estende su quel PV che stava utilizzando (PFROM, PTO)

Dopo aver ottenuto queste informazioni, si crea un nuovo LV della stessa dimensione esattamente sullo stesso PV si estende senza cancellare i primi 8kB del LV:

lvcreate --extents EFROM-ETO --zero n --name customer007 YOUR-VG-NAME /dev/yourpv:PFROM-PTO

1
Potresti essere più specifico nel trovare EFROM ed ETO dal file di backup? Tutti i LV hanno un "start_extend" da 0 nel mio file di backup, quindi sono un po 'perso :) Grazie!

3

(Come risposto in precedenza da thermoman) il modo più semplice per ricreare un volume LVM cancellato consiste nel crearlo con lvcreate senza azzerare e assicurarsi che si trovi nella stessa posizione sul disco. (Il comando dalla risposta di thermoman non ha funzionato.)

Controllare le dimensioni e la posizione del volume logico eliminato come erano prima della cancellazione leggendo i file in / etc / lvm / archive. La dimensione del volume è extent_countdel segment1(o somma segment*/extent_countvalori se aveva diverse estensioni). La posizione è nella stripessezione dopo l'alias del volume fisico (ad es pv0.).

Ad esempio, la sezione del volume potrebbe apparire così:

    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
                            ]
                    }
            }
            ...
    }

La dimensione di questo examplevolume era 1024 e si trovava su / dev / somedisk a partire dall'estensione 30720.

Calcola l'ultima estensione come inizio + dimensione -1 = 30720 + 1024 - 1 = 31743. Per ricreare il problema relativo al volume seguente:

lvcreate --extents 1024 --zero n --name example vgname /dev/somedisk:30720-31743

Questa risposta mi ha appena salvato la notte! Ho avuto un XenServer rotto che stava cancellando LV errato a causa di un errore API ...: o
Elektordi

2

Ho avuto una situazione simile. Avevo tutti i PV che contenevano i LV desiderati, ma il mio VG mostrava PV mancanti e 0 LV. Mi sono ripreso facendo quanto segue:

  1. Diventa root
  2. Esegui pvsper raccogliere gli UUID per tutte le unità.
  3. Esamina i file in / etc / lvm / archive fino a quando non ne trovo uno che elenca tutti gli stessi UUID.
  4. Crea una copia funzionante del file di configurazione archiviato e avvia la modifica.
  5. Nella physical_volumessezione, imposta le device =linee in modo che corrispondano al dispositivo / UUID corrente riportato da pvs, cancella eventuali "MISSING"flag e rimuovi tutte le pvNsezioni che mancavano effettivamente.
  6. Nella logical_volumessezione, rimuovere tutti gli elenchi con strisce sulle pvNsezioni che non esistevano più.
  7. Ecco fatto, poi ho corso

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

  8. Quando ha funzionato, ho eseguito di nuovo senza l' --testopzione.

Ho raggiunto la mia situazione particolare estendendo il VG con PVs SDG e SDH. Quindi ho creato un nuovo LV, specificando /dev/sdg /dev/sdhsulla riga di comando in modo da sapere che il nuovo LV era su quelle unità. Quindi ho spostato solo quelle unità su una nuova macchina. La vecchia macchina era molto turbata per le unità mancanti e quando le ho rimosse forzatamente, ha rimosso anche TUTTI i LV. Bummer.

La prossima volta, ovviamente, creerò un nuovo VG per evitare questo problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.