एक साधारण उदाहरण के रूप में 100MB कच्चे ब्लॉक डिवाइस पर विचार करें। कि कुल 102760448 बाइट्स के लिए 512 बाइट्स के 204800 ब्लॉक हैं।
पहली 98MB (200704 ब्लॉक) को स्थानांतरित करने की चुनौती है, इसलिए इसके सामने 2MB (4096 ब्लॉक) का अंतर है। ऐसा करने के लिए इन-प्लेस की आवश्यकता है कि कुछ भी उस सेक्टर को नहीं लिखा गया है जिसे पढ़ा नहीं गया है। इसे प्राप्त करने का एक तरीका बफर शुरू करना है:
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 | dd of=/dev/sdj2 seek=4096
उम्मीद यह है कि mbuffer
लेखक के लिए कुछ भी पारित करने से पहले 4096 ब्लॉक संग्रहीत करेगा, इस प्रकार यह सुनिश्चित करना कि कुछ भी उस क्षेत्र को नहीं लिखा गया है जिसे पढ़ा नहीं गया है और यह कि लेखक बफर के आकार से पाठक को परेशान करता है। बफर को पाठक और लेखक को उन अवरोधों के भीतर जितनी जल्दी हो सके संचालित करने की अनुमति देनी चाहिए।
हालाँकि, यह मज़बूती से काम नहीं करता है। मैंने वास्तविक उपकरणों का उपयोग करने की कोशिश की है, लेकिन यह उन पर कभी काम नहीं करता है, जबकि एक फ़ाइल के साथ प्रयोगों ने मेरे 64-बिट बॉक्स पर काम किया, लेकिन मेरे 32-बिट बॉक्स पर नहीं।
सबसे पहले, कुछ तैयारी:
$ dd if=/dev/sdj2 count=200704 | md5sum
0f0727f6644dac7a6ec60ea98ffc6da9
$ dd if=/dev/sdj2 count=200704 of=testfile
यह काम नहीं करता है:
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=/dev/sdj2 seek=4096
summary: 98.0 MiByte in 4.4sec - average of 22.0 MiB/s
md5 hash: 3cbf1ca59a250d19573285458e320ade
यह 64-बिट सिस्टम पर काम करता है, लेकिन 32-बिट सिस्टम पर नहीं:
$ dd if=testfile count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=testfile seek=4096 conv=notrunc
summary: 98.0 MiByte in 0.9sec - average of 111 MiB/s
md5 hash: 0f0727f6644dac7a6ec60ea98ffc6da9
यह मज़बूती से कैसे किया जा सकता है?
टिप्पणियाँ
मैंने बफरिंग के बारे में अन्य प्रश्नों को पढ़ा है और देखा है pv
, buffer
और mbuffer
। मैं केवल आवश्यक बफर आकार के साथ काम करने के लिए उत्तरार्द्ध प्राप्त कर सकता हूं।
इंटरमीडिएट स्टोरेज का उपयोग उस समस्या का एक स्पष्ट समाधान है जो हमेशा काम करता है लेकिन यह तब व्यावहारिक नहीं होता है जब पर्याप्त अतिरिक्त क्षमता उपलब्ध न हो।
mbuffer
20140302 संस्करण के साथ आर्क लिनक्स चलाने वाले टेस्ट प्लेटफ़ॉर्म ।
mbuffer
वास्तव में दूसरे के लिए मजबूर करना चाहिए dd
पहले के लिए पीछे करने के लिए और आप केवल बदलाव के आकार बफ़र करने के लिए पर्याप्त रैम की जरूरत है। बहुत बुरा dd
पढ़ने और पिछड़े क्रम में ब्लॉक लिखने का समर्थन नहीं करता है क्योंकि इससे समस्या खत्म हो जाएगी!
-H
तर्क इस सुविधा को सक्षम करता है)।
mbuffer
? इसके बजायdd
ब्लॉक डिवाइस की पूरी सामग्री को एक बार उपयोग करने के लिए क्यों न बनाएंdd bs=102760448
? बेशक, एक तरीका या दूसरा यह रैम में बफर है।