web-dev-qa-db-ja.com

Gddrescueはマップファイルを要求しますが、マップファイルの作成を拒否します

私は ここにあるgddrescueのドキュメントの例 を使用してゼロに書き込み、ディスク上の保留中の不良セクタを強制的に再割り当てします。

同じドキュメントには、他の場所で次のように記載されています。

Mapfileが存在しない場合、ddrescueがそれを作成します。

しかし、例3をほぼ逐語的に実行すると、次のようになります。

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

...エラーが発生します:

ddrescue:Mapfile'mapfile.txt 'が存在しないか、読み取り可能ではありません。

私が実行した場合:

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

...同じエラーの切り捨てられたバージョンが表示されます:

ddrescue:Mapfile '/ cygdrive/b/users/user/desktop/mapfile.txt'が存在しないか、存在しません

Cygwin経由でWindows7でgddrescueを使用しています。

これはddのCygwin実装のバグですか、それとも何かが足りませんか?

1
Hashim

バグではありません。私のKubuntuでも同じです。 --fill-modeオプションを使用したためだと思います。このモードには ドキュメントの独自の章 があります。あなたが欠けているのはこの部分です[私の強調]:

ddrescue--fill-modeオプションで呼び出されると、デフォルトの「レスキューモード」とは異なるである「フィルモード」で動作します。つまり、--fill-modeオプションを使用した場合、ddrescueは何もレスキューしません。 infileから読み取られたデータのみで埋められます。outfileのブロックのステータス文字from mapfileは、--fill-modeオプションの引数として指定されたタイプ文字の1つと一致します。

これは、--fill-modeには既存のmapfileが必要であることを意味します。


ここでのステ​​ータス文字とタイプ文字とは何ですか?

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  ?

--fill-modeオプションの引数として指定されたタイプ文字」は、--fill-mode=の直後に表示される文字になりました。

したがって、mapfileが上記の例のようであり、

  • --fill-mode=-の場合、ddrescue0x00000200の位置から始まる0x00117000ブロックのみを埋めます。
  • --fill-mode=?-*(シェルグロブに注意してください。可能性は低いですが、それでも)ddrescueは、?-、または*でマークされたフラグメントを埋めます。
2