Gddrescue pede um mapfile, mas se recusa a criar um

Gddrescue pede um mapfile, mas se recusa a criar um

estou a usarExemplo 3 da documentação do gddrescue aquigravar em zero um disco e forçar a realocação de setores defeituosos pendentes nele.

A mesma documentação afirma em outro lugar que:

Se o mapfile não existir, o ddrescue irá criá-lo.

Mas quando executo o Exemplo 3 quase literalmente:

ddrescue -vvvv --fill-mode=- -f --synchronous /dev/zero /dev/sdc mapfile.txt

... recebo o erro:

ddrescue: Mapfile 'mapfile.txt' não existe ou não é legível.

Se eu correr:

ddrescue -vvvv --fill-mode=- -f --synchronous /dev/zero /dev/sdc -m /cygdrive/b/users/user/desktop/mapfile.txt

... recebo uma versão truncada do mesmo erro:

ddrescue: Mapfile '/cygdrive/b/users/user/desktop/mapfile.txt' não existe ou não existe

Estou usando gddrescueno Windows 7, via Cygwin.

Isso é um bug com a implementação do Cygwin ddou estou faltando alguma coisa?

Responder1

Não é um bug. É o mesmo no meu Kubuntu. Acho que é por causa da --fill-modeopção que você usou. Este modo temseu próprio capítulo da documentação. O que está faltando é esta parte [ênfase minha]:

Quando ddrescueé invocado com a --fill-modeopção ele opera em "modo preenchimento", que édiferentedo "modo de resgate" padrão. Ou seja, se usar a --fill-modeopção, ddrescuenão resgata nada. Ele apenas preenche os dados lidos dos infileblocos outfilecujo caractere de statusdemapfilecoincide com um dos caracteres de tipo especificados como argumento para a --fill-modeopção.

Isso significa --fill-modeque precisa de um arquivo mapfile.


O que são caracteres de status e caracteres de tipo aqui?

A expressão “caractere de status de mapfile” deve ser entendida de acordo comeste fragmento:

O caractere de status é um destes:

Personagem que significa
'?' bloco não testado
'*' bloco com falha não aparado
'/' bloco com falha não raspado
'-' bloco com falha setor(es) defeituoso(s)
'+' bloco finalizado

E aqui está um exemplo de mapfile:

# Mapfile. Created by GNU ddrescue version 1.23
# Command line: ddrescue -d -c18 /dev/fd0 fdimage mapfile
# Start time:   2015-07-21 09:37:44
# Current time: 2015-07-21 09:38:19
# Copying non-tried blocks... Pass 1 (forwards)
# current_pos  current_status  current_pass
0x00120000     ?               1
#      pos        size  status
0x00000000  0x00117000  +
0x00117000  0x00000200  -
0x00117200  0x00001000  /
0x00118200  0x00007E00  *
0x00120000  0x00048000  ?

Agora, "caracteres de tipo especificados como argumento para a --fill-modeopção" são caracteres que aparecem logo após --fill-mode=.

Então, se mapfilefor como o exemplo acima e você usar

  • --fill-mode=-, então ddrescuepreencherá apenas 0x00000200blocos começando na posição 0x00117000;
  • --fill-mode=?-*(cuidado com o globbing do shell, improvável, mas ainda assim), ddrescuepreencherá os fragmentos marcados com ?, -ou *.

informação relacionada