Пропустить/сократить чтение таблицы разделов на сломанном диске

Пропустить/сократить чтение таблицы разделов на сломанном диске

У меня сломанный жесткий диск с множеством поврежденных блоков. Я выполняю восстановление ddrescueдовольно успешно (нахожусь на 99,5%). К сожалению:

  • По какой-то причине, иногда, но не всегда, при ddrescueпопадании на сильно поврежденную часть, диск «сходит с ума» и либо возвращает только ошибки чтения для остальной части диска, либо сообщает об ошибке невыровненного чтения и завершает работу; компьютер необходимо перезапустить, и эти части можно будет считать снова.
  • Первый блок, содержащий таблицу разделов, поврежден, и запуск системы занимает около часа, поскольку ядро ​​снова и снова пытается прочитать таблицу разделов.

Забавно: мне вообще не нужно читать таблицу разделов, я выполняю восстановление «всего диска».

Так есть ли способ, как сообщить ядру

  • не читать таблицу разделов или
  • ограничить количество повторных попыток?

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

dmesgвыход:https://cloud.oprendek.sk/index.php/s/Mk8figkaspD8xRE

решение1

Кажется, я уже отвечал на этот вопрос, но сейчас не могу найти...

Если проблема сохраняется не только во время первоначальной загрузки, но и при «горячем» подключении проблемного диска к уже работающей системе, то вам, по сути, не повезло.

В полной установке Linux вы практически не можете предотвратить сканирование диска на предмет разделов, UUID и других метаданных каждый раз, когда вы его подключаете. Ядро обнаруживает таблицы разделов, udev создает ссылки disk/by-uuid и т. д.

Однако поддержка таблицы разделов является необязательной в ядре ( CONFIG_*_PARTITION, *являясь одним из MSDOS, EFI, MAC, ...). Поэтому вы можете скомпилировать собственное ядро, которое не поддерживает ни одну из них или отключает все из них, а затем (чтобы также предотвратить сканирование UUID и т. п.) использовать его с минимальной средой initramfs, содержащей только ddrescue.

Это также отключает вам доступ к разделам на любом из ваших других дисков, если вы не эмулируете это с помощью losetupи offset / sizelimits, или, в качестве альтернативы, device mapper ( dmsetup). Так что вам придется обойти отсутствие разделов в целом.

  • ограничить количество повторных попыток?

Не уверен, делает ли он какие-либо повторные попытки, но можно установить тайм-ауты (в /sys/block/*/device/timeouts), которые, я полагаю, будут полезны только в том случае, если диск вообще не отвечает.

Для встроенных несъемных устройств вы также можете использовать libata.force=<port.device>:disableпараметр ядра, чтобы полностью отключить их.

Связанный контент