GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi les liens durs semblent-ils occuper le même espace que les originaux ?

Un fichier est un inode avec des métadonnées parmi lesquelles une liste de pointeurs vers où trouver les données.

Pour pouvoir accéder à un fichier, vous devez lien dans un répertoire (considérez les répertoires comme des répertoires téléphoniques, pas des dossiers), c'est-à-dire ajoutez une ou plusieurs entrées à un ou plusieurs répertoires pour associer un nom avec ce fichier.

Tous ces liens, ces noms de fichiers pointent vers le même fichier. Il n'y en a pas un qui soit l'original et les autres qui sont des liens. Ce sont tous des points d'accès au même fichier (même inode) dans l'arborescence des répertoires. Lorsque vous obtenez la taille du fichier (lstat appel système), vous récupérez des informations (les métadonnées mentionnées ci-dessus) stockées dans l'inode, peu importe le nom de fichier, le lien que vous utilisez pour faire référence à ce fichier.

En revanche, les liens symboliques sont un autre fichier (un autre inode) dont le contenu est un chemin au fichier cible. Comme tout autre fichier, ces liens symboliques doivent être liés à un répertoire (doit avoir un nom) afin que vous puissiez y accéder. Vous pouvez également avoir plusieurs liens vers un lien symbolique, c'est-à-dire que les liens symboliques peuvent avoir plusieurs noms (dans un ou plusieurs répertoires).

$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a

Au-dessus du numéro de dossier 10486707 se trouve un dossier régulier. Deux entrées dans le répertoire courant (une avec le nom a , un avec le nom b ) lien vers celui-ci. Parce que le nombre de liens est 2, nous savons qu'il n'y a pas d'autre nom pour ce fichier dans le répertoire courant ou dans tout autre répertoire. Le fichier numéro 10502404 est un autre fichier, cette fois de type lien symbolique lié deux fois au répertoire courant. Son contenu (cible) est le chemin relatif "a".

Notez que si 10502404 était lié à un autre répertoire que le répertoire actuel, il pointerait généralement vers un fichier différent selon la manière dont il a été accédé.

$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a

2:
total 92
10608674 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar

Les fichiers n'ont aucun nom qui leur est associé autre que dans les répertoires qui les relient. L'espace occupé par leurs noms correspond aux entrées de ces répertoires, il est pris en compte dans la taille du fichier/l'utilisation du disque des répertoires.

Vous remarquerez que l'appel système pour supprimer un fichier est unlink . Autrement dit, vous ne supprimez pas les fichiers, vous les dissociez des répertoires dans lesquels ils sont référencés. Une fois dissocié du dernier répertoire contenant une entrée dans un fichier donné, ce fichier est ensuite détruit (tant qu'aucun processus ne l'a ouvert).


Le lien physique est essentiellement le fichier d'origine. Ainsi, la taille que vous voyez rapportée est la taille du fichier lié. C'est doux des liens qui n'occupent que l'espace de leurs noms (un peu).

En ce qui concerne le système de fichiers, le lien dur et l'original sont la même chose, ils pointent vers le même inode donc la même taille est signalée.


Linux
  1. Liens physiques et liens souples sous Linux expliqués

  2. Faire référence à un fichier sous le même répertoire qu'un script trouvé dans $path ?

  3. Linux - Pourquoi n'y a-t-il pas de système de fichiers Rootfs présent sur le système ?

  4. La différence entre les liens symboliques et les liens matériels ?

  5. Rediriger vers le même fichier que le fichier source traité par la commande ?

La commande ln sous Linux :créer des liens logiciels et matériels

Quel est le moyen le plus simple de libérer de l'espace sur un disque dur ?

Comment remplir un disque dur sous Linux

Pourquoi est-il si difficile de trouver un fichier dans Ubuntu ?

Pourquoi le répertoire racine est-il désigné par un signe / ?

Comment compter le nombre d'octets dans un fichier, regroupant les mêmes octets ?