ฉันกำลังพยายามใช้การล็อก flock () / BSD เพื่อล็อคไฟล์ที่ใช้กับไคลเอนต์หลายตัว แต่ไฟล์เสียหาย มาทำไม A. flock () / BSD ล็อคทำหน้าที่เฉพาะบนไคลเอนต์ Linux NFS ก่อน 2.6.12 ใช้การล็อค fcntl () / POSIX เพื่อให้แน่ใจว่าการล็อคไฟล์จะปรากฏให้ลูกค้ารายอื่นเห็นได้
ต่อไปนี้เป็นวิธีการเข้าถึงไฟล์ NFS เป็นลำดับ
ใช้ API การล็อค fcntl () / POSIX การล็อกชนิดนี้จัดเตรียมการล็อกช่วงไบต์สำหรับไคลเอ็นต์หลายตัวผ่านโปรโตคอล NLM หรือผ่าน NFSv4 ใช้ lockfile แยกต่างหากและสร้างฮาร์ดลิงก์ไปยังมัน ดูคำอธิบายในส่วน O_EXCL ของหน้า creat (2) เป็นที่น่าสังเกตว่าจนกระทั่งต้น 2.6 เมล็ด O_EXCL สร้างไม่ได้เป็นอะตอมมิกบนไคลเอนต์ Linux NFS อย่าใช้ O_EXCL สร้างและคาดหวังว่าพฤติกรรมแบบปรมาณูระหว่างไคลเอนต์ NFS หลายรายการยกเว้นว่าคุณใช้เคอร์เนลใหม่กว่า 2.6.5
เป็นปัญหาที่ทราบกันดีว่า Perl ใช้การล็อค flock () / BSD เป็นค่าเริ่มต้น สิ่งนี้สามารถทำลายโปรแกรมที่พอร์ตจากระบบปฏิบัติการอื่นเช่น Solaris ซึ่งคาดว่าการล็อก flock / BSD จะทำงานเหมือนล็อค POSIX
บน Linux การใช้การล็อกไฟล์แทนฮาร์ดลิงก์มีข้อดีเพิ่มเติมของการตรวจจุดแคชของไคลเอ็นต์กับเซิร์ฟเวอร์ เมื่อได้รับการล็อคไฟล์ไคลเอนต์จะล้างแคชเพจสำหรับไฟล์นั้นเพื่อให้ผู้อ่านในภายหลังได้รับข้อมูลใหม่จากเซิร์ฟเวอร์ เมื่อการล็อกไฟล์ถูกปล่อยการเปลี่ยนแปลงใด ๆ กับไฟล์บนไคลเอ็นต์นั้นจะถูกล้างกลับไปที่เซิร์ฟเวอร์ก่อนที่การล็อกจะถูกปล่อยเพื่อให้ไคลเอนต์อื่นที่รอการล็อกไฟล์นั้นสามารถเห็นการเปลี่ยนแปลง
ไคลเอ็นต์ NFS ใน 2.6.12 ให้การสนับสนุนสำหรับการล็อก flock () / BSD บนไฟล์ NFS โดยจำลองการล็อกสไตล์ BSD ในแง่ของการล็อคช่วงไบต์ POSIX ไคลเอนต์ NFS อื่น ๆ ที่ใช้กลไกการจำลองแบบเดียวกันหรือที่ใช้การล็อค fcntl () / POSIX จะเห็นการล็อกเดียวกันกับที่ไคลเอ็นต์ Linux NFS เห็น
บนระบบไฟล์โลคัล Linux, POSIX ล็อคและล็อค BSD จะมองไม่เห็นซึ่งกันและกัน ดังนั้นเนื่องจากการจำลองนี้แอปพลิเคชันที่ทำงานบนเซิร์ฟเวอร์ Linux NFS จะยังคงเห็นไฟล์ที่ถูกล็อกโดยไคลเอนต์ NFS ว่าถูกล็อกด้วยการล็อค fcntl () / POSIX ไม่ว่าแอปพลิเคชันบนไคลเอนต์จะใช้สไตล์ BSD หรือ POSIX- ล็อคสไตล์ หากแอปพลิเคชันเซิร์ฟเวอร์ใช้การล็อค flock () BSD จะไม่เห็นการล็อคที่ไคลเอ็นต์ NFS ใช้