「ls -lh」は、個々のサイズの合計よりも小さい合計サイズを報告します


14

どのような状況ls -lhで、個々のファイルの合計よりも少ない合計が表示されますか?例えば:

$ ls -lh /var/lib/nova/instances/_base
total 100G
-rw-rw-r-- 1 nova         nova 4.3M 2012-02-14 14:07 00000001
-rw-rw-r-- 1 nova         nova 5.7M 2012-02-14 14:07 00000002
-rw-rw-r-- 1 nova         nova  42G 2012-03-08 15:24 1574bddb75c78a6fd2251d61e2993b5146201319.part
-rw-rw-r-- 1 libvirt-qemu kvm   24M 2012-02-14 14:07 77de68daecd823babbb58edb1c8e14d7106e83bb_sm
-rw-r--r-- 1 libvirt-qemu kvm   65G 2012-03-02 12:43 bd307a3ec329e10a2cff8fb87480823da114f8f4
-rw-rw-r-- 1 libvirt-qemu kvm  160G 2012-02-24 16:06 ephemeral_0_160_None
-rw-rw-r-- 1 libvirt-qemu kvm   80G 2012-02-24 22:38 ephemeral_0_80_None
-rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 22:37 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f
-rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 11:09 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f_sm

編集:コメントのリクエストごとにいくつかの追加フラグが表示されるようになりました:

$ ls -aiFlh  /var/lib/nova/instances/_base/
total 143G
29884440 drwxrwxr-x 2 nova         nova 4.0K 2012-03-08 15:45 ./
29884427 drwxr-xr-x 6 nova         nova 4.0K 2012-03-08 15:05 ../
29884444 -rw-rw-r-- 1 nova         nova 4.3M 2012-02-14 14:07 00000001
29884445 -rw-rw-r-- 1 nova         nova 5.7M 2012-02-14 14:07 00000002
29884468 -rw-r--r-- 1 nova         nova  65G 2012-03-08 15:59 1574bddb75c78a6fd2251d61e2993b5146201319.converted
29884466 -rw-rw-r-- 1 nova         nova  58G 2012-03-08 15:35 1574bddb75c78a6fd2251d61e2993b5146201319.part
29884446 -rw-rw-r-- 1 libvirt-qemu kvm   24M 2012-02-14 14:07 77de68daecd823babbb58edb1c8e14d7106e83bb_sm
29884467 -rw-r--r-- 1 libvirt-qemu kvm   65G 2012-03-02 12:43 bd307a3ec329e10a2cff8fb87480823da114f8f4
29884443 -rw-rw-r-- 1 libvirt-qemu kvm  160G 2012-02-24 16:06 ephemeral_0_160_None
29884442 -rw-rw-r-- 1 libvirt-qemu kvm   80G 2012-02-24 22:38 ephemeral_0_80_None
29884447 -rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 22:37 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f
29884441 -rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 11:09 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f_sm

それらのいずれかがリンクであるかどうかわからない、ls -aiFlh
bsd

@bdowning追加のフラグが追加されました。ディレクトリにいくつかの変更があったことに注意してください。しかし、問題はまだそこにあります
ロリンホッホシュタイン

どの程度du -h --total同じディレクトリのため?
-bsd

回答:


20

スパースファイルがある場合に発生します。

$ mkdir test; cd test
$ truncate -s 1000000000 file-with-zeroes
$ ls -l
total 0
-rw-r--r-- 1 gim gim 1000000000 03-08 22:18 file-with-zeroes

スパースファイルとは、ファイルシステムブロック(または一部のみ)が含まれていないファイルです。スパースファイルの非ポピュレートゾーンを読み取ると、ゼロが取得されます。このような空白ゾーンは実際のディスク容量を必要としません。また、レポートされる「合計」はls、ファイルが占有するディスク容量に対応します(と同様du)。


3
kvmディスクイメージにはおそらく穴がいっぱいです:
StéphaneGimenez

coreutilsのドキュメントはと言う-s/の--sizeオプションは、「ファイル名の左に各ファイルのディスク割り当てを印刷します。これは通常、もう少しファイルのサイズよりもファイルが使用するディスク領域の量である、しかしそれができますファイルに穴がある場合は少なくしてください。」-l当然の選択肢も、サイズを出力します。
フランチェスコターコ

2

ls -lとによって与えられる出力にduは、微妙ですが非常に重要な違いがあることに注意してください。これを試して:

dd if=/dev/urandom of=aaa bs=1024 count=1

いま

ls -l aaa
-rw-r--r-- 1 abc abc 1024 2012-03-08 15:45 aaa

一方、

du -h aaa
4.0K    aaa

これは、ファイルシステムが4096のチャンク単位でサイズを割り当てるためです(私のLinuxボックスでは)。IOブロックと呼ばれます。これは次の方法で確認できます。

    stat aaa
  File: `aaa'
  Size: 1024        Blocks: 8          IO Block: 4096   regular file

また、stat提案されたを試してみるとempty-file、ファイルのサイズが1Gと報告されている場合でも、ブロック数が0であることがわかります。
ステファンギメネス

@StéphaneGimenezなぜBlocksを8と報告するのですか?サイズ512バイトのこれはどのブロックですか?
アンクールアガルワル

1
少し奇妙です。昔はIOブロックのサイズは512でしたが、現在は通常4Kです。statすべての4Kブロックを格納するのに必要な古いサイズのブロックと同等の数を報告します(つまり、4Kブロックの実際の数の8倍)
ステファンギメネス

1

受け入れられた答えは絶対に正しいです。見かけのサイズを確認したい場合は、次を使用できます。

du --apparent-size

ディスク使用量ではなく、見かけのサイズを印刷します。見かけのサイズは通常小さくなりますが、(「スパース」)ファイルの穴、内部断片化、間接ブロックなどにより大きくなる場合があります

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