BTRFS के साथ फ़ाइलों को ढूँढना अनिश्चित त्रुटियाँ


17

मेरे पास एक BTRFS फाइल सिस्टम पर अपरिवर्तनीय त्रुटियों से संबंधित प्रश्न है। विशेष रूप से, मैंने हाल ही में अपने एक रैम स्टिक के साथ एक समस्या का सामना करने के बाद BTRFS स्क्रब चलाया है और ऐसा लगता है कि 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)

मैंने सुझाए गए कई इनोड सर्च एप्रोच की कोशिश की है और वे सभी किसी भी सफलता के साथ सीमित मिले हैं।


जहां तक ​​मैं समझता हूं, आप प्रदर्शित लाइनों की संख्या को सीमित करने और डुप्लिकेट को अनदेखा करने के लिए पूंछ का उपयोग कर रहे हैं। मैं sort | uniqडुप्लिकेट से छुटकारा पाने के लिए इस तरह का उपयोग करने की सलाह dmesg | grep "checksum error at" | cut -d\ -f24- | sed 's/.$//' | sort | uniq
दूंगा

3

हां, INODE या ब्लॉक नंबर से फ़ाइल नाम पर मैप करना मुश्किल हो सकता है। यदि आप वास्तव में रुचि रखते हैं, तो आप कुछ इस तरह की कोशिश कर सकते हैं और देख सकते हैं कि कौन सी फाइल कॉपी करने के लिए फाइल है ... यदि फाइल खराब है तो कॉपी के दौरान एक त्रुटि फेंकनी चाहिए। मैंने पहले इस प्रकार की तकनीक का उपयोग किया है।

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

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

इसे अभी चलाना, उम्मीद है कि यह कुछ बदल जाएगा। आपकी सलाह के लिए धन्यवाद, मैं आपको परिणाम के रूप में अपडेट करूंगा।
रेडहैक 22

1
यह कहने के लिए खेद है कि यह काम नहीं करता है = / यह पहली फाइल पाया जो कि अयोग्य त्रुटि का कारण है, लेकिन फिर यह संदेश को स्पैम करता है: "बासी फ़ाइल हैंडल" टर्मिनल पर जब तक मैं इसे समाप्त नहीं करता। दी यह फ़ाइल मिल गया है, लेकिन अब मैं यह पता नहीं कर सकता कि इसे कैसे निकालना है। गोना को BTRFS मेलिंग सूची से संपर्क करना होगा।
रेडहैक

आप इसे एक विशेष निर्देशिका में ले जा सकते हैं और फिर इसे आगे की खोज से बाहर कर सकते हैं।
एमडीपीसी

1
यह स्थानांतरित या प्रतिलिपि नहीं करेगा, यह सिर्फ मुझे बताता है कि फ़ाइल हैंडल बासी है। मैं ls भी नहीं कर सकता।
रेडहैक

यदि आप उपयोग करते हैं 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आपको अचूक चेकसम त्रुटियों में शामिल फ़ाइलों के बारे में विवरण देगा। संदेश आम तौर पर इस तरह दिखते हैं: "बीटीआरएफएस: देव पर तार्किक [...] पर चेकसम त्रुटि [...], सेक्टर [...], रूट [...], इनोड [...], ऑफसेट [। ...], लंबाई [...], लिंक [...] (पथ: [...]) "; जानकारी का अंतिम टुकड़ा दूषित फ़ाइल का पूर्ण पथ है।


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आउटपुट फाइल होना चाहिए? (आउटपुट फ़ाइलों को निर्दिष्ट करने के लिए यह बहुत उपयोगी नहीं है, जब तक कि वे मध्यवर्ती फाइलें नहीं हैं जो आप फिर से उपयोग कर रहे हैं। लोग जानते हैं कि परिणामों को कैसे संभालना है; उदाहरण के लिए, पाइपिंग द्वारा।)
स्कॉट

क्या यह मूल प्रश्न का उत्तर देता है? मैं बता नहीं सकता।
मैं कहता हूं कि मोनिका

@TwistyImpersonator खैर, यह (IMO) स्पष्ट रूप से मार्क के जवाब के लिए एक विकल्प होने के लिए था , और उसे आठ वोट मिले (और बन्दी के उत्तर का विस्तार है )।
स्कॉट

1
@ दूसरी पंक्ति कमांड का नमूना आउटपुट थी।
crusaderky
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.