dd इनपुट डिवाइस के पिछले छोर पर चल रहा है
मैं dd
एक हार्ड ड्राइव को क्लोन करने के लिए उपयोग करने की कोशिश कर रहा हूं जिसकी मैंने मरम्मत की थी। मैं dd
10GB चंक्स में ड्राइव से कॉपी डेटा को बंद करने की कोशिश कर रहा हूं , हालांकि इसमें ड्राइव से अधिक डेटा ट्रांसफर होना चाहिए। ड्राइव स्वयं कार्य करता है, और उस पर विभाजन को माउंट किया जा सकता है।
उपयोग करने से 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
यह उस अंतिम पुनरावृत्ति द्वारा ड्राइव के अंत से बहुत दूर चलना चाहिए, हालांकि यह बस चलता रहा। क्लोन माउंट करता है, लेकिन स्पष्ट रूप से दूषित और गायब डेटा है।
- क्या मेरे गणित में कुछ गड़बड़ है, या मेरे द्वारा उपयोग किए गए तर्क
dd
? - क्या मेरे पास 10GB विखंडू में डेटा प्राप्त करने के लिए 'dd' कमांड लिखने का बेहतर तरीका है?
जवाब
समस्या यह है कि आप मान रहे हैं कि seek
एक बाइट मान लिया जाता है, जब वास्तव में यह एक ब्लॉक गणना लेता है। आप का उपयोग करना चाहिए seek=0
, 78125
, 156250
, आदि
हालाँकि, आप इससे छुटकारा पा सकते हैं dd
:
split -b 10G < /dev/sdd
मैं एक हार्ड ड्राइव क्लोन करने के लिए dd का उपयोग करने की कोशिश कर रहा हूं जिसकी मैंने मरम्मत की थी
नहीं है।
ddrescueइसके बजाय का उपयोग करें , जो अपठनीय ब्लॉक और अन्य मीडिया त्रुटियों के साथ अच्छी तरह से मुकाबला करता है।
मुझे पता चला कि जिस कारण मेरा समाधान विफल हो गया था, वह गलत समझ रहा था कि साधक ने क्या किया। यह केवल आउटपुट ड्राइव पर लिखने के स्थान को स्थानांतरित कर रहा था। इसलिए स्क्रिप्ट पहले 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
) क्षतिग्रस्त ड्राइव को ठीक करने के लिए एक बेहतर तरीका है, और क्रमशः खंडित स्थानान्तरण करते हैं।