linux – 使用rsync复制数据会导致大小差异

前端之家收集整理的这篇文章主要介绍了linux – 使用rsync复制数据会导致大小差异前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在切换机器并将旧硬盘驱动器(/ dev / sda4)连接到新机器上.

与新的硬盘(736G)相比,旧机器的硬盘略小(720G),所以我创建了一个稍大的分区.

所以,我然后运行rsync将所有数据复制到新分区,如下所示:

linux-70e2:/ # time rsync -azprvl /mnt/external-disk/foo /media/sda4/

...
sent 169,237,139,987 bytes  received 24,529 bytes  24,419,185.41 bytes/sec
total size is 190,542,953,489  speedup is 1.13

real    115m30.297s
user    112m13.068s
sys     3m59.996s

数据被复制而没有错误.

但是,当我这样做时:

du -h -m -s /mnt/external-disk/foo /media/sda4/foo

我明白了:

162414  /mnt/external-disk/foo
181721  /media/sda4/foo

有人可以解释这个巨大的差异吗?为什么我没有得到相同的结果?这让我疯了好几天了.还有一些其他分区,我也有类似的差异.

两个分区都是ext4.

linux-70e2:/ # mount | grep sda4
/dev/nvme0n1p5 on /media/sda4 type ext4 (rw,relatime,data=ordered)
/dev/sda4 on /mnt/external-disk type ext4 (rw,nosuid,nodev,data=ordered,uhelper=udisks2)

据我所知,两个驱动器都是SSD-s没有问题.其中一个是全新的.我在他们两个上运行e2fsck.

另外,我跑了:

find -L /mnt/external-disk type/foo -type l

这不会列出源目录下的任何符号链接.

这不是我第一次使用rsync来做这种事情,但我之前从未遇到过这种问题.请指教!

解决方法

这种差异很可能是由旧磁盘上人口稀少的文件引起的.

无论如何,让我们首先检查文件和inode编号是否相同:

> issue find< path> |两个挂载点上的wc -l.文件/目录的数量是否相同?
>问题df -i. inode的数量是否相同?

如果两个问题的答案都是肯定的,那么差异可以通过新磁盘上更稀疏的文件来解释.但什么是稀疏文件?简而言之,稀疏文件是普通文件,它们比它们看起来要小.这是可能的,感谢(相对)现代文件系统的一个功能,而不是将所有零写入文件,只需设置一个标志告诉系统“这个文件(或部分)充满了零,不要让我写商场”.

默认情况下,du报告文件占用的实际空间,而不是表观大小.要显示表观尺寸,请使用du –apparent-size(其他选项,请参阅du manpage)

对于实际示例,您可以使用命令truncate test.img -s 1G创建稀疏文件.正如ls所报告的那样,新创建的文件大小为1 GB,但是如果你尝试du -hs test.img,你会看到一个非常非常小的文件大小(甚至可能是零!).怎么可能?如上所述,现代文件系统有时会对应用程序“撒谎”,报告实际上不存在的分配大小.另一方面,du -hs –apparent-size test.img将打印与ls相同的大小.

当您开始写入稀疏文件时,文件系统将动态分配所需的空间.例如,发出dd if = / etc / services of = test.img conv = notrunc,nocreat会将一些数据写入以前全稀疏的test.img文件中.现在,运行du -hs test.img将报告为数据存储分配的~600 KB.

一个显而易见但非常重要的含义是,稀疏文件支持只能针对零填充文件(或部分文件)进行优化.在写入文件的同一时刻,其分配的空间开始增长.如果您将其他零写入文件,这是真实的事件,除非应用程序知道如何处理稀疏文件(在这种情况下,应用程序将建议文件系统它将写入全零,并且文件系统优化符合).

如果你想真正预先分配一些空间怎么办?然后你可以使用fallocate test.img -l 1G.如果你执行ls; du -hs test.img; du -hs –apparent-size test.img,你会发现所有工具都报告了相同的大小,因为该文件确实是由fallocate调用完全分配的.

简而言之,在复制期间,有可能以较少的稀疏方式重新创建一些文件,用“真实”零替换稀疏部分.要在rsync中使用稀疏文件,必须使用-S选项.

猜你在找的Linux相关文章