Dd आसन्न विभाजन को अधिलेखित कर सकता है


15

चाहेंगे

dd if=/dev/zero of=somepartition bs=512

के बाद भी विभाजन मिटा somepartitionया अंत somepartition?


5
विभाजन का प्रतिनिधित्व करने वाले ब्लॉक डिवाइस, उदाहरण के लिए /dev/sda1, कर्नेल द्वारा इस तरह से बनाए गए हैं कि उनके माध्यम से आसन्न भंडारण तक पहुंचना असंभव है (यह मानते हुए कि पिछली बार पढ़ने के बाद विभाजन तालिका को बदल नहीं दिया गया था)। यदि आप उस तरह से आसन्न भंडारण तक पहुंच सकते हैं, तो इसे एक विशाल बग माना जाएगा।
डेविड फ़ॉस्टर

जवाबों:


18

के साथ एक विभाजन को अधिलेखित करें dd

ddएक बहुत शक्तिशाली लेकिन खतरनाक उपकरण है। यह वह करता है जो आप इसे बिना किसी प्रश्न के करने के लिए कहते हैं। इसलिए यदि आप इसे पारिवारिक चित्रों को पोंछने के लिए कहते हैं, ... और यह एक छोटी टाइपिंग त्रुटि है।

लेकिन अगर आप चेक और डबल चेक करते हैं, तो आप इसका उपयोग कर सकते हैं।

dd if=/dev/zero of=somepartition bs=512

या मैं सुझाव दूंगा

dd if=/dev/zero of=/dev/sdxn bs=4096

xड्राइव अक्षर कहां है और nविभाजन संख्या है और ब्लॉक आकार 4096 बाइट्स लिखने की प्रक्रिया को तेज करता है।

यह महत्वपूर्ण है कि आप इस मामले में एक विभाजन को लिखें । यदि आप पूरी ड्राइव (ड्राइव हेड एंड) /dev/sdxपर लिखते हैं, तो पूरी ड्राइव ओवरराइट हो जाएगी। लेकिन विभाजन को लिखना विभाजन के अंत में बाधित होगा और इसके पीछे के विभाजन संरक्षित रहेंगे। (मैंने अब ल्यूबंटू 16.04 एलटीएस में एक यूएसबी पेनड्राइव पर परीक्षण किया है , इसलिए मुझे पता है कि यह उसी तरह काम करता है।)

एक विस्तारित विभाजन के लिए अपवाद

एक विस्तारित विभाजन के लिए एक अपवाद है (जो तार्किक विभाजन के लिए एक कंटेनर है, ताकि MSDOS विभाजन तालिका में चार से अधिक विभाजन हों)। यह निम्नलिखित लिंक में वर्णित है,

क्या मैं dd का उपयोग करके 'विस्तारित' विभाजन की छवि बना सकता हूं?

लेकिन एक और समस्या भी है। मैंने परीक्षण वातावरण में आपकी आज्ञा का परीक्षण किया, और dd ने केवल एक kibibyte (1024 बाइट्स) पढ़ा जब मैं चाहता था कि यह एक विस्तारित विभाजन की एक छवि बना सके।

मैंने अब ल्यूबंटू 16.04 एलटीएस में एक यूएसबी पेनड्राइव पर भी इसका परीक्षण किया, और यह लेखन (साथ ही पढ़ने के लिए) पर लागू होता है। केवल पहली kibibyte अधिलेखित है।

इसलिए संक्षेप में, प्राथमिक विभाजन और तार्किक विभाजन को अधिलेखित करना इस उत्तर में मुख्य विवरण के अनुसार काम करता है। लेकिन एक विस्तारित विभाजन को अधिलेखित करने के लिए इस पद्धति का उपयोग न करें क्योंकि केवल पहली किबिबाइट को ओवरराइट किया जाएगा। विस्तारित विभाजन के तार्किक विभाजन अब विभाजन तालिका के माध्यम से नहीं मिलेंगे, लेकिन उनमें संग्रहीत डेटा अभी भी हैं।


