btrfs ขัดผิวอย่างไรและทำอย่างไร?


19

btrfs ขัดผิวทำอะไรกันแน่? ตามหน้าคู่มือซึ่งไม่ชัดเจนโดยสิ้นเชิงมันทำการตรวจสอบข้อผิดพลาดบางอย่าง การตรวจสอบข้อผิดพลาดชนิดใด มันเชื่อถือได้แค่ไหน? มันสามารถกู้คืนข้อผิดพลาดบางอย่าง? มันทำงานยังไง? มันทำงานบนดิสก์ btrfs ทุกอันหรือไม่


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

คำตอบ:


23

ฉันไม่รู้ว่ามันจะทำอะไรอย่างอื่นอีกหรือไม่ แต่ฉันรู้ว่าอย่างน้อยที่สุดbtrfs scrubก็ทำการขัดข้อมูลดิสก์แบบเต็ม โดยพื้นฐานแล้วมันจะอ่าน data * ทั้งหมดบนดิสก์คำนวณการตรวจสอบซ้ำและเปรียบเทียบ checksum ที่คำนวณแล้วใหม่กับที่เก็บไว้ เมื่อเช็คซัมที่จัดเก็บและคำนวณใหม่ไม่ตรงกันระบบจะรู้ว่ามีความเสียหาย

เมื่อตรวจพบความเสียหายพฤติกรรมจะขึ้นอยู่กับการตั้งค่าดิสก์ของคุณ ตัวอย่างเช่นหากคุณมี RAID 1 (การทำมิเรอร์) คุณbtrfs scrubสามารถแก้ไขข้อมูลที่เสียหายได้โดยการคัดลอกเวอร์ชั่นที่ไม่เสียหายจากดิสก์อื่น หากสำเนาทั้งหมดของข้อมูลเสียหาย (เช่นความเสียหายหลายดิสก์หรือไม่มีการทำสำเนาซ้ำซ้อนในตอนแรก) แสดงว่าไม่มีอะไรbtrfs scrubสามารถทำได้นอกเหนือจากการเตือนคุณ

เหตุผลที่สำคัญคือฮาร์ดไดรฟ์มีความน่าเชื่อถือเพียง 99.999999999999% สำหรับการอ่านและการเขียนบิต ดังนั้นทุกๆ I / O ของข้อมูลเทราไบต์สองสามอาจมีข้อผิดพลาด แม้ว่าข้อผิดพลาดสามารถตรวจพบและแก้ไขได้ (และคงที่สมมติว่าสำเนาที่ซ้ำซ้อนยังคงใช้ได้) ในระหว่างการเข้าถึงดิสก์ปกติการขัดถูดิสก์เต็มรูปแบบประจำสามารถค้นหาและแก้ไขข้อผิดพลาดก่อนสะสมได้ว่าสำเนาทั้งหมดของข้อมูลเดียวกันเสียหาย

* ฉันใช้ "data" แทน "file" เพื่อรวมข้อมูลเมตาด้วย Btrfs เก็บไฟล์และข้อมูลที่สอดคล้องกัน (รวม checksums) ในบล็อกข้อมูลทั้งหมดที่ได้รับการ checksummed btrfs scrubและตรวจสอบโดย

ดูสิ่งนี้ด้วย:

  • Btrfs -> ตรวจสอบต้นไม้และขัดที่วิกิพีเดีย: ข้อมูลทางเทคนิคเกี่ยวกับการขัดข้อมูลของ btrfs
  • ปัญหาวันเกิด -> ตารางความน่าจะเป็นที่วิกิพีเดีย: การรักษา "พื้นที่แฮช" เป็น "จำนวนบล็อคข้อมูล" และ "จำนวนขององค์ประกอบแฮช" เป็น "จำนวนบล็อกข้อมูลที่เสียหาย" ทำให้ความน่าจะเป็นที่จะมีบล็อกข้อมูลพร้อมสำเนาทั้งสอง เสียหายในการตั้งค่า RAID 1

ฉันไม่ได้นับ แต่ฉันยินดีที่จะคาดเดาว่าตัวเลขความน่าเชื่อถือของคุณจะถูกปิดด้วยขนาดของคำสั่งไม่กี่ โดยทั่วไปผู้บริโภค HDDs มักจะระบุอัตรา UBE ที่ 10 ^ -14 บิต กล่าวอีกนัยหนึ่งข้อผิดพลาดการอ่านที่ไม่สามารถกู้คืนได้ต่อการอ่าน 10 ^ 14 บิต ปัญหาคือว่านี่สำหรับเซกเตอร์เต็ม คุณอาจได้รับเซกเตอร์แบบเต็มหรือคุณไม่ได้รับอะไรเลย (หรือนั่นคือความคิดข้อผิดพลาดที่เงียบคือชาถ้วยอื่นทั้งหมด) ดังนั้นข้อผิดพลาดจะถูกขยายโดยขนาดเซกเตอร์ซึ่งมีไดรฟ์รูปแบบขั้นสูงเป็น 32,768 บิต ดังนั้นอัตราความผิดพลาดที่แท้จริงจึงเป็นมากกว่า 10 ^ -10 ถึง 10 ^ -11 readbit-error
CVn

