使用md5sum加速dd磁盘映像,示例脚本:好主意?

时间:2013-12-30 13:36:24

标签: bash dd md5sum diskimage

我正在考虑如何安全地备份我的笔记本电脑硬盘,并且如果需要,仍然可以快速备份。 我的方法如下:我会买一个相同大小的2.5英寸硬盘,用USB到SATA线缆并克隆内部,当灾难发生时,我只需将笔记本电脑中的硬盘换成另一台硬盘。我很高兴再去一次。 但是,我想避免每次想要备份我的硬盘时写入500GB,特别是当我知道它的相当一部分(+/- 80GB)很少被写入时,这就是下面的md5sum / dd脚本来到救援,我希望:

#!/bin/bash
block="1M"
end=50000
count=10

input="/dev/sda"

output="/dev/sdb"
output="/path/to/imagefile"


function md5compute()
{
    dd if=$1 skip=$2 bs=$block count=$count | md5sum - | awk '{ print $1 }'
}
for i in {0..$end}
do
    start=$(($i*$count))
    md5source=$(md5compute $input $start)
    md5destination=$(md5compute $output $start)
    if [ "$md5source" != "$md5destination" ]
    then
        dd if=$input of=$output skip=$start seek=$start count=$count conv=sync,noerror,notrunc
    fi
done

现在,问题部分:

A)运行这个,我会错过磁盘的某些部分吗?你看到一些缺陷吗?

B)与500GB读/写相比,我能赢得一些时间吗?

C)显然我可能会少写一些目标磁盘。我会改善该磁盘的使用寿命吗?

D)我在考虑将计数保留为1,并增加块大小。这是个好主意/坏主意吗?

E)这个相同的脚本是否可以作为输出使用图像文件?

编程不是很流畅,应该有足够的改进空间,任何提示?

谢谢大家...

1 个答案:

答案 0 :(得分:0)

逐点回答:

  1. 运行此功能后,我会错过磁盘的某些部分吗?

    • 没有
  2. 你看到一些瑕疵吗?

    • 虽然单位是不同的。这意味着在源处读取双重读取并在写入目标之前完全读取。这将大大改善备份时间。
    • 在存在差异的情况下,MD5匹配的可能性很小。使用 SHA1 MD256 或其他更难的校验和算法可以减少这种可能性。但这会在两端产生更多的资源。 (见Birthday problem on wikipedia
  3. 与500GB读/写相比,我能赢得一些时间吗?

    • 如果两个单位已经相同,是的,因为阅读速度通常比写作速度快。 (取决于处理器,校验和计算:这对非常差的处理器来说可能很重要)
  4. 显然我可能会少写一些目标磁盘。我会改善该磁盘的使用寿命吗?

    • 在这种情况下,是的,但如果你只编写差异,这将会更快,并且真正改善你的磁盘寿命。
    • 当磁盘不同时,你重写整个磁盘,效率不高!
  5. 我在考虑将计数保留为1,并增加块大小。这是个好主意/坏主意吗?

    • 我认为这在全球范围内是一个坏主意。为什么重新发明轮子?
  6. 这个相同的脚本是否可以作为输出使用图像文件?

  7. 功能回答。

    对于此类工作,您可以使用rsync!使用此工具,您可以

    • 转移期间压缩数据
    • 通过网络复制
    • 使用SSH隧道(或不使用)
    • 传输(写入)仅修改块

    使用ddmd5sum

    我有时会运行一种命令:

    ssh $USER@$SOURCE "dd if=$PATH/$SRCDEV |tee >(sha1sum >/dev/stderr);sleep 1" |
        tee >(sha1sum >/dev/tty) | dd of=$LOCALPATH/$LOCALDEV
    

    这将在源主机上执行完整读取,而不是 sha1sum 发送到localhost(目标)之前,而不是sha1sum以确保在写入本地设备之前转移。

    这可能会产生类似:

    2998920+0 records in
    2998920+0 records out
    1535447040 bytes (1.4gB) copied, 81.42039 s, 18.3 MB/s
    d61c645ab2c561eb10eb31f12fbd6a7e6f42bf11  -
    d61c645ab2c561eb10eb31f12fbd6a7e6f42bf11  -
    2998920+0 records in
    2998920+0 records out
    1535447040 bytes (1.4gB) copied, 81.42039 s, 18.3 MB/s