मैंने पहले ही स्वीकार कर लिया है, लेकिन अगर ऐसा है तो यह सही उत्तर होना चाहिए।
लॉजिकब्रीकर

3
@ LogicBreaker, शायद आप स्वीकृति को स्थानांतरित कर सकते हैं। लेकिन यह महत्वपूर्ण नहीं है। यह अधिक महत्वपूर्ण है कि आप समझें कि कैसे उपयोग करना है ddऔर यह जोखिम भरा है, ताकि आप इसका उपयोग करते समय बहुत सावधान रहें। सौभाग्य :-) सामान्य रूप से, आपके पास हमेशा सभी फ़ाइलों का बैकअप होना चाहिए , जिसे आप खो नहीं सकते।
सूडोडस

1
नंगे विभाजन के लिए लिखते समय आपके पास कई विकल्प नहीं होते हैं। मैं चला गया, अन्यथा यह दूसरों के लिए भ्रामक होगा।
लॉजिकब्रीकर

1
यही कारण है कि उपयोगकर्ता आमतौर पर / dev / * "फाइल" तक नहीं पहुंच पाते हैं।
थोर्बोजर्न रेवन एंडरसन

1
यदि आपके पास बैकअप के साथ आपके परिवार के फोटो की एकमात्र प्रति है, तो आप चोरी, आग, दुर्घटना, या साधारण हार्डवेयर विफलता से किसी भी समय उन्हें खोने के अधीन हैं :-)
user334639

4

एक विभाजन डिवाइस के लिए लिखता है कि विभाजन के बाहर नहीं होगा, dd या कुछ और के साथ। आपको एक विभाजन के बाहर किसी भी प्रभाव के लिए व्होलडिसक डिवाइस का उपयोग करने की आवश्यकता होगी।

(कैविएट: जब तक आपकी डिस्क में अतिव्यापी विभाजन के साथ विभाजन तालिका नहीं होती है, जो कभी नहीं होनी चाहिए।)


3
एक और चेतावनी: यदि आप LVM जैसी किसी चीज़ का उपयोग कर रहे हैं, तो भौतिक मात्रा में लिखना निश्चित रूप से कई तार्किक संस्करणों को प्रभावित कर सकता है।
मैक्सएमपी

4

मुझे लगता है कि आपका सवाल एक बुनियादी गलतफहमी पर आधारित है कि कैसे dd(और वास्तव में यूनिक्स की तरह ऑपरेटिंग सिस्टम) काम करते हैं:

ddआसन्न विभाजन को अधिलेखित नहीं कर सकता, बस इसलिए कि ddविभाजन, अवधि को अधिलेखित नहीं कर सकता ।

ddबस फ़ाइलों को लिखता है । बस।

अब, यदि आपdd एक फाइल पास करते हैं जो कई विभाजनों का प्रतिनिधित्व करती है , तो उस फाइलdd को ओवरराइट कर देगा । लेकिन उस मामले में, यह ddविभाजन के अंत में नहीं लिख रहा है। ddअभी भी फ़ाइल के अंत तक लिखेंगे, और केवल फ़ाइल के अंत तक।

लेकिन, यदि आप ddएक फाइल पास करते हैं जो केवल एक विभाजन का प्रतिनिधित्व करती है, तो ddइस विभाजन के अंत में पिछले नहीं लिखेंगे। फिर, इससे कोई लेना-देना नहीं है ddddबस उस फ़ाइल को लिखता है जिसे आप इसे लिखना चाहते हैं। तथ्य यह है कि यह फ़ाइल एकल विभाजन का प्रतिनिधित्व करती है (इस मामले में) कर्नेल में ब्लॉक डिवाइस ड्राइवर द्वारा सुनिश्चित की गई है। ddउससे कोई लेना-देना नहीं है।

