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% 中在地狱中燃烧,直到你弄清楚这一点
小智 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)