![您能否将 urandom 提供给 dd 来擦除驱动器,但跳过所有其他块以加快速度?](https://linux22.com/image/167279/%E6%82%A8%E8%83%BD%E5%90%A6%E5%B0%86%20urandom%20%E6%8F%90%E4%BE%9B%E7%BB%99%20dd%20%E6%9D%A5%E6%93%A6%E9%99%A4%E9%A9%B1%E5%8A%A8%E5%99%A8%EF%BC%8C%E4%BD%86%E8%B7%B3%E8%BF%87%E6%89%80%E6%9C%89%E5%85%B6%E4%BB%96%E5%9D%97%E4%BB%A5%E5%8A%A0%E5%BF%AB%E9%80%9F%E5%BA%A6%EF%BC%9F.png)
我一直在擦拭大量旧笔记本电脑以供捐赠/回收。为此,我从 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 脚本来执行一些操作,然后调用它。这背后的基本思想是:
- 擦除磁盘分区表
- 创建跨越所有磁盘的单个分区并将其格式化
- 挂载分区并立即用单个文件填充它(错误分配)
- 这里的关键部分:处理文件,将其划分为固定数量的块,并用随机数据(在本例中只是数字)覆盖 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]