तो, संक्षेप में: ddफ़ाइलों को लिखता है। उन फ़ाइलों का प्रतिनिधित्व करते हैं, ddचिंता का कोई नहीं है । ddविभाजन के बारे में कुछ नहीं पता है।


Mhh ... dd केवल फाइलों में लिखने के साथ, आप इसे कच्चे विभाजन में लिखने के लिए उपयोग नहीं कर सकते।
लॉजिकब्रीकर

1
सही बात। आप ddकच्चे विभाजन में लिखने के लिए उपयोग नहीं कर सकते । आप केवल फाइलों पर लिख सकते हैं। आप निश्चित रूप से एक ब्लॉक डिवाइस फाइल को लिख सकते हैं जो एक विभाजन (जैसे ) का प्रतिनिधित्व करती है /dev/sda1, लेकिन आप एक कच्चे विभाजन को नहीं लिख सकते। और चूँकि आप केवल एक फाइल को लिख सकते हैं जो विभाजन का प्रतिनिधित्व करती है, आप विभाजन के अंत को नहीं लिख सकते हैं, क्योंकि फाइल केवल विभाजन का प्रतिनिधित्व करती है, और विभाजन का नहीं और अंत से थोड़ा अतीत।
जोर्ग डब्ल्यू मित्तग

3
जोर्ग यूनिक्स दर्शन के मुख्य विचारों में से एक को संदर्भित करता है - "सब कुछ एक फ़ाइल है"। जैसे, कर्नेल फाइलों के रूप में पेटेंट, डिवाइस, पोर्ट आदि प्रस्तुत करता है। नतीजतन, हर प्रोग्राम जो एक फ़ाइल में लिख सकता है उसका उपयोग विभाजन या डिवाइस पर लिखने के लिए किया जा सकता है। विभाजन की सीमा को लागू करना कर्नेल का काम है। आप /dev/sdaअपने टेक्स्ट एडिटर में खोल सकते हैं और डेटा को बदल ddसकते हैं, विभाजन तक पहुंचने में सक्षम होने के मामले में किसी भी अन्य कार्यक्रम से अलग नहीं है। बहुत अच्छा जवाब!
सर्गेई

1

एक खतरनाक, लेकिन दुर्लभ विशेष परिदृश्य है जिसमें यह गैर-छोटी गाड़ी ब्लॉक डिवाइस ड्राइवरों के साथ भी हो सकता है:

  • डिस्क पर विभाजन तालिका इस तरह से बदली जाती है कि विभाजन एक्स को पहले की तुलना में कम सीमा पर समाप्त करने के लिए आकार दिया जाता है। या तो इसके पीछे विभाजन y का आकार कम सीमा पर शीर्ष प्रारंभ है, या अंतरिक्ष में एक नया विभाजन y जोड़ा जाता है।
  • विभाजन y प्रासंगिक डेटा से भरा है जिसका अर्थ है कि विभाजन तालिका से स्वतंत्र हैं, जैसे कि संपूर्ण डिस्क ब्लॉक डिवाइस पर स्किप / काउंट विकल्पों के साथ dd का उपयोग करना (जैसे / dev / sda)
  • Ioctl जो कर्नेल को विभाजन तालिका को फिर से लिखने के लिए कहता है, जारी नहीं किया जाता है, या व्यस्त उपकरणों के कारण विफल रहता है
  • विभाजन x किसी भी प्रक्रिया द्वारा लिखा जाता है जो इसे लिखने की कोशिश करता है जब तक कि यह एक त्रुटि स्थिति नहीं मारता है।

0

आपको dd से सावधान रहना होगा जैसे कि यदि आप कोई गलती करते हैं तो आप उससे अधिक सौदेबाजी कर सकते हैं जिसके लिए आप सौदेबाजी कर रहे हैं और यह इस बात पर निर्भर करता है कि आप dd के लिए क्या उपयोग कर रहे हैं (dd के उपयोग में ओपी अस्पष्ट था और dd का सटीक सिंटैक्स। आदेश)।

