scp后从一台机器到另一台机器的大小不同

scp后从一台机器到另一台机器的大小不同

我有一个大小为 7.5Gb 的文件,我通过 scp 将其从一台 Solaris 计算机传输到另一台 Solaris 计算机。 scp 之后,文件在目标服务器中显示 13Gb。我想知道这是什么原因?

答案1

发生这种情况的一种方法是带有“漏洞”的文件:稀疏文件。假设一个程序做了类似的事情:

fd = open("somefile", O_RDWR);
seek(fd, 1024, SEEK_SET);
write(fd, "blah blah", 9);

系统seek()调用跳过文件的第一个磁盘块(我想,自从我使用 Solaris 以来已经有一段时间了),并在第二个块中写入 9 个字节。大多数/所有 Unix 和 Linux 文件系统实际上不会分配第一个从未写入的磁盘块。如果您复制文件、存档文件或执行其他操作,文件就会增大,因为对read()文件的前 1024 个字节执行的任何操作都会返回全零字节。

话虽如此,这样的情况确实很少遇到。我会更努力地寻找一些错误,比如重复复制之类的。

您可以通过比较源文件的大小和磁盘使用情况来检查源文件是否稀疏:

ls -l the_file
du -k the_file

如果第二个数字(磁盘使用情况)小于第一个数字(实际文件大小),则文件是稀疏的。

如果文件是稀疏的,则可以使用rsync -a --sparse来传输它,而不是scp。如果您告诉它,Rsync 可以将稀疏文件复制到稀疏文件。

相关内容