ファイルへの書き込みと/dev/zeroからの切り取りの違い

ファイルへの書き込みと/dev/zeroからの切り取りの違い
$ timeout 1 cat /dev/zero > file1

$ wc -c file1
270422016 file1

$ du file1
264084 file1

質問:

(1)270422016 null文字はどのように264084バイト(例:258M)になりますか?

$ truncate -s 270422016 file2

$ wc -c file2
270422016 file2

$ du file2
0 file2

質問:

(2)以前と同じ数のヌル文字file2で生成されたが、サイズが0の理由は何ですか?file1file2

(3)実行されたタスクのうち実行されていない/dev/zeroタスクは何であり、その逆の場合も同じですか?truncate

答え1

  1. duバイト単位のサイズは表示されませんが(この場合)、1024バイトのブロックが表示されます。したがって、この数字は実際には同じです(264084 * 1024 = 270422016)。

  2. truncate作るスパースファイル前提は、ファイルシステムがこれらの機能をサポートしていることです。

  3. /dev/zero事実上、無限のバイトが生成さ\0れ、ファイルに書き込まれ、ゼロを書くと、他の書き込みと同様にスペースが消費されます。スペースを占めるファイルを生成する別の方法実際にはゼロは記録されません。使用しますfallocate

filefragそのファイルに関する追加情報を取得するために使用できます。

$ timeout 1 cat /dev/zero > file1
$ truncate -s 270422016 file2
$ fallocate -l 270422016 file3
$ filefrag -e file1 file2 file3

ファイル1(cat /dev/zero)は完全に書かれていますが、この場合でも断片化されていることがわかりました。

Filesystem type is: 58465342
File size of file1 is 270422016 (66021 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..    8175:    9983740..   9991915:   8176:            
   1:     8176..   32751:   11049359..  11073934:  24576:    9991916:
   2:    32752..   54271:   11193265..  11214784:  21520:   11073935:
   3:    54272..   62191:   11182601..  11190520:   7920:   11214785:
   4:    62192..   70383:   11214785..  11222976:   8192:   11190521: last,eof
file1: 5 extents found

断片化は、使用可能な空き領域のサイズとファイルサイズがどれくらいになるかを知らずに、ファイルシステムがファイルの書き込みを開始することを決定した場所によって異なります。


ファイル2(truncate)は空のシェルに過ぎず、予約されたスペースはまったくなく、サイズは物理拡張領域ではなくメタデータとしてのみ表示されます。

File size of file2 is 270422016 (66021 blocks of 4096 bytes)
file2: 0 extents found

ファイル3(fallocate)が割り当てられているが記録されていないとマークされます。したがって、断片化されていない場合でも物理スペースが予約されています(ファイルシステムにサイズが事前に知られているため)。そのアドレスに物理的に異なるデータが保存されていても、ファイルを読み込むと0になります。これは、すぐにファイル割り当てがスペースを確保するだけでディスク上のデータを上書きしないためです。

File size of file3 is 270422016 (66021 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..   66020:   10983338..  11049358:  66021:             last,unwritten,eof
file3: 1 extent found

関連情報