web-dev-qa-db-ja.com

EXT3:ブロックサイズが4Kの場合、なぜls -lはそれ以下のファイルサイズを表示するのですか?

1文字を含むファイルに対してls -lを実行すると、サイズが2Bとしてリストされます。ファイルシステムが4kブロックの場合、ファイルをブロックサイズに丸めたと思いますか? ls -lが実際にiノードからバイト数を読み取るためですか? Linux 2.6カーネルでブロック応答と実際のバイトカウント応答をどのように切り上げますか?GNU utils?

16
Gregg Leventhal

深い答えは次のとおりだと思います。

論理ファイルの長さと占有されるディスク容量は実際には異なります。

他の回答が示すように、原則として2バイトで作成されたファイルの長さは2バイト(ls -lで表示)で、4 KiBを占有します(duまたはls -lsで表示)。

見る:

1& [:~/tmp] % echo -n A > test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 1 Apr 28 14:31 test
1& [:~/tmp] % du test
4 test

さて、testの長さは1、サイズ(ディスク上)は4 KiBです。だが:

1& [:~/tmp] % truncate -s +8191 test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 8192 Apr 28 14:33 test
1& [:~/tmp] % du test
4   test

(最初のコマンドは8191ゼロバイトをtestに追加します)、テストの長さは8192ですが、ディスク上にはまだ4 KiBを占めています( "穴"がある)(1)。

一部のファイルシステムは、ブロックを共有することで短いファイルを占有するように短いファイルを圧縮することもできます(例 テールパッキング を参照)および他の btrfs do write on copy のように、ファイル、その論理的な長さ、およびディスク上でそのファイルが占める領域は複雑です。

脚注:

(1) それは実際には穴ではありません 、それは最後にあります...しかし、それでも例の最後まで機能します.

9
Rmano

ls -lは長い形式です。 ls -lsは、ブロックサイズを表示するために使用されます。

テスト

echo "1" > 1.txt

bash-3.2$ ls -l 1.txt
-rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

ご覧のとおり、ファイルのサイズは2Bと表示されています。ただし、ブロックサイズを確認する必要がある場合は、以下のコマンドを実行する必要があります。

bash-3.2$ ls -ls 1.txt
4 -rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

上記の4は、使用されたブロックサイズを表示します。 statコマンドを使用して同じことを確認することもできます。

bash-3.2$ stat 1.txt
  File: `1.txt'
  Size: 2               Blocks: 8          IO Block: 4096   regular file
Device: 805h/2053d      Inode: 48267720    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  505/  ramesh)   Gid: (  508/  ramesh)
Access: 2014-04-28 15:17:31.000000000 -0500
Modify: 2014-04-28 15:15:58.000000000 -0500
Change: 2014-04-28 15:15:58.000000000 -0500

なぜls -lsはブロックサイズを4としてリストしますが、statはブロックサイズを8として表示します。この動作の理由は、回答 here で明確に説明されています。

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

5
Ramesh