Innanzitutto, dissipiamo alcuni miti.
è atomico, quindi non possono verificarsi incoerenze
Lo spostamento di un file all'interno dello stesso filesystem (ovvero la rename
) chiamata di sistema è atomico rispetto all'ambiente software. Atomicity significa che qualsiasi processo che cerca il file lo vedrà nella sua posizione precedente o nella sua nuova posizione; nessun processo sarà in grado di osservare che il file ha un conteggio dei collegamenti diverso o che il file è presente nella directory di origine dopo essere stato presente nella directory di destinazione o che il file è assente dalla directory di destinazione dopo essere stato assente nella sorgente directory.
Tuttavia, se il sistema si arresta in modo anomalo a causa di un bug, un errore del disco o un'interruzione dell'alimentazione, non vi è alcuna garanzia che il filesystem venga lasciato in uno stato coerente, per non parlare del fatto che lo spostamento non viene lasciato a metà. Linux non offre in generale una garanzia di atomicità rispetto agli eventi hardware.
prima copi la voce dir nella nuova dir e poi cancelli la voce nella dir precedente, quindi potresti avere l'incoerenza di avere un file referenziato due volte, ma il conteggio dei ref è 1
Questo si riferisce a una tecnica di implementazione specifica. Ce ne sono altri
Accade così che ext2 su Linux (a partire dal kernel 3.16) usi questa particolare tecnica. Tuttavia, ciò non implica che il contenuto del disco passi attraverso la sequenza [vecchia posizione] → [entrambe le posizioni] → [nuova posizione], poiché le due operazioni (aggiungi nuova voce, rimuovi vecchia voce) non sono atomiche neanche a livello hardware : è possibile che uno di essi venga interrotto, lasciando il file system in uno stato incoerente. (Speriamo che fsck lo ripari.) Inoltre lo strato di blocco può riordinare le scritture, quindi la prima metà potrebbe essere impegnata su disco appena prima dello schianto e la seconda metà non sarebbe stata eseguita.
Il conteggio dei riferimenti non sarà mai osservato essere diverso da 1 finché il sistema non si arresta in modo anomalo (vedere sopra) ma tale garanzia non si estende a un arresto anomalo del sistema.
prima cancella il puntatore e quindi copia il puntatore in modo che l'incoerenza sia che il file ha riferimento 0
Ancora una volta, ciò si riferisce a una particolare tecnica di implementazione. Un file pendente non può essere osservato se il sistema non si arresta in modo anomalo, ma è una possibile conseguenza di un arresto anomalo del sistema, almeno in alcune configurazioni.
Secondo un post sul blog di Alexander Larsson , ext2 non fornisce alcuna garanzia di coerenza in caso di crash del sistema, ma ext3 funziona in data=ordered
modalità. (Nota che questo post sul blog non riguarda rename
se stesso, ma la combinazione di scrivere su un file e chiamare rename
quel file.)
Theodore Ts'o, il principale autore dei filesystem ext2, ext3 ed ext4, ha scritto un post sul blog sullo stesso problema . Questo post sul blog discute atomicità (solo rispetto all'ambiente software) e durata (che è atomicità rispetto agli arresti anomali più una garanzia di impegno, cioè sapendo che l'operazione è stata eseguita). Purtroppo non riesco a trovare informazioni sull'atomicità rispetto ai soli incidenti. Tuttavia, le garanzie di durabilità fornite per ext4 richiedono che rename
sia atomico. La documentazione del kernel per ext4 afferma che ext4 con l' auto_da_alloc
opzione (che è l'impostazione predefinita nei kernel moderni), così come ext4, fornisce una garanzia di durata per un write
seguito da unrename
, il che implica che rename
è atomico rispetto agli arresti anomali dell'hardware.
Per Btrfs, un file rename
che sovrascrive un file esistente è garantito in modo atomico rispetto agli arresti anomali, ma un file rename
che non sovrascrive un file può comportare l' assenza di file o di entrambi i file.
In sintesi, la risposta alla tua domanda è che non solo si sta spostando un file non atomico rispetto agli arresti anomali su ext2, ma non è nemmeno garantito che lasci il file in uno stato coerente (anche se i guasti che fsck
non possono essere riparati sono rari) - praticamente nulla lo è, motivo per cui sono stati inventati file system migliori. Ext3, ext4 e btrfs offrono garanzie limitate.
rename
è atomico, ma btrfs non lo fa secondo il wiki (vedi la mia risposta). È anche possibile garantire atomicità senza un diario (non conosco esempi su Linux ma potrebbero essercene alcuni). Hai informazioni affidabili su ext2?