जब मैं अधिक अनुरोध करता हूं तो 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.