filesystems – なぜ「サイズ」と「ディスク上のサイズ」に大きな違いがあるのか?

filesystems

下の写真のように、私のフォルダ内のディスクのフィールドのサイズとサイズにはこんなにも差があります。これはなぜでしょうか?

Screenshot showing 50,875 files in 1,504 folders, 105 MB being 1.43 GB on disk

Windowsの割り当て単位の関係で、ディスク上のSizeはSizeよりも少し多いはずなのは知っているのですが、なぜそんなに差があるのでしょうか?もしかしてファイル数が多いからでしょうか?

ところで、このフォルダは私のAndroid携帯のSDカードにあります。この中に、私の地図アプリはキャッシュされた地図を保存し、アプリはGoogleマップから地図を取得します

  304  vfsoraki  2014-01-20


ベストアンサー

これはSDカードだと言っているので、FAT/FAT32ファイルシステムを使用していると仮定しています。

このファイルシステムは SD カードだと言っているので、ここでは FAT/FAT32 ファイルシステムを使用していると仮定しています。他のファイルシステムは異なるかもしれませんが、いずれにせよ Windows ではサポートされていません

小さなファイルをたくさん持っている場合は、確かに可能です。これを考えてみてください

  • 50,000 files.

  • FAT32の最大値である32kBのクラスタサイズ(割り当て単位)

OK、今、取られる最小スペースは 50,000 * 32,000 = 1.6 GB です (計算を簡単にするためにバイナリではなく SI 接頭辞を使用して)。各ファイルがディスク上で取るスペースは、常に割り当て単位サイズの倍数です – ここでは、各ファイルが実際には1つの単位内に収まるように十分に小さく、いくつかの(無駄な)スペースが残っていると仮定しています

各ファイルが平均2kBだとすると、合計で約100MBになりますが、割り当て単位のサイズの関係で、平均でその15倍(1ファイルあたり30kB)も無駄になってしまいます


In-depth explanation

なぜこのようなことが起こるのでしょうか?FAT32ファイルシステムは各ファイルがどこに保存されているかを追跡する必要があります。もしそれがすべてのバイトのリストを保持していたら、テーブル(アドレス帳のようなもの)はデータと同じ速度で成長し、多くのスペースを浪費してしまうでしょう。そこで彼らが行うのは、「クラスタサイズ」とも呼ばれる「割り当て単位」を使用することです。ボリュームはこれらの割り当て単位に分割され、ファイルシステムが懸念する限り、それらを細分化することはできません – それらはそれがアドレスできる最小のブロックです。あなたは家の番号を持っていますが、あなたの郵便配達員はあなたの寝室の数や誰が住んでいるかを気にしません

では、非常に小さなファイルを持っている場合はどうなるのでしょうか?ファイルシステムはファイルが0キロバイトであろうと2キロバイトであろうと15キロバイトであろうと気にしません。ファイルが使用しているのはこのスペースのほんの少しだけで、残りは基本的には無駄になりますが、ファイルの所有物となります

割り当て単位のサイズが異なるのはなぜですか?まあ、それは、より大きなテーブル(アドレス帳、例えば、ジョンは123 Fake Street, 124 Fake Street, 666 Satan Laneなどに家を所有していると言う)を持つか、または各ユニット(家)のより多くの無駄なスペースを持つかの間のトレードオフになります。あなたがより大きなファイルを持っている場合、それはより大きな割り当て単位を使用することはより理にかなっています – なぜなら、他のすべての他のすべてが満たされるまで、ファイルは新しいユニット(家)を取得しないからです。あなたが小さなファイルをたくさん持っている場合は、まあ、あなたはとにかく大きなテーブル(アドレス帳)を持っているつもりなので、それらに小さなユニット(家)を与えることができます

大きな割り当て単位は、原則として、小さなファイルをたくさん持っている場合には、多くのスペースを浪費します。通常、一般的な使用のために4kB以上にする理由はありません


Fragmentation?

