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

19

Скажем, вы хотите обнулить неисправный жесткий диск. Вы хотите перезаписать как можно больше с нулями. То, что вы не хотите, это: процесс прерывается при первой ошибке записи. Как это сделать?

AFAICS, plain ddпредоставляет только возможность игнорировать ошибки чтения. Таким образом, что-то вроде

dd if=/dev/zero of=/dev/disk/by-id/lousy-vendor-123 bs=128k

недостаточно.

ddrescue Кажется, лучше игнорировать ошибки - но какова будет оптимальная командная строка с ним?

Моя попытка с GNU ddrescue:

ddrescue --verbose --force --no-split /dev/zero /dev/disk/by-id/lousy-vendor-123
maxschlepzig
источник
1
dd conv=noerrorможет быть расширение GNU, я не уверен. В любом случае, это должно сработать. Тем не менее, ответ SATA «скажи приводу стирать сам» стоит того, чтобы стереть целые диски.
Питер Кордес
1
@PeterCordes, справочная страница ddдокументов GNU noerrorкак «продолжить после ошибок чтения» ...
maxschlepzig
1
dd conv=noerrorэто стандарт POSIX, но он может быть очень медленным
schily
2
dd conv=noerrorдолжно быть для ошибок чтения (согласно man-странице), а не для записи ошибок. Нет ничего плохого в том, чтобы объединить это conv=notrunc, что помогло мне игнорировать ошибки записи. unix.stackexchange.com/a/229379/4319
imz - Иван Захарящев
Простая операция записи на жесткий диск, например использование dd if=/dev/zero of=/dev/sdX, не будет выполнять чтение с диска. Почему вы думаете , что дд команда «не хватает» ? Какие "ошибки" вы испытываете?
опилки

Ответы:

12

Я предпочитаю badblocksв режиме деструктивной записи для этого. Он пишет, что продолжает делать это, когда сталкивается с ошибками, и, наконец, сообщает вам, где были эти ошибки, и эта информация может помочь вам решить, что делать дальше (Будет ли смесь?).

# badblocks -v -b 4096 -t random -o badblocks.txt -w /dev/destroyme
Checking for bad blocks in read-write mode
From block 0 to 2097151
Testing with random pattern: done
Reading and comparing: done
Pass completed, 52105 bad blocks found. (0/52105/0 errors)

И черный список:

# head badblocks.txt
2097000
2097001
2097002
2097003
2097004

А что осталось на диске потом:

# hexdump -C /dev/destroyme
00000000  be e9 2e a5 87 1d 9e 61  e5 3c 98 7e b6 96 c6 ed  |.......a.<.~....|
00000010  2c fe db 06 bf 10 d0 c3  52 52 b8 a1 55 62 6c 13  |,.......RR..Ubl.|
00000020  4b 9a b8 d3 b7 57 34 9c  93 cc 1a 49 62 e0 36 8e  |K....W4....Ib.6.|

Обратите внимание, что это не случайные данные - шаблон повторяется, поэтому, если вы пропустите, 1MiBвы снова увидите тот же результат.

Он также попытается проверить, прочитав данные обратно, поэтому, если у вас есть диск, который утверждает, что пишет успешно, но возвращает неправильные данные при обратном чтении, он найдет и эти ошибки. (Убедитесь, что никакие другие процессы не записывают на диск во время работы badblocks, чтобы избежать ложных срабатываний.)

Конечно, с сильно поврежденным диском это может занять слишком много времени: нет кода, который позволил бы полностью пропустить дефектные области. Единственный способ добиться этого badblocks- использовать гораздо больший размер блока.

Я не уверен, что ddrescueделает это лучше; он должен делать это в другом направлении (восстанавливать как можно больше данных). Вы можете сделать это вручную для dd / ddrescue / badblocks, указав первый / последний блок ...

frostschutz
источник
1
Если я использую -t randomили ... -t 0блокирует ошибку, тогда просто сделать один проход записи? Глядя на -tсправочную страницу - кажется, что без нее обходится 4 прохода (для «0xaa, 0x55, 0xff, 0x00»).
maxschlepzig
2
Это делает один проход для каждого, который -tвы предоставляете в командной строке. По умолчанию 4 прохода, как вы говорите.
frostschutz
13

