Sto cercando di utilizzare i blocchi flock () / BSD per bloccare i file utilizzati su più client, ma i file vengono danneggiati. Come mai? I blocchi A. flock () / BSD agiscono solo localmente sui client NFS Linux precedenti alla 2.6.12. Utilizzare i blocchi fcntl () / POSIX per assicurarsi che i blocchi dei file siano visibili ad altri client.
Ecco alcuni modi per serializzare l'accesso a un file NFS.
Utilizzare l'API di blocco fcntl () / POSIX. Questo tipo di blocco fornisce il blocco dell'intervallo di byte su più client tramite il protocollo NLM o tramite NFSv4. Utilizzare un file di blocco separato e creare collegamenti reali ad esso. Vedi la descrizione nella sezione O_EXCL della pagina man creat (2). Vale la pena notare che fino ai primi 2.6 kernel, le creazioni O_EXCL non erano atomiche sui client NFS Linux. Non utilizzare O_EXCL crea e prevede comportamenti atomici tra più client NFS a meno che non stia eseguendo un kernel più recente della 2.6.5.
È un problema noto che Perl utilizza il blocco flock () / BSD per impostazione predefinita. Ciò può interrompere i programmi portati da altri sistemi operativi, come Solaris, che prevedono che i blocchi flock / BSD funzionino come i blocchi POSIX.
Su Linux, l'utilizzo del blocco dei file anziché di un collegamento reale ha l'ulteriore vantaggio di controllare la cache del client con il server. Quando viene acquisito un blocco file, il client svuota la cache della pagina per quel file in modo che eventuali letture successive ottengano nuovi dati dal server. Quando viene rilasciato un blocco file, tutte le modifiche al file su quel client vengono rinviate al server prima del rilascio del blocco in modo che altri client in attesa di bloccare quel file possano vedere le modifiche.
Il client NFS in 2.6.12 fornisce supporto per i blocchi flock () / BSD sui file NFS emulando i blocchi in stile BSD in termini di blocchi dell'intervallo di byte POSIX. Altri client NFS che usano lo stesso meccanismo di emulazione o che usano i blocchi fcntl () / POSIX, vedranno quindi gli stessi blocchi che vede il client NFS Linux.
Sui file system Linux locali, i blocchi POSIX e i blocchi BSD sono invisibili l'uno all'altro. Pertanto, a causa di questa emulazione, le applicazioni in esecuzione su un server NFS Linux vedranno comunque i file bloccati dai client NFS come bloccati con un blocco fcntl () / POSIX, indipendentemente dal fatto che l'applicazione sul client stia usando uno stile BSD o POSIX- blocco di stile. Se l'applicazione server utilizza i blocchi BSD flock (), non vedrà i blocchi utilizzati dai client NFS.