«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 Добавлены дополнительные флаги. Обратите внимание, что в каталоге произошли некоторые изменения, но проблемы все еще остаются
Lorin Hochstein
Как насчет того 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, вероятно, дырявые :-)
Стефан Гименес
В документации по 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 Block. Вы можете увидеть это по:

    stat aaa
  File: `aaa'
  Size: 1024        Blocks: 8          IO Block: 4096   regular file
Анкур Агарвал
источник
Кроме того, вы можете примерить statпредложенное мной empty-file, и вы увидите, что количество блоков равно 0, даже если размер файла равен 1G.
Стефан Гименес
@ StéphaneGimenez Почему он сообщает о блоках как 8, хотя? Что это за блок размером 512 байт?
Анкур Агарвал
1
Это немного странно, в старые времена блоки ввода-вывода имели размер 512, но сейчас они обычно 4K. statсообщает эквивалентное количество блоков старого размера, необходимых для хранения всех блоков 4K (это в 8 раз больше действительного числа блоков 4K).
Стефан Гименес
1

Принятый ответ является абсолютно правильным, просто если вы хотите увидеть видимый размер, вы можете использовать:

du --apparent-size

печатать видимые размеры, а не использование диска; хотя видимый размер обычно меньше, он может быть больше из-за дыр в («редких») файлах, внутренней фрагментации, косвенных блоков и т. п.

иман
источник