Como posso gerar uma lista de arquivos de uma lista de setores?

7

Eu tive uma falha no disco rígido e consegui resgatar alguns dados do disco (1TB) com o ddrescue do GNU. Os últimos 800GB do disco foram perfeitos, nenhum erro, mas nos primeiros 200GB havia quase 14000 erros (badblocks) espalhados pela área. ddrescue cria um arquivo de log que descreve onde estão os badblocks.

ddrescue s parâmetros da linha de comando:

ddrescue /dev/sdb /dev/sdd /mnt/sdc1/sdb.log -r -1 -f -d -v

O arquivo de log é assim:

#      pos        size  status
0x00000000  0x1C08CE00  +
0x1C08CE00  0x00000200  -
0x1C08D000  0x011E6800  +
0x1D273800  0x00000200  -
0x1D273A00  0x005EC000  +
0x1D85FA00  0x00000200  -
...         ...         ...

O sinal de mais (+) significa espaço bom contíguo, o espaço de menos (-) ilegível; posição e tamanho estão em hexadecimal. Listrando as linhas terminadas em '+' Eu tenho uma lista com posições de badblock, mas eu preciso de uma maneira de correlacionar esses badblocks a arquivos no Sistema de Arquivos, que é, a propósito, NTFS.

Eu sei que posso usar algo como DiskExplorer para fazer isso manualmente, mas seria o inferno com 14000 setores. Então, há uma maneira mais ou menos automática e elegante de fazer isso?

    
por Miguel Santos 14.10.2011 / 03:49

3 respostas

6

Desde o enorme sucesso desta questão, fiquei sem respostas, se houvesse alguma. Mas continuei pesquisando e encontrei um utilitário da Microsoft que data de 1999, chamado nfi.exe, parte da Fase 3 Service Release 2 das ferramentas de suporte OEM para Windows NT 4 e 2000 . O utilitário faz exatamente o que eu precisava, recebe um setor e retorna um arquivo. Mas isso é para setores individuais, então eu tive que criar um script para automatizar o processo. É um script em Python (2.7+) que funciona assim:

Ele recebe como entrada um arquivo de log ddrescue, analisa, chama nfi.exe para cada setor no arquivo e gera uma lista com os arquivos em ordem alfabética.

>sector_correlator.py -h

usage: sector_correlator.py [-h] [-v] [-n \path\to\nfi.exe] [-V] [-L]
                        logfile nt-device-path output file

Receives a list of sectors and returns a list of files which resides in them.

positional arguments:
  logfile              path to ddrescue's logfile.
  nt-device-path       NT-style path to physical device, like
                       \device\harddisk1\dr1
  output file          filelist output file name

optional arguments:
  -h, --help           show this help message and exit
  -v, --version        show program's version number and exit
  -n \path\to\nfi.exe  nfi.exe's path, if not speciified, assumes's it is in
                       the same path as the script
  -V                   enables verbose mode
  -L                   save nfi.exe's output log to nfi_raw.log

Exemplo:

sector_correlator.py sdb.log \devices\harddisk0\dr0 filelist.txt

Onde: sdb.log é o log do ddrescue,

\ device \ harddisk0 \ dr0 é um caminho no estilo NT para o HD (você o descobre usando uma ferramenta sysinternals chamada WinObj e o Utilitário de Gerenciamento de Disco

e filelist.txt é a lista de arquivos que você deseja. Será assim:

\Documents\Downloads\Evernote_4.5.1.5432.exe
\Documents\Downloads\Programs\Apophysis207SE.exe
\Documents\Downloads\Programs\GetGnuWin32-0.6.21.exe
\Documents\Downloads\Programs\mbam-setup.exe
\Documents\Downloads\Programs\msnbackup133.exe
\Documents\Downloads\Programs\x64Components_v254.exe

Os outros argumentos no script são opcionais e são explicados quando você o executa com -h. Por padrão, o script assume que o nfi.exe está no mesmo diretório, caso contrário, use -n pathtonfi.exe.

Por fim, aqui está o link para o script: sector_correlator.py

É muito rudimentar e não tem tratamento de erros, mas faz o trabalho.

    
por 17.10.2011 / 21:30
1

Este é mais um adendo à Resposta (# 1) com base nas minhas tentativas de verificar minha unidade com falha. 1) você ainda pode obter o nfi.exe e usá-lo (com o winxp pelo menos). Você faz o download do arquivo listado como oem3sr2.zip na página MS vinculada acima no Ans # 1.

Eu achei que com a versão atual do nfi.exe você não precisa cavar o caminho da unidade. Uma simples letra de unidade fará ... por exemplo, "K:"

python sector_correlator.py badsectors.log k: badfiles.txt

No entanto (e minha força é em perl, então não espere muito da minha leitura de python), parece-me que o script verifica apenas um bloco por linha correspondente a '-'. Portanto, se o arquivo de log relatou 200 blocos inválidos consecutivos (o segundo número da linha do arquivo de log), o script não verificou os últimos 199 blocos para diferentes associações de arquivos.

No linux você pode usar o ddrescuelog -l- badsectors.log para expandir e mostrar todos os blocos defeituosos. Infelizmente, e eu não entendo o porquê, a implementação do ddrescue no Ubuntu não inclui o ddrescuelog (mas é bastante fácil obter o mais recente do debian e compilá-lo e instalá-lo, sobre o mais simples que já vi).

    
por 12.03.2012 / 08:07
0

Estou recuperando um disco ruim agora e tentarei fazer isso:

link

... que (a partir da versão 2.1) inclui ddru_ntfsfindbad:

Ddru_ntfsfindbad is a utility for NTFS partitions to find which files are related to bad sectors in a ddrescue log file.

A instalação significa compilar a partir da fonte, mas com uma máquina Ubuntu (VM) por perto, as instruções fornecidas tornaram isso fácil.

    
por 15.04.2014 / 14:20