«Ls -lh» indique une taille totale inférieure à la somme des tailles individuelles


14

Dans quelles circonstances ls -lhafficherait un total inférieur à la somme des dossiers individuels? Par exemple:

$ 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

Edit: montrant maintenant quelques drapeaux supplémentaires sont par demande en commentaire:

$ 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

Je ne sais pas si certains de ces liens sont, pourriez-vous lister ls -aiFlh
bsd

@bdowning Ajout des drapeaux supplémentaires. Notez qu'il y a eu quelques changements dans le répertoire, mais les problèmes sont toujours là
Lorin Hochstein

Et du -h --totalpour le même dir?
bsd

Réponses:


20

Cela se produira si vous avez des fichiers clairsemés:

$ 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

Un fichier clairsemé est un fichier qui n'a pas été rempli de blocs de système de fichiers (ou seulement partiellement). Lorsque vous lisez une zone non peuplée d'un fichier clairsemé, vous obtenez des zéros. Ces zones vides ne nécessitent pas d'espace disque réel et le «total» signalé par lscorrespond à l'espace disque occupé par les fichiers (tout comme du).


3
Vos images de disque kvm sont probablement pleines de trous :-)
Stéphane Gimenez

La documentation de coreutils indique que l' option -s/ --size"Imprimer l'allocation de disque de chaque fichier à gauche du nom de fichier. Il s'agit de la quantité d'espace disque utilisée par le fichier, qui est généralement un peu plus que la taille du fichier, mais elle peut être moins si le fichier a des trous . " L' -loption imprime bien sûr également la taille.
Francesco Turco

2

Veuillez noter que la sortie donnée par ls -let dua une différence subtile mais très importante. Essaye ça:

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

Maintenant

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

Tandis que

du -h aaa
4.0K    aaa

C'est parce que le système de fichiers alloue la taille en morceaux de 4096 (sur ma boîte Linux). Il s'appelle IO Block. Vous pouvez le voir en:

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

En outre, vous pouvez essayer statma proposition empty-fileet vous verrez que le nombre de blocs est de 0, même si le fichier a une taille de 1G.
Stéphane Gimenez

@ StéphaneGimenez Pourquoi rapporte-t-il des blocs comme 8? De quel bloc s'agit-il avec une taille de 512 octets?
Ankur Agarwal

1
C'est un peu étrange, dans le passé, les blocs d'E / S avaient une taille 512, mais maintenant ils sont généralement 4K. statsignale le nombre équivalent de blocs de taille ancienne nécessaires pour stocker tous les blocs 4K (soit 8 fois le nombre réel de blocs 4K).
Stéphane Gimenez

1

La réponse acceptée est absolument correcte, juste si vous voulez voir la taille apparente, vous pouvez utiliser:

du --apparent-size

imprimer les tailles apparentes, plutôt que l'utilisation du disque; bien que la taille apparente soit généralement plus petite, elle peut être plus grande en raison des trous dans les fichiers («clairsemés»), de la fragmentation interne, des blocs indirects, etc.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.