ฉันจะมีสองไฟล์ที่มีชื่อเดียวกันในไดเร็กทอรีเมื่อเมาต์ด้วย NFS ได้อย่างไร?


8

ฉันมีการทดสอบแอปพลิเคชัน C ++ ที่สร้าง 10,000 ไฟล์ในไดเรกทอรีที่เมาท์ NFS แต่การทดสอบของฉันล้มเหลวเมื่อเร็ว ๆ นี้เนื่องจากไฟล์หนึ่งปรากฏสองครั้งด้วยชื่อเดียวกันในไดเรกทอรีนั้นและอีก 10,000 ไฟล์ทั้งหมด สิ่งนี้สามารถเห็นได้บน Linux Centos v4 หรือ v5 โดยที่ไดเร็กทอรีนั้นถูกเมาท์ NFS แต่ไม่ใช่บนเครื่องโฮสต์ที่ดิสก์อยู่

เป็นไปได้ยังไงที่จะมีสองไฟล์ที่มีชื่อเดียวกันในไดเรกทอรีเดียวกัน?

[centos4x32 destination] ls -al ./testfile03373
-rwx------  1 user root 3373 Sep  3 03:23 ./testfile03373*
[centos4x32 destination] ls -al ./testfile03373*
-rwx------  1 user root 3373 Sep  3 03:23 ./testfile03373*
-rwx------  1 user root 3373 Sep  3 03:23 ./testfile03373*
[centos4x32 destination] ls -al *testfile03373
-rwx------  1 user root 3373 Sep  3 03:23 testfile03373*
-rwx------  1 user root 3373 Sep  3 03:23 testfile03373*
[centos4x32 destination] ls -alb test*file03373
-rwx------  1 user root 3373 Sep  3 03:23 testfile03373*
-rwx------  1 user root 3373 Sep  3 03:23 testfile03373*

เรียกใช้สคริปต์ Perl ที่แนะนำในหนึ่งในคำตอบด้านล่าง:

ls -la *03373* | perl -e 'while(<>){chomp();while(/(.)/g){$c=$1;if($c=~/[!-~]/){print("$c");}else{printf("\\x%.2x",ord($c));}}print("\n");}'

ให้:

-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*
-rwx------\x20\x201\x20user\x20root\x203373\x20Sep\x20\x203\x2003:23\x20testfile03373*

การพิมพ์ด้วยค่า inode (-i) แสดงว่าสำเนาสองชุดมีรายการ inode เดียวกัน (36733444):

[h3-centos4x32 destination] ls -alib te*stfile03373
36733444 -rwx------  1 user root 3373 Sep  3 03:23 testfile03373*
36733444 -rwx------  1 user root 3373 Sep  3 03:23 testfile03373*

ดูเหมือนว่ารายการไดเรกทอรีจะเสียหายอย่างใด

แอปพลิเคชันของฉันสามารถสร้างสถานการณ์นี้ได้อย่างถูกกฎหมายหรือเป็นข้อบกพร่องในระบบปฏิบัติการหรือไม่ มีสิ่งใดบ้างที่ฉันสามารถทำได้เพื่อป้องกันสิ่งนี้ในโปรแกรมที่สร้างไฟล์

ฉันคิดว่ามีข้อผิดพลาดบางอย่างในซอฟต์แวร์ยึด NFS นอกจากนี้ 'umount' และ 'mount' ของไดรฟ์ NFS ที่มีปัญหาไม่สามารถแก้ไขได้


อัปเดต 1:ตอนนี้ฉันได้ตีปัญหานี้ครั้งที่สองไม่กี่ชั่วโมงต่อมาและสิ่งที่แปลกจริงๆคือมันเกิดขึ้นในไฟล์เดียวกันtestfile03373แม้ว่ามันจะมี inode ที่แตกต่างกันในเวลานี้คือ 213352984 สำหรับไฟล์สองเท่า ฉันจะเพิ่มว่าไฟล์นั้นถูกสร้างขึ้นบนเครื่อง Centos 5 ที่มีการโฮสต์ดิสก์ดังนั้นมันจึงถูกสร้างขึ้นในเครื่องและแสดงให้ถูกต้องภายในเครื่อง แต่เครื่องอื่น ๆ ทั้งหมดที่ NFS ติดตั้งจะเห็นรายการสองเท่า


อัปเดต 2:ฉันติดตั้งไดรฟ์บนเครื่อง Centos v6 และพบสิ่งต่อไปนี้ใน/var/log/messagesหลังจากรายการและเห็นรายการที่นั่น:

