ファイルブロックサイズ-statとlsの違い


9

私がするとき、私はそれに気づきました:

ls -ls file

それは、ブロック数、たとえば8ブロックを提供します。

私がする時:

stat file

ブロック数が16で、lsで指定された数の2倍であることに気づきました。

私のファイルシステムのブロックサイズは4096です。lsで使用されるブロックの任意の単位は1024であることがわかりました。ブロックを報告するときに、statが512バイトの任意の単位を使用すると言って間違いありませんか?

もしそうなら、矛盾の理由はありますか?

私はext4ファイルシステムでUbuntu 11.10を実行しています。

回答:


9

多くのディスクのセクターサイズは512バイトです。つまり、ディスク上で読み取りまたは書き込みを行うと、一度に512バイトのセクター全体が転送されます。セクターがファイル間で分割されていないファイルシステムを設計するのは自然なことです(設計が複雑になり、パフォーマンスが低下します)。したがって、ファイルシステムはファイルに512バイトのチャンクを使用する傾向があります。したがって、lsおよびなどの従来のユーティリティduは、サイズを512バイトのチャンク単位で示します。

人間にとって、512バイト単位はあまり意味がありません。1kBは同じ桁数で、はるかに意味があります。ファイルシステムブロック(ファイルが分割される最小単位)は、実際には複数のセクターで構成されることがよくあります。1kB、2kB、4kBは一般的なファイルシステムブロックサイズです。したがって、512バイト単位はファイルシステム設計によって強く正当化されておらず、ディスクドライバーの外部で512バイト単位を使用するという伝統以外の理由はありません。

だから、あなたはそれのために多くをしていない伝統と、より読みやすい慣習を持っています。8進数や16進数に少し似ています。正しい数字と間違っている数字はありません。同じ数字を書く方法は異なります。

多くのツールには、表示単位を選択するオプションがあります:ls --block-size=512GNUのls場合、設定POSIXLY_CORRECT=1 GNU dfおよびGNUの環境でdu512バイト単位を取得するようします(または、-k1kB単位を強制するために渡します)。statGNU coreutils のコマンドが「ブロックサイズ」(%B値)として公開するものは、内部インターフェイスのOS依存の値です。OSによっては、ファイルシステムまたはディスクコードで使用されるサイズに関連する場合と関連しない場合があります(通常は関係ありません。ブロックサイズとクラスターサイズの違いを参照してください)。Linuxでは、基になるドライバーが何をしているかに関係なく、値は512です。の価値は%B決して重要ではありません。それが存在するのは単なる奇妙なことです。


4

ソースコードとPOSIX標準を掘り下げた後、@ antje-mと@Gillesの答えはほとんど正しいと思います。

からのコメントを引用する価値があります POSIX.1-2008要約として。

512バイト単位の使用は歴史的な慣例であり、このPOSIX.1-2008のボリュームでは、lsおよびその他のユーティリティとの互換性を維持しています。これは、ファイルシステム自体が512バイトのブロックに基づくことを義務付けるものではありません。-kオプションが妥協策として追加されました。System Vでの完全な履歴の一貫性(BSDシステムでの512/1024バイトの混合使用に対して)のため、512バイトがデフォルトの最適な単位であり、-kオプションで1024-に切り替えることが標準開発者によって合意されましたバイト単位は良い妥協案でした。より論理的な1024バイト量を好むユーザーは、512バイト単位に依存する多くの履歴スクリプトを壊すことなく、dfをdf -kに簡単にエイリアスできます。

のブロックサイズについて ls -s

POSIX は言う-kオプションが指定されない限り、デフォルトのブロックサイズは実装定義であるています。

に実装されてGNU coreutils lsいるデフォルトのブロックサイズは、で定義されていGNU gnulibます。 gnulib/lib/human.c

/* The default block size used for output.  This number may change in
   the future as disks get larger.  */
#ifndef DEFAULT_BLOCK_SIZE
# define DEFAULT_BLOCK_SIZE 1024
#endif

古いコミットから来ています:

commit 96e78d1f64d7c8d2acc5ad27dc3e73b96ae80585
Author: Jim Meyering <jim@meyering.net>
Date:   Mon Jun 29 15:23:04 1998 +0000

コミットメッセージ自体は1024という数字については何も言っていません。

そして、ブロックサイズがで使用されることに注意duしてdfも1024年であるが、lsちょうど彼らとから構成することにしました。for dudfそれはPOSIX標準との競合です(したがって、ここでは環境変数POSIXLY_CORRECTが使用されます)。これはGNUチームの決定のようです、この論争についてはウィキペディアのページPOSIXをご覧ください。

コマンドについてstat

これはPOSIX標準の一部ではありませんが、システムコールは一部です。ただし、ブロックサイズの単位は標準化されていません(sys_stat.hstat )。

stat構造体のst_blocksメンバーの単位は、POSIX.1-2008内では定義されていません。

このstatコマンドは、statシステムコールによって提供された情報を表示し、ほとんど例外なく512ブロックサイズを使用します(これらはLinux以外のもので、HP-UX、IBM AIXなどです。で定義されているマクロを参照してくださいgnulib/lib/stat-size.hです。で)。

したがって、512という数字は、歴史的な選択であり、Linuxの慣例です。

GNU coreutils(したがって、lsコマンド)(それゆえのLinuxカーネルの一部ではありませんstatコール)、彼らは別のシステムの側面をターゲットにしている、GNU coreutilsより人間(読みやすい)、およびハードウェアの抽象化(したがって、近いハードウェアへの)のためのLinuxカーネル用です。

編集:4096ブロックサイズは「IOブロック」サイズです。実際の物理ブロックサイズは、この質問で説明されているように、依然として512バイトです。


1

statコマンドは、ハード・ディスクの物理ブロックサイズを使用しています。1956年の創業以来、基本的にすべてのハードディスクは512バイトのブロックを使用しています。ただし、これは最近のAdvanced Formatのリリースに伴い変化し始めています。

私はと思われるls1024バイト、ブロックサイズにも歴史的な理由'を有しています。おそらく、ファイルシステムのブロックサイズが1024であることがかつて一般的であったか、サイズをキロバイト単位で指定するために使用されていました。ただし、(少なくともGNU coreutils)では、--block-size=オプションでブロックサイズを指定できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.