जब मैं अधिक अनुरोध करता हूं तो dd केवल 128 बाइट / देव / यादृच्छिक से कॉपी करता है?


10

मैं ddकमांड के आउटपुट को समझने की कोशिश कर रहा हूं । मैंने कोशिश की

dd if=/dev/zero of=/dev/null bs=512 count=1

और मिल गया (उम्मीद के मुताबिक):

 1+0 records in
 1+0 records out
 512 bytes (512 B) copied, 2e-05 seconds, 26 MB/s

हालाँकि जब मैंने कोशिश की

dd if=/dev/random of=/dev/null bs=512 count=1

मुझे मिला

 0+1 records in
 0+1 records out
 128 bytes (128 B) copied, 0.00012 seconds, 1.1 MB/s

यह केवल 128 बाइट्स की नकल क्यों है?


देखें superuser.com/questions/359599/... / dev / यादृच्छिक और urandom को अधिक अच्छी तरह चर्चा के लिए
BobT

जवाबों:


8

आपको उपयोग करने की आवश्यकता है /dev/urandom, या "अनब्लॉकिंग" यादृच्छिक स्रोत।

/dev/randomबिट स्रोत के यादृच्छिकता को बढ़ाने के लिए एक प्रकार का एंट्रोपी पूल का उपयोग करता है। यह विधि केवल कई यादृच्छिक बिट्स / बाइट्स के रूप में वापस आ जाएगी क्योंकि उस समय एंट्रोपी पूल की स्थिति के आधार पर वापस किया जा सकता है, इसलिए यदि हार्डवेयर यादृच्छिक संख्या जनरेटर का उपयोग किया जाता है, तो यह कभी-कभी एक स्थिर हो सकता है। से लिनक्स मैनपेज :

जनरेटर भी एन्ट्रापी पूल में शोर के बिट्स की संख्या का एक अनुमान रखता है। इस एंट्रॉपी पूल से रैंडम नंबर बनाए जाते हैं।

/dev/urandomफ़ाइल आंतरिक पूल पुन: उपयोग जब तक आप जरूरत है एक संख्या उत्पन्न करने के रूप में है रहता है। इसका दुष्परिणाम यह है: क्रिप्टोग्राफ़िक प्रयोजनों के लिए उपयोग न करें/dev/urandom , क्योंकि यह उत्पादित बिट्स की तुलना में कम यादृच्छिक है /dev/random। विवरण के लिए ऊपर दिए गए मैनपेज लिंक को देखें।



3

चूंकि रीडिंग /dev/randomकेवल बाइट्स की मात्रा उपलब्ध है, जो आपको ब्लॉक 1 को निर्दिष्ट करना होगा । आपके उदाहरण में, आपने ब्लॉक आकार को 512 पर सेट किया है जो पहले पढ़ने के बाद विफल हो जाता है।

इसलिए, सही तर्क जो 512 बाइट्स को पढ़ता है:

dd if=/dev/random of=filename bs=1 count=512

नोट करें कि जब तक सिस्टम में पर्याप्त एन्ट्रॉपी न हो जाए, तब तक सारा डेटा ब्लॉक हो जाएगा। इसी तरह /dev/randomकाम करता है। यदि आप इंतजार नहीं करना चाहते हैं और आप कम एन्ट्रॉपी के साथ ठीक हैं, तो /dev/urandomइसके बजाय उपयोग करें । बहुतायत में मामलों का उपयोग /dev/urandomकरना पसंद किया जाता है।


स्पष्टीकरण के लिए +1, हालांकि यह कहा जाना चाहिए कि बाइट की गणना 512 के रूप में उच्च का उपयोग करके /dev/randomलगभग अनुपयोगी हो जाती है, क्योंकि कमांड को समाप्त होने में कई मिनट लग सकते हैं। इसके अलावा, यहां तक bs=512 count=1कि ऐसा लगता है कि कॉल अभी भी अवरुद्ध है अगर कोई बाइट्स बिल्कुल भी उपलब्ध नहीं हैं, सही है? स्विचिंग bsऔर countमूल्यों का एक विकल्प उपयोग करना है iflag=fullblock; यानी, bs=512 count=1 iflag=fullblock
mklement0

IMHO, इस उत्तर को @ निर्णायक के एक में विलय कर दिया जाना चाहिए। (यह मेरी समस्या का जवाब था जबकि ब्रेकथ्रू नहीं था)।
सुपरबॉब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.