Tente o ddrescue (gddrescue na maioria das distros):
GNU ddrescue - ferramenta de recuperação de dados. Copia dados de um arquivo ou dispositivo de bloco para outro, tentando resgatar as partes boas primeiro em caso de erros de leitura.
Eu tenho uma unidade defeituosa de 320 GB que tem erros de leitura em posições diferentes, mas as posições exatas variam. Eu estou bem com a probabilidade de erros, isso está fora de questão aqui.
Primeiro de tudo, fiquei surpreso com o fato de eu precisar de conv=sync
para conv=noerror
sendo realmente útil, mas ok, tenho tempo livre para ganhar um novo pé. Eu achei por causa de file -s /dev/sdc*
não deu nenhuma saída sensata para as últimas partições (ou seja, o mesmo que para a unidade de origem), ele disse data
em vez disso. No entanto, não obtive nenhuma melhoria prática depois que adicionei sync
à minha linha de comando: a saída file -s
ainda não faz sentido, exceto pela primeira partição que não contém erros na seção de descrição do FS, portanto o comando file -s
detecta o FS corretamente . Eu confirmo a cópia errática com mount -o ro
para ambas as unidades e a comparação de md5sum
s para todos os arquivos (mas a estrutura de diretórios sozinha é errática).
Estou tentando adicionar a nova unidade maior dessa maneira:
dd if=/dev/sda3 conv=noerror,sync bs=1M of=/dev/sdc3 2> /part3_log
grep -oPaz '[[:digit:]]*(?=\+[[:digit:]]+ records out\n)' </part3_log >/part3_log_bads # parsing is ok for this specific case
rm /part3_log_01
for i in $(cat /part3_log_bads); do dd if=/dev/sda3 conv=noerror,sync bs=1M of=/dev/sdc3 skip=$((i-1)) seek=$((i-1)) count=1 2>>/part3_log_01; done # retrying erratic blocks. i-1 because of number of records is written after erratic block was padded and written. noerror does not make any practical difference here.
Eu recebo essa saída para cada bloco errático em /part3_log
(conforme esperado):
dd: error reading ‘/dev/sda3’: Input/output error
71051+3 records in <<<<<<<<< second number increments from 0 after each erratic block indicating partial read, this is expected
71054+0 records out
74505519104 bytes (75 GB) copied, 2546,96 s, 29,3 MB/s
E eu recebo essa saída estranha (a diferença de velocidade é esperada) para todos os blocos em /part3_log_01
:
1048576 bytes (1,0 MB) copied, 6,5663 s, 160 kB/s
0+1 records in
0+0 records out
0 bytes (0 B) copied, 6,41877 s, 0,0 kB/s
0+1 records in
1+0 records out
1048576 bytes (1,0 MB) copied, 7,42028 s, 141 kB/s
1+0 records in
1+0 records out
O que me chama a atenção é que quase cada registro de entrada é lido parcialmente enquanto não há erros informados, apesar deles realmente acontecerem (eu os vejo em dmesg
). Não há nenhum erro relatado para sdc
(como esperado, é uma nova unidade).
Então, eu copio cegamente o drive defeituoso e depois repito os registros defeituosos? Minha abordagem parece falhar em dois pontos:
conv=sync
estar presente) P.S. Eu gostaria de fazer isso apenas com dd
. Usar ddrescue
é um ATM problemático.
P.P.S. É Debian 8.7.1 e dd 8.23