การค้นหาไฟล์ที่มีข้อผิดพลาดที่ไม่สามารถแก้ไขได้ BTRFS


17

ฉันมีคำถามเกี่ยวกับข้อผิดพลาดที่ไม่สามารถกู้คืนได้ในระบบไฟล์ BTRFS โดยเฉพาะฉันใช้ BTRFS Scrub เมื่อไม่นานมานี้หลังจากประสบปัญหากับหนึ่งใน RAM ของฉันและดูเหมือนว่าจะพบข้อผิดพลาดที่ไม่สามารถแก้ไขได้ 4 ข้อ นี่คือผลลัพธ์:

scrub status for <UUID>
    scrub started at Thu Dec 25 15:19:22 2014 and was aborted after 89882 seconds
    total bytes scrubbed: 1.87TiB with 4 errors
    error details: csum=4
    corrected errors: 0, uncorrectable errors: 4, unverified errors: 0

โชคดีที่ฉันได้สำรองข้อมูลทุกอย่างในการสำรองข้อมูลระดับอุดมศึกษาดังนั้นฉันจึงไม่กังวลเป็นพิเศษเกี่ยวกับการสูญเสียไฟล์ (ฉันตระหนักดีถึงปัญหาที่เกี่ยวข้องกับสถานะการทดลองของ BTRFS ฉันมีการสำรองข้อมูลหลายครั้งเพื่อให้ข้อมูลของฉันปลอดภัย ใช้งานต่อไปดังนั้นโปรดอย่า: "โซลูชัน; ไม่ใช้ BTRFS" โพสต์)

อย่างไรก็ตามฉันต้องการทราบวิธีการตรวจสอบไฟล์ที่เกี่ยวข้องกับข้อผิดพลาดที่ไม่สามารถแก้ไขได้? ฉันต้องการค้นหาลบและแทนที่ด้วยสำเนาสำรองของพวกเขา

หากใครมีข้อมูลเกี่ยวกับวิธีการทำเช่นนี้ฉันชอบที่จะได้ยินจากคุณ

ขอบคุณล่วงหน้า.

คำตอบ:


8

ฉันพบวิธีต่อไปนี้มีประโยชน์ ...

btrfs scrub ระดับเสียง

คุณจะพบกับข้อผิดพลาด csum ใด ๆ ตามที่คุณได้แสดงไว้ด้านบน
โดยใช้ตัวอย่างของคุณรายละเอียดข้อผิดพลาด: csum = 4 ใช้หมายเลขนั้นในหางคำสั่งของคำสั่งต่อไปนี้:

dmesg | grep "checksum error at" | tail -4 | cut -d\  -f24- | sed 's/.$//'

มีประโยชน์ในการไพพ์ไฟล์นี้ออกเป็นไฟล์ (เช่น> csums.txt)

ฉันได้ลองใช้วิธีการค้นหา inode ที่แนะนำจำนวนหนึ่งและพวกเขาได้พบกับข้อ จำกัด หากความสำเร็จใด ๆ


เท่าที่ฉันเข้าใจคุณใช้หางเพื่อ จำกัด จำนวนบรรทัดที่แสดงและไม่สนใจรายการที่ซ้ำกัน ฉันอยากจะแนะนำให้ใช้sort | uniqเพื่อกำจัดรายการที่ซ้ำกันเช่น:dmesg | grep "checksum error at" | cut -d\ -f24- | sed 's/.$//' | sort | uniq
niklasfi

3

ใช่การจับคู่จาก INODE หรือ Block Number กลับไปที่ชื่อไฟล์อาจเป็นเรื่องยาก หากคุณสนใจจริงๆคุณสามารถลองทำสิ่งนี้และดูว่าไฟล์ไฟล์ใดที่จะคัดลอก ... หลังจากนั้นหากไฟล์ไม่ดีควรทิ้งข้อผิดพลาดระหว่างการคัดลอก ก่อนหน้านี้ฉันเคยใช้เทคนิคประเภทนี้

 find /mount-point -type f -exec cp {} /dev/null \;

 where mount-point is the ROOT node/mount-point of the affected filesystem

เรียกใช้ทันทีหวังว่ามันจะเปิดบางสิ่งบางอย่าง ขอบคุณสำหรับคำแนะนำของคุณฉันจะอัปเดตคุณตามผล
RedHack

