से कल्पना :
- तो
bs=
expr
संकार्य निर्दिष्ट किया जाता है और बिना किसी रूपांतरण के अलावा अन्य sync
, noerror
या notrunc
अनुरोध कर रहे हैं, डेटा प्रत्येक इनपुट ब्लॉक से लौटे एक अलग उत्पादन ब्लॉक के रूप में लिखा जाएगा; यदि read()
पूर्ण ब्लॉक और sync
रूपांतरण से कम रिटर्न निर्दिष्ट नहीं है, तो परिणामी आउटपुट ब्लॉक इनपुट ब्लॉक के समान आकार का होगा।
तो शायद यही आपके भ्रम का कारण बनता है। हाँ, क्योंकि dd
है डिज़ाइन किया गया अवरुद्ध, डिफ़ॉल्ट रूप से आंशिक के लिए read()
आंशिक करने के लिए 1: रों 1 मैप किया जाएगा write()
रों, वरना sync
करने पर पूंछ गद्दी NUL या अंतरिक्ष वर्ण बाहर d bs=
जब आकार conv=sync
निर्दिष्ट किया जाता है।
इसका मतलब है कि dd
है (w / भ्रष्टाचार का कोई खतरा नहीं एक आंशिक पढ़ने या लिखने की वजह से) नकल डेटा के लिए उपयोग करने के लिए सुरक्षित हर मामले में, लेकिन एक है जिसमें यह मनमाने ढंग से एक द्वारा सीमित है count=
तर्क, क्योंकि अन्यथा dd
होगा खुशी से write()
हूबहू आकार ब्लॉकों में इसके उत्पादन उन लोगों के लिए जिसमें इसका इनपुट तब read()
तक था जब तक कि यह read()
पूरी तरह से इसके माध्यम से न हो। और यहां तक कि इस चेतावनी है ही सच्चा जब bs=
निर्दिष्ट किया जाता है या obs=
है नहीं निर्दिष्ट, कल्पना राज्यों में अगले ही वाक्य के रूप में:
- तो
bs=
expr
संकार्य निर्दिष्ट नहीं है, या एक रूपांतरण के अलावा अन्य sync
, noerror
या notrunc
अनुरोध किया जाता है, इनपुट संसाधित किया जाएगा और पूर्ण आकार उत्पादन ब्लॉक में एकत्र जब तक इनपुट के अंत तक पहुँच गया है।
बिना ibs=
और / या obs=
तर्क के यह कोई फर्क नहीं पड़ता - क्योंकि ibs
और obs
डिफ़ॉल्ट रूप से एक ही आकार के हैं। हालाँकि, आप इनपुट बफ़रिंग के बारे में अलग-अलग आकार निर्दिष्ट करके स्पष्ट कर सकते हैं या तो निर्दिष्ट नहीं कर सकते (क्योंकि इसमें पूर्वता लगती है) ।bs=
उदाहरण के लिए, यदि आप करते हैं:
IN| dd ibs=1| OUT
... तो एक एकल उत्पादन ब्लॉक में हर एकल बाइट को इकट्ठा करके 512 बाइट्स का हिस्सा dd
होगा ।write()
read()
अन्यथा, यदि आप करते हैं ...
IN| dd obs=1kx1k| OUT
... एक POSIX एक समय में अधिकतम 512 बाइट्स पर dd
होगा , लेकिन प्रत्येक मेगाबाइट-आकार के आउटपुट ब्लॉक (कर्नेल को अनुमति देने और संभवतः अंतिम को छोड़कर - क्योंकि वह ईओएफ है) पूर्ण-आकार वाले आउटपुट ब्लॉक में इनपुट एकत्र करके ।read()
write()
हालांकि कल्पना से, हालांकि:
count=n
- केवल n इनपुट ब्लॉक कॉपी करें ।
count=
i?bs=
ब्लॉक करने के लिए नक्शे , और इसलिए count=
आप दो dd
एस की आवश्यकता होगी पर एक मनमानी सीमा को संभालने के लिए । दो dd
एस के साथ यह करने का सबसे व्यावहारिक तरीका एक के आउटपुट को दूसरे के इनपुट में पाइप करके है, जो निश्चित रूप से मूल इनपुट प्रकार की परवाह किए बिना एक विशेष फ़ाइल को पढ़ने / लिखने के दायरे में रखता है ।
एक आईपीसी पाइप का मतलब है कि जब यह निर्दिष्ट करता है [io]bs=
कि सुरक्षित रूप से ऐसा करने के लिए, आपको सिस्टम की निर्धारित PIPE_BUF
सीमा के भीतर ऐसे मूल्यों को रखना चाहिए । POSIX कहा गया है कि सिस्टम कर्नेल केवल परमाणु गारंटी चाहिए read()
और write()
की सीमाओं के भीतर रों PIPE_BUF
के रूप में परिभाषित किया limits.h
। POSIX गारंटी देता है कि PIPE_BUF
हो सकता है कम से कम ...
{_POSIX_PIPE_BUF}
- पाइप से लिखते समय अधिकतम बाइट्स जो परमाणु होने की गारंटी है।
- मान: 512
... (जो डिफॉल्ट dd
i / o blockize होना भी होता है ) , लेकिन वास्तविक मूल्य कम से कम 4k है। एक अप-टू-डेट लिनक्स सिस्टम पर, यह डिफ़ॉल्ट रूप से, 64k है।
इसलिए जब आप अपनी dd
प्रक्रियाओं को सेट करते हैं तो आपको इसे तीन मानों के आधार पर ब्लॉक कारक पर करना चाहिए :
- bs = (अवलोकन =
PIPE_BUF
या कम)
- n = बाइट्स की कुल वांछित संख्या पढ़ी गई
- गिनती = एन / बी एस
पसंद:
yes | dd obs=1k | dd bs=1k count=10k of=/dev/null
10240+0 records in
10240+0 records out
10485760 bytes (10 MB) copied, 0.1143 s, 91.7 MB/s
dd
गैर-शोध योग्य जानकारी को संभालने के लिए आपको i / ow / को सिंक्रोनाइज़ करना होगा। दूसरे शब्दों में, पाइप-बफ़र्स को स्पष्ट करें और वे एक समस्या बन जाते हैं। वह किस dd
लिए है? यहां अज्ञात मात्रा yes
बफर का आकार है - लेकिन यदि आप इसे किसी अन्य के साथ ज्ञात मात्रा में ब्लॉक करते हैं, dd
तो थोड़ा सूचित गुणन dd
डेटा की प्रतिलिपि बनाने के लिए उपयोग करना सुरक्षित कर सकता है (आंशिक रूप से पढ़ने या लिखने के कारण भ्रष्टाचार का कोई जोखिम नहीं) यहां तक कि जब मनमाने ढंग से इनपुट W / count=
w / किसी भी POSIX सिस्टम पर किसी भी प्रकार के मनमाने इनपुट प्रकार को सीमित करने और एक भी बाइट को याद किए बिना।
यहाँ POSIX युक्ति से एक स्निपेट दिया गया है :
ibs=
expr
- इनपुट ब्लॉक आकार निर्दिष्ट करें, बाइट्स में, (डिफ़ॉल्ट रूप से 512) है ।
expr
obs=
expr
- आउटपुट ब्लॉक आकार निर्दिष्ट करें, बाइट्स में, (डिफ़ॉल्ट रूप से 512) है ।
expr
bs=
expr
- इनपुट और आउटपुट ब्लॉक आकार दोनों को
expr
बाइट्स, सुपरस्डिंग ibs=
और पर सेट करें obs=
। कोई रूपांतरण के अलावा अन्य हैं sync
, noerror
और notrunc
निर्दिष्ट किया जाता है, प्रत्येक इनपुट ब्लॉक कम ब्लॉक के योग के बिना एक भी ब्लॉक के रूप में उत्पादन में कॉपी किया जाएगा।
आप भी इस में से कुछ बेहतर समझाया मिल जाएगा यहाँ ।