2008-09-29 13 views
39

मान लीजिए कि मैं अपने हार्ड ड्राइव (hda) को उसी कंप्यूटर में किसी अन्य ड्राइव (hdb) पर क्लोन करना चाहता हूं। मैं इसे देख, वहाँ दो, आसान किसी न किसी और कर इसे स्वयं तरीके है:बिल्ली से बेहतर डीडी है?

cat /dev/hda > /dev/hdb

और

dd if=/dev/hda of=/dev/hdb

क्या तकनीकी कारणों से कर रहे हैं वहाँ के बाद अक्सर/हमेशा बेहतर होने के लिए कहा है कि पूर्व की तुलना में?

किसी भी परिस्थिति में घर में इन आदेशों का प्रयास करें, या अपने यूनिक्स

+0

gnu ddrescue डीडी – endolith

उत्तर

25

केवल सादा 'बिल्ली' और 'डीडी' के बीच बड़ा अंतर यह है कि डीडी बीमा करता है कि आपके द्वारा निर्दिष्ट आकार के साथ सभी पढ़ और लिखते हैं। यह महत्वपूर्ण हो सकता है कि आप किस डिवाइस (और * निक्स का संस्करण) का उपयोग कर रहे हैं, इस पर निर्भर करता है।

+2

यदि आप टेप से बात कर रहे हैं तो बहुत महत्वपूर्ण है। आधुनिक उपकरणों के साथ कम महत्वपूर्ण है। लेकिन आप कभी-कभी विस्तृत नियंत्रण चाहते हैं कि डीडी आपको दे सके। – Darron

+14

* कब * यह महत्वपूर्ण है? यह केवल उत्तर का आधा या कम है। – endolith

4

fubar'd है मैं पाइप के माध्यम से अपने सभी डेटा भेजने के लिए एक प्रदर्शन जुर्माना हो सकता है लगता है। डीडी यह सब एक कार्यक्रम में करता है, और शायद ब्लॉक पढ़ने और लिखने के लिए अनुकूलित किया गया है।

+0

+1 से बेहतर है ... लेकिन हो सकता है कि स्पष्ट हो ... केवल एक प्रोग्राम डीडी शामिल है, जहां बिल्ली के साथ खोल शामिल है और डेटा पास हो गया है हालांकि आईपीसी पाइप – epatel

+1

नहीं है इसके बारे में भी निश्चित रहें। http://prstat.blogspot.com/2008/04/why-cat1-ran-faster-than-dd1m.html – olle

+0

दिलचस्प ... लेकिन, वे syscalls गिन रहे हैं ...और, मैं उनको कॉल की गिनती नहीं देख रहा हूं, क्योंकि यह खोल डिस्क पर लेखन कर रहा है। – epatel

2

अगर मैं सही ढंग से याद, dd भी बहुत कुछ "कम स्तर" दृष्टिकोण है में, फ़ाइल सिस्टम और सभी घंटियाँ और सीटी :)

एक बार, सचमुच मेरा कीमती, ehm बचाया डीडी के रूप में ऐसी कल्पना बातें लंघन है, जीवन:

एक ठेकेदार से "अबाउटली इरप्लासेबल डेटा" से भरा लिनक्स बॉक्स से भरा हुआ, कई खराब क्षेत्रों में वाए के साथ, केवल एकमात्र चीज आपातकालीन लिनक्स खोल थी। क्या मैंने ड्राइव प्राप्त करने के लिए बॉक्स खोलने की असंभवता का उल्लेख किया था? आह, हाँ, कोई यूएसबी और ऐसा नहीं ...

और फिर, प्रकाश !!! डीडी और काम कर रहा हूँ !!! आह, ताज़ा करना! एक साफ कमांड लाइन जादू के साथ अपने दिन (और कैरियर) सहेजा जा रहा है एफ़टीपी के साथ एक दूरस्थ डिस्क पर एक बैकअप डंप बनाने के लिए ...

put |dd if=/dev/hda bs=4096 count= ???? या इसी तरह की तरह ...

बिल्ली फ्लॉप 'मेरे लिए काम तो ...

-2

डीडी तेजी से होना चाहिए क्योंकि यह आंतरिक रूप से I/O करता है, बिल्ली के विपरीत, जो stdio और I/O के लिए खोल का उपयोग करता है।

+0

नहीं, यह नहीं है। खोल केवल तभी शामिल हो जाती है जब इसे stdout में पाठ प्राप्त होता है, अन्यथा, 'बिल्ली foo> bar' के मामले में प्रतिलिपि आंतरिक रूप से संभाली जाती है। यही कारण है कि एक टेक्स्ट फ़ाइल में लॉग (उदा। 2 एमआईबी लायक) भेजने के लिए यह बहुत तेज़ है और इसे बाद में इसे सीधे खोलने के लिए इसे प्रिंट करना है। 'Cat/dev/cdrom' बनाम बिल्ली/dev/cdrom> file.iso' पर विचार करें; उत्तरार्द्ध काफी तेजी से चलता है, और खत्म होता है [डीडी से भी तेज] (http://stackoverflow.com/a/150989/1175714) जब कोई बीएस निर्दिष्ट नहीं किया जाता है –

+0

यहां और अधिक है: http://prstat.blogspot.com/2008/ 04/क्यों-cat1-ran-fast-than-dd1m.html –

2

अब थोड़ा व्यावहारिक अंतर है।
आंतरिक रूप से वे दोनों एक ही सील्स का उपयोग करने के लिए ऑप्टोमाइज़ करते हैं।

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