フラグメンテーションに関しては、フラグメント化はこのようにスペースを無駄にしてはいけません。大きなファイルを複数の割り当て単位に分割して断片化することもできますが、それぞれの単位は次の単位が開始される前に満たされるべきです。デフラグはアロケーションテーブルのスペースを少し節約できるかもしれませんが、これはあなたの特定の問題ではありません


Possible solutions

gladiator2345が提案したように、この時点でのあなたの唯一の選択肢は、このまま生きるか、より小さな割り当て単位で再フォーマットするかです

あなたのカードはFAT16でフォーマットされているかもしれませんが、これはテーブルサイズの制限が小さく、したがって、より大きなボリュームに対応するためには、より大きな割り当て単位を必要とします(32キロバイトの割り当て単位で2GBの上限があります)。Source courtesy of Braiamそうであれば、いずれにせよ安全にFAT32でフォーマットできるはずです

305  Bob  2014-01-20


これは、一つのファイルに圧縮/アーカイブすることが役立つかもしれない状況の一つです。Bobが彼の回答の中で言ったことは本当です しかし、他の回答が示唆しているように、解決策はディスクを再構築するよりも簡単かもしれません。もしあなたがディレクトリを圧縮したりアーカイブしたりした場合(zip、tar、または他の方法を使って)、ファイルシステムはあなたがいくつかの小さなファイルではなく、一つの大きなファイルを持っていることを確認します。圧縮しなくても、それらすべての「小さなファイル」が単一の大きなファイルとしてカウントされるので、ほぼ1.4GiBのスペースを取り戻すことになります

この中で、私の地図アプリはそのキャッシュされた地図を保存し、アプリはGoogleマップからその地図を取得します

複数のファイルの代わりにアーカイブやデータベースを使うように開発者と相談してみてはいかがでしょうか。その方がディスクの断片化が少なくて済むでしょうし、特に NAND フラッシュドライブの場合は確実にスペースを節約できるでしょう。100MBのペイロード/有用なデータが1.4GiBになるという馬鹿げた状況を説明するなら、データの保存方法に何か問題があり、開発者はより良い解決策を持ってくるべきです

45  Braiam  2014-01-20


すでに説明したように、サイズの違いの最も一般的な理由は、使用されているスペース対割り当てられているスペースです。しかし、それだけではなく、NTFSにはファイルに隠しデータを追加する機能があります。この可能性を悪用したのが、2019年後半に発生した医療業界向けランサムウェアです

ファイルフォークと代替データストリーム

リソースフォーク“は、1984年(Macintosh)からAppleが使用している、プログラムの主な内容(命令)とそれに関連するリソース(アイコンやメニューなど)を同じファイルに格納する方法です。実行ファイルにリソースを埋め込むことは一般的な手法ですが、フォークで行うことはそうではありません

Apple は一貫して Macintosh のファイルシステムをファイルフォークをサポートするように設計し、Microsoft が FAT を置き換えるために NTFS を設計したときにも、フォークは “代替データストリーム” という名前で導入されました。(ADS)との契約を締結しました

NTFSでは、ファイルには以下のようなものが含まれています

  • 必須の無名データストリーム(UDS)
  • 1つ以上のオプションの代替データストリーム(ADS)

目に見えないところに隠れています

ファイルフォークは悪くないが、NTFSのADSはWindowsエクスプローラを含む一般的なツールではサポートされていないことを除けば、ADSは事実上の隠し機能であり、ハッカーにとっては予想外の贈り物である。Wikipediaより

代替ストリームはWindowsエクスプローラには表示されず、ファイルのサイズには含まれません

UDS サイズのみを報告するファイルサイズは ADS の存在によって変化しないが、割り当てられたサイズ(ファイルシステムによってファイルに割り当てられたクラスター)は、すべてのストリームを含むファイルの実際のサイズを報告する

Windows エクスプローラは ADS を報告しないし、CMD コマンド dir も報告しない。しかし、ADS は表示されます

ファイルシステムで予約されたキーワードを使用することで、これらのツールのいくつかから ADS を隠すことが可能であることに注意してください (以下にリンクされている Pierce のドキュメントを参照してください)

  • Windowsは、インターネットからダウンロードしたファイルにタグを付けたり、その他のメタデータを保存したりするためにADSを使用しています

  • ハッカーはADSを使用して、悪意のある活動のためにデータやコードを隠しています

