Como recuperar o volume lógico excluído com lvremove


12

Estou no CentOS 5.5 e estou executando o Xen. Eu tenho um grande grupo de volumes em que crio volumes lógicos usando o lvcreate. Hoje, um cliente cancelou a conta e mudou de ideia cerca de uma hora depois. Infelizmente, eu já havia removido o LVM em que sua imagem Xen residia. (apenas usando um lvremove padrão). Não houve nenhuma outra atividade LVM neste disco desde então (nada mais foi adicionado ou excluído). É possível "desfazer" um lvremove ou recuperar um volume lógico? Se sim, como eu faria isso?

Respostas:


13

O LVM faz backup de seus metadados para /etc/lvm/backupe /etc/lvm/archive. Na parte superior de cada arquivo, ele informará a hora / dados em que o arquivo foi gerado; portanto, é provável que você tenha uma cópia dos metadados mais antigos como antes de excluir o LV. Acredito que o backup seja automático sempre que os metadados forem alterados.

O seguinte pode ser perigoso e destrutivo, portanto, tenha muito cuidado e, se possível, faça um backup completo.

O comando para restaurar esses backups de metadados do grupo de volumes é vgcfgrestore. Certifique-se de fazer uma cópia atual da configuração de trabalho existente usando o vgcfgbackupcomando com o sinalizador -f para especificar um arquivo diferente para a saída, para que você não altere nenhum arquivo que esteja no / etc / lvm / backup ou / etc / lvm / pastas de arquivamento. Certifique-se de diferenciar a configuração atual com a configuração que deseja restaurar para verificar se as únicas alterações que você está prestes a aplicar são recriar o LV excluído recentemente. Ter um backup completo de seus dados provavelmente também não é uma má idéia. Você também pode considerar entrar em contato com o fornecedor do Linux para obter suporte / orientação se tiver um contrato de suporte antes de prosseguir, pois eu nunca tive que fazer isso sozinho.

Boa sorte.


1
Lendo mais profundamente no vgcfgrestore, parece que eu precisaria desligar todas as VMs dessa caixa antes de tentar isso ou arriscar corromper toda a matriz. Parece que suas instruções funcionariam, por isso estou aceitando a resposta, mas os dados não valem o risco. Graças
John P

@ John P Sim, eu meio que percebi com as VMs e tudo isso seria algo difícil de fazer em um ambiente como esse. Acho que um exemplo é que, no futuro, talvez o procedimento para remover uma conta deva envolver um período de 30 dias sem exclusão.
3dinfluence

18

"Você poderia, por favor, ser mais específico sobre encontrar EFROM e ETO a partir do arquivo de backup? Todo o lv tem um" start_extend "de 0 no meu arquivo de backup, então estou um pouco perdido :) Obrigado! : 06 "

Ok, serei muito específico ... com a maneira mais simples de recuperar um volume lógico.

Exemplo:

1 - Eu removi meu volume lógico!

$ sudo lvremove /dev/vg1/debian.root

2 - A primeira coisa a fazer é procurar o arquivo morto em /etc/lvm/archive/vg1_(xxxxx).vg. Eu posso fazer isso, apenas olhando a data em que removi o volume lógico!

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

3- eu achei!

-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 em que fiz o lvremove !!! ... foi a alguns minutos atrás ..

4 - Vamos ver o arquivo!

$ 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 - Faça um teste antes de recuperá-lo!

$ 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, agora repita a linha de comando, sem o (--test)

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

7 - Confira!

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

8 - Se a lógica não estava ativa, faça!

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

É tudo

Espero que isso possa ajudar outras pessoas que estão procurando por esta solução!


5

A coisa mais fácil de recuperar do lvremove (supondo que você não tenha escrito na extensão em que o LV residia) é:

Basta encontrar o backup dos seus metadados em / etc / lvm / archive e descobrir

a) em que extensões o VE estava residindo (EFROM, ETO)
b) em quais PVs seu VE estava residindo e que se estende naquele PV que estava usando (PFROM, PTO)

Depois de obter essas informações, você cria um novo LV do mesmo tamanho no mesmo PV se estende sem limpar os primeiros 8kB do LV:

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

1
Você poderia ser mais específico sobre encontrar EFROM e ETO a partir do arquivo de backup? Todo o lv tem um "start_extend" de 0 no meu arquivo de backup, então estou um pouco perdido :) Obrigado!

3

(Conforme respondido por thermoman anteriormente), a maneira mais fácil de recriar um volume LVM excluído é criando-o com lvcreate sem zerar e certificando-se de que ele estará na mesma posição no disco. (O comando da resposta do thermoman não funcionou.)

Verifique o tamanho e a posição do volume lógico excluído como antes da exclusão, lendo os arquivos em / etc / lvm / archive. O tamanho do volume é em extent_countde a segment1(ou soma de segment*/extent_countvalores se tinha várias extensões). A posição está na stripesseção após o alias do volume físico (por exemplo pv0).

Por exemplo, a seção de volume pode ficar assim:

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

O tamanho deste examplevolume era 1024 e estava localizado em / dev / somedisk a partir da extensão 30720.

Calcule a última extensão como start + size -1 = 30720 + 1024 - 1 = 31743. Para recriar o problema de volume a seguir:

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

Esta resposta acabou de salvar minha noite ontem! Eu tinha um XenServer quebrado que estava excluindo LV errado por causa de um erro de API ...: o
Elektordi

2

Eu tive uma situação semelhante. Eu tinha todos os PVs contendo os LVs desejados, mas meu VG mostrou PVs ausentes e 0 LVs. Eu me recuperei fazendo o seguinte:

  1. Torne-se root
  2. Execute pvspara coletar UUIDs para todas as unidades.
  3. Revise os arquivos em / etc / lvm / archive até encontrar um que liste todos os mesmos UUIDs.
  4. Faça uma cópia de trabalho do arquivo de configuração arquivado e comece a editar.
  5. Na physical_volumesseção, defina as device =linhas para corresponder aos UUIDs / dispositivos atuais relatados por pvs, limpe todos os "MISSING"sinalizadores e remova as pvNseções que realmente estavam faltando.
  6. Na logical_volumesseção, remova as listagens que apresentavam listras nas pvNseções que não existiam mais.
  7. Foi isso, então eu corri

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

  8. Quando isso funcionou, corri novamente sem a --testopção.

Atingi minha situação particular estendendo o VG com PVs sdg e sdh. Em seguida, criei um novo LV, especificando /dev/sdg /dev/sdhna linha de comando, para que eu soubesse que o novo LV estava nessas unidades. Então mudei apenas essas unidades para uma nova máquina. A máquina antiga ficou muito chateada com as unidades ausentes e, quando as removi à força, também removeu TODOS os LVs. Vadio.

Da próxima vez, é claro, vou criar um novo VG para evitar esse problema.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.