как использовать dd для заполнения диска 1's

Так как проблема о корректной эмуляции терминала ANSI, я думаю наилучший вариант, который Вы имеете, должен соединиться с последовательным к USB преобразователем с minicom. Просто не забудьте открывать последовательное устройство, не инициализируя модем, т.е. не отправляя hayes команды на запуске.

7
19.08.2014, 21:36
6 ответов

Просто сделайте:

tr '\0' '\377' < /dev/zero > /dev/sdb

Когда накопитель будет переполнен, он прервется с ошибкой.

Использование dd здесь не имеет смысла. Вы используете dd, чтобы убедиться, что чтение и запись выполняются определенного размера. Здесь нет смысла делать это. tr будет делать чтение/запись 4 или 8 килобайт, что должно быть достаточно хорошо.

10
27.01.2020, 20:15

Для более быстрой альтернативы / dev / urandom существует shred -v -n 1 (если псевдослучайное допустимо) или ] cryptsetup со случайным ключом и его обнулением (для зашифрованных нулей). Даже без ускорения AES он легко превосходит / dev / urandom скорости.

Не знаю, насколько быстро tr , иначе можно было бы просто dd if = | tr | dd of = .

Использование файла в качестве источника шаблона может быть выполнено следующим образом:

(while [ 1 ]; do cat file; done) | dd of=...

Хотя файл должен быть достаточно большим, чтобы это было эффективно удаленно.

Если count = важен для вас, добавьте iflag = fullblock в команду dd . Возможны частичные чтения, в результате которых частичные блоки будут считаться полными. Это особенно важно при использовании блоков большего размера (например, bs = 1M ), что вам нужно, если вам нужна скорость.

4
27.01.2020, 20:15

Это очень быстрый и эффективный способ многократной записи строк размером 0xFF размером 64 КБ с использованием awk , потребляющих <8% ЦП и ограничивается только скоростью диска, на который вы записываете.

Я попытался использовать tr , как было предложено здесь, и обнаружил, что он очень медленный и потребляет много ресурсов процессора, переводя каждый байт. Мой метод работает с блоками по 64 КБ и как минимум в 3,5 раза быстрее, чем односимвольный tr (26 МБ / с против 7 МБ / с на старом PATA hw - завершение за 52 минуты в тишине против 3 + часы при громких оборотах вентилятора охлаждения ...). Мне нравится, когда люди отказываются от базовых знаний в области информатики, даже не проверив сначала их мнение.

Я рекомендую создать следующий сценарий, используя printf из оболочки, а не пытаться записать его в vi , поскольку большинство загрузочных компакт-дисков не предоставят вам достаточно места для tmp для буфера. log для копирования и вставки 65 536 раз ...

1) Составьте сценарий

$ printf "echo | awk '{\n\twhile (1) {\n\t\tprintf(\"%%s\", \"" >/tmp/writeones.sh
$ for i in `seq 1 65536`; do printf '\377' >>/tmp/writeones.sh; done
$ printf "\");\n}\n}'\n" >>/tmp/writeones.sh

сценарий вывода выглядит следующим образом: (Пропустите некоторые символы 0xff в строке)

echo | awk '{                                                                                                                           
    while (1) {
        printf("%s", "ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ...");
    }
}'

2) Протестируйте сценарий:

$ sh /tmp/writeones.sh | od -Ax -tx1
000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
*
Ctrl+C

3) Запустите сценарий и направьте его по конвейеру. ваш диск с dd (проверьте еще раз, что у вас правильный диск !!!):

# sh /tmp/writeones.sh | dd of=/dev/ada0 bs=65536 &

Почему я выбрал 64 kB? 1. Ограничение списка аргументов для AWK и 2. для моего оборудования это обеспечивает лучшую скорость для меня. Я также попытался написать это в простой оболочке с помощью printf и обнаружил, что он на 40% медленнее и потребляет 80% CPU из-за всех вилок.

2
27.01.2020, 20:15

Чтобы протестировать скорость SSD, я написал небольшую программу на Perl, которая записывала «нули», «единицы» или буквенно-цифровые символы в блочное устройство, указанное в командной строке. Он не вызывает голема dd, а только осуществляет прямую запись и синхронизацию. Здесь может помочь:

https://github.com/dtonhofer/wild_block_device_filler

Просто запустите его как

wildly_fill_block_device.pl --dev=sdX1 --fillpat 1 --chunksize=1024P --sync

И он будет записывать 0xFF в /dev/sdX1 (без буферизации, используя системную запись Perl ())кусками (, в данном случае )"1024 физических блока" при синхронизации -данных в диск после каждой записи с использованием fdatasync (). На моем SSD это работает со скоростью ~70 МБ/с.

Он спросит вас, УВЕРЕНЫ ли вы, прежде чем он приступит к уничтожению раздела или диска.

0
27.01.2020, 20:15

Вы можете сделать это довольно эффективно в Bash без внешних файлов, кроме устройства для записи, или внешних команд, кроме dd.

  1. Используйте printf, чтобы сгенерировать байт со всеми единичными битами и поместить его в переменную Bash.
  2. Несколько раз соедините переменную Bash с самой собой.
  3. Используйте подстановку процесса Bash для имитации бесконечно длинного входного файла, который неоднократно echoдобавляет переменную Bash без новой строки в конце.
  4. Используйте это как входной файл для dd.

Если у вас GNU dd, получите хороший индикатор выполнения с помощью:

sudo -i
bash
ones="$( printf '\xff' )"; for _ in {1..16}; do ones="$ones$ones"; done; dd status=progress bs=65536 if=<( while true; do echo -n "$ones"; done ) of=/dev/whatever

Удалите status=progress, если он вам не подходит. 65536равно 2 16 , потому что начальный байт со всеми единичными битами дублировался 16раз.

0
27.01.2020, 20:15

Можно имитировать /dev/oneбез специального устройства, с FIFO +printf(в цикле; медленно )илиyes(быстро):

mkfifo ddfifo
dd if=ddfifo of=<file> iflag=fullblock bs=32K status=progress & while printf '\1'; do printf '\1'; done > ddfifo

или:

mkfifo ddfifo
dd if=ddfifo of=<file> iflag=fullblock bs=4M status=progress & yes "" | tr '\n' '\1' > ddfifo

Если вы хотите, чтобы байты со всеми битами были установлены в единицу, поменяйте местами '\1'на '\377'.

0
24.10.2021, 18:23

Теги

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