2

次の問題にたどり着きました。Linux で cp コマンドを使用してファイル A をファイル B にコピーすると、これらのファイルのサイズが異なります。たとえば、A は 6.4M で、B は 7.0M です。同じディレクトリでこれを行っても発生します(ドライブごとにブロックサイズが異なるのを避けるため)。

これは何についてですか?回避する方法は?ファイルを変更しますか?

さらに、他にも奇妙な動作がいくつかあります。ファイル A をファイル B に変換し、すぐに B のサイズを確認しようとすると、0 または 6.2M になります。しばらくすると、B のサイズは 7.0M で一定になります。コピーの中間結果をキャプチャすることは可能ですか? なぜそれはとても遅いのですか?

4

2 に答える 2

4

と仮定coreutils ducpます。

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
于 2012-04-28T16:02:33.807 に答える
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

したがって、FIEMAP を使用しようとする coreutils のバグのある cp と、FIEMAP を正しく処理しないカーネルのバグのあるファイルシステムが疑われます。カーネルと coreutils パッケージをアップグレードします。

于 2012-04-28T16:14:38.227 に答える