私は次のことをしたときにそれを見つけました。
ls -ls file
これはブロック数(例えば8ブロック)を提供します。
私がするとき:
stat file
私はブロック数がlsによって与えられた数の2倍の16であることを知りました。
私のファイルシステムのブロックサイズは4096です。 lsで使用される任意のブロック単位は1024であることを学びました。 statがブロックを報告するときに任意の単位である512バイトを使用すると言うのは正しいですか?
それでは、矛盾の理由はありますか?
私はext4ファイルシステムでUbuntu 11.10を実行しています。
答え1
多くのディスクのセクタサイズは512バイトです。これは、ディスクへの読み取りまたは書き込みが一度に512バイトのセクタ全体を転送することを意味します。ファイル間でセクタが分割されないようにファイルシステムを設計すると(設計が複雑になり、パフォーマンスが低下する)、ファイルシステムは512バイトのファイルブロックを使用する傾向があります。したがって、ls
などのレガシーユーティリティはdu
サイズを512バイトブロックとして表示します。
人間にとって512バイト単位はほとんど意味がありません。 1kBはサイズと同じで、より意味があります。ファイルシステムブロック(ファイルパーティションの最小単位)は、実際には複数のセクタで構成されています。 1kB、2kB、および4kBは一般的なファイルシステムブロックサイズであるため、ファイルシステム設計は512バイト単位を完全に正当化できません。ディスクドライバの外で512バイト単位を使用する伝統以外には、妥当な理由はありません。
そのため、長所が多くない伝統があり、より読みやすいルールが登場しています。これは8進数と16進数に少し似ています。正しいことはありませんが、同じ数字を書く方法は異なります。
多くのツールには表示単位を選択するオプションがあります。ls --block-size=512
GNUの場合は、GNUおよびGNU環境でls
512バイト単位を取得するように設定します(または1kB単位を強制的に転送するように渡します)。 GNU coreutilsのコマンドが「blocksize」(値)で表示するのは、オペレーティングシステムに依存する内部インタフェース値であり、ファイルシステムまたはディスクコードで使用されるサイズに関連する場合もあれば、そうでない場合もあります。 (通常そうではありません - 参照POSIXLY_CORRECT=1
df
du
-k
stat
%B
ブロックサイズとクラスタサイズの違い)。 Linuxでは、デフォルトドライバが何をしているかに関係なく、値は512です。価値は%B
決して重要ではありません。その存在は単なる奇妙なものです。
答え2
ソースコードとPOSIX標準を詳しく見た後、@antje-mと@Gillesの答えはほとんど正しいと言いたいと思います。
引用する価値のあるコメントPOSIX.1-2008、結論として:
512バイト単位を使用することは歴史的な慣例であり、このPOSIX.1-2008ボリュームのlsおよび他のユーティリティとの互換性を維持します。これは、ファイルシステム自体が512バイトブロックに基づいている必要はありません。トレードオフで-kオプションを追加しました。標準開発者は、512バイトがSystem Vで完全な記録一貫性を持ち(BSDシステムで512/1024バイトを混合して使用するのとは対照的に)、最良の基本単位であることに同意し、-kオプションは1024バイト単位に切り替えますできます。良い妥協。より論理的な1024バイト数を好むユーザーは、512バイト単位を使用する多くの履歴スクリプトを破損することなく、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 <[email protected]>
Date: Mon Jun 29 15:23:04 1998 +0000
コミットメッセージ自体には、数字1024の内容はありません。
du
そしてで使用されたブロックサイズdf
も1024であり、ls
一貫性を維持するために選択されています。 POSIX標準du
とdf
競合することはありますが(ここにはPOSIXLY_CORRECT
環境変数があります)。これはGNUチームの決定のようです。 Wikipediaページをご覧ください。POSIX今回の議論について。
注文のためstat
。
POSIX規格の一部ではありませんが、stat
システムコールはい。ただし、ブロックサイズの単位は標準化されていません(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バイトです。この質問が説明するように。
答え3
このstat
コマンドはハードディスクの物理ブロックサイズを使用します。 1956年のリリース以来、ほぼすべてのハードドライブは512バイトブロックを使用してきました。しかし、最近の高度なフォーマットが導入され、この状況が変わり始めました。
ls
1024バイトのブロックサイズにも歴史的な理由があると考えられます。ファイルシステムのブロックサイズは1024で一般的であってもよいし、サイズをキロバイト単位で提供するために使用されたかもしれない。ただし、(少なくとも場合はGNU coreutils
)optionsを使用してブロックサイズを指定できます--block-size=
。