Dd का उपयोग करते समय मेरा / dev / random इतना धीमा क्यों है?


29

मैं हार्ड ड्राइव का एक गुच्छा अर्ध-सुरक्षित रूप से मिटाने की कोशिश कर रहा हूं। निम्नलिखित 20-50Mb / s पर काम कर रहा है

dd if=/dev/zero of=/dev/sda

परंतु

dd if=/dev/random of=/dev/sda 

काम करने के लिए नहीं लगता है। जब मैं टाइप करता हूं

dd if=/dev/random of=stdout

यह केवल मुझे कुछ बाइट्स देता है चाहे मैं इसे bs = और count = के लिए पास करूँ

क्या मैं / देव / यादृच्छिक गलत का उपयोग कर रहा हूँ? इस समस्या निवारण को आगे बढ़ाने के लिए मुझे और कौन सी जानकारी देखनी चाहिए? क्या स्क्रिप्ट या कुछ और के साथ ऐसा करने का कोई और तरीका है

makeMyLifeEasy | dd if=stdin of=/dev/sda

या कुछ इस तरह का...


1
बस एक नोट के रूप में: जब तक आपको अपने डेटा के बाद सीआईए के जाने पर संदेह है, शून्य (/ देव / शून्य) के साथ एक एकल ओवरराइट शायद पर्याप्त है। चर्चा के लिए उदाहरण देखें superuser.com/questions/215852/…
sleske

क्यों से पढ़ने के लिए के रूप में /dev/randomकेवल कुछ बाइट्स देता है, देखते हैं superuser.com/a/712515/139307
mklement0

जवाबों:


42

दोनों /dev/randomऔर /dev/urandomएक "एन्ट्रापी पूल" का उपयोग करें। जब पूल बाहर निकलता है, तो /dev/randomइसे फिर से भरने के लिए इंतजार करता है, जिसके लिए निगरानी प्रणाली व्यवहार (कीबोर्ड इनपुट, माउस आंदोलन, आदि) की आवश्यकता होती है, जबकि /dev/urandomआप छद्म यादृच्छिक डेटा देना जारी रखेंगे। /dev/randomसैद्धांतिक रूप से उच्च गुणवत्ता है, लेकिन /dev/urandomलगभग निश्चित रूप से आपके उद्देश्यों के लिए काफी अच्छा है। (लेकिन /dev/urandomसंभवत: कुछ अन्य तरीकों की तुलना में धीमी गति से भी हो सकता है। हार्ड ड्राइव को मिटाने के लिए एक तेज, लेकिन कम गुणवत्ता वाला, जनरेटर शायद काफी अच्छा है। यह स्पष्ट नहीं है कि एक हमलावर को उस अनुक्रम को जानने से कोई फायदा होगा जो उत्पन्न होने वाला है, या। यादृच्छिक संख्या इस उद्देश्य के लिए 0, 1, 2, 3, 4, .... जैसे अनुक्रम से बेहतर हैं ।)

random(4)आदमी पृष्ठ का हवाला देते हुए :

यदि आप इस बारे में अनिश्चित हैं कि आपको इसका उपयोग करना चाहिए /dev/randomया /dev/urandom, तो शायद आप बाद का उपयोग करना चाहते हैं। एक सामान्य नियम के रूप में, /dev/urandomलंबे समय तक रहने वाले GPG / SSL / SSH कुंजियों को छोड़कर हर चीज के लिए उपयोग किया जाना चाहिए।

