ファイルサイズはどこから来るか。つまり、lsとcpはファイルサイズをどのように知ることができますか?

ファイルサイズはどこから来るか。つまり、lsとcpはファイルサイズをどのように知ることができますか?

最近、私の500GB SSDのファイルサイズは33Pバイトというファイルレポートを受け取りました。ここ。これが完了すると、lsスペースcpが不足しているというメッセージが表示されます。

VFSに関する私の限られた知識と理解のために、(SATA)ドライバがディスクと通信し、inodeに到達するまでVFSを介して移動すると信じています(セクション8.6のinodeの説明に基づいて仮定)。ここ)その後、カーネルは何らかの方法でそれをユーザースペースに渡します。

ls最後に、サイズを知る方法も知りたいのですが、ファイルが間違ったcpサイズを報告する方法、後でこのようなことが再び発生した場合、どこで答えを見つけることができるのかを知りたいです。

答え1

strace -v -e trace=lstat ls -l file
[...]
lstat("tw.txt", {[...] st_size=1103, [...]

答え2

ファイルサイズはファイルの一部として保存されます。メタデータ、ファイルタイプ(ディレクトリ/一般/シンボリックリンク/...)、タイムスタンプ、権限などが含まれます。アプリケーションは次を使用してこのメ​​タデータを検索します。statシステムコール。メタデータはファイルのinodeに保存されます。

ファイルがSATAディスクに保存されている場合、SATAドライバは関連しますが、ファイルシステムよりはるかに低いレベルです。 SATAレベルについて考えることは、何が起こっているのか理解するのに役立ちません。むしろその逆です。

ファイルがディスクより大きい場合があります。ファイルを圧縮できます。ほとんどのファイルシステムは非常に単純な形式の圧縮のみをサポートします。スパースファイル、ヌルバイトの大きな塊がディスクに保存されない場合。報告されたディスク使用量にはdu省略されたブロックは含まれませんが、報告されたファイルサイズにはls含まれます。

〜のようにこんなQ.ウェンブリーあなたが見つけたサイズ(36028797019011568)が完全に合理的なサイズ(47600)から少しずれていることをコメントで指摘してください。したがって、このサイズは正当なスパースファイルではない可能性が高いですが、ディスクのデータ破損の兆候である可能性が高いです。他のことをする前にまず実行してください。記憶力テスト。 RAMは、修正されていないシングルビットエラーの最大のソースです。このエラーによりデータがさらに破損する可能性があることに注意してください。

関連情報