Клонирование диска без потери информации об ошибках ввода-вывода

Я хочу протестировать программное обеспечение для создания разделов, как parted,

Я нашел старую флешку, которая вылетает из программы всякий раз, когда я пытаюсь ее прочитать. Чтобы сохранить этот тестовый пример, мне нужно как можно точнее скопировать USB-накопитель, сохранив ошибки ввода-вывода.

Я знаю, что, возможно, невозможно заставить мой HDD выдавать ошибку ввода-вывода при чтении некоторых байтов этого файла, но, возможно, это может быть эмулировано какой-то программой, которая имеет жестко запрограммированное содержимое всей флешки и запоминает, когда выдать ошибку ввода-вывода?

Я использую Arch Linux и предпочел бы решение, которое может быть адаптировано к нему (возможно, через какую-то виртуальную машину или эмулятор машины).

2 ответа

Решение

Для копирования используйте ddrescue, safecopy, или же dd_rescue, Все они ведут журнал неудачных областей, а также автоматически повторяют попытки, пока не смогут получить данные.

Общее использование:

  • ddrescue: (не путайте со старым dd_rescue)

    ddrescue /dev/sdc3 sdc3.img sdc3.map
    

    Если хотите, повторите с --retrim или `--try-again:

    ddrescue --try-again /dev/sdc3 sdc3.img sdc3.map
    

    Не забудьте указать файл карты для записи плохих областей.

  • safecopy:

    safecopy --stage1 /dev/sdc3 sdc3.img
    safecopy --stage2 /dev/sdc3 sdc3.img
    safecopy --stage3 /dev/sdc3 sdc3.img
    

    После этапа 3 у вас будет stage3.badblocks файл со списком отдельных плохих секторов.

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

    mv stage3.badblocks stage2.badblocks
    safecopy --stage3 /dev/sdc3 sdc3.img
    
  • dd_rescue: (не путать с более способным ddrescue)

    dd_rescue -o sdc3.badblocks /dev/sd3 sdc3.img
    

    (Я не знаю, поддерживает ли этот инструмент возобновление / повтор со вторым вызовом, но, по крайней мере, он выводит журнал badblocks.)

Эти программы делают упор на том, чтобы как можно быстрее выводить как можно больше данных, и обеспечивают медленное восстановление для дальнейшего использования. Поэтому не удивляйтесь, если "этап 1" пропустит целые мегабайты только из-за одного плохого блока - он вернется к этому на этапе 2.

Для эмуляции плохого диска возьмите только что полученный журнал badblocks и примените его к этому сообщению:

использование dmsetup создать устройство с поддержкой цели "ошибка". Это будет отображаться в /dev/mapper/<name>,

На странице 7 презентации Device mapper (PDF) есть именно то, что вы ищете:

dmsetup create bad_disk << EOF
  0 8       linear /dev/sdb1 0
  8 1       error
  9 204791 linear /dev/sdb1 9
EOF

Или пропустите sdb1 разделяет и ставит цель "ошибка" в качестве устройства для блоков 0 - 8 (вместо sdb1) сделать диск с чистой ошибкой.

См. Также приложение Device Mapper из "Администрирование менеджера логических томов RHEL 5".

- Питер Кордес, https://stackoverflow.com/questions/1870696/simulate-a-faulty-block-device-with-read-errors

(Преобразование журнала поврежденных блоков или файла карты ddrescue в синтаксис таблицы dmsetup оставлено читателю в качестве упражнения...)

При обнаружении ошибок dd можно продолжить, просто он будет писать нули в местах, которые он не может прочитать с исходного диска...

dd bs=<blocksize here> conv=sync,noerror if=/dev/sdc123 of=/home/me/testFile

Вы также можете попробовать использовать ddrescue, чтобы попытаться восстановить данные, однако я не уверен, насколько хорошо они будут работать на USB-накопителе.

ПРЕДУПРЕЖДЕНИЕ. Если вы испортите размер блока, вы испортите все данные после первого не прочитанного блока - вы хотите установить размер блока для устройства, с которого вы копируете.

Другие вопросы по тегам