1
ขออภัยที่จะบอกว่าดูเหมือนจะไม่ทำงาน = / พบไฟล์แรกที่ทำให้เกิดข้อผิดพลาดที่ไม่สามารถแก้ไขได้ แต่จากนั้นจะส่งข้อความ: "stale file handle" ไปยังเทอร์มินัลเว้นแต่ฉันจะยกเลิก ได้รับมันพบไฟล์ แต่ตอนนี้ฉันไม่สามารถหาวิธีกำจัดมันได้ จะต้องติดต่อรายการส่งจดหมาย BTRFS
RedHack

คุณสามารถย้ายไปยังไดเรกทอรีพิเศษแล้วแยกออกจากการค้นหาเพิ่มเติม
mdpc

1
มันจะไม่ย้ายหรือคัดลอกมันแค่บอกฉันต่อไปว่าตัวจัดการไฟล์นั้นค้าง ฉันไม่สามารถทำได้
RedHack

ถ้าคุณใช้คุณยังอาจตรวจสอบความคืบหน้า:cp -v find / -type f -exec cp -v {} /dev/null \; 2> corrupted-files.txtอย่างไรก็ตาม/proc/kcoreไฟล์อาจมีขนาดใหญ่ (ของฉันคือ 128TB) ดังนั้นการดำเนินการคัดลอกน่าจะหยุดทำงาน เนื่องจาก/procไดเรกทอรีมีไฟล์วิเศษพิเศษเราไม่จำเป็นต้องตรวจสอบไฟล์เหล่านั้น ยกเว้น/procไดเรกทอรี:sudo find / -type f -and -not -path /proc -exec cp -v {} /dev/null \; 2> corrupted-files.txt
ceremcem

2

dmesgจะให้รายละเอียดเกี่ยวกับไฟล์ที่เกี่ยวข้องกับข้อผิดพลาดการตรวจสอบที่ไม่สามารถแก้ไขได้ ข้อความโดยทั่วไปจะมีลักษณะเช่นนี้: "ข้อผิดพลาด BTRFS: การตรวจสอบที่ตรรกะ [... ] บน dev [... ], เซกเตอร์ [... ], รูท [... ], inode [... ], offset [ ... ], ความยาว [... ], ลิงก์ [... ] (เส้นทาง: [... ]) "; ข้อมูลชิ้นสุดท้ายคือเส้นทางที่แน่นอนไปยังไฟล์ที่เสียหาย


1

ฉันมาที่นี่เพื่อค้นหา "ข้อผิดพลาดที่ไม่สามารถแก้ไขได้" จาก BTRFS ด้วย grep ด้านบนใช้งานไม่ได้สำหรับฉัน ฉันต้องใช้แทน:

$ dmesg | sed -n -r 's#.*BTRFS.*i/o error.*path: (.*)\)#\1#p' | sort -u
somepath/somefile.txt

สังเกตว่าเส้นทางนั้นสัมพันธ์กับจุดเริ่มต้นของไดรฟ์ย่อย - ไม่มีการบ่งชี้ว่ามีไดรฟ์ย่อยได้อย่างไรโชคดีที่มันไม่ใช่ปัญหาสำหรับฉัน


คือsomepath/somefile.txtอะไร ดูเหมือนว่าคุณกำลังพิมพ์มันเป็นคำสั่งแยกต่างหาก - หรือมันเป็นเอาท์พุทจากคำสั่งที่คุณพิมพ์? ถ้ามันควรจะเป็นหนึ่งบรรทัดคำสั่งโปรดอย่าแยกบรรทัดคำสั่งออกจากกันเพื่อจุดประสงค์ในการแสดง - เพียงแค่ใส่คำตอบลงไปในคำตอบเดียว แต่มันคืออะไร คุณกำลังให้อินพุตสองอินพุตให้กับsort(ไพพ์และไฟล์) หรือไม่? หรือsomepath/somefile.txtตั้งใจที่จะเป็นไฟล์ที่ส่งออก? (มันไม่ได้มีประโยชน์มากในการระบุไฟล์ที่ส่งออกเว้นแต่พวกเขาจะเป็นไฟล์ระดับกลางที่คุณใช้อีกครั้งผู้คนรู้วิธีจัดการกับผลลัพธ์เช่นโดยการไพพ์)
Scott

คำถามนี้ตอบคำถามเดิมหรือไม่? ฉันไม่สามารถบอกได้
ฉันพูดว่า Reinstate Monica

@TwistyImpersonator นั่นเป็น (IMO) ชัดเจนว่าเป็นทางเลือกแทนคำตอบของ Markและมีคะแนนแปดคะแนน (และเป็นการขยายคำตอบของ arrrr )
สกอตต์

1
@Scott บรรทัดที่สองเป็นตัวอย่างเอาต์พุตของคำสั่ง
crusaderky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.