Dd को बहुत लंबा क्यों लगता है?


18

मुझे एक डिस्क को दूसरे में कॉपी करने की आवश्यकता है। मैंने नीचे दिए गए आदेश के साथ कोशिश की और फेडरो में 1 टीबी डिस्क की प्रतिलिपि बनाने में लगभग एक दिन का समय लगता है।

dd if=/dev/sda of=/dev/sdb 

मैंने नीचे दिए गए कमांड के साथ यूनिक्स (HP-UX) सिस्टम पर यही कोशिश की है और यह कुछ ही घंटों में पूरा हो जाता है

dd if=/dev/sda of=/dev/rdsk

डिस्क से डिस्क पर तेजी से कॉपी करने के लिए मैं क्या विकल्प चुन सकता हूं?


2
cp /dev/sda /dev/sdbया ( pv /dev/sda > /dev/sdb एक प्रगति बार पाने के लिए) एक बहुत तेज होगा। आप ddयहां क्यों इस्तेमाल करेंगे ? ddकेवल जैसी चीजों के साथ उपयोगी होगा conv=sync,noerrorत्रुटियों के साथ संभाल डिस्क के लिए, लेकिन फिर भी यह की तरह उपयोग चीजों को और अधिक समझ बनाने होगा ddrescueबजाय (यह भी देखें pvके -Eविकल्प)।
स्टीफन चेजलस

1
@ स्टीफेनचैजल्स और catभी तेज हो सकते हैं, लेकिन अंतर यह नहीं है कि (मेरे प्रयोग की तरह फाइल-टू-फाइल की तुलना में डिवाइस-टू-डिवाइस के लिए बड़ा हो सकता है)।
गिल्स एसओ- बुराई को रोकना '

8
"मैंने यूनिक्स प्रणाली पर भी यही कोशिश की है" - तो आपने यूनिक्स नहीं तो किस प्रकार की प्रणाली की कोशिश की? इसके अलावा, क्या हार्डवेयर, आदि, yaddayadda।
मार्सेलम


HP-UX (इंटीग्रिटी ब्लेड) में पहले इस्तेमाल किया और पहले सोलारिस मशीन का भी इस्तेमाल किया।
केकेडी

जवाबों:


28

ddकई (अजीब) विकल्प हैं, देखें dd (1)

आपको बफर आकार स्पष्ट रूप से बताना चाहिए, इसलिए प्रयास करें

dd if=/dev/sda of=/dev/sdb bs=16M

IIRC, डिफ़ॉल्ट बफर आकार केवल 512 बाइट्स है। ऊपर दिया गया कमांड इसे 16 मेगाबाइट पर सेट करता है। तुम कुछ छोटे (जैसे की कोशिश कर सकते bs=1Mहै), लेकिन आप डिफ़ॉल्ट (विशेष रूप से 4Kbytes के क्षेत्रों के साथ हाल ही डिस्क हार्डवेयर, यानी पर अधिक से अधिक उपयोग करना चाहिए उन्नत स्वरूप )। मैं भोलेपन से कुछ शक्ति की सिफारिश करता हूं जो कम से कम मेगाबाइट है।

डिफ़ॉल्ट 512 बाइट्स बफ़र आकार के साथ, मुझे लगता है (लेकिन मैं बहुत गलत हो सकता है) कि हार्डवेयर को प्रत्येक 512 बाइट्स ब्लॉक के लिए 4K को स्थानांतरित करने की आवश्यकता होती है।

के बारे में rdsk, एसडी (4) मैन पेज कहते हैं:

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

Dd के बफ़र आकार में वृद्धि से आपको पढ़ने और लिखने के संचालन के लिए अधिक प्रदर्शन मिलेगा। अब सभी डिस्क में हार्डवेयर रीड / राइट बफर है। लेकिन अगर आप dd के बफर के आकार को हार्डवेयर बफर से अधिक बढ़ा देंगे तो इसका प्रदर्शन कम हो जाएगा क्योंकि dd पहली डिस्क से बफर तक पढ़ेगा जब दूसरी डिस्क ने अपने हार्डवेयर बफर से सभी लिखा होगा। आपको bsअलग-अलग उपकरणों के लिए हर बार अलग-अलग मूल्य पर dd कमांड के सेट विकल्प की आवश्यकता होती है।


लिनक्स सिस्टम में rdsk उपलब्ध है या नहीं? मैंने यूनिक्स सिस्टम में उपयोग किया है।
केकेडी

1
पेज कैश शायद 4K ब्लॉक में सौदा करेगा जो आप करते हैं, लेकिन आप उस 4Kb को पढ़ने के लिए कितने syscalls dd का उपयोग कर सकते हैं। मुझे यकीन है कि ऊपर कुछ पढ़ने का आकार है, जिसमें स्टालिंग लिखने की लागत सहेजे गए सिस्कॉल की तुलना में अधिक महंगी है, लेकिन यह पता नहीं है कि मिठाई स्थान कहां है।
बेकार

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

1
दिलचस्प बात यह है कि macOS में (एक SUS- प्रमाणित, btw) प्रदर्शन करते समय लक्ष्य के रूप में उपयोग करने के लिए तेजी से/dev/rdiskXdd
adib

1
यदि आप आश्चर्यचकित हैं कि व्हाट्सएप चल रहा है (जैसे मैंने किया) तो status=progressवह भी जोड़ें जो पूरे ऑपरेशन प्रगति को प्रिंट करेगा।
अलेक्जेंडर लेच