@ MichaelKjörlingฉันไม่คิดว่าภาคส่วนสำคัญที่นี่ .... ฉันมีบันทึกของ 29 btrfs ครั้งล่าสุดที่ขัดของฮาร์ดไดรฟ์ 1TB ภายในคอมพิวเตอร์ของฉันสองเครื่อง จำนวนข้อมูลมีการเปลี่ยนแปลงระหว่าง 270 และ 300 GiB (รวม 1.35 * 10 ^ 14 ถึง 1.49 * 10 ^ 14 บิตที่อ่านสำหรับสครับทั้งหมดรวมกัน) พบข้อผิดพลาด 3 ครั้งในระหว่างการขัดเหล่านี้ สมมติว่า I / O แบบไม่ขัดไม่ก่อให้เกิดหรือเน่าบิตคงที่นั่นเป็นเพียง 2 ถึง2¼เท่าของอัตราความผิดพลาดที่คาดไว้ของไดรฟ์ "99.999999999999% ที่เชื่อถือได้" แม้จะมีเพียงเซกเตอร์ 4096 บิตฉันคิดว่าการโต้แย้งของคุณคาดว่าไดรฟ์ของฉันจะมีข้อผิดพลาดนับพันในตอนนี้
Mark Haferkamp

@ MichaelKjörlingเท่าที่ฉันเข้าใจแผ่นข้อมูลจำเพาะของผู้ผลิต (Seagate และ WD) มันเป็นข้อผิดพลาดเล็กน้อยและไม่ใช่ทั้งภาคที่ตาย และจำนวนของเก้าคำตอบในแง่ดียิ่งขึ้น: 100-1/10^14มี 16 เก้าและโพสต์มีเพียง 14 (ตรงกับ 10 ^ 12)
Luc

@Luc มันเป็นเรื่องดีถ้าความตายของภาคเป็นเรื่องธรรมดาน้อย; ภาคที่กำลังจะตายหมายความว่าไดรฟ์นั้นอาจล้มเหลวและอาจจำเป็นต้องเปลี่ยนใหม่ ข้อผิดพลาดบิตเพียงนำไปสู่ความเสียหายของข้อมูลเงียบซึ่งสามารถทำเสียงดังพอที่จะเรียกคืนจากการสำรองข้อมูล คณิตศาสตร์หมายเหตุ: การคำนวณที่แท้จริงคือ1-10^nซึ่งจะถูกแปลงเป็นเปอร์เซ็นต์เพราะมนุษย์ไม่ชอบทศนิยม นอกจากนี้ฉันละเลยที่จะพูดถึงในความคิดเห็นก่อนหน้าของฉันว่าไดรฟ์อยู่ใน RAID 1 (ดังนั้นข้อมูล 270-300 GiB เดียวกันอยู่ในแต่ละของพวกเขา) ซึ่งแก้ไขข้อผิดพลาดการคำนวณที่ชัดเจนอีก
Mark Haferkamp

5

การขยายคำตอบที่ยอดเยี่ยมของ Mark Haferkamp btrfs scrubการอ่านข้อมูลทั้งหมดแทนที่จะเป็นไฟล์ทั้งหมดเป็นคุณสมบัติที่สำคัญและเป็นสิ่งที่ทำให้มีประโยชน์มาก โปรดจำไว้ว่า btrfs นั้นรองรับการสร้าง RAID สมมติว่าคุณมีระบบไฟล์ btrfs ซึ่งประกอบไปด้วยไดรฟ์สองตัวที่คุณกำหนดค่าให้ใช้ RAID1 ในกรณีนี้เมื่อคุณเขียนไปยังไฟล์การเขียนนั้นจะถูกเรพลิเคทไปยังดิสก์ทั้งสอง (มันมีความซับซ้อนมากขึ้นด้วยตัวอย่างที่ซับซ้อนมากขึ้น แต่สำหรับกรณีง่าย ๆ นี่คือสิ่งที่เกิดขึ้นเสมอ) อย่างไรก็ตามเมื่อคุณอ่านจากไฟล์นั้นการอ่านจะกดดิสก์เพียงแผ่นเดียว (เพราะเป็นการสิ้นเปลืองในการอ่านไฟล์สองครั้ง เว้นแต่ว่าสำเนาแรกจะใช้ไม่ได้ด้วยเหตุผลบางประการ)

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

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

