rsync 不传输所有文件的原因?

Hes*_*ann 11 linux ubuntu backup rsync

有没有人知道在 Ubuntu 10.04 LTS 设置上使用 rsync 备份我的大主目录时传输的文件数量差异如此大的常见原因?机器稳定,所有卷都是干净的 ext4——fsck.ext4 没有错误。

Number of files: 4857743
Number of files transferred: 4203266
Run Code Online (Sandbox Code Playgroud)

那是 654,477 个文件的差异!!!

我想将我的完整主文件夹备份到外部磁盘,以便我可以完全擦除并重新格式化我的系统,然后从这个 rsync 备份恢复我的主文件夹,但我担心我丢失了重要的数据文件。

我以 root 身份登录并使用 rsync 将我的 /home/hholtmann/* 目录备份到 /mnt/wd750/c51/home/ 中的备用备份驱动器

这是我作为 root 使用的命令行

root@c-00000051:~# pwd
/root
root@c-00000051:~# rsync -ah --progress --stats /home/hholtmann /mnt/wd750/c51/home/ -v
Run Code Online (Sandbox Code Playgroud)

从 rsync 捕获的摘要输出

Number of files: 4857743
Number of files transferred: 4203266
Total file size: 487.41G bytes
Total transferred file size: 487.41G bytes
Literal data: 487.41G bytes
Matched data: 0 bytes
File list size: 102.48M
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 487.75G
Total bytes received: 82.42M
Run Code Online (Sandbox Code Playgroud)

只是为了比较rsync后我家中一个重要的项目子目录:

使用源和目标子目录之间的字节差异 du

root@c-00000051:~# du -cs /home/hholtmann/proj/
18992676    /home/hholtmann/proj/
18992676    total
root@c-00000051:~# du -cs /media/wd750/c51/home/hholtmann/proj/
19006768    /mnt/wd750/c51/home/hholtmann/proj/
19006768    total
Run Code Online (Sandbox Code Playgroud)

但是:相同的源和目标子目录之间没有文件计数差异

root@c-00000051:~# find /home/hholtmann/proj/ -type f -follow | wc -l
945937
root@c-00000051:~# find /mnt/wd750/c51/home/hholtmann/proj/ -type f -follow | wc -l
945937
Run Code Online (Sandbox Code Playgroud)

为什么会有这样意想不到的结果?文件就是文件……尤其是在用户的主目录中!

我错过了什么?或者这是我准备好管理的迹象!?!

解决方案和答案:

下面选定的答案解释了字节数差异和我对 rsync 摘要数据的错误期望。鉴于两个卷都是具有默认块大小的 ext4,我对这个字节差异感到惊讶。我只是假设每个文件在du数字方面都占用相同的空间。

确实通过添加-vv到 rsync 并再次运行向 rsync 添加更多详细输出,找到了一些未rsync 的文件。

我看到的是来自 rsync 的错误,指出由于文件上的“扩展属性”,它无法将我的任何 DROPBOX 目录文件写入目标。rsync 正在跳过我所有的保管箱路径文件。

最终我的 /home 卷是使用user_xattr/etc/fstab 文件中的ext4 挂载选项挂载的:

/dev/mapper/vg1-lv_home /home   ext4 nobarrier,noatime,user_xattr 0 2
# I HAD to add the ,user_xattr option to match my home volume
/dev/sda1           /mnt/wd750  ext4 nobarrier,noatime,user_xattr 0 2
Run Code Online (Sandbox Code Playgroud)

在第三次执行另一个完整的 rsync 之后,我决定让我的完整主文件夹和 rsync 备份上的文件计数整晚运行:

root@c-00000051:~# find /home/hholtmann/ -type f | wc -l
4203266
root@c-00000051:~# find /mnt/wd750/c51/home/hholtmann/ -type f | wc -l
4203266
Run Code Online (Sandbox Code Playgroud)

** 文件的完美搭配 **

结论:

** 始终确保您的备份卷使用与源完全相同的文件系统挂载选项挂载,并使用 rsync 打开完整日志记录,以便稍后进行 grep 分析以搜索长文件列表中的任何错误!**

小智 14

致所有其他在深夜休假工作的可怜的迷失灵魂,

--checksum 让 rsync 实际上检查文件中是否有更改,否则它会检查时间戳和文件大小并每天调用它,

这在 99.9% 的情况下就足够了,让你在剩下的 0.01% 中在地狱中燃烧,直到你弄清楚这一点

  • 那剩下的0.09%的情况呢?(对不起) (3认同)

小智 12

这个问题有两个部分。首先,为什么“文件数”和“传输的文件数”之间存在差异。这在 rsync 联机帮助页中有解释:

文件数:是所有“文件”(一般意义上)的计数,包括目录、符号链接等。

传输的文件数:是通过 rsync 的增量传输算法更新的普通文件的计数,包括创建的目录、符号链接等

这里的差异应该等于目录、符号链接、其他特殊文件的总数。这些不是“转移”而是重新创建。

现在是第二部分,为什么与 du 存在大小差异。du 显示文件使用的磁盘空间量,而不是文件的大小。例如,如果文件系统块大小不同,则同一个文件可以占用不同数量的磁盘空间。

如果您仍然担心数据完整性,一个简单的方法是为所有文件创建哈希并进行比较:

( cd /home/hholtmann && find . -type f -exec md5sum {} \; ) > /tmp/hholtmann.md5sum
( cd /media/wd750/c51/home/ && md5sum -c /tmp/hholtmann.md5sum )
Run Code Online (Sandbox Code Playgroud)