NFS üzerinden fcntl (2) 'ye karşı sürü (2)


19

Perl 5.x belgeleri, flock (..) uygulamasının 1'den başlayarak ve yoksa 3'e doğru çalışarak aşağıdaki yerel çağrılardan birini kullanacağını belirtir:

  1. akın (2)
  2. fcntl (2)
  3. lockf (3)

Bu iyi. Ancak, feragatın (2) bir NFS üzerinde kullanılmaması gerektiğini feragat etmiş olabilirsiniz. Belge, Perl'i sürü (2) kullanmaya zorlamak için -Ud_flock bayrağı kullanmanızı önerir. Flock (2) kılavuz sayfası (Redhat'te) NFS sorunları hakkında benzer bir sorumluluk reddi beyan eder.

Sorum şu, neden!?!? Derinlemesine bir makale bulamıyorum veya NED sürü (2) 'nin bir NFS üzerinde güvensiz olduğunu açıklayamıyorum.

Hem Redhat (flock (2) 'nin kullanıldığı) hem de Solaris (fcntl (2) kullanıldığı) üzerinde C ve Perl'de birkaç test komut dosyası yazdım. Perl'in gerçekten sırasıyla flock (2) ve fcntl (2) kullandığından emin olmak için strace / truss koştum. Bir kilit onurlandırılmadığı sorunları çoğaltamadım! Ne oluyor??

Yanıtlar:


3

Lennart Poettering son zamanlarda linux dosya sistemi kilitleme davranışına biraz kazdı, bu da NFS'yi kilitlemek için özellikle pembe bir resim çizmedi (özellikle yazının alt kısmına bağlandığı takip).

http://0pointer.de/blog/projects/locking.html


1
Aradığım tam bilgi türü budur. Teşekkür ederim! Birkaç haftalık araştırmadan sonra geldiğimde çok benzer bir karar aldım, ancak şüphelerimi doğrulayan (ve başkalarını öneren) bir makaleyi okumak harika. Bu sayfanın yorumlarından gelen bağlantı da iyi bir referans ve POSIX ve geçmişi hakkında iyi bir makaleydi
Jmoney38 14:02

15

Eski endişelere baktığınızdan eminim. Perl5 el kitabının 1994 yılında piyasaya sürüldüğünü ve 1991'den beri sadece Perl4 el kitabının bir düzenlemesi olduğunu hatırlayın. O günlerde, muhtemelen Nightmare File System adı verilen "Kabus Dosya Sisteminin" şaşırıyor, ama hiç dans etmiyor ".

1991 çağındaki NFS2, Güneş'ten yavaşça diğer platformlara sürülüyordu ve nispeten kaba idi. Güvenlik modeli aslında yoktu (bir istemci makinedeki kök, NFS montajının tüm içeriğini okuyabilir) ve kilitleme - nfs.lockd aracılığıyla - bu deneysel taraftı. İki farklı iddia edilen birlikte çalışabilir uygulama arasında, sürü semantiğinin düzgün çalışmasını beklemek aptalca olurdu. Coax, intranetlerin durumunu daha iyi kavradıysa, birçok ağ kullanıcısının hiç kullanma hoşnutsuzluğuna sahip olmadığı (50𝛀 sonlandırma direncini takmayı unuttun mu?) O zaman baskın Ethernet PHY idi.

Larry Wall ve mürettebat, o sırada NFS kilitlerinin doğruluğu hakkında kötümser varsayımlar yapmak için her nedene sahipti ve bu, gelecekteki kod jokeylerinin kaldırmaktan nefret ettikleri bir savunma programlamasıdır, çünkü bir kusurun olmadığını kanıtlamak çok zordur daha önce hiç duymadığınız eski bir sistemle birlikte çalışabilirlikle yeniden tanıtılan eski kodun kaldırılması.

O zamandan beri, NFS önemli ölçüde iyileşti ve lockd zamanla Linux 2.6 çekirdeğinin bir özelliğine geçti. 2003+ sistemlerden oluşan bir koleksiyon için NFS dosya kilitleme, özellikle uygulamanızda üzerinde çalıştığı birçok platformda iyi test edildiğinde muhtemelen güvenilir olabilir.

Yukarıdakilerin hepsi hafızadan atıldı ve muhtemelen araştırma yoluyla kanıtlanabilirdi (örneğin http://nfs.sourceforge.net/ ) ama kanıt - dedikleri gibi, kilitlemede ve eğer test etmediyseniz , kırık olduğu varsayılır.


Harika bir analiz. Aslında şimdiye kadar aynı sonuca vardım. Bu bağlantıyı yayınladıktan sonra nfs sourceforge sayfasını tekrar okudum ve sonunda ne aradığımı buldum! İşte doğrudan atın ağzından derinlemesine bir analiz!
Jmoney38

2
ayy, enter'a vurdum ... nfs.sourceforge.net adresine gidin , D10 kısmının altına doğru bu konuyu ayrıntılı olarak tartışıyor.
Jmoney38

3

Bir diğeri, doğrudan Linux-NFS'den SSS: nfs.sf.net

Birden fazla istemcide kullanılan dosyaları kilitlemek için flock () / BSD kilitlerini kullanmaya çalışıyorum, ancak dosyalar bozuldu. Nasıl olur? A. flock () / BSD kilitleri 2.6.12'den önce yalnızca Linux NFS istemcileri üzerinde yerel olarak çalışır. Dosya kilitlerinin diğer istemciler tarafından görülmesini sağlamak için fcntl () / POSIX kilitlerini kullanın.

NFS dosyasına erişimi serileştirmenin bazı yolları.

Fcntl () / POSIX kilitleme API'sini kullanın. Bu tür kilitleme, NLM protokolü veya NFSv4 aracılığıyla birden çok istemcide bayt aralığı kilitleme sağlar. Ayrı bir kilit dosyası kullanın ve bu dosyaya sabit bağlantılar oluşturun. Creat (2) kılavuz sayfasının O_EXCL bölümündeki açıklamaya bakın. 2.6 çekirdeklere kadar, O_EXCL oluşturucularının Linux NFS istemcilerinde atomik olmadığını belirtmek gerekir. 2.6.5'ten daha yeni bir çekirdek çalıştırmıyorsanız, O_EXCL oluşturma ve birden çok NFS istemcisi arasında atom davranışı beklemeyin.

Perl'in varsayılan olarak flock () / BSD kilitleme kullanması bilinen bir sorundur. Bu, flok / BSD kilitlerinin POSIX kilitleri gibi çalışmasını bekleyen Solaris gibi diğer işletim sistemlerinden taşınan programları kırabilir.

Linux'ta, sabit bağlantı yerine dosya kilitleme kullanmanın, istemcinin önbelleğini sunucu ile işaretlemenin ek bir yararı vardır. Bir dosya kilidi alındığında, istemci bu dosya için sayfa önbelleğini temizler, böylece sonraki okumalar sunucudan yeni veriler alır. Bir dosya kilidi bırakıldığında, o istemcideki dosyada yapılan herhangi bir değişiklik, kilit açılmadan önce sunucuda temizlenir, böylece o dosyayı kilitlemeyi bekleyen diğer istemciler değişiklikleri görebilir.

2.6.12'deki NFS istemcisi, BSD tarzı kilitleri POSIX bayt aralığı kilitleri açısından taklit ederek NFS dosyalarında flock () / BSD kilitleri için destek sağlar. Aynı öykünme mekanizmasını kullanan veya fcntl () / POSIX kilitlerini kullanan diğer NFS istemcileri, Linux NFS istemcisinin gördüğü kilitleri görür.

Yerel Linux dosya sistemlerinde POSIX kilitleri ve BSD kilitleri birbirlerine görünmezdir. Bu nedenle, bu öykünme nedeniyle, bir Linux NFS sunucusunda çalışan uygulamalar, istemcideki uygulama bir BSD stili veya POSIX kullanıyor olsa da, NFS istemcileri tarafından kilitlenen dosyaların fcntl () / POSIX kilidi ile kilitli olduğunu görmeye devam eder. tarzı kilit. Sunucu uygulaması flock () BSD kilitlerini kullanıyorsa, NFS istemcilerinin kullandığı kilitleri görmez.


Öyleyse çekirdek 3.13. * Çalıştıran iki NFS istemcisi birbirlerinin flock () larını görüyor mu?
reinierpost

Doğru anlıyorsam, cevap hayır. Bir şeyi kaçırmadıkça flock, yapmaz, yapmaz ve nfs bağları arasında kilitlenmezse.
Daniel Farrell

En azından NFS4'te.
rjh

3

Bu artık güncel değil. NFS4 , protokolün içinde kilitlemeyi destekler (kilitli arka plan programı veya RPC geri arama mekanizması gerekmez) ve Perl'in flock()yöntemi iyi çalışıyor - bunu üretimde kullanıyoruz.

Çekirdeğin çok eski sürümleri flock(sistem çağrısı) NFS'de işlem yapılmaması ve bayt aralığı kilitleme gibi diğer şeyler düzgün bir şekilde desteklenmedi. Histeri buradan geliyor.


İpucu için çok teşekkürler. NFS4 ile montaj sorunumu çözdü. Fstab yapılandırmasını doğru yapmak için access.redhat.com/documentation/en-us/red_hat_enterprise_linux/… ' ı takip etti .
maraspin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.