読み応えのあるADSの包括的な説明

マルウェアによるADSの利用

深刻なアンチマルウェアツールは、ADSのために見ていますが、マルウェアはまだ大規模で、ADSを使用しています

  • セキュリティスイートの中には、ADSを意識していない、あるいはADSの悪意のある使用法を特定できないものもある
  • 正当なファイルの実行をADSにリダイレクトするのは簡単です(ショートカットを使うなど)

BitPaymer

ransomware BitPaymerは、通常の可視ファイルとしてコンピュータに侵入しますが、実行されるとADSとして正当なファイルに自らをコピーし、初期ファイルを削除します。これでは正規のファイルのサイズは変わらず、ADSは一般的なツールではリストアップされないため、マルウェアは事実上隠れてしまいます

コバルトキティ作戦

また、ADSを使用して非表示

私が言いたいのはクラスターサイズ: 4KB以上の大きなファイルサイズの違いが観測された場合、ADSや隠れたマルウェアの可能性を見過ごさないようにしてください

ADSを自分で実験してみてください

ADS を安全に実験するために、DOS/CMD レベルでこれを試してみてください

Cのルートにファイルの内容を作成して表示します

C:\> echo The main data stream> test.txt
C:\> type test.txt

Result:

C:\> The main data stream

次に、同じ方法で ADS を追加します

C:\> echo The secret message> test.txt:secret

あなたはファイルの中に秘密のメッセージを隠しただけです。ADS の “secret” にバイトを追加したにもかかわらず、エクスプローラのファイルサイズは変わっていないことに注意してください

ADSのコンテンツを表示してみてください

C:\> type test.txt:secret

Result:

The filename, directory name, or volume label syntax is incorrect.

CMD typeではADSの内容を表示することができません。代わりにメモ帳を使うことにします

notepad test.txt:secret

メモ帳では、ADSの内容を見ることができます

The secret message

また、無実のテキストファイルのADSに完全な実行可能ファイルを隠して、いつでも実行することができます。富はハッカーに害を与えません。)

26  mins  2014-01-21


クラスターサイズが大きいために問題があるのかもしれません

マイクロソフトによると

ボリュームに含まれるファイルやフォルダにNTFS圧縮を使用していない場合、SIZEとSIZE ON DISKの差は、必要以上に大きいクラスタサイズのため、スペースの無駄になります。SIZE ON DISKの値が可能な限りSIZE値に近づくように、最適なクラスタサイズを使用するようにしてください。SIZE ON DISKとSIZE値の間に不一致がある場合、デフォルトのクラスタ サイズがボリュームに保存している平均的なファイル サイズに対して大きすぎるため、クラスタ サイズを小さくする必要があることを示しています。これは、ボリュームをバックアップしてから、format コマンドと /a スイッチを使用して適切な割り当てサイズを指定してボリュームを再フォーマットすることによってのみ行うことができます。IE: format D: /a:2048 (この例では2KBのクラスタサイズを使用しています)

クラスタサイズを小さくしてドライブをフォーマットしてみてください

20  arundevma  2014-01-20


私は多くの人が小さいクラスタサイズでドライブを再フォーマットすることを推奨しているのを見ます。これはSDカードなので、多くのベンダーは、NANDのクラスタサイズのサイズに合わせて、推奨されるクラスタサイズにカードを事前にフォーマットしていることに注意してください(両方を同期させておくことは、最適な読み取り/書き込みパフォーマンスと摩耗を減らすために非常に重要です)

NANDのクラスタサイズを変更することはできません(SDカードのハードウェアの物理的属性です)

まず、SDカード上でscandisk/chkdskを実行して、サイズレポートの問題が破損したファイルシステム内に存在しないことを確認してください

第二に、私はこのバグをGoogle Mapの開発者に報告することをお勧めします。彼らは優れたストレージ方法を使用しているはずです。それを修正することで、I/Oとファイルシステムのドライバの活動が少なくなるため、多くのデバイスでアプリがより速く実行されるようになるはずです