17

यूनिक्स-भूमि में वर्षों पहले ddएक ब्लॉक डिवाइस की प्रतिलिपि बनाने का आवश्यक तरीका था। यह कार्गो-पंथ ज्ञान के रूप में आगे बढ़ा है, भले ही (लिनक्स-आधारित सिस्टम पर, कम से कम) catलगभग हमेशा की तुलना में तेज है dd

हालांकि, इतिहास में भी एक सभ्य ब्लॉक आकार ने (धीमी) सिस्टम कॉल की संख्या को कम करने में मदद की, यह देखते हुए कि प्रत्येक सिस्टम कॉल ने I / O ऑपरेशन शुरू किया। डिफ़ॉल्ट ब्लॉक का आकार 512 बाइट्स (एक डिस्क सेक्टर) है। एक ही रीड में कई डिस्क ब्लॉक को एक साथ इकट्ठा करना - था और यह भी स्वीकार्य है। यह उदाहरण 32MB ब्लॉक आकार का उपयोग करता है:

dd bs=$((512*2048*32)) if=/dev/source of=/dev/target

वर्तमान लिनक्स-आधारित प्रणालियों पर, डिस्क को एक सरल के साथ सबसे कुशलता से कॉपी किया जा सकता है cat

cat /dev/source >/dev/target

(जैसा कि आपके प्रश्न पर टिप्पणियों में उल्लेख किया गया है, pvके लिए प्रतिस्थापित किया जा सकता है catऔर आपको प्रगति और थ्रूपुट का संकेत देगा)


3
विशेष रूप से, कारण dd का उपयोग किया जाना था GNU cp में एक बग और 90 के दशक की शुरुआत में लिनक्स कर्नेल में एक बग। ऐतिहासिक यूनिक्स प्रणालियों पर dd का उपयोग करने के कारण बहुत अलग थे, और पूरे ब्लॉक डिवाइस को कॉपी करना एक असामान्य बात थी।
रैंडम 832

1
@ Random832 एक पूरी डिस्क को कॉपी करना चाहता था, जो असामान्य था, लेकिन मुझे याद है कि (बड़े - 150 या 200MB तक) विभाजन की प्रतिलिपि बनाने की आवश्यकता है
roaima

3
(बग्स की बारीकियाँ: कर्नेल ने डिस्क उपयोग आकारों को गलत तरीके से रिपोर्ट किया है [cp को यह बताने के लिए कि प्रत्येक स्रोत फ़ाइल एक विरल फ़ाइल थी], और cp ने किसी ब्लॉक फ़ाइल से डिवाइस गंतव्य पर कॉपी करते समय ब्लॉक को शून्य नहीं किया। आपके स्रोत में ब्लॉक होगा जो कुछ भी कचरा डिस्क पर पहले से ही होता है)
रैंडम 832

मुझे इस तरह का जवाब पसंद है। जानकारी के लिए धन्यवाद। यहाँ अपने updoot है।
कैटबार्डर

7

आमतौर पर, ddकुछ विकल्पों के पक्ष में टाला जा सकता है। ddrescueइसके बजाय GNU का उपयोग करने के कई अच्छे कारण हैं । उबंटू में, आप इसे स्थापित कर सकते हैं:

sudo apt-get install gddrescue

और सिर्फ सादा ddrescueउपयोग करने के लिए। ध्यान दें कि पैकेज के नाम से अलग, निष्पादन योग्य में प्रारंभिक नहीं है g

इसका उपयोग करना उतना ही सरल है:

ddrescue inputFile outputFile logFile

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

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

अक्सर बार, जो ड्राइव विफल होना शुरू हो जाते हैं उनमें गति के मुद्दे जैसे कि धीमेपन के कभी-कभी पैच, कम औसत गति, अचानक लंबे समय तक रुकने (खराब सेक्टर) या पूर्ण रीसेट (गंभीर सतह त्रुटियां) होते हैं। ddrescueयदि आप अपने ड्राइव को स्वयं रीसेट कर रहे हैं, तब भी आप उपरोक्त सभी को पहचानने में मदद कर सकते हैं और अपने क्लोन को पुनः प्रदान कर सकते हैं (बशर्ते कि आप एक लॉग फ़ाइल निर्दिष्ट करें)।


6

बहुत अच्छा सवाल है। कच्चे इंटरफ़ेस को कुछ यूनिक्स सिस्टम (tru64, hpux, Solaris) पर लागू किया गया है, लेकिन लिनक्स पर नहीं। कच्चा इंटरफ़ेस तेजी से हस्तांतरण करता है क्योंकि यूनिक्स I / O को छोड़ दिया जाता है। ब्लॉक इंटरफ़ेस ( /dev/dskया /dev/disk) धीमा है क्योंकि यह यूनिक्स I / O सिस्टम का उपयोग करता है। स्पीडअप dd(gn dd can) का उपयोग bs=30Mया bs=20Mअपने hw पर निर्भर करता है। संक्षिप्त उत्तर है: नहीं यह लागू नहीं है, कम से कम जहाँ तक मुझे पता है। मैं कर्नेल संस्करण 2.2 के पुराने समय से लिनक्स का उपयोग कर रहा हूं और कभी भी rdskयूनिक्स पर उपयोग नहीं किया है।


6
आप एक ब्लॉक आकार क्यों सुझाते हैं जो दो की शक्ति नहीं है?
बेसिल स्टारीनेवविच

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