ls -ls 出力にファイルサイズより大きいブロック数が表示されます。

ls -ls 出力にファイルサイズより大きいブロック数が表示されます。

私が知る限り、 "-s"オプションを持つlsコマンドはファイルサイズをブロック単位で印刷し、lsはブロックサイズとして1024を使用しますが、奇妙なことを見つけました。

理解を深めるために、ls -ls コマンドの次の出力を検討してください。

12-rw-r--r--. 1 ルート 10240 7月15日 19:22 z

ファイルサイズが10240バイト、ブロックサイズが1024なので、このファイルのブロック数は10240/1024 = 10ブロックですが、なぜls12ブロックで表示されるのでしょうか。

挨拶

答え1

ここで実際に報告されるのは、lsファイルに割り当てられたブロックサイズです。サイズは12KBです。

このサイズは伝統的に512Bの「ブロック」と報告されていますが、その理由は古代のUnixシステムでは実際に512バイトのブロックが多かったからです。ただし、ブロックサイズはファイルシステムによって異なり、ls同じ単位を使用します。 GNUツールは512Bの代わりに1kBを単位として使用します。キロバイトが人間に0.5キロバイトよりも意味があるからです。

Ext4やその他の共通ファイルシステムのデフォルト値は4kBブロックです。したがって、10240バイトのファイルは、サイズが12kBの3つのブロックを占めます。

また、見ることができますファイルブロックサイズ - statとlsの違いそしてブロックサイズとクラスタサイズの違い

答え2

これは良い質問です。読んだ後ザイルズの答え、強制的に読む必要がありman lsls --help 閉じる私は彼の答えが間違っていると確信しているからです。代わりに、私は彼が正しいことを証明するためにこの答えを提示します! :血

ls -ls1024バイトファイルの結果は次のとおりです。

12 -rw-r--r--. 1 root root 10240 Jul 15 19:22 z

私たちがそれを信じてman ls問題のファイルが10,240バイトであると主張している場合、この結果はファイルのサイズが次のようになることを示しています。12 blocksしかし、この結果はこれらのブロックのサイズを教えてくれません。ブロックサイズを理解するために、関連する段落を参照すると、man ls我々はほぼ手ぶらで出てきます。

関連する段落はman ls次のとおりです。

--block-size=SIZE
       with -l, scale sizes by SIZE when printing them; e.g., '--block size=M'; see SIZE format below

-k, --kibibytes
        default to 1024-byte blocks for disk usage; used only with -s and per directory totals  

-s, --size
       print the allocated size of each file, in blocks  

The SIZE argument is an integer and optional unit (example: 10K is 10*1024).  Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).
信仰に頼らない:

次のように10,240バイトのファイルを生成します。

fallocate -l 10240 lstest.txt

確認する:

wc -c lstest.txt
10240 lstest.txt
ls -l
  12 -rw-r--r-- 1 pi pi   10240 Jan  4 12:09 lstest.txt  
ls -ls
  12 -rw-r--r-- 1 pi pi   10240 Jan  4 12:09 lstest.txt 
ls -lks 
  12 -rw-r--r-- 1 pi pi   10240 Jan  4 02:09 lstest.txt 
ls -ls --kibibytes 
  12 -rw-r--r-- 1 pi pi   10240 Jan  4 02:09 lstest.txt

あなたが言ったように、このようなものです。奇妙な文書によると、12 * 1,024 = 12,288バイトなので、10,240バイトより大きいです。

しかし、脱出口があります。

3つのことを考えてみましょう。

  1. この-sオプションはレポートallocationファイルサイズではありません(参照man ls
  2. ブロックサイズは抽象的なファイルシステムで定義されています。物理量ではありませんが、効率的なブロックサイズを次のようにします。高度なフォーマットセクタサイズ4,096バイト。 2011年1月以降に製造されたすべてのHDDは、高度なフォーマット規格に準拠しています。
  3. ファイルシステムのブロックサイズを決定できます。
stat -fc %s .     
# or, if you prefer:
stat -fc %s lstest.txt
# which is, in both cases (on my ext3 filesystem):
4096

最後に、いくつかの答え

1.上記の結論:lsファイルシステムで使用されるブロックサイズがわかりません。
ls2. ブロックサイズがわかっている場合は、以下を共有する必要があります。
ls -ls --block-size=4K 
3 -rw-r--r-- 1 pi pi    3 Jan  4 02:09 lstest.txt

3 * 4,096 = 12,288バイトです。また、ブロックサイズ(4,096バイト)は量子ブロックデバイスのストレージスペース、つまりストレージ割り当てを変更できる最小サイズ。これで、12,288バイトが実際に必要なバイト割り当てであることが明らかになりました。ただし、ブロックから正解を得るには、オプションを使用してシステムのブロックサイズを知らせる必要がman lsあります。ls--block-size=4K

3. ザイルズの答えが正しかった
審査の熟考:

私の考えにはman lsあまり明確ではありません。おそらく、ファイルシステムのブロックサイズがわからないと明示するように変更する必要がありますか?

より良い方法は、lsシステムからブロックサイズを取得するように変更することです。結局、statそれの一部ですGNU coreutils 8.30

答え3

これがデフォルトになったため、デフォルトのファイルシステムのブロックサイズは4kです。したがって、10.240バイトファイルには3つ(ceil(10.240/4096))ファイルシステムブロックが必要です。 3つの4kブロック、それぞれ3 * 4 = 12個の1kブロックとして報告

関連情報