[root@c6x64 double3373file]# ls -laiB testfile03373* ; tail -3 /var/log/messages
36733444 -rwx------. 1 user root 3373 Sep  3 03:23 testfile03373
36733444 -rwx------. 1 user root 3373 Sep  3 03:23 testfile03373
...
Sep  4 14:59:46 c6x64 kernel: NFS: directory user/double3373file contains a readdir loop.Please contact your server vendor.  The file: testfile03373 has duplicate cookie 7675190874049154909
Sep  4 14:59:46 c6x64 kernel: NFS: directory user/double3373file contains a readdir loop.Please contact your server vendor.  The file: testfile03373 has duplicate cookie 7675190874049154909

นอกจากนี้ฉันพบว่าการเปลี่ยนชื่อไฟล์จะทำให้รายการสองรายการหายไป แต่การเปลี่ยนชื่อกลับเป็นสาเหตุให้รายการนั้นปรากฏขึ้นสองเท่าหรืออีกทางหนึ่งเพียงแค่สัมผัสไฟล์ใหม่ที่มีชื่อtestfile03373ทำให้รายการสองรายการปรากฏขึ้น แต่สิ่งนี้เกิดขึ้นใน สองไดเร็กทอรีที่เห็นรายการคู่นี้


AFAIK เป็นไปไม่ได้ที่ไฟล์สองไฟล์ที่มีชื่อและนามสกุลรวมกันอยู่ในไดเรกทอรีเดียวกันในระบบไฟล์ใด ๆ คุณสามารถใช้กลไกการยกเว้นบางอย่างในโปรแกรมของคุณเพื่อป้องกันความล้มเหลวอื่น ๆ ที่ ...
Doktoro Reichard

คุณใช้ระบบไฟล์อะไร
Doktoro Reichard

พวกเขาได้อย่างแม่นยำเดียวกันได้หรือไม่ เช่นไม่มีช่องว่างนำหน้าหรือตามหลัง? ไม่มีตัวอักษร UTF-16, ...
Hennes

ฉันสามารถทำการทดสอบอื่นใดอีกเพื่อยืนยันว่าการทดสอบนั้นเหมือนกันหรือไม่
WilliamKF

ดูเหมือนว่าคุณจะได้เรียนรู้วิธีการสิ้นสุดการตรวจสอบสติของระบบปฏิบัติการที่สำคัญ
Fiasco Labs

คำตอบ:


8

เพื่อนช่วยให้ฉันติดตามนี้และพบว่านี่เป็นข้อผิดพลาดที่บันทึกไว้ในBugzilla 38572 สำหรับลินุกซ์ที่นี่ ข้อผิดพลาดได้รับการแก้ไขตามที่คาดคะเนในเคอร์เนลเวอร์ชัน 3.0.0 แต่มีอย่างน้อยในเวอร์ชัน 2.6.38

ปัญหาคือว่าการโทร ReadDIR () RPC ของเซิร์ฟเวอร์ส่งคืนผลลัพธ์ที่ไม่ถูกต้อง สิ่งนี้เกิดขึ้นเนื่องจากสาเหตุต่อไปนี้:

เมื่อไคลเอนต์อ่านไดเรกทอรีมันระบุขนาดบัฟเฟอร์สูงสุดและศูนย์คุกกี้ หากไดเรกทอรีมีขนาดใหญ่เกินไปการตอบกลับแสดงว่าการตอบนั้นเป็นเพียงบางส่วนและอัปเดตคุกกี้ จากนั้นไคลเอ็นต์สามารถเรียกใช้งาน RPC อีกครั้งด้วยคุกกี้ที่อัปเดตเพื่อรับข้อมูลกลุ่มถัดไป (ข้อมูลเป็นชุดของการจัดการไฟล์และชื่อในกรณีของ ReadDirPlus () นอกจากนี้ยังมีข้อมูล stat / inode / vnode) เอกสารไม่ได้ระบุว่านี่เป็นข้อผิดพลาดกับ ReadDirPlus () แต่อาจมี เช่นกัน

ปัญหาที่แท้จริงคือไฟล์สุดท้ายในแต่ละก้อน (ชื่อจัดการทูเปิล) บางครั้งก็ถูกส่งคืนเป็นไฟล์แรกในก้อนถัดไป

มีการโต้ตอบที่ไม่ดีกับระบบไฟล์พื้นฐาน Ext4 จัดแสดงสิ่งนี้ XFS ไม่ได้

นี่คือสาเหตุที่ปัญหาปรากฏขึ้นในบางสถานการณ์ แต่ไม่ใช่ในสถานการณ์อื่นและไม่ค่อยเกิดขึ้นในไดเรกทอรีขนาดเล็ก ดังที่เห็นในคำอธิบายคำถามไฟล์จะแสดงหมายเลขไอโหนดเดียวกันและชื่อเหมือนกัน (ไม่เสียหาย) เนื่องจากเคอร์เนล Linux เรียกการดำเนินงาน vnode สำหรับการดำเนินการพื้นฐานเช่น open () และอื่น ๆ รูทีนพื้นฐานของระบบไฟล์จะตัดสินใจว่าจะเกิดอะไรขึ้น ในกรณีนี้ไคลเอ็นต์ NFS3 จะแปลการดำเนินการ vnode เป็น RPC หากข้อมูลที่ต้องการไม่ได้อยู่ในแคชของแอตทริบิวต์ สิ่งนี้นำไปสู่ความสับสนเนื่องจากลูกค้าเชื่อว่าเซิร์ฟเวอร์ไม่สามารถทำได้


