我执行了“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 报告中的数字不同的原因?
所以,我的问题有两个:
- 为什么 df 的报告中有不同的数字?
- 如何确保 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
。目标认为这些文件名相同,因此备份过程先复制foo
到foo
,然后复制FOO
到foo
。因此,我们丢失了原始foo
。我们就这样丢失了很多文件。