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


16

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


2
ext4は「小さなファイルのパッキング」の概念を導入し、小さなファイルがそのiノードが占有する同じディスクブロックを占有する(したがって、ディスクブロックの浪費を避ける)ことを念頭に置いてください
oakad

回答:


20

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 -lduディスクで占有されている実際のサイズが表示されます。

$ 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

3
さらに、2つの情報があると便利です。ファイルシステムは、「テール圧縮」(sp?)(短いファイル間で共有される1つのブロックを使用)、「コピーオンライト」、および「ホールパンチ」を実行できます...ファイルサイズ<->ディスクスペースの関係を複雑なものにします。
Rmano 14

9

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

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

他の回答が示すように、原則として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のような書き込みにコピーするか、それが上の占有ファイル、その論理的な長さ、そしてどのくらいのスペースの関係ので、ディスクは複雑です。

脚注:

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


5

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バイトのチャンクの単位でサイズlsdu示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.