„Ls -lh” podaje całkowity rozmiar mniejszy niż suma poszczególnych rozmiarów

14

W jakich okolicznościach ls -lhsuma jest mniejsza niż suma poszczególnych plików? Na przykład:

$ 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

Edycja: teraz w komentarzu wyświetlane są dodatkowe flagi dla każdego żądania:

$ 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
Lorin Hochstein
źródło
nie wiem, czy któryś z nich jest linkiem, czy mógłbyś wymienić ls -aiFlh
bsd
@bdowning Dodano dodatkowe flagi. Uwaga: wprowadzono pewne zmiany w katalogu, ale problemy nadal występują
Lorin Hochstein
Co powiesz du -h --totalna ten sam reż?
bsd

Odpowiedzi:

20

Stanie się tak, jeśli masz rzadkie pliki:

$ 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

Plik rzadki to plik, który nie został wypełniony blokami systemu plików (lub tylko częściowo). Kiedy czytasz niezapełnioną strefę pliku rzadkiego, otrzymasz zera. Takie puste strefy nie wymagają faktycznego miejsca na dysku, a „suma” zgłoszona przez lsodpowiada miejscu na dysku zajmowanym przez pliki (podobnie jak du).

Stéphane Gimenez
źródło
3
Twoje obrazy dysku kvm są prawdopodobnie pełne dziur :-)
Stéphane Gimenez
Dokumentacja coreutils mówi, że opcja -s/ --size„Drukuj przydział dysku dla każdego pliku po lewej stronie nazwy pliku. Jest to ilość miejsca na dysku wykorzystywana przez plik, która zwykle jest nieco większa niż rozmiar pliku, ale może bądź mniej, jeśli w pliku są dziury . ” -lOpcja oczywiście drukuje rozmiar też.
Francesco Turco,
2

Należy pamiętać, że dane wyjściowe podane przez ls -li dumają subtelną, ale bardzo ważną różnicę. Spróbuj tego:

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

Teraz

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

Natomiast

du -h aaa
4.0K    aaa

Wynika to z faktu, że system plików przydziela rozmiar w częściach 4096 (w moim systemie Linux). Nazywa się to IO Block. Możesz to zobaczyć przez:

    stat aaa
  File: `aaa'
  Size: 1024        Blocks: 8          IO Block: 4096   regular file
Ankur Agarwal
źródło
Możesz także wypróbować statmoją proponowaną wersję empty-file, a zobaczysz, że liczba bloków wynosi 0, nawet jeśli plik ma rozmiar 1G.
Stéphane Gimenez
@ StéphaneGimenez Dlaczego zgłasza Bloki jako 8? Co to za blok o rozmiarze 512 bajtów?
Ankur Agarwal
1
To trochę dziwne, w dawnych czasach bloki IO miały rozmiar 512, ale teraz mają zwykle 4K. statzgłasza równoważną liczbę starych rozmiarów bloków potrzebnych do przechowywania wszystkich bloków 4K (czyli 8-krotność rzeczywistej liczby bloków 4K).
Stéphane Gimenez
1

Zaakceptowana odpowiedź jest absolutnie poprawna, tylko jeśli chcesz zobaczyć pozorny rozmiar, możesz użyć:

du --apparent-size

drukuj pozorne rozmiary zamiast użycia dysku; chociaż pozorny rozmiar jest zwykle mniejszy, może być większy ze względu na dziury w plikach („rzadkich”), fragmentację wewnętrzną, bloki pośrednie i tym podobne

iman
źródło