เช็ด 1MB สุดท้ายของฮาร์ดไดรฟ์


25

มีคำสั่งง่าย ๆ ที่ฉันสามารถใช้เพื่อกำจัดฮาร์ดไดรฟ์ 1MB ล่าสุดหรือไม่

dd if=/dev/zero of=/dev/sdx bs=1M count=1สำหรับการเริ่มต้นของไดรฟ์ผมจะ seekเลือกสำหรับรูปลักษณ์ DD สัญญาว่า แต่คนที่มีวิธีที่ง่ายต่อการตรวจสอบว่าวิธีไกลฉันควรขอ?

ฉันมีอุปกรณ์ RAID ของฮาร์ดแวร์ที่เก็บการกำหนดค่า RAID บางอย่างไว้ที่ส่วนท้ายของไดรฟ์ ฉันต้องการอุปกรณ์ RAID เพื่อดูว่าไดรฟ์นั้นไม่ได้กำหนดค่าดังนั้นฉันต้องการลบการกำหนดค่า RAID โดยไม่ต้องใช้เวลาในการลบไดรฟ์แบบเต็ม ฉันมีไดรฟ์ 2TB โหลและการลบไดรฟ์ทั้งหมดนั้นใช้เวลานาน

คำตอบ:


22

วิธีที่ง่ายที่สุดบน Linux เพื่อให้ได้ขนาดของดิสก์คือblockdev --getsz:

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

ยอดเยี่ยมฉันรู้ว่าต้องมีเครื่องมือที่สามารถปรับขนาดได้อย่างง่ายดาย
Zoredache

1
ในขณะที่ฉันชอบวิธีแก้ปัญหาการใช้sdaตัวอย่างเป็นสิ่งที่อันตรายอย่างยิ่งหากคุณคัดลอกและวางและจัดการเพื่อให้ได้รับสำเนาของการคืนสินค้า sdxจะเหมาะกว่ามาก ฉันใช้ความระมัดระวัง แต่เพียงเพราะพวกเขาไม่ได้ทำลายดิสก์ของฉันตอนนี้
emk2203

@ emk2203 จุดดี ฉันอยากรู้อยากเห็นคุณมีข้อควรระวังในสถานการณ์เช่นนี้?
Hashim

1
ฉันใช้คำพูดเดียวก่อนที่จะวาง หากบรรทัดมีการขึ้นบรรทัดใหม่จะถูกจับได้โดยพร้อมต์เชลล์เนื่องจากจุดสิ้นสุดที่หายไปสำหรับใบเสนอราคา หากทุกอย่างเรียบร้อยฉันไปที่จุดเริ่มต้นของบรรทัดด้วย Ctrl-A จากนั้นลบเครื่องหมายคำพูดแล้วส่งคืน การกดแป้นอีกสามครั้งเพื่อการประกันคุ้มค่า
emk2203

แทนที่จะเป็น / dev / sdx ให้ดูลิงก์ใน / dev / disk / by-id / เช่น nvme-SAMSUNG_MZVLW1TXXXX-000XX_XXXXXXXXXXXX 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 ในตอนท้ายคืออะไร?
Hashim

1
@Hashim คำถามจะถามวิธีลบ 1MB สุดท้าย 1MB สุดท้ายเริ่มต้นที่ 1024kB ก่อนสิ้นสุด
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

3

การใช้การค้นหาเพื่อไปยังจุดสิ้นสุดของไดรฟ์นั้นทำได้ดีมากเช่น:

แสวงหา = $ (( blockdev --getsz /dev/sda- 2048))

อย่างไรก็ตามเมื่อคุณใช้สิ่งนี้ฉันขอแนะนำให้คุณรู้ว่าค่าการนับของคุณถูกต้องหรือไม่ใช้เลย เหตุผลที่ฉันพูดแบบนี้ก็คือไดรฟ์สามารถมีเซกเตอร์ 512 ไบต์หรือเซ็กเตอร์ 4k และถ้าคุณใช้โซลูชันนี้กับไดรฟ์ที่มีเซ็กเตอร์ 4k อยู่คุณจะไม่ไปที่จุดสิ้นสุดของไดรฟ์ด้วยค่าการนับ และอาจพลาดข้อมูล RAID ในตอนท้าย (ฉันพบสิ่งนี้)


คุณช่วยแบ่งปันอะไรก็ได้ที่คุณพบเจอ ฉันรู้สึกทึ่งและสงสัยว่าฉันเข้าใจผิดว่าddภาคที่อยู่เมื่อใช้กับbsค่าที่กำหนดเองมีขนาดเล็กลง / ใหญ่ขึ้นจากนั้นบล็อกขนาดจริงที่รายงานโดยเฟิร์มแวร์ของอุปกรณ์หรือเคอร์เนลลินุกซ์
sjas

2

คุณสามารถรับจำนวนเซ็กเตอร์ในดิสก์hdparm -v /dev/sdxได้ ลองค้นหา number_of_sectors - 2048 (สมมติว่าเป็น 512 ไบต์)


ดูเหมือน hdparm จะมีประโยชน์ แต่ฉันจะตรวจสอบขนาดของภาคได้อย่างไร
Peter.O

1
/sys/block/sdx/queue/physical_block_sizeอาจให้ข้อมูลแก่คุณ แต่ดิสก์ที่ใหม่กว่าบางรุ่นเล่นได้อย่างรวดเร็วและหลวมด้วยขนาดเซกเตอร์ที่รายงาน อาจเป็นการดีกว่าที่จะอ่านฉลากบนดิสก์หรือค้นหาในแผ่นข้อมูลผู้ผลิต

1
ขอบคุณ .. ฉันได้สังเกตเห็นเพียงแค่ว่าhdparm -I /dev/sdaรายการ 2 "รุ่น" ของเซกเตอร์ขนาด: และLogical Physicalนี่คือสิ่งที่คุณหมายถึง "fast-and-loose" หรือไม่ .... ฉัน jsut รับที่ "ความรู้สึก" ว่าถ้ามีอะไรที่เป็นไปประพฤติตนในทางที่มันอาจจะดีระบบ RAID .. มี
Peter.O

1
@ แดง: ฉันไม่สามารถอ้างถึงการอ้างอิงได้ในตอนนี้ แต่ฉันอ่านบางที่ว่าไดรฟ์บางส่วนที่มี 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 ม. เพื่อหลีกเลี่ยงข้อผิดพลาดในการปัดเศษ

หรือคุณสามารถเขียนโปรแกรม C (หรือสคริปต์) ขนาดเล็กซึ่งเรียกใช้lseekฟังก์ชันด้วยSEEK_ENDและออฟเซ็ตเชิงลบ 1mb แล้วเรียกwriteใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.