完成 rsync -Sap 传输后,df 输出中的可用磁盘空间数字不同

完成 rsync -Sap 传输后,df 输出中的可用磁盘空间数字不同

我执行了“rsync -Sap --numeric-ids --delete-during /mnt/RAIDVault/ /mnt/RAIDVault-BACKUP/”旨在同步两个存储单元(具有相同的内容),但最终两个存储单元的可用磁盘空间量不同:

/dev/md1 2.0T 2.0T 81G 96% /mnt/RAIDVault /dev/md0 2.0T 2.0T 79G 97% /mnt/RAIDVault-BACKUP /dev/md1 1951405544 1873160540 78245004 96% /mnt/RAIDVault /dev/md0 1951405544 1874906476 76499068 97% /mnt/RAIDVault-BACKUP

我在这里很困惑,因为我不知道为什么会发生这种情况,也不知道从哪里开始排除故障。没有错误,rsync 顺利完成了传输,一切似乎都很好,而且是“最新的”。

然而,在完成所谓的“镜像 A 到 B”的传输之后,/dev/md0 却少了 2 GB。

df 输出是用“df --sync”生成的。我认为这是一个可靠的数字。df 从不说谎,不是吗?

/dev/md0 和 /dev/md1 之间的一个重要区别是,尽管两者都是 raid1 类型的软件 raid,但 /dev/md0 目前只有 1 个阵列成员。我想知道这是否是导致 df 报告中的数字不同的原因?

所以,我的问题有两个:

  1. 为什么 df 的报告中有不同的数字?
  2. 如何确保 md0 和 md1 都具有相同内容的完整且相同的副本?

答案1

2GB 的丢失数据意义重大。如果大小增加 2G,那么就会有一些简单的解释:硬链接变成重复文件,有漏洞的文件变成完整的文件,等等。这些都是非常合理的解释。

但是由于新版本尺寸较小,您应该进行比较以查看有哪些变化。您不希望 5 个月后才意识到出现问题,而您却没有有效的备份。

备份并不重要。恢复很重要。除非我们验证备份,否则我们不知道恢复是否有效。

对于少量文件,您可以这样做diff -r /mnt/RAIDVault /mnt/RAIDVault-BACKUP。但是,如果中途停止,则无法从中断处重新启动。

对于大量文件,我建议计算所有文件的哈希值并查找差异。这样,如果进程停止或中断,您可以轻松继续。

这是一个将生成目录中所有文件的 md5 哈希值的程序:

#!/usr/local/bin/perl

# md5tree: Output file data information for comparison

use Digest::MD5;
use File::Find ();

# Default to "." unless things are speced on the cmd line.
if ($#ARGV == -1) {
        @DIRS = ( '.' );
} else {
        @DIRS = @ARGV;
}

&File::Find::finddepth(\&wanted, @DIRS);

exit;

sub wanted {
    (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
    -f _ &&
    ((-s _) > 0) &&
    &doit($_, $File::Find::dir, -s _, $mode, $uid, $gid);
}

sub doit {
        my($fn, $dir, $size, $mode, $uid, $gid) = @_;

        return 0 if $fn =~ m/[\r\n]+/;

        open(FILE, "<$fn") or die "Can't open '$dir/$fn': $!";
        binmode(FILE);
        print Digest::MD5->new->addfile(*FILE)->hexdigest, "\t$size\t$uid\t$gid\t$mode\t$dir/$fn\n";

        return 0;
}

你可以像这样使用它:

# md5tree /mnt/RAIDVault-BACKUP >/var/tmp/list.backup
# md5tree /mnt/RAIDVault        >/var/tmp/list.orig
   # NOTE: For these next 2 lines TAB means press the TAB key.
# sort  -t'TAB' -k6 </var/tmp/list.backup >/var/tmp/list.backup.sorted
# sort  -t'TAB' -k6 </var/tmp/list.orig >/var/tmp/list.orig.sorted
# diff /var/tmp/list.orig.sorted /var/tmp/list.backup.sorted

我很想知道您发现了什么不同!

答案2

rsync FAQ 页面上有一个很好的详细答案,网址为https://sanitarium.net/rsyncfaq/#differentsizes

源和目标的大小可能不同的原因有多种:

  • 排除
  • 由于磁盘空间分配不同导致的目录大小(根据设计,目标或源仅略小)
  • 硬链接(差异 1-10%)
  • 稀疏文件(差异 >10%)
  • 文件系统类型、块大小、文件松弛开销等方面的差异
  • df 使用二进制单位(2 的幂),而 rsync 使用十进制单位(1000 的幂)
  • 最后,比较源和目标的大小并不总是可靠的,因此文件的校验和验证是判断源和目标是否相同的更好方法

答案3

我上次看到这种情况时,目标副本位于文件名不区分大小写的文件系统上。主目录中有名为foo和 的文件FOO。目标认为这些文件名相同,因此备份过程先复制foofoo,然后复制FOOfoo。因此,我们丢失了原始foo。我们就这样丢失了很多文件。

相关内容