एक परिमित आकार के उपकरणों की प्रतिलिपि बनाते समय ब्लॉक आकार क्यों निर्दिष्ट करें?


14

ऑनलाइन ट्यूटोरियल में अक्सर यह सुझाव दिया जाता है कि एक सीडीओ से एक आईएसओ इमेज को कॉपी करने के लिए निम्न कमांड का उपयोग करें:

$ dd if=/dev/dvd of=foobar.iso bs=2048

बाइट का आकार क्यों निर्दिष्ट किया जाना चाहिए? मुझे लगता है कि वास्तव में 2048 CDROM छवियों के लिए मानक बाइट आकार है, लेकिन ऐसा लगता है कि ddबिना निर्दिष्ट bs=या count=काम करता है।

किन परिस्थितियों में परिमित आकार के उपकरण से निर्दिष्ट करना या कॉपी करना समस्याग्रस्त नहीं होगा ?bs=count=

जवाबों:


12

Dd डेटा कॉपी करने के लिए उपयुक्त कब है? (या, जब पढ़े जाते हैं () और लिखते हैं () आंशिक) का उपयोग करते समय एक महत्वपूर्ण चेतावनी बताते हैं count: ddआंशिक ब्लॉकों की प्रतिलिपि बना सकते हैं, इसलिए जब दिया जाता है तो countयह दिए गए ब्लॉकों की संख्या के बाद बंद हो जाएगा, भले ही कुछ ब्लॉक अपूर्ण थे। इसलिए bs * count, जब तक आप निर्दिष्ट नहीं करते हैं, तब तक आप कम से कम बाइट्स की प्रतिलिपि बना सकते हैं iflag=fullblock

Dd के लिए डिफ़ॉल्ट ब्लॉक का आकार 512 बाइट्स है। countएक सीमा है; जैसा कि आपके सवाल का संकेत है कि यह परिमित आकार के एक उपकरण की नकल करते समय आवश्यक नहीं है, और वास्तव में एक उपकरण के केवल एक हिस्से की नकल करना है।

मुझे लगता है कि यहां पर विचार करने के दो पहलू हैं: प्रदर्शन और डेटा रिकवरी।

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

जहाँ तक डेटा रिकवरी का संबंध है, यदि आप छोटे ब्लॉक आकारों का उपयोग करते हैं, तो आप एक असफल हार्ड डिस्क से अधिक डेटा प्राप्त कर सकते हैं; यह वही कार्यक्रम है जो dd-rescueस्वचालित रूप से करते हैं: वे शुरू में बड़े ब्लॉक पढ़ते हैं, लेकिन यदि कोई ब्लॉक विफल हो जाता है तो वे इसे छोटे ब्लॉक आकार के साथ फिर से पढ़ते हैं। ddऐसा नहीं होगा, यह पूरे ब्लॉक को विफल कर देगा।


2
प्रदर्शन विशेष रूप से; एक एसडी कार्ड के लिए एक विभाजन छवि लिखें, उदाहरण के लिए, dd bs=4m iflag=fullblockबनाम का उपयोग करते हुए dd bs=1111और पूर्व में आपको दिए गए उच्च डेटा दरों को नोटिस करेगा। ऐसा इसलिए है क्योंकि पूर्व एसडी कार्ड पर प्राकृतिक ब्लॉक आकार के साथ संरेखित करता है, जबकि उत्तरार्द्ध को आंशिक भौतिक ब्लॉक लिखने के लिए एसडी नियंत्रक को बहुत अधिक पढ़ने, कॉपी करने और फिर से पढ़ने की आवश्यकता होती है। महत्व को fullblockकम करके नहीं आंका जाना चाहिए, वैसे, जैसे कि इसके बिना, bsकेवल एक अधिकतम और आंशिक रीड है, जिसके बाद लगातार मिसलिग्न्मेंट हो सकते हैं।
जेसन सी

6

चारों ओर एक कार्गो पंथ का एक सा है dd। मूल रूप से, दो cpकारणों से समस्याएँ थीं: यह 512 के अलावा एक ब्लॉक आकार (लिनक्स 1024 के एक ब्लॉक आकार का उपयोग करता है) के साथ रिपोर्ट किए जाने पर विरल के रूप में फ़ाइलों को गलत बताएगा, और यह एक से नकल करते समय गंतव्य से खाली ब्लॉकों को साफ नहीं करता था। एक ब्लॉक डिवाइस के लिए विरल फ़ाइल।

आप शुरुआती लिनक्स मेलिंग सूची अभिलेखागार में इसके कुछ संदर्भ पा सकते हैं ।

