$ 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の理由は何ですか?file1
file2
(3)実行されたタスクのうち実行されていない/dev/zero
タスクは何であり、その逆の場合も同じですか?truncate
答え1
du
バイト単位のサイズは表示されませんが(この場合)、1024バイトのブロックが表示されます。したがって、この数字は実際には同じです(264084 * 1024 = 270422016
)。truncate
作るスパースファイル前提は、ファイルシステムがこれらの機能をサポートしていることです。/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