私の印象は、tarがファイルを圧縮しないことです。 100万個の小さなファイル(du -h
〜4.2G)を圧縮しましたが、結果のtarが元のサイズ(〜1.3G)の4分の1に過ぎなかったときにどれだけ驚いたかをls -lh mytar.tar
想像してみてください。
明らかに、これらの小さなファイルは報告されたサイズよりも多くのスペースを占めています。他の質問に答える空でない各ファイルが占有していることを示します。少なくともサイズに関係なく1KBです。しかし、この1KBはどこから来ており、ファイルシステムによって異なり(ext4)、1.01KBファイルが2KBを占めますか?
つまり、実際のファイルサイズ、特にディレクトリ内の多くのファイルをどのように測定しますか?試してみましたが、du --apparent-size -h
437Mしか得られなかったので、これら3つの非常に異なる数字のために非常に混乱しています。
答え1
Christopherが指摘したように、問題は次のようによく似ています。1バイトのテキストしかありませんが、テキストファイルが少なくとも4kBを占めるのはなぜですか?
個人的にこれを重複として分類するかどうかはわかりません。
ところで1KBはどこから来るのでしょうか?
より一般的には4KB
ファイルシステムは、個々のバイトではなくバイトブロック(割り当て単位とも呼ばれる)として割り当てます。したがって、シングルバイトをファイルに保存するには、ファイルにブロック全体が必要です。これは、ブロックの残りの部分は空ですが、他のファイルではそれを使用できないことを意味します。
この数字の起源は不明ですが、多くのものに適しています。たとえば、低レベルでは、シングルバイトをディスクに書き込むことはできず、ブロックのみを書き込むことができます。最新のHDやSSDにも4KBの制限があることが多いです。つまり、1バイトを書き込むには、まず4KBをロードし、1バイトを変更してからブロック全体を書き換える必要があります。ブロック全体を書き込もうとすると、元の内容を読む必要はありません。したがって、ハードウェア制約に準拠したファイルシステムがより効率的です。
Stephen Kittが指摘したように、4KBは多くのカーネルがext3の最大ブロックサイズをサポートしています。。 (返品ここで議論してください)。一般に、ブロックサイズが大きいほど、アクセス時間はより効率的である。つまり、ブロックが大きいほど良いです。
異なるファイルシステム間に違いはありますか(ext4)
昔は、512は一般的なブロックサイズでしたが、この数字はまだ時々デフォルトとして表示されます。 Tarファイルは非常に古く、同じ512バイトのブロックサイズ(おそらく、ファイルシステムとハードウェアとの整合性を維持することで、ディスクの書き込み速度が非常に速くなります)。これらのtarファイルは非常に小さいファイル(<512バイト)の場合は依然として非常に無駄です。
今日では、1KBではなく4KBソートファイルシステムがより一般的です。
はい、異なるブロックサイズを使用するようにフォーマットするときにファイルシステムを設定できます。ファイルシステムごとに制限が異なりますが、ほとんどは設定可能です。
1.01KBファイルが2KBを占めていますか?
ブロックサイズを1KBと仮定するとそうです。
答え2
あなたの例では、ファイルシステム内の単一のファイルが使用する平均スペースは4200バイトです。
tarアーカイブのファイルオーバーヘッドは512バイトなので、例ではファイルの平均サイズは800バイトです。
多くのファイルが800バイト未満で、一部のファイルが4096バイトよりわずかに大きく、ファイルシステムが4096バイトの内部ブロックサイズを使用しているが4096バイト未満のフラグメントを実装していない場合、説明は正確です。
すべてのファイルが4096バイト未満の場合、du
4Gが報告されるため、一部のファイルには4096バイトのブロックが2つ必要です。