GNU/Linux >> Tutoriels Linux >  >> Linux

Déplacer un fichier en cours d'utilisation -- Comment ça marche ?

L'entrée de répertoire n'est qu'un pointeur vers un inode. L'inode contient les méta-informations sur le fichier (autres que le nom) et des pointeurs vers les données du fichier (le cas échéant). Lorsque vous commencez à copier un fichier, vous obtenez un handle vers l'inode.

Le système d'exploitation conserve un nombre de références à l'inode. Tant qu'il y a des références à l'inode, l'inode et les données du fichier sont conservés. Une fois que toutes les références à l'inode sont supprimées, l'inode est supprimé et l'espace requis par le fichier est libéré.

Comme vous avez le fichier ouvert pour la copie, il sera conservé jusqu'à ce que votre processus ferme le fichier. Cela devrait se produire lorsque le transfert de fichiers se termine et se produira si le processus de copie échoue. Si le transfert de fichier échoue à mi-chemin et que vous avez supprimé tous les liens physiques vers le fichier, vous ne pourrez pas redémarrer le transfert avec succès.

EDIT :Comme d'autres l'ont noté, les déplacements de fichiers sur le même appareil sont effectués sans déplacer les données. Au lieu de cela, une nouvelle entrée de répertoire est créée dans le répertoire de destination et l'entrée de répertoire d'origine est supprimée.

Il est possible d'avoir plusieurs entrées de répertoire pour le même fichier. C'est ce qu'on appelle des liens durs. Ils sont créés en créant une nouvelle entrée de répertoire pour le fichier sans supprimer l'entrée d'origine. L'inode du système de fichiers a un compteur de références pour enregistrer le nombre d'entrées de répertoire pointant vers le fichier.

EDIT2 :si le processus se bloque ou est tué, le fichier sera proprement supprimé car le nombre d'accès en mémoire sera réduit à zéro. C'est l'action qui se produit lorsque le programme se termine normalement.

Dans le cas d'une panne de courant ou d'un autre arrêt anormal du système, le disque aura besoin d'un fsck (vérification du système de fichiers) avant qu'il puisse être entièrement monté. Selon l'état de l'inode sur le disque et des structures de répertoires, l'espace sera récupéré, le fichier restera dans le répertoire, ou une nouvelle entrée sera faite dans le lost+found annuaire. Les résultats dépendront des modifications qui ont été vidées sur le disque ou écrites dans le journal des systèmes de fichiers.


Comme l'a expliqué Matt Jenkins, le système d'exploitation (le système de fichiers) garde une trace des fichiers qui sont maintenus ouverts par les applications. Tant qu'un processus garde un fichier ouvert, ses données restent sur le disque (même s'il a été supprimé et n'est plus visible ou accessible aux autres programmes.

Notez qu'une conséquence de ceci est que l'espace occupé par un fichier ne peut être récupéré qu'une fois que le dernier processus l'utilisant l'a fermé. C'est une FAQ pour les opérations du système de fichiers Linux/Unix :"la commande 'df' indique que la partition est pleine, tandis que 'du' signale de l'espace libre" (voir par exemple http://batleth.sapienti-sat.org/projects/FAQs/ext3- faq.html ). Si vous avez besoin de libérer de l'espace, il ne suffit pas de supprimer les fichiers volumineux (par exemple, les fichiers journaux), vous devez également vous assurer qu'aucun processus ne les garde ouverts (généralement un problème avec les fichiers journaux).


C'est assez simple en fait. Le fichier maintient une liste de références - processus qui accèdent au fichier. Lorsque vous supprimez le fichier, cela supprime simplement la liste du répertoire, mais pas le fichier lui-même. Les programmes qui ont encore le fichier ouvert peuvent toujours y accéder. Le fichier n'est réellement supprimé que lorsque tous les programmes qui y accèdent le ferment.

De plus, en déplaçant le fichier - s'il se trouve dans le même système de fichiers - le fichier ne se déplace pas en tant que tel, il change simplement le pointeur vers le répertoire dans lequel se trouve le fichier.


Linux
  1. Qu'est-ce que NGINX ? Comment ça marche?

  2. Comment fonctionne Awk '!a[$0]++' ?

  3. Comment fonctionne le Sticky Bit ?

  4. Ssh – Comment Tcp-keepalive fonctionne-t-il dans Ssh ?

  5. Comment utiliser le type de fichier dans Vim ?

Comment utiliser Rsync

Comment fonctionne la mémoire d'échange sous Linux ?

Comment utiliser la commande lsof sous Linux

Comment utiliser gzip sous Linux ?

Comment utiliser la commande shred Linux

Comment fonctionne /proc/* ?