นี่คือที่btrfs scrubมามันอ่านข้อมูลทั้งหมดไม่ใช่ไฟล์ทั้งหมด ซึ่งรวมถึงข้อมูลเมตา แต่ยังมีสำเนาสำรองของไฟล์ที่ปกติจะไม่อยู่ในเส้นทางการอ่าน เมื่ออ่านสำเนาสำรองเหล่านี้จะสร้างโอกาสในการแก้ไขข้อผิดพลาดในวงของ btrfs เพื่อเริ่มต้นและกู้คืนข้อมูลจากสำเนาที่ซ้ำซ้อน


2
คุณแน่ใจหรือไม่ว่าในการอ่าน RAID1 ทำได้จากดิสก์ 1 ตัวเท่านั้น อย่างน้อยกับ mdadm RAID นี่ไม่ควรเป็นอย่างนั้น การอ่านควรเกิดขึ้นพร้อมกันจากดิสก์ทั้งสอง แต่มีข้อมูลต่างกันซึ่งหมายความว่าควรจะเร็วเป็นสองเท่าของการอ่านจากดิสก์หนึ่งแผ่น การเพิ่มประสิทธิภาพการอ่านเป็นหนึ่งในคุณสมบัติหลักของ RAID 1
Petr

@Petr ใช่คุณถูกต้อง แต่ละบล็อกจะอ่านจากดิสก์เดียวเท่านั้น
strugee

@Petr: เพื่ออธิบายอย่างละเอียด - ภายใต้การใช้งานปกติทั้ง MDADM และ BTRFS ไม่ได้อ่านทั้งสำเนาของข้อมูลเดียวกันจากดิสก์ทั้งสอง พวกเขาอ่านเพียงหนึ่งสำเนา - MDADM สามารถโหลดบาลานซ์และกระจายการอ่านข้ามสำเนาเพื่อให้ได้ความเร็วในการอ่านเพิ่มเป็นสองเท่า (เพราะการคัดลอกทั้งหมดไปที่ดิสก์ 1 และคัดลอก B ทั้งหมดลงบนดิสก์ 2 เนื่องจาก mdadm จะใช้ 2 ดิสก์อย่างแน่นอน) - BTRFS มีปัญหามากขึ้น (เนื่องจากการคัดลอก A และ B จะไปที่ใดก็ตามที่ 2 ดิสก์ (จาก 2 หรือมากกว่าดิสก์) ที่เกิดขึ้นมีพื้นที่ว่างมากที่สุดในขณะนี้ -:: 2 สำเนาจะได้รับการแพร่กระจายแบบสุ่มในดิสก์ทั้งหมดในปัจจุบัน)
DrYak

และเกี่ยวกับความปลอดภัย: - ทั้ง MDADM และ BTRFS จะลองสำเนาอื่น ๆ ในกรณีที่เกิดปัญหา - สำหรับ MDADM ปัญหาเดียวที่มันสามารถตรวจจับได้คือ "ดิสก์ไม่ตอบ" (เพราะไม่มีความคิดที่แท้จริงของไฟล์ที่เก็บไว้ข้างต้น) - สำหรับ BTRFS มันสามารถตรวจจับความเสียหายของข้อมูลเงียบได้อีกด้วย (เพราะข้อมูลถูกตรวจสอบและอื่น ๆ เลเยอร์ RAID ของ BTRFS รู้ว่าสามารถเชื่อถือได้หนึ่งสำเนาหรือหากต้องดึงสำเนาอีกชุดหนึ่ง)
DrYak

สุดท้าย แต่ไม่ท้ายสุดเกี่ยวกับ RAID5 / 6: - ใน MDADM มันใช้งานได้ (แต่จะไม่ตรวจจับการคอร์รัปชั่นเงียบ ๆ ) - ใน BTRFS การคอร์รัปชั่นเงียบ ๆ ในตอนนี้ยังไม่ได้รับการจัดการ (เพราะง่ายกว่าที่จะดึงสำเนาอื่น (ใน RAID1) แทนที่จะทำการคำนวณ Erasure Coding เพื่อเดาว่าสมาชิกแถบใดเสียหาย ควรสร้างใหม่จากข้อมูล / พาริตีที่เหลืออยู่) กล่าวอีกนัยหนึ่ง: ณ วันนี้ (สิงหาคม 2017) อย่าใช้ RAID5 / 6 ของ btrfs
DrYak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.