अद्यतन : जब से मैंने लिखा है कि `यादृच्छिक (4) मैन पेज अपडेट किया गया है। अब यह कहता है:

/dev/randomइंटरफ़ेस एक विरासत इंटरफेस माना जाता है, और /dev/urandomपसंद किया जाता है और सभी उपयोग के मामलों में पर्याप्त, आवेदन जो जल्दी बूट समय के दौरान अनियमितता की आवश्यकता होती है के अपवाद के साथ; इन अनुप्रयोगों के लिए, getrandom(2)इसके बजाय उपयोग किया जाना चाहिए, क्योंकि यह तब तक अवरुद्ध होगा जब तक कि एंट्रॉपी पूल को प्रारंभ नहीं किया जाता है।

थॉमस हुनन द्वारा " मिथकों के बारे में / देव / आरेख " भी देखें ।

लेकिन /dev/urandom, भले ही यह ब्लॉक न हो, अगर आप भारी मात्रा में डेटा उत्पन्न करना चाहते हैं, तो यह बहुत धीमा होने की संभावना है। इसे आज़माने से पहले अपने सिस्टम पर कुछ माप लें।

संपादित करें: निम्नलिखित "सत्य" यादृच्छिक संख्या बनाम छद्म यादृच्छिक संख्या पर एक विषयांतर है। यदि आप जिस विषय में रुचि रखते हैं, वह प्रश्न का व्यावहारिक उत्तर है, तो आप अभी पढ़ना बंद कर सकते हैं।

मुझे लगता है कि दावे (यहां अन्य उत्तरों में शामिल हैं) जो कि /dev/randomछद्म-यादृच्छिक संख्या जनरेटर (PRNG) के विपरीत "सही" यादृच्छिक संख्या जनरेटर को लागू करता है। उदाहरण के लिए, विकिपीडिया लेख ऐसा दावा करता है। मुझे विश्वास नहीं है कि यह सही है। यहाँ इसकी कुछ चर्चा है जो हार्डवेयर रैंडम नंबर जनरेटर को संदर्भित करती है, लेकिन मुझे कोई सबूत नहीं दिखता है कि /dev/randomआमतौर पर इस तरह के डिवाइस का उपयोग किया जाता है, या कि विशिष्ट कंप्यूटरों में भी ऐसा उपकरण होता है। वे PRNGs से C rand()फ़ंक्शन की तरह भिन्न होते हैं , जिसमें वे निर्धारक नहीं होते हैं, क्योंकि वे उन स्रोतों से कटाई करते हैं जो व्यावहारिक रूप से अप्रत्याशित हैं।

मैं कहता हूँ कि "यादृच्छिक" संख्या जनरेटर के तीन वर्ग हैं:

  1. नियतात्मक PRNGs, C के rand()फंक्शन की तरह , जो बार-बार क्रमबद्ध अनुक्रम के सांख्यिकीय गुणों वाले (अधिक या कम) दोहराए जाने वाले दृश्यों को उत्पन्न करने के लिए एक एल्गोरिथ्म का उपयोग करते हैं। ये गेम के लिए पर्याप्त हो सकते हैं (उन्हें सीडिंग करने का अच्छा तरीका दिया गया है), और उन अनुप्रयोगों के लिए आवश्यक हैं जिनके लिए पुनरावृत्ति की आवश्यकता होती है, लेकिन वे क्रिप्टोग्राफी के लिए उपयुक्त नहीं हैं।

  2. जेनरेटर जैसे /dev/randomऔर /dev/urandomउस कटाई को कुछ व्यावहारिक रूप से अप्रत्याशित स्रोत जैसे I / O गतिविधि से काटते हैं (यही कारण है कि कीबोर्ड पर तेज़ चलना या माउस हिलाना /dev/randomअधिक डेटा उत्पन्न कर सकता है)। यह स्पष्ट नहीं है (मेरे लिए) कि क्या ये PRNG की परिभाषा को संतुष्ट करते हैं (मैंने ऐसी परिभाषाएँ देखी हैं जो कहती हैं कि PRNG नियतात्मक है), लेकिन न तो वे सच यादृच्छिक संख्या जनरेटर हैं।

  3. हार्डवेयर यादृच्छिक संख्या जनरेटर जो अपने प्रारंभिक राज्य के पूर्ण ज्ञान के साथ भी शारीरिक रूप से अप्रत्याशित हैं, और इसके अलावा सही सांख्यिकीय गुणों को सुनिश्चित करने के लिए गणितीय तकनीकों का उपयोग करते हैं।


2
यहां तक ​​कि अगर आप डिस्क स्थान (उन पर एन्क्रिप्टेड फ़ाइल सिस्टम बनाने से पहले) पूरी तरह से डिस्क स्पेस की भारी मात्रा में भरना है, तो भी / dev / urandom एक तरह का धीमा है। यह उत्कृष्ट उत्तर और विस्तृत विवरण के छोटे जोड़ के रूप में लिया जाना चाहिए।
vtest

चूँकि आप एक यादृच्छिक बिट से एक से अधिक एन्ट्रापी की गणना / व्युत्पन्न / बना / नहीं कर सकते हैं, कुछ भी जो इनपुट के रूप में प्राप्त की तुलना में अधिक 'रैंडम' बिट्स उत्पन्न / उत्पन्न करता है, परिभाषा द्वारा छद्म यादृच्छिक सबसे अच्छा है। इसलिए, /dev/urandomस्पष्ट रूप से छद्म यादृच्छिक है। /dev/randomइसमें अंतर यह है कि यह अपने इनपुट की एन्ट्रापी का एक रूढ़िवादी अनुमान लगाने की कोशिश करता है और इससे अधिक एन्ट्रापी का उत्पादन नहीं करता है (ऐसा लगता है) वास्तव में कर सकते हैं। यह एक समर्पित TRNG डिवाइस की उपस्थिति से स्वतंत्र है, क्योंकि किसी भी प्रकार की स्वतंत्र घटनाओं से भी सही एंट्रोपी प्राप्त की जा सकती है, जैसे कीबोर्ड या नेटवर्क IO बनाम समय।
जिमीबी

13

/dev/randomसच एंट्रोपी का एक स्रोत है, वास्तव में यादृच्छिक बाइट्स। जैसे, इसे यादृच्छिकता के स्रोत की आवश्यकता है। आप इसे पढ़कर यादृच्छिकता का 'उपयोग' कर सकते हैं। यह आपको वह सब यादृच्छिकता देगा जो उसके पास है, तब तक ब्लॉक करें जब तक कि वह अधिक न हो जाए। आप शायद बस इंतज़ार कर रहे हैं, और मशीन को बहुत कम यादृच्छिकता मिलती है, और यह बस इंतजार करती है।

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


10
नहीं, /dev/random"वास्तव में यादृच्छिक बाइट्स" उत्पन्न नहीं करता है। यह उच्च-गुणवत्ता वाले छद्म - आयामी बाइट्स की तुलना में /dev/urandomउत्पन्न करता है।
कीथ थॉम्पसन

7

लिनक्स में / dev / random एक विशेष फ़ाइल है जो उच्च गुणवत्ता वाले छद्म यादृच्छिक संख्याओं पर कार्य करती है। यह कार्यान्वयन कीबोर्ड, माउस, डिस्क और सिस्टम से उत्पन्न होने वाली घटनाओं से एंट्रॉपी एकत्र करता है। ( इस दस्तावेज़ को देखें ) इसलिए जब ऐसी कोई घटना नहीं होती है, तो एंट्रॉपी पूल खाली होता है, जब तक अतिरिक्त पर्यावरणीय शोर इकट्ठा नहीं होता है, तब तक / देव / यादृच्छिक से पढ़ता है। यह आपकी समस्या की व्याख्या करता है। एन्ट्रापी पूल को भरने के लिए आप कीबोर्ड पर कीज़ दबा सकते हैं।

दूसरे नोट पर सही मायने में यादृच्छिक संख्या जनरेटर हार्डवेयर यादृच्छिक संख्या जनरेटर का उपयोग करता है जो भौतिक प्रक्रियाओं से यादृच्छिक संख्या उत्पन्न करता है। इन प्रक्रियाओं में सूक्ष्म घटनाएं शामिल हैं जो एक निम्न-स्तर, सांख्यिकीय यादृच्छिक "शोर" संकेत उत्पन्न करती हैं, जैसे थर्मल शोर या फोटोइलेक्ट्रिक या नोट। अन्य शारीरिक घटनाएं। ये प्रक्रियाएं, सिद्धांत रूप में, पूरी तरह से अप्रत्याशित हैं, और सिद्धांत की अप्रत्याशितता के दावे प्रायोगिक परीक्षण के अधीन हैं।

एक हार्डवेयर रैंडम नंबर जेनरेटर में आमतौर पर भौतिक घटना के कुछ पहलू को विद्युत संकेत में परिवर्तित करने के लिए एक ट्रांसड्यूसर होता है, जो एक मैक्रोस्कोपिक स्तर पर यादृच्छिक उतार-चढ़ाव के आयाम को बढ़ाने के लिए एक एम्पलीफायर और अन्य इलेक्ट्रॉनिक सर्किटरी, और डिजिटल कनवर्टर के कुछ प्रकार के एनालॉग के लिए होता है। आउटपुट को डिजिटल नंबर में बदलने के लिए, अक्सर एक साधारण बाइनरी अंक 0 या 1. यादृच्छिक रूप से अलग-अलग सिग्नल को बार-बार नमूना करके, यादृच्छिक संख्याओं की एक श्रृंखला प्राप्त की जाती है।

हार्डवेयर रैंडम नंबर जेनरेटर डिवाइस चालकों और अन्य स्रोतों से पर्यावरणीय शोर को एक एंट्रोपी पूल में इकट्ठा करता है। इस एंट्रॉपी पूल से रैंडम नंबर बनाए जाते हैं। जब पढ़ा जाता है, तो / देव / यादृच्छिक उपकरण एंट्रॉपी पूल में शोर की बिट्स की अनुमानित संख्या के भीतर केवल यादृच्छिक बाइट्स लौटाएगा। यह आपकी समस्या की व्याख्या करता है।

हार्डवेयर RNG के कुछ कार्यान्वयन को कर्नेल डॉक्टर और डिवाइस पर जानकारी में समझाया गया है

/ Dev / random का एक प्रतिरूप / dev / urandom ("अनलॉक्ड" / नॉन-ब्लॉकिंग रैंडम सोर्स) है जो आंतरिक पूल को अधिक छद्म-यादृच्छिक बिट्स का उत्पादन करने के लिए पुन: उपयोग करता है। इसका मतलब है कि कॉल ब्लॉक नहीं होगी, लेकिन आउटपुट में / देव / यादृच्छिक से संबंधित रीड की तुलना में कम एन्ट्रॉपी हो सकती है।

इसलिए यदि आपका इरादा CSPRNG (क्रिप्टोग्राफिक रूप से सुरक्षित छद्म आयामी संख्या जनरेटर) उत्पन्न करने का नहीं है, तो आपको / dev / urandom का उपयोग करना चाहिए।


क्या /dev/randomवास्तव में थर्मल शोर जैसे स्रोतों का उपयोग किया जाता है? मेरी समझ यह है कि यह (अपेक्षाकृत) अप्रत्याशित प्रणाली की स्थिति से जानकारी का उपयोग करता है, जैसे कि I / O गतिविधि और प्रक्रिया की स्थिति। मुझे नहीं लगता कि अधिकांश लिनक्स सिस्टम में हार्डवेयर भी होते हैं जो थर्मल शोर को काट सकते हैं। क्या आप इस पर कुछ प्रलेखन का हवाला दे सकते हैं?
कीथ थॉम्पसन

हाँ आप सही है। मेरे द्वारा बताई गई जानकारी जेनेरिक हार्डवेयर रैंडम नंबर जेनरेटर के लिए लागू है।
सचिन दिवेकर

लिंक पर लिनक्स में इसे कैसे लागू किया गया है, इस पर डॉक्टर को देखें । वहाँ यह उल्लेख किया गया है कि एक पीसी वातावरण में, LRNG कीबोर्ड, माउस, डिस्क और सिस्टम से उत्पन्न होने वाली घटनाओं से एन्ट्रापी एकत्र करता है। अन्य वातावरणों में, LRNG उपलब्ध संसाधनों से एन्ट्रॉपी इकट्ठा करता है। उदाहरण के लिए, एक OpenWRT राउटर में एक हार्ड डिस्क, माउस और कीबोर्ड शामिल नहीं होता है और इसलिए इनका उपयोग एंट्रोपी स्रोत के रूप में नहीं किया जा सकता है। दूसरी ओर, राउटर नेटवर्क इवेंट्स से एंट्रॉपी इकट्ठा करता है।
सचिन दिवेकर

शायद आप अपना जवाब अपडेट कर सकते हैं। मुझे विश्वास नहीं है कि यह कहना सही है कि /dev/random"वास्तव में यादृच्छिक संख्या" उत्पन्न होती है।
कीथ थॉम्पसन

विकिपीडिया पर / dev / यादृच्छिक लेख कहता है, लिनक्स पहले पैराग्राफ में इस तरह से एक सच्चे यादृच्छिक संख्या जनरेटर को लागू करने वाला पहला ऑपरेटिंग सिस्टम था।
सचिन दिवेकर

2

आपके प्रश्न का उत्तर दिए बिना - यहाँ पहले से ही पूर्ण उत्तर हैं - आप डारिक के बूट और न्यूक उर्फ डीबीएन की भी जांच कर सकते हैं जो एक लाइव-सीडी ड्राइव वाइपर है।


0

बस उस shredकमांड का उपयोग करें जो कोरुटिल्स के साथ आता है। यह एक कुशल तरीके से यादृच्छिक डेटा का उपयोग करता है। dd एक निम्न स्तर का उपकरण है और इस कार्य के लिए शायद यह बहुत कम स्तर है। shredउदाहरण के लिए डिवाइस के अलिखित भागों को कुशलतापूर्वक छोड़ देगा।

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