LVM: Como devo tentar recuperar do PV e possível corrupção do LV?

4

Esta foi a minha configuração de armazenamento de arquivos em casa. Ele não tem backups porque a configuração do RAID foi feita para ser a redundância. Eu não contei o que aconteceu e estou pagando o preço. A configuração:

  • Ubuntu 16.04
  • Matriz RAID 5 de quatro discos usando mdadm (4x2TB): / dev / md0
  • No array, um PV e LV gerenciado pelo LVM.
  • No volume lógico chamado vg0, um sistema de arquivos XFS.

Observe que o host Linux, incluindo / etc e / boot, está instalado em um disco diferente e está completamente acessível (portanto, eu tenho acesso a / etc / lvm / archive). O array RAID é puramente armazenamento de arquivos, o processo de boot não depende de nada além de sua entrada em / etc / fstab.

Por alguma razão, eu tinha iniciado a partir de um instalador do FreeDOS que eu estava lutando para entender. Acho que posso ter dito para reparticionar esse volume, embora não me lembre de fazê-lo. Em qualquer caso, quando eu reiniciei no Linux (Ubuntu 16.04), fui deixado em um prompt do modo de recuperação como o usuário root. Não foi possível montar o UUID do grupo de volumes conforme definido em / etc / fstab.

Já faz tempo suficiente desde que eu originalmente configurei esta matriz RAID que eu esqueci completamente como o LVM trabalhou, ou que eu usei o LVM para criar o volume. (10-12 anos, substituindo discos rígidos e redimensionando o array ocasionalmente ao longo do tempo). Então, primeiro tentei usar testdisk [ 1 ] para localizar e restaurar as informações da partição. Isso nunca funcionou, a partição sempre foi o tamanho incorreto (524Gb em vez de 4,5TB) e nunca em um "limite do setor físico". Eu experimentei várias geometrias pensando que havia uma combinação mágica que restauraria perfeitamente a partição. Aqui está o status atual do disco de acordo com o fdisk:

$ sudo fdisk -l /dev/md0
GPT PMBR size mismatch (1098853631 != 200894463) will be corrected by w(rite).
Disk /dev/md0: 4.1 TiB, 4500904476672 bytes, 8790829056 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 1048576 bytes / 3145728 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot Start        End    Sectors  Size Id Type
/dev/md0p1          1 1098853631 1098853631  524G ee GPT

Partition 1 does not start on physical sector boundary.

e se separaram:

(parted) print list                                                       
Error: /dev/md0: unrecognised disk label
Model: Linux Software RAID Array (md)                                     
Disk /dev/md0: 4501GB
Sector size (logical/physical): 512B/4096B
Partition Table: unknown
Disk Flags: 

Ao postar uma pergunta no fórum do testdisk [ 2 ], eu percebi que usei o LVM para gerenciar a matriz RAID e que era possível que eles não usassem uma ferramenta de particionamento tradicional. Pesquisando "recuperando volumes físicos lvm" desenterrados link . pvck me diz o seguinte:

$ sudo pvck /dev/md0
  Incorrect metadata area header checksum on /dev/md0 at offset 4096
  Found label on /dev/md0, sector 1, type=LVM2 001
  Found text metadata area: offset=4096, size=192512
  Incorrect metadata area header checksum on /dev/md0 at offset 4096

Eu também tenho vários backups do volume LVM em / etc / lvm / archives, sendo o mais recente o seguinte:

crw@bilby:~$ sudo cat /etc/lvm/archive/vg0_00002-935168089.vg
# Generated by LVM2 version 2.02.98(2) (2012-10-15): Sun Jul 19 12:00:04 2015

contents = "Text Format Volume Group"
version = 1

description = "Created *before* executing 'lvextend /dev/vg0/lv0 /dev/md0'"

creation_host = "bilby" # Linux bilby 3.16.0-43-generic #58~14.04.1-Ubuntu SMP Mon Jun 22 10:21:20 UTC 2015 x86_64
creation_time = 1437332404  # Sun Jul 19 12:00:04 2015

