डिस्क को शून्य करते समय लेखन त्रुटियों को कैसे अनदेखा करें?


19

कहते हैं कि आप एक असफल हार्ड डिस्क को शून्य-आउट करना चाहते हैं। आप शून्य से अधिक से अधिक लिखना चाहते हैं। आप जो नहीं चाहते हैं वह है: प्रक्रिया पहले लिखने-त्रुटि पर निरस्त करती है। उसको कैसे करे?

AFAICS, सादा ddकेवल पढ़ने की त्रुटियों को अनदेखा करने के लिए एक विकल्प प्रदान करता है। इस प्रकार, कुछ पसंद है

dd if=/dev/zero of=/dev/disk/by-id/lousy-vendor-123 bs=128k

काफी नहीं है।

ddrescue त्रुटियों को नजरअंदाज करने में बेहतर लगता है - लेकिन इसके साथ इष्टतम कमांड लाइन क्या होगी?

GNU ddrescue के साथ मेरी कोशिश:

ddrescue --verbose --force --no-split /dev/zero /dev/disk/by-id/lousy-vendor-123

1
dd conv=noerrorGNU एक्सटेंशन हो सकता है, मुझे यकीन नहीं है। किसी भी मामले में, यह चाल करना चाहिए। SATA बताओ-टू-ड्राइव-इरेज-ही-जवाब, पूरे ड्राइव को मिटाने के लिए देखने लायक है, हालांकि।
पीटर कॉर्ड्स

1
@PeterCordes, GNU ddदस्तावेज़ों का मैन पेज noerror'रीड एरर्स के बाद जारी रखें' ...
maxschlepzig

1
dd conv=noerrorist POSIX मानक लेकिन यह वास्तव में धीमा हो सकता है
schily

2
dd conv=noerrorरीडिंग एरर (मैनपेज के अनुसार) होना चाहिए, एरर लिखना नहीं। इसके साथ संयोजन करने में कुछ भी बुरा नहीं है conv=notrunc, जिसने मेरे लिए लिखने की त्रुटियों को अनदेखा करने के साथ चाल चली। unix.stackexchange.com/a/229379/4319
imz - इवान ज़ाखरीशेव

एक एचडीडी के लिए एक सरल लेखन ऑपरेशन, जैसे कि उपयोग करना dd if=/dev/zero of=/dev/sdX, कोई डिस्क रीड नहीं करेगा। आपको क्या लगता है कि dd कमांड "पर्याप्त नहीं है" ? आप क्या "त्रुटियाँ" अनुभव कर रहे हैं?
चूरा

जवाबों:


12

मैं इसके badblocksलिए विनाशकारी लेखन मोड में पसंद करता हूं । यह लिखता है, यह त्रुटियों को हिट करने पर ऐसा करना जारी रखता है, और अंत में यह बताता है कि वे त्रुटियां कहां थीं, और यह जानकारी आपको यह तय करने में मदद कर सकती है कि आगे क्या करना है (विल इट ब्लेंड?)।

# badblocks -v -b 4096 -t random -o badblocks.txt -w /dev/destroyme
Checking for bad blocks in read-write mode
From block 0 to 2097151
Testing with random pattern: done
Reading and comparing: done
Pass completed, 52105 bad blocks found. (0/52105/0 errors)

और ब्लॉक सूची:

# head badblocks.txt
2097000
2097001
2097002
2097003
2097004

और बाद में डिस्क पर क्या बचा है:

# hexdump -C /dev/destroyme
00000000  be e9 2e a5 87 1d 9e 61  e5 3c 98 7e b6 96 c6 ed  |.......a.<.~....|
00000010  2c fe db 06 bf 10 d0 c3  52 52 b8 a1 55 62 6c 13  |,.......RR..Ubl.|
00000020  4b 9a b8 d3 b7 57 34 9c  93 cc 1a 49 62 e0 36 8e  |K....W4....Ib.6.|