इसलिए लोगों को डिस्क छवियों से निपटने का सही तरीका होने के लिए dd की आदत पड़ गई, और cp रास्ते से गिर गए। और चूंकि dd 512 के डिफ़ॉल्ट ब्लॉक आकार का उपयोग करता है, यह धीमा है (आधुनिक प्रणालियों पर cp की तुलना में धीमा)। लेकिन यह स्पष्ट नहीं है कि आपको किस ब्लॉक आकार का उपयोग करना चाहिए। संभवतः आपके मामले में किसी ने पढ़ा है कि 2048 एक सीडी-रॉम के लिए "प्राकृतिक" ब्लॉक आकार है (यह है, सीडी-रोम 2,352 बाइट सेक्टरों में विभाजित हैं जिसमें 2,048 बाइट डेटा के साथ-साथ त्रुटि सुधारने वाली जानकारी भी है) और यह तय किया है कि dd के साथ उपयोग करने के लिए "सही" आकार है, जब वास्तव में आप तेजी से परिणाम प्राप्त करेंगे यदि आपने (मामूली) ब्लॉक आकार का उपयोग किया है। वास्तव में, जीएनयू सीपीपी इस कारण से 64k के डिफ़ॉल्ट ब्लॉक आकार का उपयोग करता है।

tl; dr: cp /dev/dvd foobar.iso ठीक काम करना चाहिए। डिफ़ॉल्ट ब्लॉक का आकार dd512 है। इसे छोड़ने का एकमात्र प्रभाव अधिकांश आधुनिक परिस्थितियों में होने की संभावना है, जिससे प्रतिलिपि बनाने की प्रक्रिया धीमी हो जाती है।


यह बदल गया है, किसी भी तरह GNU cp डिफ़ॉल्ट रूप से 64k ब्लॉक आकार का उपयोग करता है (64k नहीं), eklitzke.org/efficient-file-copying-on-linux
apurkrt 7'19

5

ब्लॉक का आकार बदलना एक अच्छा तरीका है कि एक समय में कितना बफर हो जाता है या पढ़ा / लिखा जाता है।

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

count=यह भी कि आप क्या करना चाहते हैं, इसके अलावा किसी और चीज पर निर्भर नहीं है। यह नियंत्रित करता है कि इसके काम पर विचार ibs=करने के लिए कितने "ब्लॉक" (जैसा कि मापा जाता है ) की आवश्यकता होगी dd


नोट ddआंशिक ब्लॉकों की नकल करने के स्टीफन बिंदु - यह हमेशा नहीं होता है bs * count
Drav Sloan

ध्यान दें कि कुछ यूनिक्स प्रणालियों पर आपको मूल ब्लॉक आकार के कई को पढ़ना चाहिए ; ddबिना bs=2048या कुछ एक से अधिक एक ब्लॉक डिवाइस cdrom ड्राइव से पढ़ते समय एक त्रुटि देगा।
१५:५५ पर

2

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

यदि आपके पास बड़ी मात्रा में स्पेयर मेमोरी है और ब्लॉकेज बढ़ाते हैं, तो डेटा के अधिक बड़े हिस्से को उत्तराधिकार में पढ़ा जा सकता है, बफर किया जा सकता है और आउटपुट गंतव्य पर पहुंचा जा सकता है। कम ब्लॉक आकार के लिए प्रत्येक व्यक्ति के लिसेक, मेमसेट आदि के संदर्भ में अधिक ओवरहेड की आवश्यकता होती है।

आपका लाभ जहां अपने पर निर्भर हो सकती if=है और of=स्थापित कर रहे हैं, और क्या हार्डवेयर आप के माध्यम से जा रहे हैं, अगर आप कम स्मृति है और इसके आगे।


1

Bs = ब्लॉक आकार को पढ़ने के लिए या लिखने के लिए प्रतिनिधित्व करता है। फ़ील्ड को अक्षुण्ण बनाना या उसे निर्दिष्ट न करना प्रतिलिपि बनाने का समान कार्य करने के लिए लग सकता है लेकिन इसका उपयोग करने में कोई तथ्य नहीं है। उदाहरण के लिए,

  • केवल 1 ~ 10 केबी के प्रत्येक के साथ 1000000000000000 फाइलें हैं।
  • 10 gb के लिए एक ही फाइल रखना

पहले मामले में लोअर ब्लॉक साइज का उपयोग करके नकल की गति को बढ़ाया गया है। उत्तरार्द्ध में, हायर ब्लॉक आकार बेहतर विकल्प रहा है क्योंकि यह सेक्टर आकार को बढ़ाता है sector change, जिससे कमांड की संख्या कम होती है , जिसके परिणामस्वरूप आमतौर पर I / O ऑपरेशन तेज होते हैं।

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