Як ігнорувати помилки запису під час обнулення диска?


19

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

AFAICS, звичайний 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

1
dd conv=noerrorце може бути розширення GNU, я не впевнений. У будь-якому випадку, це повинно зробити трюк. Однак відповідь SATA "підказка до стирання" варто вивчити, щоб стерти цілі накопичувачі.
Пітер Кордес

1
@PeterCordes, головна сторінка ddдокументів GNU noerrorяк "продовжуватись після помилок читання" ...
maxschlepzig

1
dd conv=noerrorist POSIX стандарт, але це може бути дуже повільно
Schily

2
dd conv=noerrorмає бути помилками читання (відповідно до сторінки сторінки), а не помилками в записі. Немає нічого поганого в його поєднанні conv=notrunc, що зробило трюк з ігноруванням помилок написання для мене. unix.stackexchange.com/a/229379/4319
imz - Іван Захарящев

Проста операція запису на жорсткий диск, наприклад, використання dd if=/dev/zero of=/dev/sdX, не проводить жодного зчитування диска. Чому ви вважаєте, що команда dd "недостатня" ? Які «помилки» у вас виникають?
тирса

Відповіді:


12

Для цього я віддаю перевагу badblocksв руйнівному режимі запису. Він пише, він продовжує робити це, коли виявляє помилки, і, нарешті, він повідомляє вам, де були ці помилки, і ця інформація може допомогти вам вирішити, що робити далі (Blend?).

# 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це використовувати значно більший розмір блоків.

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


1
Якщо я використовую -t randomабо -t 0- чи не блокоблоки, то проходить лише один запис? Переглядаючи сторінку чоловіка - здається, що без -tнеї не проходить 4 проходи (для '0xaa, 0x55, 0xff, 0x00').
maxschlepzig

2
Він робить один прохід для кожного, який -tви надаєте в командному рядку. За замовчуванням, як ви говорите, 4 проходи.
frostschutz

13

Якщо диск не підключений через USB, розгляньте можливість використання hdparm(версія> 9.31) для ATA Secure Erase диска. Ця команда змушує прошивку диска стерти вміст диска, включаючи погані блоки.

Попередження: Використовуйте правильну літеру диска - я показав /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

Більше інформації про цю процедуру можна отримати тут .


Це може працювати через USB, якщо вам пощастить, і ваш USB <-> SATA міст може пройти через нестандартні команди SATA (а драйвер Linux + hdparm знають, як це зробити на цій моделі). Також для написання прикладів /dev/sdXце добре, тому що тоді, якщо хтось пропустить його при вставці та налаштуванні, проблем не виникне.
Пітер Кордес

@Peter Cordes - Якщо у вас 24 диски ... Ні, нерозумно мені! Дякую, я змінив його на sdX, що навчить мене поспішати на відповідь!
garethTheRed

2
На пов’язаній сторінці перераховано стільки застережень, пов’язаних із апаратним та програмним забезпеченням, за допомогою цього методу ... страшно
maxschlepzig

Це дійсно показує досить багато застережень! Все, що я можу сказати, - це працювало на мене без особливих проблем.
garethTheRed

2

Тут я бачу чотири працездатні відповіді:

  1. hdparmМетод відправлений garethTheRed , ймовірно , краще за все, якщо ви підключені безпосередньо до комп'ютера. Мабуть, однак, якщо ви спробуєте це з'єднати через USB, ви можете цеглити свій диск. Якщо ви робите це на приводі, яким ви збираєтесь утилізувати, то це може бути хорошою справою. Однак, ймовірно, ви хочете захистити стирання перед відкиданням.

  2. Техніка, про яку повідомляє imz - Іван Захарящев, буде працювати, але може бути дуже повільною. Я б запропонував, якщо ви не хочете, щоб дані могли бути відновлені, використовуйте /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 із задоволенням повідомив, що вона все ще копіюється без помилок, навіть з диском в руках. Я підключив диск до іншої машини і виявив, що це зараз цегла.

Я не звинувачую ddrescue у тому, що він зробив цеглу. Привід вийшов з ладу і став би цеглою. Мені просто здається, що тривожна ddrescue не дає навіть підрахунку помилок, скільки ігнорує помилки, які вона ігнорує. У цьому використанні ddrescue залишає, що ви думаєте, що він був успішним, незалежно від усіх помилок запису. Справа в тому, що він не повинен був мати можливість продовжувати на повній швидкості в секції з уповільненням. Причиною того, що розділ був повільним, є те, що багато блоків було переміщено накопичувачем, що викликало багато запитів під час доступу до цього розділу. Тож це, мабуть, момент, коли вихід ddrescue став вигаданим.


1
"Для надійного видалення вам потрібно перезаписати один і той же блок кілька разів випадковими даними." - чи можете ви обґрунтувати свою претензію посиланням (тобто рецензованою статтею, яка показує відновлення даних з нуля на сучасних жорстких дисках)? Також прошивка жорсткого диска - це чорна скринька. Звідки ви знаєте, що команда ATA Safe delete не просто реалізована як запис-нуль-шаблон для кожного сектора?
maxschlepzig

Просто навпаки. Схоже, у 2006 році було проведено ряд досліджень, які показали, що багаторазові записи старих шкіл більше не потрібні для сучасних накопичувачів, оскільки сучасні накопичувачі зберігають дані настільки щільно, що одна запис є настільки ж ефективною.
user6856

1
dd conv=notrunc

напевно, зробив для мене трюк.

Згадане

dd conv=noerror

має бути помилками читання (відповідно до сторінки сторінки). Немає нічого поганого в поєднанні двох.

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

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

Додавання спеціального користувача bs=також може бути потрібним для певного випадку.


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/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.