यदि आप एक विभाजन निर्दिष्ट करते हैं तो यह उस विभाजन को लिख देगा जब तक कि विभाजन पूरा नहीं हो जाता।

यदि आप कोई गलती करते हैं और पूरी ड्राइव डालते हैं, तो उदाहरण के लिए = / dev / sda, dd पूरे ड्राइव को लिखना शुरू कर देगा ताकि आपकी विभाजन तालिका की अनदेखी (और ओवरराइटिंग) हो।

आप हमें डिलीट की गई फाइलों को ओवरराइट करने के लिए एक पार्टीशन पर dd भी कर सकते हैं (डिलीट की गई फाइल्स विभाजन पर बनी रह सकती हैं और विभिन्न रिकवरी टूल्स द्वारा सफलता की विभिन्न डिग्री के साथ खोज की जाती हैं, जब तक कि वे लिखित न हों। इस मामले में आप फ्री स्पेस भरने के लिए dd का उपयोग कर सकते हैं। एक फ़ाइल के लिए लेखन।

dd if=/dev/zero of=/path/to/mount_point/zero_file bs=4096
rm -f /path/to/mount_point/zero_file

आप जो भी कर रहे हैं, उसके आधार पर, आप फ़ाइलों को सुरक्षित रूप से हटाने के लिए एक वैकल्पिक उपकरण का उपयोग करना चाह सकते हैं। देखें कि कैसे सुरक्षित तरीके से फ़ाइल को हटाएं? विकल्पों के लिए।


6
यदि आप / dev / sdcX को लिख सकते हैं और एक विभाजन सीमा में लिखने का प्रबंधन कर सकते हैं, तो यह dd नहीं होगा कि विभाजन तालिका को अनदेखा करना - यह कर्नेल में ब्लॉक डिवाइस ड्राइवर होगा जो छोटी गाड़ी है और विभाजन तालिका को अनदेखा कर रहा है।
रकंडबॉम्बेनमैन

1
@ सूडोडस ddवह निम्न स्तर नहीं है। वास्तव में लोगों द्वारा उपयोग की जाने वाली अधिकांश चीजें ddबस उसी के साथ की जा सकती थीं cat। वास्तव में catयह थोड़ा तेज है क्योंकि यह ddडिफ़ॉल्ट रूप से बड़े ब्लॉक का उपयोग करता है। सभी निम्न स्तर का कोड कर्नेल में है। और ड्राइवर वास्तव में परवाह नहीं करता है यदि आप उपयोग कर रहे हैं ddया cat
कास्परड

1
@sudodus - भ्रम के लिए खेद है, मैं उतना स्पष्ट नहीं था जितना कि मेरा इरादा था। dd निश्चित रूप से लिखता रह सकता है, इस पर निर्भर करता है कि आप इसे क्या करते हैं। dd if=/dev/zero of=/dev/sda bs=512 count=1या dd if=/dev/zero of=/dev/sda bs=512उदाहरण हैं। दूसरे कमांड के साथ यह विभाजन तालिका को "अनदेखा" करते हुए पूरी डिस्क को लिखता रहेगा और भरता रहेगा। यदि आप एक विभाजन निर्दिष्ट करते हैं तो dd if=/dev/zero of=/dev/sda1यह विभाजन से आगे नहीं जाएगा। Dd के साथ आप क्या करना चाहते हैं, इस पर निर्भर करता है।
पैंथर

1
@Panther प्रश्न विशेष रूप से कहता है of=somepartition, इसलिए ऐसा मामला जहां आप पूरी डिस्क डिवाइस पर लिखते हैं वह लागू नहीं होता है। ddडिवाइस ड्राइवर के प्रतिबंधों के आसपास नहीं जा सकते।
बारमर

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