我正在尝试使用 dd 来镜像硬盘,但出现了 I/O 错误。因此,我添加了“noerror”参数,但我想跟踪错误以便尝试恢复。
我目前的尝试如下:
sudo dd if=/dev/sdb bs=1M conv=sync,noerror of=output.img 2>&1 | tee output.log
这样,output.img 和 output.log 都会被创建,但两者的大小都是 0 字节,并且终止 dd 时不会在终端上回显任何输出。
我更愿意在使用 ddrescue 等工具之前尝试使用“noerror”选项的 dd,因为我对 dd 更熟悉。
此外,该驱动器包含单个 NTFS 分区,因此,如果能提供有关如何恢复缺少位的 NTFS 分区的指示,将不胜感激(该驱动器为 500GB,我遇到的第一个错误大约在 30GB 左右)。
谢谢!
答案1
我强烈建议你使用ddrescue
- 不要避免使用适合工作的工具,运行它并不难,而且你会减轻一些压力。
调用很简单:
第一次运行:
-p
- 预先分配空间-b 4M
- 使用较大的扇区大小来提高速度
ddrescue -p -b 4M ${SRC_DISK} ${DST_IMAGE} ${DST_LOGFILE}
后续运行:(与 不同dd
,您可以多次运行它,并且它将通过参考日志文件从上次中断的地方继续运行)
-b 512
- 使用较小的扇区尺寸来尝试填补空白-r 10
- 使用多次重试
ddrescue -b 512 -r 10 ${SRC_DISK} ${DST_IMAGE} ${DST_LOGFILE}
读取错误的部分(默认)将包含零,最终您将得到类似如下的日志文件:
# pos size status
0x00000000 0x00014E00 +
0x00014E00 0x00000200 -
0x00015000 0x00005800 +
0x0001A800 0x00000200 -
0x0001AA00 0x00028000 +
0x00042A00 0x00000200 -
0x00042C00 0x00125400 +
标记的线+
表示无错误的区域,标记的线-
表示有错误的区域。
根据读取错误的性质,您可能需要研究以下一些选项:
-d, --direct
use direct disc access for input file
-K, --skip-size=<min>[,<max>]
initial size to skip on read error [64 KiB]
-M, --retrim
mark all failed blocks as non-trimmed
-O, --reopen-on-error
reopen input file after every read error
-r, --retry-passes=<n>
exit after <n> retry passes (-1=infinity) [0]
-R, --reverse
reverse the direction of all passes
直接回答你的问题:
- 你可能遇到了缓冲问题……你可能会看到很多行同时出现,然后又什么都没有了——看看
unbuffer
sudo
可能会要求输入密码,但您已将提示重定向……所以什么也没有发生。