如何检查dd备份的完整性?

stu*_*ent 12 backup dd integrity

我刚刚通过以下方式备份了整个硬盘驱动器(50GB)ssh

dd if=/dev/hda | buffer -s 64k -S 10m | ssh myuser@myhost "cat > ~/image.img"
Run Code Online (Sandbox Code Playgroud)

现在检查文件完整性的最佳方法是什么image.img,即如何验证是否正确复制了所有内容?

Gil*_*il' 13

如果命令成功终止,则备份是正确的,除非出现硬件故障(这可能同样影响您可能执行的任何验证)。如果硬件出现故障,以后可能会变得不正确,但大多数存储硬件都会检测到损坏。

这里有一个警告:在管道中,shell 不会从左侧报告错误。(这是因为一种相当常见的情况,即右侧不需要读取所有数据,例如some_command | head,左侧由于不再需要其输出而死亡。)所以这里的读取错误dd将被忽略。在 bash 中,设置pipefail选项以报告管道所有部分的错误。

另外,请注意dd bs=…忽略一些错误并且dd通常比替代方法慢。我建议根本不要使用dd:仅复制整个文件没有任何好处。与您可能在某处读到的内容相反,dd它不是具有特殊属性的低级磁盘访问命令,绝对没有魔法dd,魔法在/dev/hda.

shopt -s pipefail
set -e
</dev/hda buffer -s 64k -S 10m | ssh myuser@myhost "cat > ~/image.img"
Run Code Online (Sandbox Code Playgroud)

尽管如此,如果您想检查备份,最好的方法是在每一侧取一个加密校验和并比较它们。例如:

ssh myuser@myhost "sha1sum image.img" &
sudo sha1sum /dev/hda
Run Code Online (Sandbox Code Playgroud)

检查两个校验和是否相同。

请注意,这会在检查时测试备份和原始文件是否相同。您更改的任何内容/dev/hda,包括挂载和卸载文件系统,即使没有进行任何更改(这将更新许多文件系统上的最后挂载日期),都会更改校验和。如果您想稍后验证完整性,请在某处记下备份时磁盘的校验和。

  • 请注意,如果`/dev/hda` 上的*任何* 自备份后发生变化,则散列将不匹配。 (4认同)

bah*_*mat 5

正如 darnir & Giles 所提到的,最好的办法是在备份后立即运行加密哈希,然后源磁盘上的任何内容都没有被更改。但是,如果您从那时起就使用了磁盘,那么哈希值很可能不匹配。即使更改磁盘上的一个字节也会导致完全不同的哈希值。

虽然它远不理想,但您可以通过安装它来检查图像。在磁盘映像所在的系统上,运行以下命令(/mnt/disk如果它不存在则创建或我们一个备用位置):

mount -o loop image.img /mnt/disk
Run Code Online (Sandbox Code Playgroud)

然后,您可以浏览/mnt/disk并查看所有文件。对照原件检查图像中关键文件的 sha1 哈希值以验证其完整性。