GNU/Linux >> Linux Esercitazione >  >> Linux

Spostare un file mentre è in uso:come funziona?

La voce della directory è solo un puntatore a un inode. L'inode contiene le meta-informazioni sul file (diverse dal nome) e i puntatori ai dati del file (se presenti). Quando inizi a copiare un file ottieni un handle per l'inode.

Il sistema operativo mantiene un conteggio dei riferimenti all'inode. Finché ci sono riferimenti all'inode, l'inode ei dati del file vengono mantenuti. Una volta rimossi tutti i riferimenti all'inode, l'inode è e lo spazio richiesto dal file viene rilasciato.

Poiché il file è aperto per la copia, verrà conservato fino a quando il processo non chiuderà il file. Ciò dovrebbe verificarsi al termine del trasferimento del file e avverrà se il processo di copia fallisce. Se il trasferimento del file fallisce a metà e hai eliminato tutti i collegamenti fisici al file, non sarai in grado di riavviare correttamente il trasferimento.

EDIT:come altri hanno notato, gli spostamenti dei file sullo stesso dispositivo vengono eseguiti senza spostare i dati. Viene invece creata una nuova voce di directory nella directory di destinazione e la voce di directory originale viene rimossa.

È possibile avere più voci di directory per lo stesso file. Questi sono chiamati hard link. Vengono creati creando una nuova voce di directory per il file senza rimuovere la voce originale. L'inode del file system ha un conteggio dei riferimenti per registrare il numero di voci di directory che puntano al file.

EDIT2:se il processo si arresta in modo anomalo o viene interrotto, il file verrà rimosso in modo pulito poiché il conteggio degli accessi in memoria verrà ridotto a zero. Questa è l'azione che si verifica quando il programma termina normalmente.

In caso di interruzione dell'alimentazione o di altri arresti disordinati del sistema, il disco avrà bisogno di un fsck (controllo del file system) prima che possa essere completamente montato. A seconda dello stato dell'inode su disco e delle strutture di directory, lo spazio verrà recuperato, il file rimarrà nella directory o verrà inserita una nuova voce in lost+found directory. I risultati dipenderanno da quali modifiche sono state scaricate su disco o scritte nel journal dei file system.


Come spiegato da Matt Jenkins, il sistema operativo (il filesystem) tiene traccia dei file tenuti aperti dalle applicazioni. Finché un processo mantiene aperto un file, i suoi dati rimangono su disco (anche se è stato eliminato e non è più visibile o accessibile ad altri programmi.

Si noti che una conseguenza di ciò è che lo spazio occupato da un file può essere recuperato solo dopo che l'ultimo processo che lo ha utilizzato lo ha chiuso. Questa è una FAQ per le operazioni del file system Linux/Unix:"il comando 'df' dice che la partizione è piena, mentre 'du' segnala lo spazio libero" (vedi ad esempio http://batleth.sapienti-sat.org/projects/FAQs/ext3- faq.html ). Se hai bisogno di liberare spazio, non è sufficiente eliminare file di grandi dimensioni (ad es. file di log), devi anche assicurarti che nessun processo li mantenga aperti (tipicamente un problema con i file di log).


È abbastanza semplice in realtà. Il file mantiene un elenco di riferimenti - processi che accedono al file. Quando elimini il file, rimuove solo l'elenco dalla directory ma non il file stesso. I programmi che hanno ancora il file aperto possono comunque accedervi. Il file viene effettivamente eliminato solo quando tutti i programmi che vi accedono lo chiudono.

Inoltre, spostando il file, se si trova all'interno dello stesso filesystem, il file in realtà non si sposta in quanto tale, cambia solo il puntatore alla directory in cui si trova il file.


Linux
  1. Cos'è NGINX? Come funziona?

  2. Come funziona Awk '!a[$0]++'?

  3. Come funziona il bit appiccicoso?

  4. Ssh – Come funziona Tcp-keepalive in Ssh?

  5. UNIX / Linux:come utilizzare Sticky Bit su directory e file

Come usare Rsync

Come funziona la memoria di scambio in Linux?

Come usare il comando lsof in Linux

Come usare gzip in Linux?

Come utilizzare il comando shred Linux

Come funziona /proc/*?