ध्यान दें कि यह वास्तव में यादृच्छिक डेटा नहीं है - पैटर्न दोहरावदार है, इसलिए यदि आप छोड़ देते 1MiBहैं तो आप उसी आउटपुट को फिर से देखेंगे।

यह डेटा को वापस पढ़ने के द्वारा सत्यापित करने का भी प्रयास करेगा, इसलिए यदि आपके पास एक डिस्क है जो सफलतापूर्वक लिखने का दावा करता है, लेकिन रीडबैक पर गलत डेटा देता है, तो यह उन त्रुटियों को भी ढूंढेगा। (सुनिश्चित करें कि झूठी सकारात्मकता से बचने के लिए बैडब्लॉक चल रहा है, जबकि डिस्क पर कोई अन्य प्रक्रिया नहीं लिखें।)

बेशक एक बुरी तरह से टूटी हुई डिस्क के साथ यह बहुत लंबा हो सकता है: कोई कोड नहीं है जो इसे पूरी तरह से दोषपूर्ण क्षेत्रों पर छोड़ देगा। एक ही रास्ता है कि आप के साथ badblocksएक बहुत बड़ा blockize का उपयोग कर प्राप्त कर सकते हैं ।

मुझे यकीन नहीं है कि अगर ddrescueयह किसी भी बेहतर है; यह दूसरी दिशा में करना चाहिए (जितना संभव हो उतना तेज़ी से डेटा पुनर्प्राप्त करें)। आप इसे पहले / अंतिम ब्लॉक निर्दिष्ट करके dd / ddrescue / badblocks के लिए मैन्युअल रूप से कर सकते हैं ...


1
अगर मैं उपयोग करता हूं -t randomया -t 0बैडब्लॉक करता हूं, तो क्या सिर्फ एक लिखने के लिए पास है? मैन पेज को देखते हुए - ऐसा लगता है कि इसके बिना -t4 पास होते हैं ('0xaa, 0x55, 0xff, 0x00' के लिए)।
मैक्सचेलपिजिग

2
यह -tकमांड लाइन पर आपके द्वारा प्रदान किए गए प्रत्येक के लिए एक पास करता है । आपके कहे अनुसार डिफ़ॉल्ट 4 पास है।
फ्रॉस्ट्सचुट्ज़

13

यदि डिस्क USB से कनेक्ट नहीं है , तो डिस्क के ATA Secure Erase को hdparmकरने के लिए (संस्करण> 9.31) का उपयोग करने पर विचार करें । यह कमांड ड्राइव के फर्मवेयर को डिस्क की सामग्री को पोंछने का कारण बनता है, जिसमें खराब ब्लॉक शामिल हैं।

चेतावनी: सही ड्राइव अक्षर का उपयोग करें - मैंने /dev/sdXएक उदाहरण के रूप में दिखाया है - बस कॉपी / पेस्ट न करें।

सबसे पहले, जांचें कि यह एटीए कमांड्स को समझता है (पिछले दशक में निर्मित अधिकांश ड्राइव या अधिक चाहिए):

$ sudo hdparm -I /dev/sdX
.
# lots of other info here...
.
Security: 
    Master password revision code = 65534
        supported
    not enabled
    not locked
    not frozen
    not expired: security count
        supported: enhanced erase
    202min for SECURITY ERASE UNIT. 202min for ENHANCED SECURITY ERASE UNIT.

निकालने की अंतिम दो पंक्तियों से पता चलता है कि यह समर्थित है।

इसलिए ड्राइव में एक पासवर्ड जोड़ें (जाहिरा तौर पर एक आवश्यकता):

$sudo hdparm --user-master u --security-set-pass p /dev/sdX
security_password="p"

और मिटाएँ:

$sudo hdparm --user-master u --security-erase p /dev/sdX
security_password="p"

/dev/sdX:
Issuing SECURITY_ERASE command, password="p", user=user

इस प्रक्रिया के बारे में अधिक जानकारी यहाँ उपलब्ध है


यदि आप भाग्यशाली हैं, तो यह USB पर काम कर सकता है, और आपका USB <-> SATA पुल गैर-मानक SATA आदेशों से गुजर सकता है (और लिनक्स ड्राइवर + hdparm यह जानता है कि उस मॉडल पर ऐसा कैसे करें)। उदाहरण के लिए, उदाहरण के लिए, /dev/sdXअच्छा है, क्योंकि तब अगर किसी को अतीत और अनुकूलन करते समय इसकी घटना याद आती है, तो कोई समस्या नहीं होगी।
पीटर कॉर्ड्स

@Peter कॉर्ड - जब तक आपके पास 24 डिस्क्स नहीं हैं ... नहीं, मुझे मूर्खतापूर्ण! धन्यवाद, मैंने इसे sdX में बदल दिया है, जो मुझे उत्तर देने के लिए प्रेरित करेगा!
गैरेथ.रेड

2
लिंक किए गए पेज में इस विधि के साथ बहुत सारे हार्डवेयर / फर्मवेयर संबंधित
कैविएट हैं

यह वास्तव में काफी कुछ करतब दिखाता है! मैं बस इतना कह सकता हूं कि इसने मेरे लिए बिना किसी परेशानी के काम किया।
garethTheRed

2

मैं यहाँ चार व्यावहारिक जवाब देख रहा हूँ:

  1. hdparmविधि द्वारा पोस्ट की गई garethTheRed अगर आप अपने कंप्यूटर के लिए सीधे जुड़े हुए हैं शायद सबसे अच्छा है। जाहिर है, हालांकि, अगर आप इसे USB के माध्यम से कनेक्ट करने का प्रयास करते हैं, तो आप अपनी ड्राइव को ईंट कर सकते हैं। यदि आप इसे एक ड्राइव के लिए कर रहे हैं, जिसे आप निपटाने वाले हैं, तो यह एक अच्छी बात हो सकती है। हालाँकि, आप संभवतः त्यागने से पहले सुरक्षित करना चाहते हैं।

  2. Imz द्वारा बताई गई तकनीक - इवान ज़खरीशेव काम करेगा, लेकिन बहुत धीमा हो सकता है। मेरा सुझाव है कि यदि आप नहीं चाहते हैं कि डेटा पुनर्प्राप्त करने योग्य हो, तो /dev/urandomइसके बजाय उपयोग करें /dev/zero; जैसे,

    dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
    
  3. मैं निम्नलिखित के खिलाफ सलाह दूंगा। किसी चीज़ को तेज़ी से करने के लिए, अधिकतम तकनीक द्वारा बताई गई तकनीक का उपयोग करें (प्रश्न में):

    ddrescue --verbose --force --nosplit /dev/urandom /dev/sdX
    

    यह ddकमांड की तुलना में तेज होगा , लेकिन कमांड की तरह तेज नहीं hdparm। नीचे देखें कि मैं इसकी सिफारिश क्यों नहीं करता ...

  4. badblocksकमांड भी काम करते हैं, लेकिन आप डेटा कि जिस तरह से randomize जाएगा नहीं कर सकते, और फिर यह बहुत धीमी गति से हो जाएगा।

अंत में, मैं रिमिस हो जाऊंगा अगर मैंने नंबर एक को इंगित नहीं किया, जिसके कारण लोग डिस्क को पूरी तरह से मिटाना चाहते हैं, तो वे इसका निपटान करने वाले हैं। उस स्थिति में, यदि आप पहले से नहीं हैं, तो आप पहले डिस्क को पुनर्प्राप्त करने का प्रयास कर सकते हैं। यदि आप एक ब्लॉक पढ़ते हैं और यह I / O त्रुटि देता है, तो अगली बार जब आप उसी ब्लॉक को लिखते हैं तो डिस्क एक आरक्षित सूची से एक अलग ब्लॉक को पुनः प्राप्त करने का प्रयास करेगी। एक बार आरक्षित सूची भर गई तो आपको I / O त्रुटियां लिखनी होंगी। जब आपको वास्तव में ड्राइव को छोड़ देना चाहिए।

तो आप कुछ सरल कर सकते हैं जैसे:

dd if=/dev/sdX of=/dev/null conv=noerror

और, फिर, बुरे ब्लॉकों को फिर से लिखने के लिए, जैसे कुछ:

dd if=/dev/zero of=/dev/sdX bs=128k

यदि यह कमांड काम करता है, यदि आप बहादुर हैं, तो आप अपनी डिस्क को पुन: स्वरूपित कर सकते हैं और इसे फिर से उपयोग कर सकते हैं।

वैकल्पिक रूप से, आप badblocksडिस्क पर कमांड को दो बार चला सकते हैं । दूसरी बार यह कोई बुरा ब्लॉक रिपोर्ट करना चाहिए ...

badblocks -v -s -w -t random /dev/sdX
badblocks -v -s -w -t random /dev/sdX

इसमें अधिक समय लगेगा, लेकिन अधिक विश्वसनीय है।

यह भी ध्यान देने योग्य है कि कोई भी तकनीक वास्तव में एक सुरक्षित मिटाती नहीं है, सिवाय hdparmकमान के। उन सभी बुरे ब्लॉकों को याद रखें? अभी भी आपके कुछ मूल डेटा ज्यादातर बरकरार हैं। एक डेटा रिकवरी विशेषज्ञ आपकी हार्ड ड्राइव पर जो कुछ पहले था, उसे देखने के लिए इनका उपयोग कर सकता है।

Ddresoscope के संबंध में और मैं इसके खिलाफ क्यों सलाह देता हूं, मेरे पास निम्नलिखित एंटीडोट है:

समस्या है ddrescure त्रुटियों को अनदेखा करने में TOO अच्छा होगा। मेरे पास एक हार्ड ड्राइव थी जो लगातार dd के साथ लगभग १०२ जीबी मार्क पर राइट स्पीड को गिरा देती थी और २३ 238 जीबी मार्क पर राइट एरर का निर्माण शुरू कर देती थी। मैं काफी प्रभावित था कि ddrescue डिस्क पर लगातार गति से मंथन करता रहा, यहां तक ​​कि बिना किसी त्रुटि के भी। 17 घंटे बाद, जब मैं 1300 जीबी पर था, जब मैंने देखा कि ड्राइव लाइट ने खुद को फ्लैश करना बंद कर दिया था। एक त्वरित जाँच से पता चला कि पूरा USB एनक्लोजर ऑफ़लाइन हो गया था। मैंने ड्राइव को क्रैडल से बाहर निकाला। मैंने देखा ddrescue सिर्फ खुशी से सूचना दी कि यह अभी भी मेरे हाथों में डिस्क के साथ, बिना किसी त्रुटि के नकल कर रहा था। मैंने डिस्क को दूसरी मशीन में प्लग किया और पाया कि यह अब एक ईंट थी।

मैं ड्राइव को ईंट बनाने के लिए ddresoscope को दोष नहीं देता। ड्राइव विफल हो रही थी और एक ईंट बन जाएगी। मैं सिर्फ परेशान ddresoscope पाते हैं कि यह कैसे कई त्रुटियों को अनदेखा कर रहा है लिखने की एक त्रुटि गिनती भी नहीं देता है। इस उपयोग में, ddresoscope आपको लगता है कि यह पूरी तरह से सफल रहा है, सभी असफलताओं की परवाह किए बिना। तथ्य यह है कि यह धीमी गति के साथ अनुभाग में पूरी गति से जारी रखने में सक्षम नहीं होना चाहिए था। कारण यह था कि यह खंड धीमा था, कई खंडों को ड्राइव द्वारा स्थानांतरित कर दिया गया था, जिससे उस अनुभाग तक पहुंचने के दौरान बहुत सी मांगें पैदा हुईं। तो शायद यही वह बिंदु है जब ddresoscope का आउटपुट काल्पनिक हो गया।


