एक हार्ड ड्राइव के अंतिम 1 एमबी को पोंछें


25

वहाँ एक आसान आदेश है कि मैं एक हार्ड ड्राइव के अंतिम 1 एमबी को शून्य करने के लिए उपयोग कर सकता हूं?

ड्राइव की शुरुआत के लिए मैं करूंगा dd if=/dev/zero of=/dev/sdx bs=1M count=1seekDd का विकल्प आशाजनक लगता है, लेकिन क्या किसी को यह निर्धारित करने का एक आसान तरीका है कि मुझे कितनी दूर तक तलाश करनी चाहिए?

मेरे पास एक हार्डवेयर RAID उपकरण है, जो ड्राइव के अंत में कुछ RAID कॉन्फ़िगरेशन को संग्रहीत करता है। मुझे ड्राइव को अन-कॉन्फिगर्ड के रूप में देखने के लिए RAID उपकरण की आवश्यकता है, इसलिए मैं ड्राइव को पूरा पोंछने के लिए समय बिताने के बिना RAID कॉन्फ़िगरेशन को निकालना चाहता हूं। मेरे पास एक दर्जन 2TB ड्राइव्स हैं, और उन सभी ड्राइव्स का पूरा खाका एक लंबा समय लेगा।

जवाबों:


22

डिस्क का आकार प्राप्त करने के लिए लिनक्स पर सबसे सरल तरीका blockdev --getszनिम्न है:

sudo -s
dd bs=512 if=/dev/zero of=/dev/sdx count=2048 seek=$((`blockdev --getsz /dev/sdx` - 2048))

उत्कृष्ट, मुझे पता था कि एक ऐसा उपकरण होना चाहिए जो आसानी से आकार प्राप्त कर सके।
ज़ॉडेचेआ

1
जबकि मुझे समाधान पसंद है, sdaउदाहरण के रूप में उपयोग करना बहुत खतरनाक है यदि आप कॉपी और पेस्ट करते हैं और गाड़ी की वापसी की नकल प्राप्त करने का प्रबंधन करते हैं। sdxज्यादा बेहतर होगा। मैं सावधानी बरतता हूं, लेकिन केवल उनकी वजह से मैंने अभी अपनी डिस्क को नष्ट नहीं किया है।
emk2203

@ emk2203 अच्छी बात है। मैं उत्सुक हूं, ऐसे परिदृश्यों के लिए आपके पास क्या सावधानियां हैं?
हाशिम

1
मैं चिपकाने से पहले एक ही उद्धरण का उपयोग करता हूं। यदि लाइन में एक गाड़ी वापसी है, तो यह उद्धरण के लिए लापता छोर के कारण शेल प्रॉम्प्ट द्वारा पकड़ा जाता है। यदि सब कुछ ठीक है, तो मैं Ctrl-A के साथ लाइन की शुरुआत में जाता हूं, फिर बोली हटाता हूं, फिर लौटता हूं। बीमा के लिए तीन और कीस्ट्रोक्स, इसके लायक हैं।
emk2203

/ Dev / sdx के बजाय, / dev / डिस्क / by-id / जैसे nvme-SAMSUNG_MZVLW1TXXXX-000XX_XXXXXXXXX लिंक देखें। ls -l / dev / disk / by-id / लिंक नाम दिखाएगा और / dev / sdX इसे लिंक करता है।
rcpa0

6

हर विभाजन का आकार उपलब्ध है /proc/partitions। निम्न आदेश sdx(kB इकाइयों में) का आकार दिखाता है :

awk '$4 == "sdx" {print $3}' </proc/partitions

इस प्रकार:

dd if=/dev/zero of=/dev/sdx bs=1k count=1024 \
   seek=$(($(awk '$4 == "sdx" {print $3}' </proc/partitions) - 1024))

आखिरकार -1024 का कारण क्या है?
हाशिम

1
@ हाशिम सवाल पूछता है कि आखिरी 1 एमबी को कैसे मिटाया जाए। अंतिम 1MB अंत से पहले 1024kB शुरू होता है।
गाइल्स का SO- बुराई पर रोक '22

