Можно ли передать urandom в dd для очистки диска, но пропустить каждый второй блок для ускорения?

В приведенном ниже сценарии, если 1-я строка является строкой шебанга, новый контент будет вставлен во 2-ю строку. В противном случае он будет вставлять содержимое в 1-ю строку

.

Проверено, работает нормально

#!/bin/bash
if [[ `awk 'NR==1 && $1 == "#!/bin/bash" {print $1}' file` == "#!/bin/bash" ]]
then
sed '2i content' file
else
sed '1i content' l.txt
fi
0
11.02.2020, 09:04
2 ответа

Я бы не рекомендовал «очищать» жесткие диски (, особенно твердотельные накопители ), записывая блоки через ddна диск. Вместо этого я бы использовал команду безопасного стирания ATA (, если она поддерживается диском ). Дополнительные сведения см. в Kernel.org Wiki -ATA Secure Erase .

3
28.04.2021, 23:23

Преамбула :воспринимайте ее как прототип, просто как пример для обсуждения.

Я модифицировал Perl-скрипт , который я использую для ускорения md5sum для больших файлов (>TB ),и сделал (действительно грубый )bash-скрипт, чтобы выполнить какую-то операцию, а затем вызвать ее. Основная идея, стоящая за этим:

  1. Очистить таблицу разделов диска
  2. Создайте один раздел, охватывающий весь диск, и отформатируйте его
  3. Монтировать раздел и мгновенно заполнять его (выделять )одним файлом
  4. Важная часть здесь :процесс файла, разделяющий его на фиксированное количество блоков и перезаписывающий 4 КБ случайными данными (в данном случае только числа ).

С этого момента предстоит многое сделать, уточнить количество блоков и байтов для обработки, произвольно сдвинуть блоки, внедрить криптозащищенную библиотеку для генерации случайных чисел, внедрить защитные сценарии и т. д.

Но достаточно болтовни для прототипа.

Вот 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-скрипт wipeskipping.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

В настоящее время, со всеми ограничениями и проблемами, все это примерно в 10 раз быстрее, чем dd из случайного источника в моей лаборатории.

Использование:./wipeskipping.sh sd[X]

0
28.04.2021, 23:23

Теги

Похожие вопросы