擦除硬盘上的最后1MB


25

有没有简单的命令可以将硬盘的最后1MB归零?

为了开始开车,我会的dd if=/dev/zero of=/dev/sdx bs=1M count=1seekdd 的选项看起来很有前途,但是有人可以轻松地确定我应该寻找的距离吗?

我有一个硬件RAID设备,它在驱动器的末尾存储一些RAID配置。我需要RAID设备将驱动器视为未配置,因此我想删除RAID配置,而不必花费时间来完全擦除驱动器。我有十几个2TB驱动器,而要完全擦除所有这些驱动器将需要很长时间。

Answers:


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
我在粘贴之前使用单引号。如果该行包含回车符,则由于缺少引号结尾,它会被shell提示捕获。如果一切正常,我用Ctrl-A转到行的开头,然后删除引号,然后返回。值得再三击保险。
emk2203 '18

代替/ dev / sdx,请查看/ dev / disk / 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结尾的原因是什么?
Hashim

1
@Hashim问题询问如何擦除最后1MB。最后1MB从结尾处开始1024kB。
吉尔斯(Gilles)'所以

3

使用搜索到达驱动器的末尾效果很好,即:

seek = $((blockdev --getsz /dev/sda-2048))

但是,使用此方法时,建议您要么知道计数值正确,要么根本不使用它。我之所以这样说,是因为驱动器可以具有512字节扇区或4k扇区,如果将此解决方案与具有4k扇区的驱动器一起使用,则不会使用该计数值到驱动器的末尾,并可能会错过最后的RAID信息(我已经遇到了)。


您能否以某种方式分享您遇到了什么?我很感兴趣,想知道我是否误解了dd在使用bs比设备固件或linux内核报告的实际块大小小/大的自定义值时如何处理扇区。
sjas 17-4-27的

2

您可以使用来获取磁盘上的扇区数hdparm -v /dev/sdx。尝试寻找number_of_sectors-2048(假设512字节扇区)。


hdparm似乎很方便,但是如何检查扇区大小?
Peter.O 2011年

1
/sys/block/sdx/queue/physical_block_size可能会为您提供信息,但是某些较新的磁盘将根据它们报告的扇区大小快速而松散地播放。最好阅读磁盘上的标签或在制造商的数据表中查找它。

1
谢谢..我刚刚注意到hdparm -I /dev/sda列出了扇区大小的2个“版本”:LogicalPhysical。这是您所说的“快而松”的意思吗?....我仅仅指刚拿到“感觉”如果有什么打算以这样的方式来表现它很可能是一个RAID系统..
Peter.O

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

我没有使用1m的块大小来避免舍入错误。

或者,您可以编写一个小的C程序(或脚本),该程序lseek使用SEEK_END且具有1mb的负偏移量来调用该函数,然后调用write

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.