mardi 30 novembre 2010

Espace disque

Météo.
Nous créons le dossier test et nous y plaçons le fichier "météo" dont voici le contenu:
Belle journée ensoleillée.
Températures de 24 à 28 degrés.
Vent modéré.
Examinons maintenant le contenu du dossier avec la commande ls et les options:
g: pour un affichage au format long mais sans le propriétaire
o: idem sans le groupe
a: pour afficher les fichiers cachés
i: pour afficher le numéro d'inode
s: pour afficher la taille en blocs
toto@rigel:~$ ls -goais test
total 12
1308818 4 drwxr-xr-x  2 4096 2010-11-26 10:10 .
1308748 4 drwxr-xr-x 39 4096 2010-11-26 10:04 ..
 442198 4 -rw-r--r--  1   79 2010-11-26 10:10 météo
La première colonne contient les identifiants numériques (numéro d'inode) des fichiers. Ensuite vient une colonne avec l'espace disque occupé par chaque fichier, en blocs de 1024 octets. Ces blocs n'ont aucun rapport avec les blocs du système de fichier (ext3, taille 4096 octets), ni avec les blocs du disque (taille 512 octets). A gauche des dates, on trouve une colonne avec des tailles en octets: 79 pour le fichier météo. Pour ceux qui veulent compter, ne pas oublier les caractères de contrôle "fin de ligne". Ne pas oublier, aussi que les caractères accentués comptent double (Nous sommes en UTF-8).
Les deux premières lignes de la liste se rapportent à des dossiers comme l'indique le premier caractère de la colonne 3, c'est-à-dire d.
Quels sont ces dossiers?
La commande find permet de faire une recherche sur les identifiants numériques:
toto@rigel:~$ find ~/ -inum 1308818 ; find ~/ -inum 1308748
/home/toto/test
/home/toto/
Le premier fichier, "." n'est rien d'autre que le dossier test lui-même, tandis que le deuxième fichier, ".." est le dossier parent. Ce sont des résultats bien connus.

Ce n'est pas mon frère, c'est moi.
Procédons à quelques manipulations avant de relancer notre commande ls:
toto@rigel:~$ cd test
toto@rigel:~/test$ ln météo prévisions ; cp météo le_temps
toto@rigel:~/test$ ls -goais
total 20
1308818 4 drwxr-xr-x  2 4096 2010-11-26 12:36 .
1308748 4 drwxr-xr-x 39 4096 2010-11-26 10:04 ..
 442199 4 -rw-r--r--  1   79 2010-11-26 12:36 le_temps
 442198 4 -rw-r--r--  2   79 2010-11-26 10:10 météo
 442198 4 -rw-r--r--  2   79 2010-11-26 10:10 prévisions
Nous avons maintenant semble-t-il, 3 fichiers identiques de 79 octets.
Mais attention, les apparences sont trompeuses. En effet l'identifiant 442198 est répété. Donc nous avons dans le répertoire, deux entrées, deux noms différents (météo et prévisions) pour le même fichier (ce qui est indiqué par le chiffre 2 qui précède la taille en octets).
Vérifions cela:
toto@rigel:~/test$ echo 'Bonne soirée' >> prévisions
toto@rigel:~/test$ ls -goais
total 20
1308818 4 drwxr-xr-x  2 4096 2010-11-26 12:36 .
1308748 4 drwxr-xr-x 39 4096 2010-11-26 10:04 ..
 442199 4 -rw-r--r--  1   79 2010-11-26 12:36 le_temps
 442198 4 -rw-r--r--  2   93 2010-11-26 12:50 météo
 442198 4 -rw-r--r--  2   93 2010-11-26 12:50 prévisions
La taille de météo et de prévisions passe à 93, ce qui montre bien qu'il s'agit de deux noms portés par un même fichier. Le lien existant entre météo et prévisions est appelé un lien en dur.
Mais attendez, cela implique que le total repris en ligne 1 de l'output est faux, ou en tout cas qu'il ne correspond pas au nombre de blocs (de 1 K) occupés par les fichiers du dossier, puisque le fichier 442198 est compté deux fois.
Pour un total correct, il faut procéder avec la commande du. Utilisons l'option -a pour que les fichiers comptabilisés apparaissent dans l'output:
toto@rigel:~$ du -a test
4       test/météo
4       test/le_temps
12      test
Le chiffre 12 correspond au volume occupé par le fichier 442198 (météo), le fichier 442199 (le_temps) et le fichier 1308818 (le dossier test lui-même). L'entrée "prévisions" est ignorée. Le fichier 1308748, qui correspond au répertoire parent n'est pas repris. Deux entrées en moins (celles qui ne sont pas surlignées en saumon), à 4 K l'entrée: voilà qui explique pourquoi le total passe de 20 K à 12 K. Quant au fichier 1308748 (répertoire parent), du en tiendra compte uniquement pour le calcul du volume occupé par /home/toto ou par tout autre répertoire supérieur.

Pour vivre heureux, vivons cachés.
Effectuons encore quelques manipulations avant d'exécuter de nouveau la commande ls (avec l'option supplémentaire -R pour la récursivité):
toto@rigel:~/test$ mkdir test.d1 test.d2
toto@rigel:~/test$ mv prévisions test.d1 ; mv météo test.d2
toto@rigel:~/test$ ls -Rgoais ~/test
/home/toto/test:
total 20
1308818 4 drwxr-xr-x  4 4096 2010-11-27 11:42 .
1308748 4 drwxr-xr-x 39 4096 2010-11-26 10:04 ..
 442199 4 -rw-r--r--  1   79 2010-11-26 12:36 le_temps