Если диск не подключен через USB, рассмотрите возможность использования hdparm(версия> 9.31) для безопасного стирания диска ATA . Эта команда приводит к тому, что микропрограмма привода стирает содержимое диска, включая поврежденные блоки.

Предупреждение: используйте правильную букву диска - я показал/dev/sdX в качестве примера - не просто скопируйте / вставьте.

Во-первых, убедитесь, что он понимает команды ATA (большинство дисков, выпущенных в последнее десятилетие или более, должны):

$ sudo hdparm -I /dev/sdX
.
# lots of other info here...
.
Security: 
    Master password revision code = 65534
        supported
    not enabled
    not locked
    not frozen
    not expired: security count
        supported: enhanced erase
    202min for SECURITY ERASE UNIT. 202min for ENHANCED SECURITY ERASE UNIT.

Последние две строки извлечения показывают, что оно поддерживается.

Поэтому добавьте пароль к диску (очевидно, это необходимо):

$sudo hdparm --user-master u --security-set-pass p /dev/sdX
security_password="p"

и стереть:

$sudo hdparm --user-master u --security-erase p /dev/sdX
security_password="p"

/dev/sdX:
Issuing SECURITY_ERASE command, password="p", user=user

Более подробная информация об этой процедуре доступна здесь .

garethTheRed
источник
Это может работать через USB, если вам повезет, и ваш мост USB <-> SATA может проходить через нестандартные команды SATA (и драйвер Linux + hdparm знает, как это сделать на этой модели). Кроме того, для написания примеров /dev/sdXэто хорошо, потому что тогда, если кто-то пропустит его появление при вставке и настройке, проблем не будет.
Питер Кордес
@ Питер Кордес - Если у вас нет 24 дисков ... Нет, глупый я! Спасибо, я изменил его на sdX, это научит меня торопиться с ответом!
garethTheRed
2
На этой странице перечислено столько предостережений, связанных с аппаратным обеспечением и прошивкой, с помощью этого метода ...
довольно
Это действительно показывает довольно много предостережений! Все, что я могу сказать, это то, что это сработало для меня без каких-либо проблем.
garethTheRed
2

Я вижу четыре подходящих ответа здесь:

  1. hdparmМетод отправленный garethTheRed , вероятно , лучше всего, если вы подключены непосредственно к компьютеру. Очевидно, однако, если вы попробуете подключить его через USB, вы можете кирпич вашего диска. Если вы делаете это для диска, который вы собираетесь утилизировать, то это может быть хорошо. Тем не менее, вы, вероятно, хотите обезопасить себя перед удалением.

  2. Техника, о которой сообщил imz-Ivan Zakharyaschev, будет работать, но может быть очень медленной. Я бы посоветовал, если вы не хотите, чтобы данные можно было восстановить, используйте /dev/urandomвместо /dev/zero; например,

    dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
    
  3. Я бы посоветовал против следующего. Для чего-то более быстрого, что делает то же самое, используйте технику, о которой сообщает maxschlepzig (в вопросе):

    ddrescue --verbose --force --nosplit /dev/urandom /dev/sdX
    

    Это будет быстрее, чем ddкоманда, но не так быстро, как hdparmкоманда. Смотрите ниже, почему я не рекомендую это ...

  4. Команда badblocksтакже будет работать, но вы не можете рандомизировать данные таким образом, и снова она будет очень медленной.

Наконец, я был бы упущен, если бы не указал причину номер один, по которой люди хотят полностью стереть диск - они собираются его утилизировать. В этом случае, если вы этого еще не сделали, вы можете сначала попытаться восстановить диск. Если вы читаете блок и он возвращает ошибку ввода-вывода, то в следующий раз, когда вы записываете в тот же блок, диск попытается перераспределить другой блок из резервного списка. Как только резервный список заполнится, вы получите ошибки ввода-вывода при записи. Именно тогда вы действительно должны отказаться от диска.

Таким образом, вы можете сделать что-то простое, как:

dd if=/dev/sdX of=/dev/null conv=noerror

И затем, чтобы переписать плохие блоки, просто что-то вроде:

dd if=/dev/zero of=/dev/sdX bs=128k

Если эта команда работает, если вы смелы, вы можете переформатировать свой диск и использовать его снова.

Кроме того, вы можете запустить badblocksкоманду на диске дважды. Второй раз он должен сообщать о плохих блоках ...

badblocks -v -s -w -t random /dev/sdX
badblocks -v -s -w -t random /dev/sdX