vg0 {
    id = "Q4ZRRc-1l0h-FEgu-jrxA-EfW1-tAis-vv0jyL"
    seqno = 5
    format = "lvm2" # informational
    status = ["RESIZEABLE", "READ", "WRITE"]
    flags = []
    extent_size = 262144        # 128 Megabytes
    max_lv = 0
    max_pv = 0
    metadata_copies = 0

    physical_volumes {

        pv0 {
            id = "bKQs0l-zNhs-X4vw-NDfz-IMFs-cJxs-y0k6yG"
            device = "/dev/md0" # Hint only

            status = ["ALLOCATABLE"]
            flags = []
            dev_size = 8790828672   # 4.09355 Terabytes
            pe_start = 384
            pe_count = 33534    # 4.09351 Terabytes
        }
    }

    logical_volumes {

        lv0 {
            id = "pqInOe-ZLpV-t9oK-GQE1-AoIt-mB3M-4ImaV1"
            status = ["READ", "WRITE", "VISIBLE"]
            flags = []
            segment_count = 1

            segment1 {
                start_extent = 0
                extent_count = 22356    # 2.729 Terabytes

                type = "striped"
                stripe_count = 1    # linear

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

Se for útil, o seguinte é o detalhe na matriz RAID:

$ sudo mdadm --detail /dev/md0
/dev/md0:
        Version : 0.90
  Creation Time : Sun Oct 11 13:34:16 2009
     Raid Level : raid5
     Array Size : 4395414528 (4191.79 GiB 4500.90 GB)
  Used Dev Size : 1465138176 (1397.26 GiB 1500.30 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Mon Oct  3 13:12:51 2016
          State : clean 
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 1024K

           UUID : 9be3b2f7:102e373a:822b5a8f:216da2f7 (local to host bilby)
         Events : 0.103373

    Number   Major   Minor   RaidDevice State
       0       8       64        0      active sync   /dev/sde
       1       8       48        1      active sync   /dev/sdd
       2       8       16        2      active sync   /dev/sdb
       3       8       32        3      active sync   /dev/sdc

Finalmente, aqui está a triste trilha do testdisk.log que deixei para trás: link

edit: saída do lsblk:

crw@bilby:~$ sudo lsblk
NAME                 MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sda                    8:0    0 59.6G  0 disk  
├─sda1                 8:1    0  243M  0 part  /boot
├─sda2                 8:2    0    1K  0 part  
└─sda5                 8:5    0 59.4G  0 part  
  ├─bilby--vg-root   252:0    0 43.4G  0 lvm   /
  └─bilby--vg-swap_1 252:1    0   16G  0 lvm   [SWAP]
sdb                    8:16   0  1.8T  0 disk  
└─md0                  9:0    0  4.1T  0 raid5 
sdc                    8:32   0  1.8T  0 disk  
└─md0                  9:0    0  4.1T  0 raid5 
sdd                    8:48   0  1.8T  0 disk  
└─md0                  9:0    0  4.1T  0 raid5 
sde                    8:64   0  1.8T  0 disk  
└─md0                  9:0    0  4.1T  0 raid5 

Estou completamente perdida e suspeito que tornei as coisas piores. Minhas perguntas são:

Preciso "consertar" as informações da partição antes de lidar com problemas de LVM? Devo tentar "pvcreate --uuid xxx --restorefile yyy"? E então eu precisaria estender o disco e executar algo como o equivalente do fsck do xfs? Ou meus dados foram perdidos para mim neste momento? : '(

Por favor, deixe-me saber se há algo que eu possa adicionar para facilitar a depuração deste problema. Obrigado!

    
por Craig Wright 04.10.2016 / 08:31

1 resposta

3

Se tudo isso começar a não funcionar ou parar de fazer sentido, PARE e pergunte a um especialista no assunto. Este é um trabalho inseguro. Opere em imagens de disco copiadas por "dd" para arquivos em uma mídia de armazenamento grande ou diretamente para novos discos de tamanho igual ou maior para proteger seu conjunto de dados original da tolice. Você pode realizar essas operações em um único conjunto ao vivo, mas, se você errar, isso pode acontecer com seus dados.

Tudo bem. Para começar, precisamos reparar essa pilha de armazenamento metodicamente, a partir do nível básico do disco. Você executou um instalador do FreeDOS, e isso mexeu com seus discos (presumivelmente) criando uma tabela de partição em um deles.

Seus discos participam diretamente da matriz MD, nenhuma tabela de partição para falar. Isso é bastante típico. No entanto, essa também é uma estrutura de metadados de revisão 0.90 nesse array, portanto, colocar uma tabela de partições em qualquer um desses discos diretamente irá mexer com o array.

Verifique se você tem um disco (algum de sdb para sde) que tenha uma tabela de partições, na forma de / dev / sdb1, por exemplo. Se você tiver um assim, precisará considerá-lo sujo e retirá-lo de sua matriz, colocando-o novamente depois de se livrar dessa mesa.

Mesmo que não vejamos uma partição em um desses discos, uma verificação de integridade precisa ser executada em / dev / md0. O comando para fazer isso é simples:

# /usr/share/mdadm/checkarray -a /dev/mdX

Se isso ocorrer com uma contagem de correspondência maior que zero, essa matriz precisará ser reparada. Nós vamos visitá-lo, se necessário, já que atualmente não parece o problema.

Para problemas mais concretos, o testdisk coloca um GPT em / dev / md0 e uma partição nesse disco (/ dev / md0p1). Isso nunca deveria estar lá, e está corrompendo seus metadados do LVM. Seu grupo de volume é destinado a residir diretamente em / dev / md0, já que foi assim que você o criou originalmente.

Primeiro, teremos que lidar com essa GPT errante em / dev / md0. Precisa ser "zapped". O zapping de uma GPT anula todas as estruturas da GPT, retornando-as a um disco sem tabela, como deveria ser neste caso. Este artigo detalha isso de maneira excelente: " link ". Se você não fizer isso, você terá uma estrutura GPT quebrada nesse disco que os utilitários de particionamento tentarão "corrigir", causando problemas para você no futuro.

Depois de fazer isso, você pode recriar todos os seus metadados do LVM usando o arquivo que você publicou na sua pergunta. Felizmente, você me deu informações suficientes para lhe entregar um comando que funcionará. Se você quiser saber mais sobre esse processo, esse é um ótimo recurso: " link ".

O comando para recriar seu volume físico com todos os metadados originais:

# pvcreate --uuid "bKQs0l-zNhs-X4vw-NDfz-IMFs-cJxs-y0k6yG" --restorefile /etc/lvm/archive/vg0_00002-935168089.vg

Este arquivo archive descreve o / dev / md0 como sendo o disco que constitui seu grupo de volumes e o usará como deveria. Se você tiver um arquivo archive posterior no diretório de arquivos do LVM, USE THTE INSTEAD. O objetivo é trazer o grupo de volume ao seu último estado válido.

Depois disso, verificar sua integridade PV, VG e LV é a chave. Você já tentou isso, mas desta vez deve ser mais produtivo. Os comandos pvck e vgck são o que deve ser usado aqui.

Primeiro, execute pvck:

# pvck /dev/md0

Depois disso, valida, execute vgck:

# vgck vg0

Depois de validar todos os metadados, é hora de ativar seus LVs, se ainda não estiverem:

# vgchange -ay vg0

E finalmente, checando o sistema de arquivos em / dev / mapper / vg0-lv0 (que no seu caso é o XFS) para possíveis erros:

# xfs_check /dev/mapper/vg0-lv0

Isso não deve retornar nada se não houver erros. Se algo estiver errado, então o xfs_repair será necessário (NÃO FAÇA ISSO QUANDO ESTIVER MONTADO):

# xfs_repair /dev/mapper/vg0-lv0

    
por 04.10.2016 / 09:33