我正在尝试使用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
到最后一次迭代时,它应该已经远远超出了驱动器的终点,但它只是继续前进。克隆已安装,但明显已损坏且丢失数据。
- 我的数学或我使用的论点有问题吗
dd
? - 有没有更好的方法让我编写“dd”命令来以 10GB 块的形式获取数据?
答案1
问题是您假设seek
采用字节值,而实际上它采用块计数。您应该使用seek=0
、78125
、156250
等。
但是,您可以通过删除以下内容来简化它dd
:
split -b 10G < /dev/sdd
答案2
答案3
我发现我的解决方案失败的原因是误解了搜索标志的作用。它只是移动输出驱动器上的写入位置。所以脚本只是一遍又一遍地将前 10GB 复制到输出上。它永远不会到达设备的末端。
要移动输入,还需要使用跳过标志:
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress skip=n seek=n
设置oflag=seek_bytes
和iflag=skip_bytes
将允许以字节而不是块为单位进行数学计算。
然而,所提供的选项罗埃马(使用 ddrescue)和另一个人( split -b 10G < /dev/sdd
) 是恢复损坏驱动器的更好方法,并分别执行分段传输。