ก่อนอื่นมาปัดเป่าตำนานบางอย่าง
มันเป็นอะตอมดังนั้นความไม่สอดคล้องจึงไม่สามารถเกิดขึ้นได้
การย้ายไฟล์ภายในระบบไฟล์เดียวกัน (เช่นการrename
เรียกใช้ระบบ) นั้นเป็นแบบอะตอมมิกตามสภาพแวดล้อมของซอฟต์แวร์ Atomicity หมายความว่ากระบวนการใด ๆ ที่ค้นหาไฟล์จะเห็นที่ตำแหน่งเดิมหรือที่ตำแหน่งใหม่ ไม่มีกระบวนการใดที่จะสามารถสังเกตได้ว่าไฟล์นั้นมีจำนวนลิงค์ต่างกันหรือไฟล์นั้นมีอยู่ในไดเรกทอรีต้นทางหลังจากที่มีอยู่ในไดเรกทอรีปลายทางหรือไฟล์นั้นหายไปจากไดเรกทอรีเป้าหมายหลังจากขาดในแหล่งข้อมูล ไดเรกทอรี
อย่างไรก็ตามหากระบบล่มเนื่องจากข้อผิดพลาดข้อผิดพลาดของดิสก์หรือการสูญเสียพลังงานไม่มีการรับประกันว่าระบบไฟล์จะอยู่ในสถานะที่สอดคล้องกันนับประสาว่าการย้ายไม่เหลือครึ่งเสร็จ ลีนุกซ์ไม่ได้เสนอการรับประกันอะตอมมิกเกี่ยวกับเหตุการณ์ฮาร์ดแวร์
ก่อนอื่นให้คุณคัดลอกรายการ dir ใน dir ใหม่จากนั้นลบรายการใน dir ก่อนหน้าดังนั้นคุณอาจมีความไม่สอดคล้องกันของการอ้างอิงไฟล์สองครั้ง แต่จำนวนอ้างอิงคือ 1
นี่หมายถึงเทคนิคการใช้งานที่เฉพาะเจาะจง มีคนอื่น ๆ
มันเกิดขึ้นที่ext2 บน Linux (ณ เคอร์เนล 3.16) ใช้เทคนิคนี้โดยเฉพาะ อย่างไรก็ตามสิ่งนี้ไม่ได้หมายความว่าเนื้อหาของดิสก์จะผ่านไปตามลำดับ [ตำแหน่งเก่า] → [ทั้งสองตำแหน่ง] → [ตำแหน่งใหม่] เนื่องจากการดำเนินการสองรายการ (เพิ่มรายการใหม่ลบรายการเก่า) ไม่ใช่ระดับอะตอมที่ระดับฮาร์ดแวร์ : เป็นไปได้ที่หนึ่งในนั้นจะถูกขัดจังหวะโดยปล่อยให้ระบบไฟล์อยู่ในสถานะไม่สอดคล้องกัน (หวังว่า fsck จะซ่อมมัน) นอกจากนี้เลเยอร์บล็อกสามารถเรียงลำดับการเขียนใหม่ได้ดังนั้นครึ่งแรกสามารถส่งไปยังดิสก์ก่อนเกิดความผิดพลาดและครึ่งหลังจะไม่ถูกดำเนินการ
จำนวนการอ้างอิงจะไม่ถูกสังเกตว่าแตกต่างจาก 1 ตราบใดที่ระบบไม่ผิดพลาด (ดูด้านบน) แต่การรับประกันนั้นจะไม่ขยายไปสู่ความผิดพลาดของระบบ
มันจะลบตัวชี้ก่อนแล้วจึงคัดลอกตัวชี้ดังนั้นความไม่สอดคล้องกันคือไฟล์นั้นมีการอ้างอิง 0
อีกครั้งนี้หมายถึงเทคนิคการใช้งานเฉพาะ ไฟล์ dangling ไม่สามารถตรวจสอบได้หากระบบไม่พัง แต่เป็นไปได้ว่าอาจเกิดความผิดพลาดของระบบอย่างน้อยก็ในการกำหนดค่าบางอย่าง
จากการโพสต์บล็อกของ Alexander Larsson ext2 ไม่รับประกันความสอดคล้องในการล่มของระบบ แต่ ext3 ทำในdata=ordered
โหมด (โปรดทราบว่าการโพสต์บล็อกนี้ไม่ได้เกี่ยวกับrename
ตัวเอง แต่เกี่ยวกับการรวมกันของการเขียนไปยังไฟล์และการเรียกrename
ไฟล์นั้น)
ทีโอดอร์ทสโิผู้เขียนหลักของ ext2, ext3 และ ext4 filesystems เขียนบล็อกโพสต์เกี่ยวกับปัญหาเดียวกัน โพสต์บล็อกนี้กล่าวถึงatomicity (เกี่ยวกับสภาพแวดล้อมของซอฟต์แวร์เท่านั้น) และความทนทาน (ซึ่งเป็น atomicity เมื่อเทียบกับข้อขัดข้องพร้อมรับประกันการผูกมัดคือรู้ว่ามีการดำเนินการแล้ว) น่าเสียดายที่ฉันไม่สามารถหาข้อมูลเกี่ยวกับอะตอมมิกเกี่ยวกับการล่มได้เพียงอย่างเดียว อย่างไรก็ตามการรับประกันความทนทานที่กำหนดสำหรับความต้องการ ext4 นั้นrename
ก็คืออะตอม เอกสารเกี่ยวกับเคอร์เนลสำหรับ ext4ระบุว่า ext4 พร้อมauto_da_alloc
ตัวเลือก (ซึ่งเป็นค่าเริ่มต้นในเมล็ดที่ทันสมัย) เช่นเดียวกับ ext4 ให้การรับประกันความทนทานสำหรับwrite
ตามด้วยrename
ซึ่งหมายถึงว่าrename
เป็นอะตอมที่เกี่ยวกับฮาร์ดแวร์ล่ม
สำหรับ Btrfs การrename
เขียนทับไฟล์ที่มีอยู่จะรับประกันว่าเป็นปรมาณูเกี่ยวกับการขัดข้อง แต่ไฟล์rename
ที่ไม่เขียนทับไฟล์อาจส่งผลให้ไม่มีไฟล์หรือไฟล์ทั้งสองที่มีอยู่
โดยสรุปคำตอบสำหรับคำถามของคุณคือไม่เพียง แต่จะย้ายไฟล์ที่ไม่ใช่อะตอมมิกเกี่ยวกับการล่มใน ext2 แต่ไม่รับประกันว่าจะทำให้ไฟล์อยู่ในสถานะที่สอดคล้องกัน (แม้ว่าความล้มเหลวที่fsck
ไม่สามารถซ่อมแซมได้จะหายาก) - ไม่มีอะไรที่จะเป็นไปได้ซึ่งเป็นเหตุผลว่าทำไมระบบไฟล์ที่ดีขึ้นจึงถูกคิดค้นขึ้น Ext3, ext4 และ btrfs มีการรับประกันแบบ จำกัด
rename
เป็นอะตอม แต่ btrfs ไม่เป็นไปตามวิกิ (ดูคำตอบของฉัน) เป็นไปได้ที่จะรับประกัน atomicity โดยไม่ต้องบันทึก (ฉันไม่รู้ตัวอย่างบน Linux แต่อาจมีบางอย่าง) คุณมีข้อมูลที่เชื่อถือได้เกี่ยวกับ ext2 หรือไม่?