Как перезаписать начало устройства со случайными битами или нулями?

Просто хочу перезаписать небольшую часть устройства нулями или случайными битами. Точнее, я бы хотел перезаписать первые 1% всех секторов или несколько MiB. Есть ли простой способ сделать это?

  • Как я могу сделать загрузочный flashdrive?
  • Можно ли использовать dd для клонирования только той части используемого жесткого диска?
  • Что делает эта команда dd точно?
  • от разреженного файла до блочного устройства по сети
  • Как перенаправить dd на pv?
  • Нулевая устаревшая ZFS-метка с диска с dd
  • Размер Usb неправильный после записи dd ISO-изображения
  • SSHD-клонирование - что-то особенное, чтобы иметь в виду, по сравнению с HDD?
  • 3 Solutions collect form web for “Как перезаписать начало устройства со случайными битами или нулями?”

    Хотя /dev/urandom чрезвычайно медленный и, как таковой, не подходит для перезаписи больших объемов данных (всего диска), это может быть сделано для небольших регионов.

    Пример перезаписи 8MiB:

     dd bs=1M count=8 iflag=fullblock if=/dev/urandom of=/dev/destroyme 

    В качестве альтернативы вы можете использовать shred :

     shred -v -n 1 -s 8M /dev/destroyme 

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

     losetup --find --show --offset 0 --sizelimit $((8*1024*1024)) /dev/destroyme # will print /dev/loopX cat /dev/urandom > /dev/loopX losetup -d /dev/loopX 

    То же, что и в любом файле для перезаписывания первых 10 MiB с нулями:

     head -c10M < /dev/zero 1<> /dev/sdax 

    Для файлов блочных устройств 1<> для открытия без усечения даже не требуется, поскольку нет такой вещи, как обрезание блочного устройства, поэтому вы можете просто сделать:

     head -c10M < /dev/zero > /dev/sdax 

    Не все реализации head поддерживают -c , и когда они это делают, не все поддерживают этот суффикс M (а когда они делают M может означать мегабайт (1000000 байт), например, ksh93 или ksh93 (1048576 байт), как head GNU). В этом случае вы можете:

     head -c "$((10 * 1024 * 1024)" 

    чтобы сделать это явным.

    Если мы сравним с dd bs=1M count=10 < /dev/zero > /dev/sdax :

    • концептуально

      • head – это команда для чтения определенного количества байтов или строк из файла и записи в stdout
      • в то время как dd является командой низкого уровня для чтения и записи данных точно так, как вы этого хотите.

      Я бы использовал head здесь на том основании, что это команда, предназначенная для этой задачи. Я бы использовал dd если бы хотел оптимизировать конкретный вариант использования, или использовать одну из особенностей dd (см. Также примечание о переносимости).

    • Цикл чтения + записи:

      • head -c10M будет пытаться и считывать запрошенные данные независимо от того, что и только не head -c10M с ненулевым статусом выхода, если возникла ошибка.
      • dd bs=1M count=10 , будет делать ровно 10 чтений (пока нет ошибок), и для каждого чтения, которое возвращает некоторые данные, выполните соответствующую запись с количеством прочитанных данных. Это работает только в том случае, если каждое чтение возвращает точно запрошенное 1M. На практике это верно для /dev/zero , но в Linux (по крайней мере 4.6), для /dev/urandom , я не могу получить больше, чем 32MiB минус 1 байт в одном чтении (так что все еще OK для 1MiB, хотя YMMV если вы используете другую версию Linux), а для /dev/random – всего несколько байтов (что в настоящее время входит в пул энтропии). GNU-реализация dd имеет iflag=fullblock чтобы продолжать чтение до тех пор, пока буфер запросов не будет заполнен, чтобы вести себя как head , но если у вас нет GNU dd , единственным вариантом является выполнение 1 байтового чтения в то время, которое будет иметь драматический влияет на производительность.
    • Производительность: для чего угодно, кроме небольших (менее нескольких сотен мегабайт), где данные записываются в буферы, которые позже будут удалены на диск или записываются в /dev/null , процесс будет связан с I / O. Если чтение /dev/urandom или /dev/random шея бутылки будет либо генерацией случайных чисел, либо дисковым вводом-выводом. В этих случаях вы не найдете большой разницы между dd и head. В любом случае head , вероятно, будет иметь более высокие накладные расходы процессора (незаметно, когда производительность связана с I / O).

      • head – это основной инструмент. Реализации будут стараться максимально эффективно выполнять эту работу, сохраняя при этом надежность для всех типов ввода и вывода и не использовать слишком много ресурсов. Он будет делать тот же цикл чтения + записи, что и dd , основное различие в показателях производительности – это размер чтения и записи, который будет определять количество выполняемых системных вызовов.

        Эти размеры будут зависеть от реализации и версии head и, возможно, от системы. С последней версией GNU head в моей системе данные чтения имеют размер BUFSIZE (8KiB в системах GNU) и записи размером 4KiB, хотя это можно изменить, например, с помощью stdbuf -o 1M .

        ksh93 что встроенная head ksh93 делает 64KiB, читает и пишет и не использует stdio libc, по крайней мере, в моей системе.

        GNU head использующий stdio, также означает дополнительные накладные расходы, вызванные stdio (реализация которых зависит от системы).

        Текущие версии GNU cat используют fadvise чтобы сообщить системе, что она будет считывать данные последовательно, чтобы она могла оптимизировать кеширование соответственно. Не исключено, что некоторые реализации head сделают это, или сделают это в будущем. dd является низкоуровневым, я бы ожидал, что он выполнит это только в том случае, если вы скажете это (я не знаю о какой-либо реализации dd которая имеет такую ​​поддержку).

      • dd очень низкий уровень, он вызовет прямые вызовы read() и write() . Вы не можете получить гораздо более эффективное, чем это, кроме как с помощью специализированных API, таких как Linux sendfile() .

        Это дает вам больший контроль над размером read() и write() , поэтому позволяет оптимизировать себя на основе типа ввода / вывода и доступных ресурсов. Например, если у вас много доступной памяти, вы можете также прочитать все данные за один раз (хотя в моих тестах при копировании с / dev / zero на / dev / null я не вижу никакого значительного улучшения в прошлом размер блока 32KiB и производительность даже начинают деградировать после блокировки 1MiB).

    • портативность

      Ни один из -c , bs=10M , conv=fullblock не переносится. Единственной командой POSIX для чтения определенного объема данных из файла является dd , но для надежного использования (кроме как /dev/zero ), как обсуждалось выше, вам нужно bs=1 что означает ужасную производительность.

    • последствия ошибок записи.

      Обе head и dd выйдут при попытке записи за конец блочного устройства. Если на диске произошли сбои в секторах, это, как правило, не будет обнаружено, поскольку фактическая запись на диск является асинхронной. С реализацией GNU dd вы можете принудительно написать запись с помощью функции oflag=direct что означает, что dd остановится при первой ошибке. Возможно, вы захотите использовать размер блока по умолчанию 512, если вы хотите написать как можно больше до первого отказавшего сектора.

    • следствие ошибок чтения

      Вы не должны получать ошибку чтения / dev / zero, / dev / urandom или / dev / random. Но в более общем плане, как head и dd выходят с ошибкой при первой ошибке чтения. С dd вы можете продолжать ошибки с conv=noerror . В этом случае вы, вероятно, захотите добавить параметр sync ( conv=noerror,sync ), чтобы conv=noerror,sync блоки дополнялись нулями. head не даст вам никакой возможности сделать это, поскольку он не предназначен для этого.

    Альтернативы.

    • pv -Ss 10M < /dev/zero > /dev/sdax скопирует эти 10M и даст вам индикатор выполнения. По умолчанию размер чтения / записи составляет 128 Кбайт в моем тесте. Вы можете изменить его с помощью опции -B , но в моих тестах 128KiB дает наилучшие результаты. pv имеет параметр -E эквивалентный dd 's conv=noerror,sync .

      В Linux это также хорошо для ввода-вывода на трубах, поскольку для оптимизации производительности используется системный вызов splice() .

    • Если вы хотите играть с системным вызовом sendfile() , вы можете использовать xfs_io .

       xfs_io -c 'sendfile -i src 0 10M' dst 

      отправляет 10M из src в dst. Однако он имеет только один sendfile() и системный вызов не может использоваться на /dev/zero , /dev/random или /dev/urandom . Однако он может использоваться на разреженных файлах.

        truncate -s 1T empty-file xfs_io -c 'sendfile -i empty-file 0 10M' /dev/sdax 

      будет работать, но в больших количествах (несколько Gibibytes), потому что это один системный вызов sendfile() , необходимо выделить много памяти, что означает, что он будет менее эффективным, чем dd bs=1M . В идеале мы хотели бы делать несколько sendfile() только из нескольких мегабайт за раз, но я не знаю ни одной команды, которая это делает.

    • Для ввода /dev/zero вам не нужно читать данные для каждого записываемого блока. В конце концов, это всего лишь нули. Достаточно просто создать буфер с нулями без чтения /dev/zero , и мы можем использовать его между каждой записью. Например:

       PERLIO=:unix perl -e '$x = pack("x" . 1024*1024); print $x for 1..10000' > /dev/sdax 

    для написания 10000 MiB было бы намного более эффективным (несмотря на служебные данные perl ), чем любое решение, которое многократно читает /dev/zero .

    Вы можете использовать dd для этого, используя устройство /dev/urandom которое предоставит вам случайные данные. Пример :

     dd if=/dev/urandom of=/dev/sdX bs=1M count=100 

    это будет писать 100 мбайт случайных данных:

    • if – входной файл
    • of – это выходной файл
    • bs=1M – размер блока 1 Мбайт
    • count во, сколько раз должно быть записано в этих блоках

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

    Interesting Posts

    Как быстро вернуться в последний рабочий каталог?

    Удаленный ls на нескольких машинах

    Измените предпочтительный сетевой адаптер в маршрутах по умолчанию

    Как настроить сочетание клавиш, которое входит в предопределенный текст в X11 xterminal через SSH из Mac OS?

    Промежуточные пробелы при копировании с консоли

    Странные проблемы рендеринга при использовании xvfb-run

    Как показать и использовать удаленный рабочий стол Linux, когда SSH или любая другая удаленная служба недоступна?

    Поддерживают ли Linux-терминалы и шрифты с открытым исходным кодом лигатуры?

    Выход для вывода с символами новой строки

    Центральная / вторичная установка сервера имен centos

    Найдите самые большие файлы или каталоги

    Как уменьшить вывод ps aux на несколько строк?

    добавление консоли в GDM

    Запись загрузочного образа на USB и использование USB

    Развертывание диска с таблицей GPT

    Linux и Unix - лучшая ОС в мире.