3

ड्राइव के अंत में आने के लिए खोज का उपयोग करना बहुत अच्छी तरह से काम करता है, अर्थात:

चाह = $ (( blockdev --getsz /dev/sda- २०४)))

हालाँकि, जब आप इसका उपयोग करते हैं, तो मैं आपको सलाह देता हूं कि या तो आप यह जान लें कि आपका गणना मूल्य सही है, या इसका उपयोग बिल्कुल भी न करें। मेरे कहने का कारण यह है कि ड्राइव में 512 बाइट सेक्टर या 4k सेक्टर हो सकते हैं, और यदि आप इस समाधान का उपयोग उस ड्राइव के साथ करते हैं, जिस पर 4k सेक्टर हैं, तो आप उस गणना मान के साथ ड्राइव के अंत में नहीं जाएंगे, और अंत में RAID जानकारी याद कर सकते हैं (मैं इस में चला है)।


क्या आप किसी तरह साझा कर सकते हैं कि आप वास्तव में भागे हैं? मैं यह सोचकर ddअंतर्ग्रही हो जाता हूं कि अगर मैं गलतफहमी करता हूं कि कस्टम bsमान छोटे / बड़े के साथ उपयोग किए जाने पर सेक्टरों को कैसे प्रभावित करता है, तो डिवाइस के फर्मवेयर या लिनक्स कर्नेल द्वारा रिपोर्ट किए गए वास्तविक ब्लॉक करें।
एसजे

2

आप डिस्क पर सेक्टर्स की संख्या प्राप्त कर सकते हैं hdparm -v /dev/sdx। नंबर_ऑफ_सेक्टर्स - 2048 (512 बाइट क्षेत्रों को मानते हुए) की कोशिश करें।


एचडीपीआर काम में लगता है, लेकिन मैं सेक्टर का आकार कैसे जांचूंगा?
पीटर।

1
/sys/block/sdx/queue/physical_block_sizeआपको जानकारी दे सकते हैं, लेकिन कुछ नए डिस्क तेजी से और ढीले खेलते हैं, जो सेक्टर के आकार के साथ रिपोर्ट करते हैं। डिस्क पर लेबल को पढ़ना या निर्माताओं के डेटा पत्रक में इसे देखना शायद बेहतर है।

1
धन्यवाद .. मैंने अभी देखा है कि hdparm -I /dev/sdaसेक्टर आकार के 2 "संस्करणों" को सूचीबद्ध करता है: Logicalऔर Physical। क्या इसका मतलब है "फास्ट-एंड-लूज" से? .... मुझे लगता है कि "महसूस" jsut मिलता है कि अगर कुछ भी इस तरह से व्यवहार करने जा रहा है तो यह एक अच्छी तरह से एक RAID प्रणाली हो सकता है ..
पीटर

1
@red: मैं अब संदर्भ नहीं दे सकता, लेकिन मैंने कहीं पढ़ा है कि 4096 बाइट क्षेत्रों के साथ कुछ ड्राइव सिस्टम को रिपोर्ट करेंगे कि वे 512byte हैं और फिर आंतरिक रूप से रूपांतरण की डील करेंगे।

1

आप उपयोग कर सकते हैं ddऔर डिवाइस का आकार प्राप्त कर सकते हैं fdisk:

dd if=/dev/zero of=/dev/sda bs=1k \
   seek=$(( (`fdisk -l /dev/sda | grep 'Disk /' | cut -d' ' -f 5` -1024*1024)/1024  )) count=1024

मैं गोलाई त्रुटियों से बचने के लिए 1 मी के एक ब्लॉकसेक का उपयोग नहीं कर रहा हूं।

वैकल्पिक रूप से, आप एक छोटा सी-प्रोग्राम (या स्क्रिप्ट) लिख सकते हैं जो lseekफ़ंक्शन SEEK_ENDको 1mb के नकारात्मक ऑफसेट और फिर कॉल करता है write

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