Como determinar qual arquivo / inode ocupa um determinado setor

7

Recebi mensagens em /var/log/kern.log que indicam falha na unidade. As mensagens ocorreram durante a cópia do meu $HOME entre as unidades (ext4 - > ext3):

[ 5733.186033] sd 4:0:0:0: [sdb] Unhandled sense code
[ 5733.186038] sd 4:0:0:0: [sdb]  Result: hostbyte=invalid driverbyte=DRIVER_SENSE
[ 5733.186042] sd 4:0:0:0: [sdb]  Sense Key : Medium Error [current] 
[ 5733.186048] sd 4:0:0:0: [sdb]  Add. Sense: Unrecovered read error
[ 5733.186053] sd 4:0:0:0: [sdb] CDB: Read(10): 28 00 05 b7 2e 40 00 00 08 00
[ 5733.186064] end_request: critical target error, dev sdb, sector 95891008

As mensagens vêm em massa, essa é uma dessas granéis. sdb é a unidade de origem.

Como descubro a qual arquivo / inode o setor pertence? Eu só quero saber para que eu possa recuperar os arquivos em questão a partir de um backup. Qualquer coisa mais rápida que o seguinte código mais uma análise subseqüente da saída?

find . -type f -print \
               -exec cp \{\} /dev/null \; \
               -exec tail -n 1 /var/log/kern.log \;

SO: Ubuntu Oneiric.

EDIT: O comando acima também gera em stderr os arquivos que não puderam ser lidos.

    
por krlmlr 26.09.2011 / 23:02

2 respostas

2

A ideia básica seria

  1. faça alguns cálculos para descobrir o número do bloco do sistema de arquivos com base no número do setor físico
  2. use os comandos debugfs testb / ncheck / icheck para descobrir se o bloco está em uso e o nome do (s) arquivo (s) que o está usando

Há um HOWTO de bloqueio incorreto no site do projeto smartmontools descrevendo o processo em mais detalhe.

    
por 27.09.2011 / 00:58
5
  1. Encontre em qual partição o setor está executando fdisk -lu /dev/sdb . Suponha que seja "sdb2", que começa no setor 45612307.

  2. Subtraia isso de 95891008 para obter 50278701.

  3. Em seguida, determine quantos setores por bloco: tune2fs -l /dev/sdb2 | grep Block . Suponha que seja 4096.

  4. Calcule a relação bloco / setor: 512 bytes / setor / 4096 bytes / bloco = 0,125 blocos / setor.

  5. Calcule o bloco do setor: 50278701 * 0.125 = 6284837.625.

  6. Use o debugfs para descobrir qual está usando o bloco. Se icheck 6284837 retornar inode 12345, execute ncheck 12345 .

Advertências: Pode ser necessário desativar o registro no diário. Isso pode não funcionar com o ext4.

    
por 27.09.2011 / 01:18