我在用着示例 3 来自 gddrescue 的文档对磁盘进行零写入并强制重新分配其上待处理的坏扇区。
同一文献在其他地方指出:
如果 mapfile 不存在,ddrescue 将创建它。
但是当我几乎逐字逐句地运行示例 3 时:
ddrescue -vvvv --fill-mode=- -f --synchronous /dev/zero /dev/sdc mapfile.txt
...我收到错误:
ddrescue:映射文件“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'不存在或不是
我在 Windows 7 上通过 Cygwin 使用gddrescue
。
这是 Cygwin 实现的一个错误dd
,还是我遗漏了什么?
答案1
不是 bug。我的 Kubuntu 上也是一样。我认为这是因为--fill-mode
你使用的选项。此模式有其文档的单独章节。你缺少的是这部分[重点是我的]:
当
ddrescue
使用--fill-mode
选项调用时,它将以“填充模式”运行,即不同的从默认的“救援模式”中恢复。也就是说,如果您使用该--fill-mode
选项,ddrescue
则不会救援任何东西。它只填充从其状态字符infile
的块中读取的数据outfile
从mapfile
与选项参数指定的类型字符之一一致--fill-mode
。
这意味着--fill-mode
需要一个已经存在的mapfile
。
这里的状态字符和类型字符是什么?
短语“来自的地位特征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=-
,则ddrescue
只会填充0x00000200
从位置开始的块0x00117000
;--fill-mode=?-*
(警惕 shell 全局匹配,虽然不太可能,但仍然存在),然后ddrescue
将填充标有?
、-
或 的碎片*
。