9  Matias N Goldberg  2014-01-21


これは多くのファイルシステムの一般的な問題です。ここでは、ファイルシステムが論理ボリュームあたりに扱える「ブロック」の最大数と、ストレージメディアの物理的な制限という2つの要因が働いています。任意のブロックに割り当てられるファイルは1つだけです(ファイルは一般的に必要なだけのブロックを取ります)。そのため、64 バイトのテキストファイルは、ファイルシステムのブロックサイズにもよりますが、4k から 32k までの範囲で使用することができます

これを考える一つの方法として、ファイルシステムの各ブロックを箱に見立て、ファイルシステムを部屋に見立てて考えてみましょう。すべての箱のサイズは同じで、1つの部屋にできるだけ多くの箱を入れようとします。もし、部屋が余っている状態で箱を全部入れてしまうと、部屋が箱でいっぱいになってしまうので、より大きな箱を用意しなければなりません

物を箱に入れるときのルールの一つに、無関係なものを二つも箱に入れてはいけないというものがあります。それらは同じドキュメントの一部でなければなりません。ですから、もし私が1ページのテキストをタイプアップするとしたら、それはそれ自身のボックスを持つことになります。もし私が入力したテキストがページ数が多くて1つのボックスに収まりきらない場合は、別のボックスを見つけて、その代わりにページを入れ続け、すべてのページをファイルするまで繰り返します。また、その文書に使った箱と、それを順番に読むための箱の順番を書き留めていました

箱の整理の仕方によっては、私のマニフェストには一定の数の箱を入れるのに十分なスペースしかないかもしれません。だから、大きな部屋があっても箱の数が少なければ、とても大きな箱を使わないと部屋の容量に達しません

その場合、私の1ページの文書は1つのボックスを占有し、それを共有するものは何もありません

同じ状況が様々なストレージソリューションの間で繰り広げられています。FAT32は、今日の巨大なハードドライブ上の低い数の「箱」しか管理できないので、それを補うために非常に大きな「箱」で終わってしまいます

7  CyberSkull  2014-01-20


クラスタサイズは別として、以下のような条件で不一致が発生することもあります

  • 圧縮されたファイルや暗号化されたファイルは、論理ファイルサイズとは異なるスペースを使用することができます
  • リンクされたファイルは、論理ファイルのサイズに対して、リンク数のn倍のファイルサイズを報告しますが、使用される物理的なスペースは通常より少なくなります

6  Archimedes Trajano  2014-01-20


ウィキペディアのBlock Suballocationのエントリを見てみてください。これはまさにあなたに起こっていることです。Tail Packagingをサポートするファイルシステムを使用することは、アロケーションクラスタのサイズを変更する以外に、この問題のファイルシステムレベルの解決策となります

すべてはディスクを再フォーマットする必要があるという不便さを持っています

いくつかのケースでは、単にそれらのファイルをアーカイブに保存するだけで問題が解決するでしょう (そして、ファイルの最後にスペースを失うのを止めるために、小さなファイルも圧縮されるでしょう)。この場合、解凍に時間がかかるという不都合があります

あなたがいくつかの特定のアプリケーションに関連する問題のために非常に多くの小さなファイルを持っている場合は、別の方法(データベースにあるかもしれません)を使用してソフトウェアのデータを保存する別のオプションです。しかし、もちろんそれはプログラマーのための解決策であって、エンドユーザーのためのものではありません

Block suballocation - Wikipedia

6  kriss  2014-01-20


Windows 10では、個々のファイルのファイルサイズに大きなズレがあることを指摘しましたが、Windows XPで同じ場所(ネットワークドライブ)から同じファイルのプロパティを見てみると、大きなズレはなく、小さなズレがあるだけです。私は、Windows 10にバグがあると思います。449MBのファイルが3.99GBを占有することはおそらくないと思いますが、これはWindows10が教えてくれていることです

0  David Hutchins  2016-06-15


タイトルとURLをコピーしました