1文字を含むファイルに対してls -lを実行すると、サイズが2Bとしてリストされます。ファイルシステムが4kブロックの場合、ファイルをブロックサイズに丸めたと思いますか? ls -lが実際にiノードからバイト数を読み取るためですか? Linux 2.6カーネルでブロック応答と実際のバイトカウント応答をどのように切り上げますか?GNU utils?
深い答えは次のとおりだと思います。
論理ファイルの長さと占有されるディスク容量は実際には異なります。
他の回答が示すように、原則として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) それは実際には穴ではありません 、それは最後にあります...しかし、それでも例の最後まで機能します.
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バイトのチャンクを使用する傾向があります。したがって、
ls
やdu
などの従来のユーティリティは、サイズを512バイトのチャンク単位で示します。