드라이브를 지우기 위해 dd에 urandom을 공급하고 작업 속도를 높이기 위해 다른 모든 블록을 건너뛸 수 있습니까?

드라이브를 지우기 위해 dd에 urandom을 공급하고 작업 속도를 높이기 위해 다른 모든 블록을 건너뛸 수 있습니까?

저는 기부/재활용을 위해 오래된 노트북을 많이 닦아왔습니다. 이를 위해 USB 또는 CD에서 Linux 라이브 CLI로 부팅하고 이를 사용하여 dd if=/dev/urandom of=/dev/sda status=progress해당 데이터를 덮어씁니다. 내 문제는 모든 노트북에서 이 작업이 오랜 시간이 걸린다는 것입니다. 특히 일부 노트북은 매우 오래되고 느립니다. dd에게 다른 모든 블록을 덮어쓰도록 지시할 수 있습니까? 그렇다면 처리에 소요되는 시간을 효과적으로 절반으로 줄일 수 있을까요? 이 작업을 수행하는 데 가장 적합한 명령은 무엇입니까?

우리 회사에는 실제 데이터 보안 정책이 없으며 대부분의 정책은 애초에 특히 민감한 정보를 다루지 않습니다. 그러나 이 작업을 수행하면 드라이브에서 정보를 쉽게 복구할 수 있습니까?

답변1

dd드라이브에 블록을 써서 하드 드라이브(특히 SSD)를 "삭제"하는 것은 권장하지 않습니다 . 대신 ATA Secure Erase 명령을 사용합니다(드라이브가 지원하는 경우). 바라보다Kernel.org Wiki - ATA 보안 삭제더 알아보기.

답변2

머리말: 프로토타입으로 사용하고 토론을 촉진하기 위한 예시로 사용하십시오.

하나 수정했어요펄 스크립트나는 그것을 사용하여 대용량 파일(>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

현재 모든 제한 사항과 문제에도 불구하고 이는 내 연구실에 있는 우랜덤 소스의 dd보다 약 10배 빠릅니다.

용법:./wipeskipping.sh sd[X]

관련 정보