将 dd 的控制台输出复制到文件以及控制台

将 dd 的控制台输出复制到文件以及控制台

我正在尝试使用 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

直接回答你的问题:

  1. 你可能遇到了缓冲问题……你可能会看到很多行同时出现,然后又什么都没有了——看看unbuffer
  2. sudo可能会要求输入密码,但您已将提示重定向……所以什么也没有发生。

相关内容