8

Я хочу создать большой файл ~ 10G, заполненный нулями и случайными значениями. Я пытался с помощью:

dd if=/dev/urandom of=10Gfile bs=5G count=10

он создает файл размером около 2 Гб и выходит со статусом выхода 0. Я не понимаю, почему?

Я также попытался создать файл, используя:

head -c 10G </dev/urandom >myfile

но его создание занимает около 28-30 минут. Но я хочу, чтобы это создавалось быстрее. У кого-нибудь есть решение?

Также я хочу создать несколько файлов с одинаковым (псевдо) случайным рисунком для сравнения. Кто-нибудь знает способ сделать это? Спасибо

4 ответа4

13

Я видел довольно ловкий трюк в commandlinefu: использование /dev/urandom в качестве источника случайности (он является хорошим источником), а затем использовать это в качестве пароля к поточному шифру AES.

Я не могу вам сказать с 100% уверен, но я считаю , что если изменить параметры (т.е. использовать намного больше , чем просто 128 байт из /dev/urandom то по крайней мере достаточно близко к криптографически безопасного PRNG, для все практические цели:

Эта команда генерирует псевдослучайный поток данных, используя aes-256-ctr с начальным значением, заданным /dev /urandom. Перенаправить на блочное устройство для безопасного шифрования данных.

openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero > randomfile.bin

Как это работает?

openssl enc -aes-256-ctr будет использовать openssl для шифрования нулей с помощью AES-256 в режиме CTR.

  • Что это зашифрует?

    /dev/zero

  • Какой пароль он будет использовать для шифрования?

    dd if=/dev/urandom bs=128 count=1 | base64

    Это один блок из 128 байтов /dev/urandom закодированный в base64 (перенаправление на /dev/null - игнорирование ошибок).

  • На самом деле я не уверен, почему используется -nosalt , поскольку на странице руководства OpenSSL указано следующее:

    -salt
        use a salt in the key derivation routines. This is the default.
    
    -nosalt
        don't use a salt in the key derivation routines. This option SHOULD NOT be used except for test purposes or compatibility with ancient versions of OpenSSL and SSLeay.
    

    Возможно, дело в том, чтобы сделать это как можно быстрее, а использование солей было бы неоправданным, но я не уверен, оставит ли это какой-либо паттерн в зашифрованном тексте. Ребята из Cryptography Stack Exchange могут дать нам более подробное объяснение этого.

  • Ввод /dev/zero . Это потому, что на самом деле не имеет значения, что шифруется - на выходе будет что-то, напоминающее случайные данные. Нули можно быстро получить, и вы можете получить (и зашифровать) столько, сколько захотите, не исчерпывая их.

  • На выходе получается randomfile.bin . Это также может быть /dev/sdz и вы будете рандомизировать полное блочное устройство.

Но я хочу создать файл с фиксированным размером! Как я могу это сделать?

Просто!

dd if=<(openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero) of=filename bs=1M count=100 iflag=fullblock

Только dd , что команда с фиксированным размером blocksize (который является 1 МБ здесь) и count Размер файла будет размером blocksize * count = 1M * 100 = 100M.

5

Существует программа генератора случайных чисел sharand, которая записывает в файл случайные байты. (Первоначально программа называлась sharnd, на одну букву меньше (см. Http://mattmahoney.net/dc/).

Это занимает примерно треть времени по сравнению с чтением /dev/urandom

Это безопасный RNG - есть более быстрый, но не безопасный RNG, но это не то, что обычно требуется.
Чтобы быть действительно быстрым, поищите коллекцию алгоритмов RNG для perl: libstring-random-perl .


Давайте попробуем (apt-get install sharand):

$ time sharand a 1000000000                      
sharand a 1000000000  21.72s user 0.34s system 99% cpu 22.087 total

$ time head -c 1000000000 /dev/urandom > urand.out
head -c 1000000000 /dev/urandom > urand.out  0.13s user 61.22s system 99% cpu 1:01.41 total

И файлы результатов - (они выглядят более случайными изнутри):

$ ls -l
-rw-rw-r-- 1 siegel siegel 1000000000 Aug  5 03:02 sharand.out
-rw-rw-r-- 1 siegel siegel 1000000000 Aug  5 03:11 urand.out


Сравнивая «общие» значения времени, sharand потребовалось только треть времени, необходимого для метода urandom, чтобы создать немного меньше, чем ГБ случайных байтов:

sharand: всего 22
urandom: всего 61с

4

Я получаю хорошие скорости с помощью утилиты shred .

  • 2G с dd in=/dev/urandom - 250сек
  • 2G с openssl rand - 81сек
  • 2G с shred - 39sec

Поэтому я ожидаю около 3-4 минут для 10G с shred .


Создайте пустой файл и уничтожьте его, передав желаемый размер файла.

touch file
shred -n 1 -s 10G file

Я не уверен, насколько криптографически безопасны сгенерированные данные, но это выглядит случайным образом. Вот немного информации об этом.

2

Вам нужен специальный файл в Linux, /dev /random служит генератором случайных чисел в системе Linux. /dev /random будет в конечном итоге блокироваться, если ваша система не имеет большой активности, /dev /urandom в неблокировании. Мы не хотим блокировать при создании наших файлов, поэтому мы используем /dev /urandom.


попробуйте эту команду:

dd if=/dev/urandom bs=1024 count=1000000 of=file_1GB conv=notrunc

Это создаст файл с числом случайных байтов bs *, в нашем случае 1024 * 1000000 = 1 ГБ. Файл не будет содержать ничего читаемого, но в нем будут некоторые новые строки.

xKon@xK0n-ubuntu-vm:~/tmp$ dd if=/dev/urandom of=file.txt bs=1048576 count=100 conv=notrunc
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 13.4593 s, 7.8 MB/s
xKon@xK0n-ubuntu-vm:~/tmp$ wc -l file.txt
410102 file.txt

Вы можете использовать опцию поиска с помощью dd, чтобы еще немного ускорить процесс:

$ dd if=/dev/zero of=1g.img bs=1 count=0 seek=1G
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 8.12307 s, 132 MB/s
$ ls -lh t
-rw-rw-r-- 1 xK0n  xK0n  1.1G 2014-08-05 11:43 t

Недостатками здесь являются тот факт, что файл не содержит ничего читаемого и тот факт, что он немного медленнее, чем метод /dev /zero (около 10 секунд для 100 Мб).


Вам также может понравиться команда fallocate, которая предварительно выделяет пространство для файла.

fallocate -l 1G test.img

выход

-rw-р - r--. 1 xK0n xK0n 1.0G Авг 05 11:43 test.img

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .