dd इनपुट डिवाइस के पिछले छोर पर चल रहा है

Aug 18 2020

मैं ddएक हार्ड ड्राइव को क्लोन करने के लिए उपयोग करने की कोशिश कर रहा हूं जिसकी मैंने मरम्मत की थी। मैं dd10GB चंक्स में ड्राइव से कॉपी डेटा को बंद करने की कोशिश कर रहा हूं , हालांकि इसमें ड्राइव से अधिक डेटा ट्रांसफर होना चाहिए। ड्राइव स्वयं कार्य करता है, और उस पर विभाजन को माउंट किया जा सकता है।

उपयोग करने से df -hमुझे ड्राइव का आकार 1000204886016 बाइट्स (1TB ड्राइव) मिला।

मैंने शुरू में कोशिश की:

sudo dd if=/dev/sdb of=/dev/sdd status=progress

हालाँकि यह लगभग 300GB के बाद एक क्रॉल तक धीमा हो गया, और अंततः एक त्रुटि के कारण विफल हो गया। मैंने इसे 10GB विखंडू में कॉपी करने की कोशिश करने का फैसला किया। मैंने गणना की कि 128kByte ब्लॉक आकार के साथ 10GB पढ़ने के लिए 78125 ब्लॉक कॉपी करने की आवश्यकता होती है।

यह करने के लिए मैं उपयोग कर रहा हूँ:

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=n

ddयह रिपोर्ट कर रहा था कि हर बार 10240000000 बाइट्स स्थानांतरित किए गए थे। प्रत्येक पुनरावृत्ति के लिए खोज मूल्य की गणना करने के लिए मैंने स्थानांतरित बाइट्स को एकत्र किया, और यह सुनिश्चित करने के लिए 1 जीबी घटाया कि कुछ ओवरलैप था। परिणामी अनुक्रम है:

seek=0
seek=9240000000
seek=18480000000
seek=27720000000
seek=36960000000
...
seek=1071840000000

मैंने उन्हें असतत dd कमांड के साथ एक शेल स्क्रिप्ट में लिखा और उसे चलाया। मैंने अंतिम पुनरावृति को उतना ही कॉपी करने के लिए स्वतंत्र छोड़ दिया जितना कि आवश्यक था।

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=0
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=9240000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=18480000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=27720000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=36960000000
    ...
sudo dd if=/dev/sdb of=/dev/sdd bs=128k status=progress oflag=seek_bytes seek=1071840000000

यह उस अंतिम पुनरावृत्ति द्वारा ड्राइव के अंत से बहुत दूर चलना चाहिए, हालांकि यह बस चलता रहा। क्लोन माउंट करता है, लेकिन स्पष्ट रूप से दूषित और गायब डेटा है।

  1. क्या मेरे गणित में कुछ गड़बड़ है, या मेरे द्वारा उपयोग किए गए तर्क dd?
  2. क्या मेरे पास 10GB विखंडू में डेटा प्राप्त करने के लिए 'dd' कमांड लिखने का बेहतर तरीका है?

जवाब

3 thatotherguy Aug 18 2020 at 02:31

समस्या यह है कि आप मान रहे हैं कि seekएक बाइट मान लिया जाता है, जब वास्तव में यह एक ब्लॉक गणना लेता है। आप का उपयोग करना चाहिए seek=0, 78125, 156250, आदि

हालाँकि, आप इससे छुटकारा पा सकते हैं dd:

split -b 10G < /dev/sdd
3 roaima Aug 18 2020 at 06:36

मैं एक हार्ड ड्राइव क्लोन करने के लिए dd का उपयोग करने की कोशिश कर रहा हूं जिसकी मैंने मरम्मत की थी

नहीं है।

ddrescueइसके बजाय का उपयोग करें , जो अपठनीय ब्लॉक और अन्य मीडिया त्रुटियों के साथ अच्छी तरह से मुकाबला करता है।

2 alphasierra Aug 21 2020 at 03:06

मुझे पता चला कि जिस कारण मेरा समाधान विफल हो गया था, वह गलत समझ रहा था कि साधक ने क्या किया। यह केवल आउटपुट ड्राइव पर लिखने के स्थान को स्थानांतरित कर रहा था। इसलिए स्क्रिप्ट पहले 10GB को बार-बार आउटपुट पर कॉपी कर रही थी। यह डिवाइस के अंत तक कभी नहीं पहुंचेगा।

इनपुट को शिफ्ट करने के लिए स्किप फ्लैग का उपयोग किया जाना चाहिए:

sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress skip=n seek=n

सेटिंग oflag=seek_bytesऔर iflag=skip_bytesब्लॉक के विपरीत गणित को बाइट्स में करने की अनुमति देगा।

हालाँकि रोएमा द्वारा प्रस्तुत विकल्प ( ddresoscope का उपयोग करें) और यह कि अन्य लोग ( split -b 10G < /dev/sdd) क्षतिग्रस्त ड्राइव को ठीक करने के लिए एक बेहतर तरीका है, और क्रमशः खंडित स्थानान्तरण करते हैं।