ディスク上のファイルとtarアーカイブ内のファイルの合計サイズの違い

ディスク上のファイルとtarアーカイブ内のファイルの合計サイズの違い

私は新しいLinuxユーザーで、まだ学んでいます。私が知る限り、このコマンドは(または等オプションなしtarで単独で)デフォルトでファイルを圧縮しません。複数のファイルを1つのファイルにまとめるだけです。以下は私のテストです。zjJ

root@u2004:~# du -sh /etc/
11M /etc/
root@u2004:~# tar cf etc.tar /etc
tar: Removing leading `/' from member names
root@u2004:~# du -sh etc.tar 
6.6M    etc.tar
root@u2004:~#

ご覧のとおり、ディレクトリ内/etcのファイルの総数は11Mです。単一ファイルにアーカイブした後、新しいアーカイブは6.6Mです。サイズの違いはどこから来ますか?ファイルが何度も書き込まれ、まとめられているのでしょうか?

ベストアンサー1

デフォルトでは、duファイルサイズは「ブロック」単位で測定されます。したがって、各小さなファイル(ブロックより小さい)は必要な数のブロックを占め、残りは空です。ただし、他のファイルでは使用できません(ブロックは1つのファイルにのみ属する可能性があるため)。したがって、一部のバイトを「無駄にする」ことになります。

一方、tarすべてのファイルをリンクします。 「無駄な」スペースがはるかに少ないです。

-btar サイズをよりよく予測するには、duキーを使用できます。

走れば意味

$ du -shb /etc
$ du -shb etc.tar 

次元が互いに近い数値を取得します。違いはファイルの説明に由来します。最初のケースはディレクトリのサイズ、2番目のケースはtarヘッダーのサイズです。

より詳細に研究するには、次のように始めることができます。

$ df /some_test_dir

ディレクトリがどの物理デバイスにあるかを知らせます(ファイルシステム列)。

$ sudo /sbin/dumpe2fs /dev/?? |grep 'Block size'

ここでデバイスを定義すると、そのデバイスのブロックサイズを取得できます。

これでdu /some_test_dirディレクトリが空の場合、ブロックサイズが得られます。

長さ0のファイル(または複数のファイル)を配置すると、duブロックサイズはまだディレクトリに表示されます。これは、ファイルが空き領域を占有せず、ファイルに関する情報が保存されるためです。ディレクトリのブロック内にあります。

次のテストでは、このディレクトリにそれぞれサイズが1ブロック未満のN個のファイルを作成します。実際のサイズは重要ではありません。 0より大きく、ブロックより小さくなければなりません。それではdu目次をお知らせします(N+1)*block。ここで、各ファイルは1ブロックを占有し、ディレクトリ自体も1ブロックを占有します。

ファイルが多い場合(ファイルシステムによって異なります)、ファイル情報を保存するためにディレクトリ自体のサイズが大きくなることがあります。ただし、ディレクトリサイズは常にブロックサイズの倍数です。

おすすめ記事