部分擦除磁盘

部分擦除磁盘

在将硬盘赠予他人之前,我需要先将其擦除,但我希望能够分段擦除,以便可以在中间的不同时间点停止并继续。例如,如果擦除磁盘需要 24 小时,但我每晚只有 6-8 小时的空闲时间,那么我希望将 USB 硬盘插入笔记本电脑进行夜间擦除,第二天早上拔下电源并带走笔记本电脑,然后在第二天晚上继续擦除,直到完全完成。

dd我在 Linux 终端上使用例如

$ nohup dd if=/dev/zero of=/dev/sdX bs=1M &

我最初的想法是简单地用 来监控其进度kill -USR1 ${ddpid},跟踪它,然后在中断后从上次中断的地方继续。但我很快就不喜欢这种方式,因为第一次尝试时我就搞砸了数学,还浪费了时间重新擦拭已经擦拭过的区域。

我现在正在考虑预先对驱动器进行分区,然后一次擦除一个分区或一次擦除几个分区。由于它是 4 TB 的磁盘,我无法使用 超过 2 TB 的边界fdisk,因此我过去常常gdisk创建新的分区:

Device          Start        End   Sectors   Size Type
/dev/sdb1        2048  589826047 589824000 281.3G Linux filesystem
/dev/sdb2   589826048 1179650047 589824000 281.3G Linux filesystem
/dev/sdb3  1179650048 1769474047 589824000 281.3G Linux filesystem
/dev/sdb4  1769474048 2359298047 589824000 281.3G Linux filesystem
/dev/sdb5  2359298048 2949122047 589824000 281.3G Linux filesystem
/dev/sdb6  2949122048 3538946047 589824000 281.3G Linux filesystem
/dev/sdb7  3538946048 4128770047 589824000 281.3G Linux filesystem
/dev/sdb8  4128770048 4718594047 589824000 281.3G Linux filesystem
/dev/sdb9  4718594048 5308418047 589824000 281.3G Linux filesystem
/dev/sdb10 5308418048 5898242047 589824000 281.3G Linux filesystem
/dev/sdb11 5898242048 6488066047 589824000 281.3G Linux filesystem
/dev/sdb12 6488066048 7077890047 589824000 281.3G Linux filesystem
/dev/sdb13 7077890048 7667714047 589824000 281.3G Linux filesystem
/dev/sdb14 7667714048 7814037134 146323087  69.8G Linux filesystem

我正在dd从 sdb14 向后运行到 sdb1,这样我就能保持一切顺利。

当我完成每个分区时,我考虑返回 fdisk/gdisk 并删除该分区,即使整个磁盘没有被擦除。

完成所有分区后,我计划擦除磁盘的开头部分:

$ dd if=/dev/zero of=/dev/sdX bs=1M count=512

(我知道 512 有点太多;请在评论中提供一个更好的数字。)

这是否可以实现我的目标,即一次擦除整个磁盘,而不在任何地方留下任何遗漏的间隙?

答案1

关于磁盘的开头。第一个分区从扇区开始2048。扇区从开始编号0。提供的gdisk输出没有明确说明,但我可以计算出您的磁盘使用大小为的扇区512B。因此,在第一个分区之前有字节2048的扇区512。此命令将用零填充它们:

dd if=/dev/zero of=/dev/sdX bs=512 count=2048

这是否可以实现我的目标,即一次擦除整个磁盘,而不在任何地方留下任何遗漏的间隙?

我已经分析了这些数字——分区之间没有间隙。但是!GPT 方案将备份分区表放在磁盘的最末端,它占用33扇区。此外,分区工具可能会以某种方式对齐最后一个分区的末尾(尽管奇数146323087表明这里不是这种情况)。因此,您还应该覆盖最后一个分区之外的这个空间:

dd if=/dev/zero of=/dev/sdX bs=512 seek=7814037135

预计该命令将几乎立即到达磁盘末尾。

磁盘操作使用缓存,因此您应该sync在完成所有这些操作后再运行。通常,当您正常关机时,所有缓存都会被刷新。但是,如果您较早断开磁盘(拔下 USB),某些更改可能会丢失。希望您在擦除特定分区后从未以这种方式断开连接。

此后,您的整个磁盘将被清零。这应该足够了(阅读)。如果磁盘是 SSD,可能会因为磨损均衡而出现一些问题;但我猜这里的 4 TB 是 HDD,所以没有问题。

答案2

@KamilMaiorowski 解决方案的另一种替代方案是在 /dev/sdX 上创建一个文件系统,然后在其中写入空文件。这样,您可以中途停止,然后随意继续,方法是附加到文件或写入新文件。一旦磁盘空间不足以容纳更多文件,您就完成了。完成后,您还可以从磁盘中删除文件。

要执行此操作(从可启动磁盘)

mkfs.ext4 /dev/sdX
mkdir /tmp/tempdisk
mount /dev/sdX /tmp/tempdisk
dd if=/dev/zero of=/tmp/tempdisk/file0.zero

相关内容