Клонирование диска без потери информации об ошибках ввода-вывода
Я хочу протестировать программное обеспечение для создания разделов, как 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-накопителе.
ПРЕДУПРЕЖДЕНИЕ. Если вы испортите размер блока, вы испортите все данные после первого не прочитанного блока - вы хотите установить размер блока для устройства, с которого вы копируете.