MV Atomic è sul mio FS?


12

Come posso verificare se mvè atomico sul mio fs (ext4)?

Il sistema operativo è Red Hat Enterprise Linux Server versione 6.8.

In generale, come posso verificare questo? Mi sono guardato intorno e non ho trovato se il mio sistema operativo è POSIX standard.


Ci hai provato strace?
Wildcard il

Risposte:


8

È interessante notare che la risposta potrebbe essere "Dipende".

Per essere chiari, mvè specificato a

L' mvutilità deve eseguire azioni equivalenti alla rename() funzione

Le specifiche della funzione di ridenominazione indicano:

Questa rename()funzione è equivalente per i file regolari a quella definita dallo standard ISO C. La sua inclusione qui espande quella definizione per includere azioni sulle directory e specifica il comportamento quando il nuovo parametro nomina un file già esistente. Tale specifica richiede che l'azione della funzione sia atomica.

Ma le ultime specifiche ISO C per gli rename()stati:

7.21.4.2 La renamefunzione

Sinossi

#include <stdio.h>
int rename(const char *old, const char *new);

Descrizione

La renamefunzione fa sì che il file il cui nome è la stringa a cui punta oldsia ormai noto con il nome dato dalla stringa a cui punta new. Il file denominato oldnon è più accessibile con quel nome. Se un file denominato dalla stringa indicata da newesiste prima della chiamata alla renamefunzione, il comportamento è definito dall'implementazione.

ritorna

La renamefunzione restituisce zero se l'operazione ha esito positivo, diversa da zero se non riesce, nel qual caso se il file esisteva in precedenza è ancora noto con il nome originale.

Sorprendentemente, nota che non esiste un requisito esplicito per l'atomicità. Potrebbe essere richiesto da qualche altra parte nell'ultimo standard C disponibile al pubblico, ma non sono stato in grado di trovarlo. Se qualcuno riesce a trovare tale requisito, le modifiche e i commenti sono più che benvenuti.

Vedi anche Is rename () atomic?

Per la pagina man di Linux :

Se newpathesiste già, verrà sostituito atomicamente, in modo che non vi sia alcun punto in cui un altro processo che tenta di accedere newpathlo troverà mancante. Tuttavia, ci sarà probabilmente una finestra in cui entrambi oldpathe si newpathriferiscono al file che viene rinominato.

La pagina man di Linux afferma che la sostituzione del file sarà atomica.

Testare e verificare che l'atomicità potrebbe essere molto difficile, comunque, se è quanto lontano devi andare. Non sei chiaro su cosa intendi nel tuo uso di "Come posso verificare se mv è atomico". Desideri requisiti / specifiche / documentazione che siano atomici o devi testarli ?

Si noti inoltre che quanto sopra presuppone che i nomi dei due file di operando si trovino nello stesso file system. Non riesco a trovare alcuna restrizione standard mvsull'utilità per applicarla.


Devo assicurarmi che la mossa sia atomica. Test è sufficiente per accettarlo? Non so dirlo. Sì, sto lavorando su uno stesso fs (da ext4 a ext4).
Tizianoreica,

1
POSIX non garantisce neanche l'atomicità, ma Linux, come la maggior parte delle varianti unix, lo fa, per filesystem "nativi" come ext4.
Gilles 'SO- smetti di essere malvagio' il

1
Dato che ISO C definisce solo il comportamento di un programma e non di un intero sistema, sarebbe strano dire qualcosa renamesull'atomicità.
Gilles 'SO- smetti di essere malvagio' il

3
Ho letto "quella specifica" facendo riferimento alla frase precedente ("La sua inclusione qui ... specifica il comportamento quando il nuovo parametro nomina un file che esiste già"), che fa riferimento a parti precedenti del documento POSIX ("un collegamento denominato nuovo deve rimanere visibile agli altri thread in tutto ... e fare riferimento al file a cui fa riferimento il nuovo o il vecchio ... "). In altre parole, POSIX promette di implementare lo standard ISO C e offre ulteriori garanzie oltre a ciò che offre ISO C. Questa interpretazione aiuta?
SimonJ

1
@Tizianoreica So che questo è un post antico, ma ho appena visto il tuo commento e ho pensato che avrei dovuto chiarire: il vero filesystem deve essere lo stesso perché la ridenominazione sia atomica. Non solo lo stesso tipo di filesystem. ad esempio se hai /come ext4 fs e /tmpcome un ext4 fs diverso, non puoi atomicamente mv l'uno dall'altro.
Wodin,

0

mvsi basa sulla renamechiamata di sistema ed rename()è atomico. Potresti guardare la manpage rename(2).

Puoi trovare la risposta su Is rename () atomic? su stackoverflow.

Che tipo di fs hai usato?


fs è ext4 - os già specificato.
Tizianoreica,

-1

Oltre a controllare le chiamate di sistema e la loro atomicità, forse inotify-toolspuò servire da test, anche se non sono sicuro che si tratti di una prova garantita di atomicità.

Apri 2 conchiglie. Guarda la directory di destinazione dello spostamento in uno di essi:

inotifywait -m target/

Sposta un file nella directory nell'altro:

mv foobar target/

L' inotifywaitdovrebbe mostrare una sola linea:

target/ MOVED_TO foobar

Sembra atomico rispetto alla risposta a ls target/e touch target/a, che producono messaggi multilinea come:

# the response to ls target/
target/ OPEN,ISDIR 
target/ ACCESS,ISDIR 
target/ CLOSE_NOWRITE,CLOSE,ISDIR 

PS

Penso che almeno dimostri che la cooperazione multi-processo asincrona sui file è sicura con inotify(praticamente atomica): in ogni caso risponderesti solo dopo aver inotifydato il segnale finale dopo l'operazione. Ad esempio, una configurazione produttore-consumatore può essere implementata facilmente e in sicurezza con inotify.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.