Tìm tệp có BTRFS Lỗi không thể sửa được


17

Tôi có một câu hỏi liên quan đến các lỗi không thể phục hồi trên hệ thống tệp BTRFS. Cụ thể, tôi đã chạy BTRFS Scrub gần đây sau khi gặp sự cố với một trong các thanh RAM của mình và dường như đã phát hiện ra 4 lỗi không thể sửa. Đây là đầu ra:

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

May mắn là tôi có mọi thứ được sao lưu trong bản sao lưu thứ ba nên tôi không đặc biệt lo lắng về việc mất các tệp (Tôi nhận thức rõ các vấn đề liên quan đến trạng thái thử nghiệm của BTRFS, tôi có nhiều bản sao lưu để giữ an toàn cho dữ liệu của mình và xác định tiếp tục sử dụng nó vì vậy xin vui lòng không: "Giải pháp; không sử dụng bài viết BTRFS").

Tôi muốn biết, tuy nhiên, làm thế nào để xác định tập tin nào được liên kết với các lỗi không thể sửa chữa? Tôi muốn tìm chúng, xóa chúng và thay thế chúng bằng các bản sao lưu của chúng.

Nếu bất cứ ai có thông tin về cách làm điều này, tôi rất thích nghe từ bạn.

Cảm ơn bạn trước.

Câu trả lời:


8

Tôi đã tìm thấy phương pháp sau hữu ích ...

btrfs scrub âm lượng.

Bạn sẽ gặp bất kỳ số lỗi csum nào như bạn đã trình bày ở trên.
Sử dụng chi tiết lỗi ví dụ của bạn : csum = 4 . Sử dụng số đó trong chỉ thị đuôi của tuyên bố sau:

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

Nó rất thuận tiện để chuyển cái này ra một tập tin (ví dụ > csums.txt)

Tôi đã thử một số cách tiếp cận tìm kiếm inode được đề xuất và tất cả chúng đều bị hạn chế nếu có thành công.


theo như tôi hiểu, bạn đang sử dụng đuôi để giới hạn số lượng dòng được hiển thị và bỏ qua các bản sao. Tôi sẽ khuyên bạn nên sử dụng sort | uniqđể loại bỏ các bản sao như vậy:dmesg | grep "checksum error at" | cut -d\ -f24- | sed 's/.$//' | sort | uniq
niklasfi

3

Có, việc ánh xạ từ INODE hoặc Block Number trở lại tên tệp có thể khó khăn. Nếu bạn thực sự quan tâm, bạn có thể thử một cái gì đó như thế này và xem tập tin nào sẽ được sao chép ... sau đó nếu tập tin xấu, nó sẽ gây ra lỗi trong quá trình sao chép. Trước đây tôi đã sử dụng loại kỹ thuật này.

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

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

Chạy nó bây giờ, hy vọng nó sẽ bật lên một cái gì đó. Cảm ơn lời khuyên của bạn, tôi sẽ cập nhật cho bạn kết quả.
RedHack

1
Rất tiếc phải nói rằng nó dường như không hoạt động = / nó đã tìm thấy tệp đầu tiên gây ra lỗi không thể sửa được, nhưng sau đó nó sẽ spam thông báo: "xử lý tệp cũ" đến thiết bị đầu cuối trừ khi tôi chấm dứt. Cấp cho nó tìm thấy các tập tin, nhưng bây giờ tôi không thể tìm ra làm thế nào để thoát khỏi nó. Gonna phải liên hệ với danh sách gửi thư BTRFS.
RedHack

Bạn có thể di chuyển nó đến một thư mục đặc biệt và sau đó loại trừ nó khỏi một tìm kiếm khác.
mdpc

1
Nó sẽ không di chuyển hoặc sao chép, nó cứ nói với tôi rằng phần xử lý tập tin đã cũ. Tôi thậm chí không thể ls.
RedHack

Nếu bạn sử dụng cp -v, bạn cũng có thể theo dõi tiến trình : find / -type f -exec cp -v {} /dev/null \; 2> corrupted-files.txt. Tuy nhiên, /proc/kcoretệp có thể rất lớn (của tôi là 128TB) nên thao tác sao chép có thể bị treo. Vì /procthư mục chứa các tệp ma thuật đặc biệt, chúng tôi không cần phải kiểm tra chúng. Loại trừ /procthư mục:sudo find / -type f -and -not -path /proc -exec cp -v {} /dev/null \; 2> corrupted-files.txt
ceremcem

2

dmesgsẽ cung cấp cho bạn thông tin chi tiết về các tệp liên quan đến lỗi tổng kiểm tra không chính xác. Các thông báo thường trông như thế này: "BTRFS: lỗi kiểm tra tại logic [...] trên dev [...], sector [...], root [...], inode [...], offset [ ...], độ dài [...], liên kết [...] (đường dẫn: [...]) "; thông tin cuối cùng là đường dẫn tuyệt đối đến tập tin bị hỏng.


1

Tôi cũng đến đây để tìm "lỗi không thể sửa" từ BTRFS. Các grep trên không làm việc cho tôi; Tôi đã phải sử dụng thay thế:

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

Lưu ý cách đường dẫn có liên quan đến sự khởi đầu của subvolume - không có dấu hiệu nào cho thấy nó nằm trong đó. May mắn thay, đây không phải là vấn đề đối với tôi.


somepath/somefile.txtgì Có vẻ như bạn đang gõ nó dưới dạng một lệnh riêng - hoặc đó là đầu ra từ lệnh bạn đã nhập? Nếu tất cả được coi là một dòng lệnh, vui lòng không tách các dòng lệnh cho mục đích hiển thị - chỉ cần đặt nó vào câu trả lời dưới dạng một dòng dài. Nhưng nó là gì? Bạn đang cung cấp hai đầu vào sort(một ống và một tệp)? Hoặc somepath/somefile.txtcó nghĩa là một tập tin đầu ra? (Việc chỉ định các tệp đầu ra không hữu ích lắm, trừ khi chúng là các tệp trung gian mà bạn đang sử dụng lại. Mọi người biết cách xử lý kết quả; ví dụ: bằng đường ống.)
Scott

Điều này có trả lời câu hỏi ban đầu không? Tôi không thể nói.
Tôi nói Phục hồi lại

@TwistyImpersonator Vâng, đó rõ ràng là (IMO) có nghĩa là một thay thế cho câu trả lời của Mark và đã nhận được tám phiếu bầu (và là một bản mở rộng của câu trả lời của mảng ).
Scott

1
@ Hủy bỏ dòng thứ hai là một đầu ra mẫu của lệnh.
thập tự chinh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.