ผมเคยถามคำถามเกี่ยวกับ #btrfs IRC พวกเขากล่าวว่าshould be ok if your hw isn't "buggy"
ที่ not- "รถ" your hw has correct flush/barrier semantics
หมายถึง
TL; DR: ซึ่งหมายความว่า btrfs ได้รับการปกป้องจากข้อมูลเสียหายเนื่องจากการสูญเสียพลังงานในลักษณะเดียวกันกับ ZFS
นี่คือเหตุผล: แนวคิดทั่วไปเบื้องหลัง ZFS และ btrfs นั้นคล้ายคลึงกัน การใช้งานทั้งต้นไม้ Merkle เป็นโครงสร้างข้อมูล การเขียนอาจต้องมีการปรับปรุงหลายบล็อกในดิสก์ ระบบไฟล์กำลังจัดการสิ่งนี้โดยการเขียนข้อมูลใหม่ไปยังบล็อกว่างเปล่า (แม้ว่าไฟล์ที่มีอยู่จะถูกแก้ไขดังนั้นจึงไม่จำเป็นต้องแก้ไขบล็อกที่สะท้อนสถานะเก่า)และสร้างทรีที่อัพเดตใหม่ เมื่อการยกของหนักเสร็จสิ้นแล้วและข้อมูล + ทรีที่อัปเดตได้ถูกเขียนลงในดิสก์แล้วตัวชี้หัวจะได้รับการอัพเดตเป็นทรีใหม่ทำให้มองเห็นการเปลี่ยนแปลงได้
นี่คือสิ่งที่ควรประพฤติเมื่อเขียนไปยังไฟล์:
- เขียนข้อมูลเพื่อบล็อกฟรีบนดิสก์
- ทำสำเนาต้นไม้ Merkle * อัปเดตตามการเปลี่ยนแปลงที่เขียนไว้ใน (1)
- ขอให้ฮาร์ดแวร์ล้างข้อมูลไปยังดิสก์ - ฮาร์ดแวร์เขียนข้อมูลที่ค้างอยู่ทั้งหมด
- อัปเดตตัวชี้ส่วนหัวเป็นแผนผัง Merkle ใหม่
- ฟรีบล็อคเก่า ๆ ที่ไม่จำเป็นอีกต่อไป
หากไฟฟ้าดับหลังจาก (4) การทำธุรกรรมเสร็จสมบูรณ์ หากไฟฟ้าดับระหว่างขั้นตอน (1) ถึง (3) ระบบไฟล์จะมาพร้อมกับสถานะเก่า (ข้อมูลที่เขียนในขั้นตอน (1) จะสูญหายไป แต่ระบบไฟล์สอดคล้องกัน) โปรดทราบว่าไม่จำเป็นต้องตรวจสอบข้อผิดพลาดของระบบไฟล์ซึ่งหมายความว่าระบบไฟล์พร้อมใช้งานทันทีซึ่งเป็นข้อได้เปรียบที่ยิ่งใหญ่ (การตรวจสอบระบบไฟล์ขนาดใหญ่อาจใช้เวลานานมาก!)
นี่คือตัวอย่างวิธีที่สิ่งต่าง ๆ ผิดปกติกับฮาร์ดแวร์ "buggy":
- เขียนข้อมูลเพื่อบล็อกฟรีบนดิสก์
- ทำสำเนาต้นไม้ Merkle * อัปเดตตามการเปลี่ยนแปลงที่เขียนไว้ใน (1)
- ขอให้ฮาร์ดแวร์ล้างข้อมูลไปยังดิสก์ - ฮาร์ดแวร์ยืนยันว่าเสร็จสิ้น แต่ไม่ได้ล้างข้อมูลทั้งหมด (เช่นข้อมูลอาจยังอยู่ในแคชเขียนกลับของดิสก์)
- อัปเดตตัวชี้ส่วนหัวเป็นแผนผัง Merkle ใหม่ ข้อมูลนี้จะถูกเขียนลงดิสก์ก่อนข้อมูลที่รอดำเนินการอื่น ๆ (เช่นเนื่องจากส่วนหัวของดิสก์อยู่ในตำแหน่งที่ถูกต้อง)
- ข้อมูลที่เขียนในขั้นตอน (1) และ (2) ถูกเขียนลงดิสก์
- ฟรีบล็อคเก่า ๆ ที่ไม่จำเป็นอีกต่อไป
ระบบไฟล์จะไม่สอดคล้องกันหากไฟฟ้าดับระหว่าง (4) และ (5) หรือขณะดำเนินการตามขั้นตอน (5) ด้วยเหตุนี้แผนผัง Merkle และ / หรือข้อมูลอาจถูกเขียนเพียงบางส่วนเท่านั้นทำให้ระบบไฟล์ไม่สอดคล้องกัน
ในทางปฏิบัติคุณจะต้องระมัดระวังโดยเฉพาะอย่างยิ่งเมื่อใช้ควบคุม RAID พวกเขามักจะปิดใช้งานแคชการเขียนกลับบนดิสก์และใช้แคชการเขียนกลับของตนเองแทน มีสองวิธีทั่วไปสำหรับสิ่งที่ผิดพลาดที่นี่:
* ฉันทำให้สิ่งที่นี่ง่ายขึ้น จริงๆแล้วมันไม่จำเป็นที่จะต้องคัดลอกต้นไม้ทั้งหมด ต้องเพิ่มเฉพาะส่วนที่เปลี่ยนไปเท่านั้น - ส่วนที่เหลือสามารถใช้ร่วมกันระหว่างต้นไม้เก่ากับต้นไม้ใหม่ได้
zpool clear -F
คำสั่ง