1309068 4 drwxr-xr-x  2 4096 2010-11-27 11:42 test.d1
1309591 4 drwxr-xr-x  2 4096 2010-11-27 11:42 test.d2

/home/toto/test/test.d1:
total 12
1309068 4 drwxr-xr-x 2 4096 2010-11-27 11:42 .
1308818 4 drwxr-xr-x 4 4096 2010-11-27 11:42 ..
 442198 4 -rw-r--r-- 2   93 2010-11-26 12:50 prévisions

/home/toto/test/test.d2:
total 12
1309591 4 drwxr-xr-x 2 4096 2010-11-27 11:42 .
1308818 4 drwxr-xr-x 4 4096 2010-11-27 11:42 ..
 442198 4 -rw-r--r-- 2   93 2010-11-26 12:50 météo
Nous avons explicitement avec la commande "ln météo prévisions", créé un lien en dur. Mais de tels liens sont naturellement présents dans le système. Ainsi pour le fichier 1308818, le nombre 4 - en rouge, colonne 4 - indique qu'il lui correspond 4 entrées, dont 3 figurent dans l'output ci-dessous (il manque l'entrée dans /home/toto). Le fichier 1308818 contribue donc à chacun des 3 totaux.
Que donne la commande du?
toto@rigel:~/test$ du -a ~/test
4       /home/toto/test/test.d1/prévisions
8       /home/toto/test/test.d1
4       /home/toto/test/le_temps
4       /home/toto/test/test.d2
20      /home/toto/test
Remarquons en premier que si le total /home/toto/test est le même dans les deux cas (20) il s'agit d'un hasard: vu l'existence de sous-dossiers (non-vides), les deux nombres ont une signification différente. D'un côté  (commande ls), il s'agit du volume occupé par les fichiers qui ont une entrée dans le répertoire test et de l'autre (commande du), il s'agit du volume occupé par le dossier test et tout ce qu'il contient. Le fichier 1308748 (/home/toto) est bien comptabilisé par ls, mais pas par du (comme précédemment). Pour le fichier 442198 (prévisions), il contribue au total calculé par du, mais pas au total 20 de ls puisqu'il n'y a plus d'entrée pour ce fichier au niveau du répertoire test. Il suffirait que 442198 occupe plus de 4 K pour que les deux totaux ne soient plus égaux.
Logiquement, du, contrairement à ls, ne tient pas compte du fichier 1308818 (/home/toto/test) pour le calcul du volume occupé par test.d1 et test.d2 (il en tient compte pour le volume occupé par test). Comme précédemment, nous avons surligné (en saumon) les items de l'output de ls dont la commande du tient compte.

C'est trop injuste!
Nous constatons que cette fois "météo" est ignoré par du au profit de "prévisions". Évidemment, il y a là un certain arbitraire. Pourquoi compter 8 K pour test.d1, 4 K pour test.d2 et non pas le contraire? D'ailleurs, si on a:
toto@rigel:~/test$ du -ac test.d1 test.d2
4       test.d1/prévisions
8       test.d1
4       test.d2
12      total
on a aussi:
toto@rigel:~/test$ du -ac test.d2 test.d1
4       test.d2/météo
8       test.d2
4       test.d1
12      total
Mais le principal est que le total des blocs occupés (affiché grâce à l'option -c) soit le bon. Attention, pour obtenir 12, il ne faut pas tenir compte des 4 K du fichier prévisions (météo) puisque ceux-ci sont inclus dans  les 8 K du dossier test-d1 (test-d2).
Donc si on pouvait avoir l'output sans les fichiers, ce serait cool. Et bien il suffit de supprimer l'option -a:
toto@rigel:~/test$ du -c test.d1 test.d2
8       test.d1
4       test.d2
12      total
toto@rigel:~/test$ du -c test.d2 test.d1
8       test.d2
4       test.d1
12      total
Mais avec la commande du ~/test, on a un problème:
toto@rigel:~/test$ du ~/test
8       /home/toto/test/test.d1
4       /home/toto/test/test.d2
20      /home/toto/test
Le fichier le_temps a disparu, alors pour expliquer le 20 final...
Comment procéder pour afficher le_temps sans pour autant faire réapparaitre prévisions, c'est-à-dire sans afficher le détail de test.d1 et test.d2 ?
La solution se trouve dans l'emploi de l'option --max-depth:
toto@rigel:~/test$ du ~/test -a --max-depth=1
8       /home/toto/test/test.d1
4       /home/toto/test/le_temps
4       /home/toto/test/test.d2
20      /home/toto/test

Creuser, toujours creuser!
L'option --max-depth=1 n'empêche pas du d'explorer l'arborescence plus en profondeur.
Ainsi, après avoir procédé comme ci-dessous,
toto@rigel:~/test$ mkdir test.d1/test.d3
toto@rigel:~/test$ echo salut > test.d1/test.d3/salut
toto@rigel:~/test$ echo hello > test.d1/test.d3/hello
ce qui a ajouté test.d3 à l'arborescence:
.
├── le_temps
├── test.d1
│   ├── prévisions
│   └── test.d3
│       ├── hello
│       └── salut
└── test.d2
    └── météo
nous constatons que l'output de la commande du, même avec --max-depth=1, est modifié en conséquence
toto@rigel:~/test$ du ~/test -a --max-depth=1
20      /home/toto/test/test.d1
4       /home/toto/test/le_temps
4       /home/toto/test/test.d2
32      /home/toto/test
On peut utiliser l'option -S. De la sorte, le volume figurant devant chaque nom de dossier se rapportera seulement au volume de ce dossier et aux fichiers qu'il contient: le volume devant test.d1 retrouvera son ancienne valeur (celle d'avant la création de test.d3). Par contre, le total qui peut être obtenu en ajoutant l'option c se rapportera à toute l'arborescence:
toto@rigel:~/test$ du ~/test -acS --max-depth=1
8       /home/toto/test/test.d1
4       /home/toto/test/le_temps
4       /home/toto/test/test.d2
8       /home/toto/test
32      total
Si seul le total nous intéresse et en aucune façon une quelconque ventilation, il suffit d'utiliser l'option s:
toto@rigel:~$ du -s ~/test
32      /home/toto/test

Quelle belle partition!
Parmi les options de la commande du, on peut encore citer:
-h pour afficher les volumes de manière facilement lisible
-x pour rester dans le même système de fichiers.
Exemple:
root@rigel:~# du -hx --max-depth=1 /
3,4G    /usr
76K     /tmp
8,0K    /home
15M     /etc
4,0K    /srv
2,4G    /var
0       /sys
12K     /mnt
275M    /opt
6,6M    /bin
255M    /lib
8,0K    /media
45M     /boot
4,0K    /cdrom
4,0K    /selinux
7,6M    /sbin
0       /dev
0       /proc
16K     /lost+found
628K    /root
6,3G    /
La commande demande un certain temps pour s'exécuter. Rappelons que l'option --max-depth=1 ne limite nullement la profondeur du scan.
Le volume de 8 K qui apparait devant /home montre bien que la partition montée en ce point n'a pas été explorée, et ce grâce à l'option -x.
En ce qui concerne le total de la partition, un résultat peut être obtenu beaucoup plus rapidement avec la commande df:
toto@rigel:~$ df -h /
Sys. de fich.       Taille  Uti. Disp. Uti% Monté sur
/dev/sdc1              11G  6,5G  3,6G  65% /
df n'effectue aucun scan et tire directement ses informations du superbloc. Le montant obtenu n'est pas le même (6,5 G au lieu de 6,3 G). Pour df, il s'agit de l'espace occupé par le système de fichier et non de l'espace occupé par l'ensemble des fichiers. Et pour un système de fichier qui vient d'être créé, l'espace disponible n'est déjà plus égal à la taille.