Como descobrir qual arquivo é afetado por um setor defeituoso?

6

Considere que você foi informado sobre um setor ruim como este:

[48792.329933] Add. Sense: Unrecovered read error - auto reallocate failed
[48792.329936] sd 0:0:0:0: [sda] CDB:
[48792.329938] Read(10): ...
[48792.329949] end_request: I/O error, dev sda, sector 1545882485
[48792.329968] md/raid1:md126: sda: unrecoverable I/O read error
               for block 1544848128
[48792.330018] md: md126: recovery interrupted.

Como descubro qual arquivo pode incluir este setor? Como mapear um setor para arquivo? Ou como descobrir se apenas mapeia para liberar espaço no sistema de arquivos?

O processo de mapeamento deve ser capaz de lidar com a pilha de armazenamento usual.

Por exemplo, no exemplo acima, a pilha se parece com isso:

/dev/sda+sdb -> Linux MD RAID 1 -> LVM PV -> LVM VG -> LVM LV -> XFS

Mas, é claro, pode até parecer assim:

/dev/sda+sdb -> Linux MD RAID 1 -> DM_CRYPT -> LVM PV -> LVM VG -> LVM LV -> XFS
    
por maxschlepzig 02.12.2014 / 12:40

1 resposta

5

A maneira tradicional é copiar todos os arquivos em outro lugar e ver qual aciona um erro de leitura. É claro que isso não responde à pergunta se o erro estiver oculto pela redundância da camada RAID.

Além disso, eu só conheço a abordagem manual. O que é muito incômodo para se levar adiante, e se há uma ferramenta que faz essa mágica para você, ainda não ouvi falar disso, e não tenho certeza se ferramentas mais genéricas (como blktrace ) ajuda nesse sentido.

Para o sistema de arquivos, você pode usar filefrag ou hdparm --fibmap para determinar os intervalos de blocos de todos os arquivos. Alguns sistemas de arquivos oferecem ferramentas para fazer a pesquisa em outra direção (por exemplo, debugfs icheck ), mas eu não sei de um syscall que faça o mesmo, então parece não haver uma interface genérica para pesquisas de arquivos em block > p>

Para o LVM, você pode usar lvs -o +devices para ver onde cada LV está armazenado; você também precisa saber o pvs -o +pe_start,pe_size . Na verdade, pode ser mais legível no vgcfgbackup . Isso deve permitir que você traduza os endereços do sistema de arquivos para bloquear endereços em cada PV.

Para LUKS, você pode ver o deslocamento em cryptsetup luksDump .

Para o mdadm, você pode ver o deslocamento em mdadm --examine . Se o nível do RAID for diferente de 1, você também precisará fazer algumas contas e, mais especificamente, você precisa conhecer o layout do RAID para entender qual endereço no dispositivo md pode traduzir para qual bloco do RAID dispositivo de membro.

Por fim, você precisará considerar os deslocamentos de partição, a menos que esteja usando os discos diretamente, sem qualquer particionamento.

    
por 02.12.2014 / 14:01