มันเกิดขึ้นกับฉันด้วยเคอร์เนล 3.18.17-13.el6.x86_64 (CentOS 6) ฉันค่อนข้างแน่ใจว่ามันเป็นข้อผิดพลาดของระบบ NFS พื้นฐานของ QNAP TS-212 NAS ซึ่งติดตั้งไดเรกทอรีไว้สามารถ มีใครยืนยันไหม
godzillante

6

ดิสก์เป็นดิสก์ที่ติดตั้ง NFS เมื่อฉันไปที่โฮสต์คอมพิวเตอร์ที่เผยแพร่ไดรฟ์ไฟล์จะแสดงรายการเพียงครั้งเดียว

อาจเป็นข้อผิดพลาดปัญหาหรือสภาพการแข่งขันกับ NFS

เป็นไปได้ที่จะมีสองไฟล์ชื่อเดียวกันหากคุณแก้ไขโครงสร้างระบบไฟล์โดยตรงโดยใช้โปรแกรมแก้ไขฐานสิบหก อย่างไรก็ตามฉันไม่แน่ใจว่าจะเกิดอะไรขึ้นหากคุณพยายามลบหรือเปิดไฟล์ ฉันไม่แน่ใจว่าเครื่องมือใดที่มีอยู่บน Linux เพื่อเข้าถึงไฟล์ด้วยหมายเลขไอโหนด (ซึ่งไม่สามารถทำซ้ำได้) แต่อาจใช้งานได้

ชื่อไฟล์ที่ซ้ำกันเป็นสิ่งที่fsckน่าจะจับได้และพยายามแก้ไข

ตรวจสอบให้แน่ใจว่าไม่มีไฟล์ใดที่มีช่องว่างต่อท้ายต่างกัน


ฉันจะแนะนำว่าจำนวนของการเขียนบนระบบไฟล์ในที่สุดก็ทำลายบางสิ่งบางอย่างและอนุญาตให้มีไฟล์เหมือนกันสองไฟล์
Doktoro Reichard

วิ่งfsckไม่พบปัญหา รีบูตทั้งโฮสต์และเครื่องไคลเอนต์ปัญหายังคงปรากฏ
WilliamKF

ฉันควรมีความชัดเจนมากขึ้น - fsckอาจเป็นไปได้ที่จะทำงานกับระบบไฟล์ในระบบเท่านั้นไม่ใช่ NFS ที่ติดตั้งอยู่ คุณอาจจำเป็นต้องอัพเกรด / แก้ไขแพ็กเกจ nfs และเคอร์เนลของคุณ @somequixotic กล่าวถึง CentOS ของคุณเก่าและปัญหาที่คุณประสบอาจได้รับการแก้ไขในการอัปเดตในอนาคต
LawrenceC

4

มีโอกาสที่คุณจะมีตัวละครหรือช่องว่างที่ไม่สามารถพิมพ์ได้ที่ซ่อนอยู่ในชื่อไฟล์อย่างใดอย่างหนึ่ง คุณสามารถตรวจสอบด้วยการให้-bตัวเลือกlsเช่น:

user@server:~/test$ ls -lab
total 8
drwxr-xr-x 2 user user 4096 Sep  3 12:20 .
drwx------ 8 user user 4096 Sep  3 12:20 ..
-rw-r--r-- 1 user user    0 Sep  3 12:19 hello
-rw-r--r-- 1 user user    0 Sep  3 12:19 hello\

จดบันทึก\ช่องว่างที่ท้ายของชื่อไฟล์นั้น

   -b, --escape
          print C-style escapes for nongraphic characters

เป็นทางเลือก (แม้ว่าข้างต้นควรใช้งานได้) คุณสามารถไพพ์เอาต์พุตผ่านสคริปต์ perl นี้เพื่อแทนที่สิ่งที่ไม่ใช่อักขระ ASCII ที่พิมพ์ได้ด้วยรหัสฐานสิบหก \x20ตัวอย่างเช่นพื้นที่กลายเป็น

while (<>) {
    chomp();
    while (/(.)/g) {
        $c = $1;
        if ($c=~/[!-~]/) {
            print("$c");
        } else {
            printf("\\x%.2x", ord($c));
        }
    }
    print("\n");
}

การใช้งาน:

ls -la | perl -e 'while(<>){chomp();while(/(.)/g){$c=$1;if($c=~/[!-~]/){print("$c");}else{printf("\\x%.2x",ord($c));}}print("\n");}'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.