Это займет больше времени, но более надежно.

Стоит также отметить, что ни один из методов на самом деле не делает безопасного удаления, кроме hdparmкоманды. Помните все эти плохие блоки? У них все еще есть некоторые ваши исходные данные в основном нетронутыми. Эксперт по восстановлению данных может получить доступ к ним, чтобы увидеть небольшое количество того, что ранее было на вашем жестком диске.

Что касается ddrescue и почему я против этого, у меня есть следующее противоядие:

Проблема в том, что ddrescure будет СЛИШКОМ хорошо игнорировать ошибки. У меня был жесткий диск, который в соответствии с dd снизил скорость записи на отметке около 102 ГБ и начал выдавать ошибки записи на отметке 238 ГБ. Я был весьма впечатлен тем, что ddrescue продолжал перетаскивать диск с постоянной скоростью, даже не сообщая об ошибках. 17 часов спустя, когда это было на 1300 ГБ, когда я случайно заметил, что индикатор диска сам перестал мигать. Быстрая проверка показала, что весь USB-корпус отключился. Я вытащил диск из колыбели. Я заметил, что ddrescue просто радостно сообщил, что все еще копирует без ошибок, даже с диском в моих руках. Я подключил диск к другой машине и обнаружил, что теперь это кирпич.

Я не виню ddcue в том, что сделал диск кирпичом. Диск отказывал и стал кирпичом. Я просто обнаружил, что тревожный ddrescue даже не подсчитывает, сколько ошибок записи он игнорирует. При таком использовании ddrescue заставляет вас думать, что он был полностью успешным, независимо от всех ошибок записи. Дело в том, что он не должен был продолжать движение на полной скорости в секции с замедлением. Причина, по которой раздел был медленным, заключается в том, что многие блоки были перемещены диском, что вызвало большое количество запросов при доступе к этому разделу. Так что это, вероятно, тот момент, когда вывод ddrescue стал вымышленным.

user6856
источник
1
«Чтобы безопасно стереть, вам нужно несколько раз перезаписать один и тот же блок случайными данными». - можете ли вы обосновать свою претензию ссылкой (т.е. рецензируемой статьей, в которой показано восстановление обнуленных данных на современных жестких дисках)? Также прошивка жесткого диска - это черный ящик. Откуда вы знаете, что команда безопасного удаления ATA не просто реализована как запись с нулевого шаблона в каждый сектор?
maxschlepzig
Как раз наоборот. Похоже, что в 2006 году было проведено несколько исследований, которые показали, что множественные записи старой школы больше не требуются для современных накопителей, поскольку современные накопители хранят данные настолько плотно, что одинарная запись столь же эффективна.
user6856 20.09.15
1
dd conv=notrunc

вероятно, добился цели для меня.

Упомянутый

dd conv=noerror

должно быть для ошибок чтения (согласно man-странице). В этом нет ничего плохого.

Моя полная команда обнуления диска выглядела так:

dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/zero of=/dev/sda

Добавление обычая bs=также может потребоваться в некоторых случаях.

imz - Иван Захарящев
источник
1

Быстрый и зрелый метод заключается в использовании sdd.

Если вы просто хотите уничтожить весь контент, позвоните:

sdd -inull bs=1m of=/dev/rdsk/cXdXtXp0 -noerror

Всегда используйте «сырой» интерфейс драйвера диска.

Если вам нравится восстанавливать диск и хранить как можно больше старого содержимого, позвоните:

sdd if=/dev/rdsk/cXdXtXp0 of=/dev/rdsk/cXdXtXp0 bs=1m -noerror

Это заменит все нечитаемые блоки нулями на уровне 512 байт. Вы можете изменить количество повторов с помощьюtry=# , по умолчанию 2.

Обратите внимание, что sddэто быстрее, чемdd в случае ошибок, поскольку он сначала пытается прочитать с предоставленным размером блока, а в случае ошибок он читает с 512 байтами. Если есть ошибки чтения, sdd делает случайные поиски, а фиктивные считывают, чтобы успокоить прошивку накопителя.

Расширенные функции восстановления после ошибок были разработаны в 1980-х годах, когда я работал для второго по величине OEM-производителя Sun-Microsystems.

Исходный код Sdd включен в инструменты schily:

http://sourceforge.net/projects/schilytools/files/

Шили
источник