1文字のファイルでls -lを実行すると、サイズが2Bとしてリストされます。ファイルシステムが4kブロックの場合、ファイルをブロックサイズに切り上げたと思いますか?ls -lが実際にiノードからバイトカウントを読み取るためですか?Linux 2.6 Kernel GNU utilsでブロックアンサーと実際のバイトカウントアンサーとの関係はどのような状況で切り上げられますか?
1文字のファイルでls -lを実行すると、サイズが2Bとしてリストされます。ファイルシステムが4kブロックの場合、ファイルをブロックサイズに切り上げたと思いますか?ls -lが実際にiノードからバイトカウントを読み取るためですか?Linux 2.6 Kernel GNU utilsでブロックアンサーと実際のバイトカウントアンサーとの関係はどのような状況で切り上げられますか?
回答:
echo a > file
またはvim file
でファイルに1文字入ったと思います。つまり、その文字と追加の改行(2文字、つまり2バイト)が含まれることになります。 ls -l
ブロックではなく、バイト単位でファイルサイズを表示します(具体的には、ファイルの長さ)。
$ echo a > testfile
$ ls -l testfile
-rw-r--r-- 1 user user 2 Apr 28 22:08 testfile
$ cat -A testfile
a$
(cat -A
改行を$
文字として表示することに注意してください)
とは対照的にls -l
、du
ディスクで占有されている実際のサイズが表示されます。
$ du testfile
4
(実際にdu
は、1kiB単位でサイズを示しているため、ここでサイズは4×1024バイト= 4096バイト= 4 kiBです。これは、このファイルシステムのブロックサイズです)
これをls
表示するには、次の-s
代わりに/に加えてオプションを使用する必要があります-l
。
$ ls -ls testfile
4 -rw-r--r-- 1 user user 2 Apr 28 22:08 testfile
最初の列は割り当てられたサイズで、やはり1kiBの単位です。最後はを指定することで変更できます--block-size
。例えば
$ ls -ls --block-size=1 testfile
4096 -rw-r--r-- 1 aw aw 2 Apr 28 22:08 testfile
深い答えは次のとおりだと思います:
論理ファイルの長さと占有ディスク容量は、実際には異なります。
他の回答が示すように、原則として2バイトで作成されたファイルの長さは2バイト(show by ls -l
)で、4 KiB(show by 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
OK、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を占有しています(「穴」があります)。
いくつかのファイルシステムがそうもコンパクトに短いファイルは、彼らがブロックを共有することにより、より少ないスペースを占有できる(例えばを参照テール・パッキング)、その他のbtrfsのような書き込みにコピーするか、それが上の占有ファイル、その論理的な長さ、そしてどのくらいのスペースの関係ので、ディスクは複雑です。
脚注:
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として表示するのかという疑問が生じます。この動作の理由は、ここの回答で明確に説明されています。
多くのディスクのセクターサイズは512バイトです。つまり、ディスク上の読み取りまたは書き込みは、一度に512バイトセクター全体を転送します。セクターがファイル間で分割されていないファイルシステムを設計することは非常に自然です(設計が複雑になり、パフォーマンスが低下します)。したがって、ファイルシステムはファイルに512バイトのチャンクを使用する傾向があります。したがって、などの従来のユーティリティは、512バイトのチャンクの単位でサイズ
ls
をdu
示します。