1
'सुरक्षित रूप से मिटाने के लिए आपको यादृच्छिक डेटा के साथ एक ही ब्लॉक को कई बार ओवरराइट करने की आवश्यकता होती है।' - क्या आप संदर्भ के साथ अपने दावे को पुष्ट कर सकते हैं (यानी आधुनिक हार्ड डिस्क पर शून्य डेटा की वसूली दर्शाता लेख) इसके अलावा, हार्डडिस्क फर्मवेयर एक ब्लैक बॉक्स है। आप कैसे जानते हैं कि ATA सिक्योर डिलीट कमांड सिर्फ राइट-ज़ीरो-पैटर्न-टू-ए-सेक्टर के रूप में लागू नहीं किया गया है?
मैक्सचेलपिजिग

बस उल्टा है। ऐसा लगता है कि 2006 में ऐसे कई अध्ययन हुए थे, जिनमें पुराने स्कूल के कई लेखन को आधुनिक ड्राइव के साथ लिखने की आवश्यकता नहीं थी, क्योंकि आधुनिक ड्राइव डेटा को इतने सघनता से संग्रहीत करते हैं कि एक एकल लिखना उतना ही प्रभावी है।
user6856

1
dd conv=notrunc

शायद मेरे लिए चाल चली गई।

का उल्लेख किया

dd conv=noerror

रीडिंग एरर (मैनपेज के अनुसार) के लिए होना चाहिए। दोनों के संयोजन में कुछ भी बुरा नहीं है।

डिस्क को शून्य करने के लिए मेरा पूरा आदेश इस तरह देखा गया:

dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/zero of=/dev/sda

bs=कुछ मामले के लिए एक रिवाज जोड़ना भी हो सकता है।


1

एक तेज और परिपक्व विधि का उपयोग करना है sdd

यदि आप सभी सामग्री को नष्ट करना चाहते हैं, तो कॉल करें:

sdd -inull bs=1m of=/dev/rdsk/cXdXtXp0 -noerror

हमेशा "कच्चे" डिस्क ड्राइवर इंटरफ़ेस का उपयोग करें।

यदि आप एक डिस्क की मरम्मत करना चाहते हैं और जितना संभव हो उतना पुरानी सामग्री रखना चाहते हैं, तो कॉल करें:

sdd if=/dev/rdsk/cXdXtXp0 of=/dev/rdsk/cXdXtXp0 bs=1m -noerror

यह सभी अपठनीय ब्लॉकों को 512 बाइट स्तर पर शून्य से बदल देगा। आप रिट्री काउंट को संशोधित करना पसंद कर सकते हैं try=#, डिफ़ॉल्ट 2 है।

ध्यान दें कि त्रुटियों के मामले में sddतेजी से होता ddहै क्योंकि यह पहले आपूर्ति किए गए अवरोध के साथ पढ़ने की कोशिश करता है और त्रुटियों के मामले में, यह 512 बाइट्स के साथ पढ़ता है। यदि रीड एरर हैं, तो sdd रैंडम सीक बनाता है और डमी ड्राइव के फर्मवेयर को शांत करता है।

1980 के दशक में उन्नत त्रुटि पुनर्प्राप्ति सुविधाओं को विकसित किया गया था, जबकि मैं दूसरे सबसे बड़े सन-माइक्रोसिस्टम्स ओईएम के लिए काम कर रहा था।

Sdd सोर्सकोड को स्किल्ली टूल्स में शामिल किया गया है:

http://sourceforge.net/projects/schilytools/files/

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