web-dev-qa-db-ja.com

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

私は次のことを行うと気づきました:

ls -ls file

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

私がする時:

stat file

ブロック数はlsで与えられる数の2倍の16であることに気づきました。

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

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

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

9
stantona

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

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

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

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

ソースコードと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 says-kオプションが指定されていない限り、デフォルトのブロックサイズは実装定義です。

GNU coreutilslsに実装されているデフォルトのブロックサイズは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 <[email protected]>
Date:   Mon Jun 29 15:23:04 1998 +0000

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

また、dudfで使用されるブロックサイズも1024であることに注意してください。lsは、それらで構成することを選択しただけです。 duおよびdfの場合は、POSIX標準と競合します(したがって、ここでは環境変数POSIXLY_CORRECTが使用されます)。これはGNUチーム、ウィキペディアのページを参照 [〜#〜] posix [〜#〜] この論争についての決定のようです。

コマンドstatの場合。

これはPOSIX標準の一部ではありませんが、 statsystem call はそうです。ただし、ブロックサイズの単位は標準化されていません( sys_stat.h ):

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

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

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

GNU coreutils(したがってlsコマンド)はLinuxカーネルの一部ではなく(したがってstat呼び出し)、システムのさまざまな側面を対象としているため、GNU coreutilsの方が多い人間向け(読みやすい)、ハードウェア抽象向けLinuxカーネル(したがってハードウェアに近い)。

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

4
Eddy Xiao

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

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

1
antje-m