0

दिलचस्प ... मैंने डीडी, सीपीओओ, या टैर के विभिन्न क्रमपरिवर्तनों के साथ इस प्रकार की कॉपी ऑपरेशन करने के लिए अतीत में सिफारिशें देखी हैं, लेकिन कभी बिल्ली नहीं।

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

डीडी में स्थानांतरित करने की प्रक्रिया में डेटा रूपांतरण के लिए बहुत सारे विकल्प हैं, लेकिन मैं इसकी सामग्री की बजाय फाइल सिस्टम को स्थानांतरित करते समय विशेष रूप से प्रासंगिक होने की अपेक्षा नहीं करता।

26

कुछ अंक।

ltrace cat </dev/zero >/dev/null सुझाव देता है कि बिल्ली डिफ़ॉल्ट रूप से अधिक कुशल है क्योंकि यह memcpy नहीं है और डिफ़ॉल्ट रूप से 4KiB बफर का अधिक महत्वपूर्ण उपयोग करता है।

ltrace dd if=/dev/zero of=/dev/null पता चलता है कि 512B बफ़र्स जो आधुनिक डिस्क पढ़ने (हालांकि गिरी विभिन्न डिस्क निर्धारण के साथ कुछ हद तक यह कम होना चाहिए) के लिए बहुत अक्षम है का उपयोग करने के dd चूक। हालांकि dd बिल्ली की तुलना में अधिक विन्यास योग्य है और आप bs = 2 एम की तरह कुछ का उपयोग syscalls की संख्या को कम करने के लिए

dd डिस्क त्रुटियों की उपस्थिति में समस्याग्रस्त है सकते हैं, और लटका कर सकते हैं या अधिक महत्वपूर्ण गैर पठनीय डेटा की अनदेखी इस प्रकार गंतव्य डिस्क को दूषित कर रहा है। इसके बजाय इस कार्य के लिए dd_rescue या ddrescue पर विचार करें।

+0

उबंटू में उस लेटेस लाइन को कर रहा है, ऐसा लगता है कि बिल्ली 64 केबी बफर – barlop

+0

का उपयोग करता है हां हाल ही में कोर्यूटल्स में वृद्धि हुई है – pixelbeat

19

यह वास्तव में ऐतिहासिक है, और यह महत्वपूर्ण नहीं है कि आप जो कुछ करने जा रहे हैं वह एक डिस्क को दूसरे पर क्लोन कर रहा है।

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

डीडी आसान हो सकता है यदि आपको अपनी स्किप और तलाश विकल्पों के कारण लंबी चलती प्रतिलिपि फिर से शुरू करने की आवश्यकता है।

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

ध्यान दें कि जब तक किसी ने शैल डिज़ाइन में कुछ प्रमुख टिंकरिंग नहीं की है, तब तक मैंने देखा, 'बिल्ली फू> बार' खोल के माध्यम से 'बार' पर लेखन नहीं करता है; सभी खोल छंटनी के साथ लिखने के लिए खुली 'बार' है, फिर फाइल डिस्क्रिप्टर 1 (stdout) के रूप में एक कांटा/निष्पादन में 'बिल्ली' के लिए खुली फ़ाइल डिस्क्रिप्टर को पास करें। उस बिंदु पर, खोल लूप से बाहर है, और 'बिल्ली' की निकास स्थिति के अधिसूचित होने से परे, फिर से शामिल नहीं होता है।

+1

कोई सवाल नहीं है कि डीडी का डिफ़ॉल्ट ब्लॉक आकार छोटा और हास्यास्पद रूप से धीमा है, हालांकि बदला जा सकता है .. लेकिन दिलचस्प बात यह है कि यह साइट http://prstat.blogspot.co.uk/2008/04/why-cat1-ran-faster-than-dd1m.html जब भी आप डीडी को एक विशाल ब्लॉक आकार का उपयोग करने के लिए कहते हैं, बिल्ली तेज है – barlop

0

आप डीडी का उपयोग करना चाहते हैं ताकि आप bsize जैसी चीजें निर्दिष्ट कर सकें, जो एक बार में पढ़ने/लिखने के लिए कितना है; इसे 4k के कुछ से अधिक में ट्यून करना बिल्ली से तेज है, जो मुझे लगता है कि इसमें शामिल पाइपों तक सीमित होना है।

3

मैं उबंटू 12.04 पर था और मेरा अनुभव यह था कि मैं एक विभाजन (/ dev/sda1) 'बिल्ली' कर सकता हूं लेकिन पूरे डिवाइस (/ dev/sda) नहीं। मैं केवल 'डीडी' का उपयोग कर डिवाइस को क्लोन कर सकता हूं। किसी भी तरह, बिल्ली/dev/sda अगर विभाजन जानकारी और बूट सेक्टर खो गया था।

+0

SO में आपका स्वागत है ! यह एक जवाब प्रतीत नहीं होता है। कृपया ध्यान दें SO एक प्रश्न/उत्तर साइट है, न कि एक मंच। – Jacinda

+2

मुझे लगता है कि यह एक सभ्य उत्तर है। प्रश्न स्वयं काफी हद तक व्यक्तिपरक है इसलिए बताते हुए मतभेद बहुत बेहतर गुणवत्ता का है, और यह एक महत्वपूर्ण अंतर है। – MDMoore313

संबंधित मुद्दे