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

Bash 使用md5sum加速dd磁盘映像,示例脚本:好主意?,bash,dd,md5sum,diskimage,Bash,Dd,Md5sum,Diskimage,我在想办法让我的笔记本硬盘安全备份,如果需要的话,仍然能够快速使用备份。 我的方法是:我会买一个2.5英寸的硬盘,大小相同,带有USB到SATA的电缆,并克隆其内部,当灾难发生时,我只需将笔记本电脑中的硬盘换成另一个,我很乐意再次使用。 但是,我希望避免每次备份硬盘时都写入500GB,尤其是当我知道其中相当一部分(+/-80GB)很少写入时,我希望以下md5sum/dd脚本能够起到帮助作用: #!/bin/bash block="1M" end=50000 count=10 input="/d

我在想办法让我的笔记本硬盘安全备份,如果需要的话,仍然能够快速使用备份。 我的方法是:我会买一个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) 我正在考虑将count设置为1,并增加块大小。这是个好主意还是个坏主意

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

编程不是很流利,应该有很大的改进空间,有什么建议吗

谢谢大家……

逐点回答:
  • 如果运行这个,我会错过磁盘的某些部分吗

    • 没有
  • 你看到一些瑕疵了吗

    • 而单位是不同的。这意味着在源位置进行双重读取,在目标位置写入之前进行完全读取。这将大大缩短备份时间
    • 存在差异时,MD5匹配的可能性很小。使用SHA1或MD256或其他更硬的校验和算法可以降低这种可能性。但这意味着两端都有更多的资源。(请参阅)
  • 与500GB读/写相比,我能赢得一些时间吗

    • 如果两个单元已经相同,则是的,因为读取通常比写入快。(取决于处理器,对于校验和计算:这在非常差的处理器上可能很重要)
  • 显然,我可能会减少对目标磁盘的写入。我会提高该磁盘的寿命吗

    • 在这种情况下,是的,但如果您只编写diff,这将大大加快速度并真正提高磁盘的使用寿命
    • 当磁盘不同时,您重新写入整个磁盘,这是没有效率的
  • 我正在考虑将count设置为1,并增加块大小。这是个好主意还是个坏主意

    • 我觉得这在全球范围内是个坏主意。为什么要重新发明轮子
  • 这个脚本是否可以使用图像文件作为输出

  • 功能性回答。 对于这样的作业,您可以使用
    rsync
    !有了这些工具,您可以

    • 在传输过程中压缩数据
    • 通过网络复制
    • 使用SSH(或不使用SSH)进行隧道传输
    • 仅传输(写入)修改的块
    使用、
    dd
    md5sum
    我有时会运行一种命令:

    ssh $USER@$SOURCE "dd if=$PATH/$SRCDEV |tee >(sha1sum >/dev/stderr);sleep 1" |
        tee >(sha1sum >/dev/tty) | dd of=$LOCALPATH/$LOCALDEV
    
    这将在源主机上执行完全读取,而不是在发送到本地主机(目的地)之前执行sha1sum,而不是在写入本地设备之前执行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
    

    为什么你想自己滚动而不是使用rsync之类的东西?我有点困惑。你是在尝试“压缩”吗“将数据转换为MD5散列,然后以某种方式从该散列恢复?@mb21:rsync是否能够处理/dev/sda作为一个500GB的文件?我已经使用rsync将我的外部硬盘备份到另一个硬盘,但是这个外部硬盘只包含数据文件,没有像我的主磁盘(Win7和Linux)那样的操作系统@DHT:我使用md5sum来比较源和目标中相应的块,当不同时,脚本会覆盖目标中的块。我做错什么了吗?镜像磁盘可以解决您的问题,
    man mdadm
    。但是混合使用SATA和USB可能会降低系统IO的速度。