您能否将 urandom 提供给 dd 来擦除驱动器,但跳过所有其他块以加快速度?

您能否将 urandom 提供给 dd 来擦除驱动器,但跳过所有其他块以加快速度?

我一直在擦拭大量旧笔记本电脑以供捐赠/回收。为此,我从 USB 或 CD 启动到 Linux live CLI,并用于dd if=/dev/urandom of=/dev/sda status=progress覆盖它们上的数据。我的问题是,这对每台笔记本电脑来说都需要很长时间,特别是其中一些笔记本电脑非常旧且速度慢。是否可以告诉 dd 仅覆盖所有其他块?如果是这样,这是否会有效地将处理所需的时间减少一半?完成此任务的最佳命令是什么?

我的公司没有真正的数据安全政策,而且大多数政策一开始就不包含特别敏感的信息。然而,执行此操作仍然可以轻松地从驱动器恢复信息吗?

答案1

我不建议通过向dd驱动器写入块来“擦除”硬盘驱动器(尤其是 SSD)。相反,我会使用 ATA 安全擦除命令(如果驱动器支持)。看Kernel.org Wiki - ATA 安全擦除了解更多详情。

答案2

序言:以它为原型,只是一个例子,以促进讨论。

我修改了一个Perl脚本我用它来为大文件(>TB)制作更快的 md5sum,并制作了一个(非常粗糙的)bash 脚本来执行一些操作,然后调用它。这背后的基本思想是:

  1. 擦除磁盘分区表
  2. 创建跨越所有磁盘的单个分区并将其格式化
  3. 挂载分区并立即用单个文件填充它(错误分配)
  4. 这里的关键部分:处理文件,将其划分为固定数量的块,并用随机数据(在本例中只是数字)覆盖 4kB。

从这里开始还有很多工作要做,细化要处理的块数量和字节,随机移动块,采用加密安全库进行随机数生成,采用防御性脚本等......

对于原型来说,闲聊已经够多了。

这是 perlwipe.pl:

#!/usr/bin/perl

use strict;
use Time::HiRes qw[ time ];

sub round_potenza {
    my $rounded = 0;
    my ($x,$p) = (@_,2);
    my $log = log($x)/log($p);
    $log = int($log+1) if $log != int($log);
    if ( abs($x-($p**$log))> abs($x-($p**int($log-1))) ) {
    $rounded = $p**($log-1);
    } else {
    $rounded = $p**$log;
    }
    return $rounded;
}

sub quickWipe {
    my $fh = shift;
    my $charset = shift;
    my $pos = 0;
    my $size = -s $ARGV[0];
    my $chunkraw = int($size/50000);
    my $chunk = round_potenza($chunkraw);
    printf $chunk;
    until( eof $fh ) {
        seek $fh, $pos, 0;
        my $garbage = rand(10);
        read( $fh, my $block, 4096 ) or last;
        print $fh $garbage;
        $pos += $chunk;
    }
}

open FH, '+<', $ARGV[0] or die $!;
printf "Processing $ARGV[0] : %u bytes\n", -s FH;

my $start = time;
my $wipe = quickWipe( *FH );
printf "Fast Wipe took %.6f seconds\n", time() - $start;

这是 Bash 脚本 wipskipping.sh,非常不言自明:

#!/bin/bash
#HANDLE WITH CARE!
if [ $# -eq 0 ]; then
        echo "You like to live dangerously."
        exit 0
else
        DEVICE="/dev/$1"
        PARTITION="1"
        PARTEDCMD="/tmp/partedcmd"
        MOUNTPOINT="/tmp/mountpoint"
        /sbin/wipefs -a -f $DEVICE
        echo mklabel gpt> $PARTEDCMD
        echo mkpart primary 0% 100%>> $PARTEDCMD
        echo quit>> $PARTEDCMD
        /sbin/parted $DEVICE <$PARTEDCMD
        /sbin/mkfs.ext4 -F $DEVICE$PARTITION
        mkdir $MOUNTPOINT
        mount $DEVICE$PARTITION $MOUNTPOINT
        /usr/bin/fallocate -l 5000G $MOUNTPOINT/sparsefile
        /usr/bin/perl perlwipe.pl $MOUNTPOINT/sparsefile
fi

目前,尽管存在所有限制和问题,这一切都比我实验室中的 urandom 源的 dd 快大约 10 倍。

用法:./wipeskipping.sh sd[X]

相关内容