我遇到了以下问题。当我在Linux中使用cp命令将文件A复制到文件B时,这些文件的大小是不同的,例如, A为6.4M,而B为7.0M。即使我在同一目录中执行此操作也会发生这种情况(以避免不同驱动器上的不同块大小)。
这是什么意思?怎么避免?它改变文件吗?此外还有一些其他奇怪的行为。如果我将文件A处理到文件B并尝试立即检查B的大小,则它给出0或例如6.2M,一段时间后,B的大小为7.0M且不变。我有可能捕获一些复制的中间结果吗?为什么那么慢?
答案 0 :(得分:4)
假设coreutils
du
和cp
。
当cp
复制文件时,尝试以使用启发式方法保留其“稀疏性”。
默认情况下,粗略的启发式检测稀疏的SOURCE文件,并且相应的DEST文件也是稀疏的。
因此,如果启发式失败,cp
将创建一个没有漏洞的纯文件。在这种情况下,副本的磁盘使用量将大于源的磁盘使用量 - 但是表观文件大小应该相同,并且内容应该相同(尝试cmp
)。
使用stat
查看文件的外观大小和磁盘使用情况(以及更多信息)。
$ dd if=/dev/zero of=./sparse bs=1 count=1 seek=10240000
1+0 records in
1+0 records out
1 byte (1 B) copied, 1.4101e-05 s, 70.9 kB/s
$ cp sparse copy1
$ cp --sparse=never sparse copy2
$ ll
-rw-r--r-- 1 me users 10240001 Apr 28 17:59 copy1
-rw-r--r-- 1 me users 10240001 Apr 28 18:00 copy2
-rw-r--r-- 1 me users 10240001 Apr 28 17:59 sparse
$ du sparse copy*
4 sparse
4 copy1
10004 copy2
$ stat sparse copy*
File: `sparse'
Size: 10240001 Blocks: 8 IO Block: 4096 regular file
...
File: `copy1'
Size: 10240001 Blocks: 8 IO Block: 4096 regular file
...
File: `copy2'
Size: 10240001 Blocks: 20008 IO Block: 4096 regular file
$ cmp sparse copy1 && echo identical
identical
$ cmp sparse copy2 && echo identical
identical
答案 1 :(得分:1)
FIEMAP存在许多错误:
http://lwn.net/Articles/429349/
http://lkml.indiana.edu/hypermail/linux/kernel/0906.1/00436.html
http://www.spinics.net/lists/linux-ext4/msg24337.html
所以我怀疑来自coreutils的一个错误的cp试图在内核中使用FIEMAP和一个错误的文件系统,而这个文件系统没有正确处理FIEMAP。升级内核和coreutils包。