dd 运行到输入设备末尾

dd 运行到输入设备末尾

我正在尝试使用dd克隆我修复的硬盘驱动器。我试图dd以 10GB 块的形式从驱动器复制数据,但它传输的数据超出了驱动器应包含的数据量。驱动器本身起作用,并且可以安装其上的分区。

使用df -h我得到的驱动器大小为 1000204886016 字节(1TB 驱动器)。

我最初尝试过:

sudo dd if=/dev/sdb of=/dev/sdd status=progress

然而,在大约 300GB 后,速度就慢了下来,最终由于读取错误而失败。我决定尝试以 10GB 块的形式复制它。我计算出,读取 10GB 的 128kByte 块大小需要复制 78125 个块。

为此,我正在使用:

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=n

dd报告每次传输 10240000000 字节。为了计算每次迭代的查找值,我聚合了传输的字节,并减去 1GB 以确保存在一些重叠。结果序列是:

seek=0
seek=9240000000
seek=18480000000
seek=27720000000
seek=36960000000
...
seek=1071840000000

我用离散的 dd 命令将它们写在 shell 脚本中并运行它。我让最后一次迭代可以自由地复制所需的数据。

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=0
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=9240000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=18480000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=27720000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=36960000000
    ...
sudo dd if=/dev/sdb of=/dev/sdd bs=128k status=progress oflag=seek_bytes seek=1071840000000

到最后一次迭代时,它应该已经远远超出了驱动器的终点,但它只是继续前进。克隆已安装,但明显已损坏且丢失数据。

  1. 我的数学或我使用的论点有问题吗dd
  2. 有没有更好的方法让我编写“dd”命令来以 10GB 块的形式获取数据?

答案1

问题是您假设seek采用字节值,而实际上它采用块计数。您应该使用seek=078125156250等。

但是,您可以通过删除以下内容来简化它dd

split -b 10G < /dev/sdd

答案2

我正在尝试使用 dd 克隆我修复的硬盘

不。

使用ddrescue相反,它可以很好地处理不可读的块和其他媒体错误。

答案3

我发现我的解决方案失败的原因是误解了搜索标志的作用。它只是移动输出驱动器上的写入位置。所以脚本只是一遍又一遍地将前 10GB 复制到输出上。它永远不会到达设备的末端。

要移动输入,还需要使用跳过标志:

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress skip=n seek=n

设置oflag=seek_bytesiflag=skip_bytes将允许以字节而不是块为单位进行数学计算。

然而,所提供的选项罗埃马(使用 ddrescue)和另一个人( split -b 10G < /dev/sdd) 是恢复损坏驱动器的更好方法,并分别执行分段传输。

相关内容