跳过/缩短损坏磁盘上的分区表读取

跳过/缩短损坏磁盘上的分区表读取

我的硬盘损坏了,其中有许多损坏的块。我的救援ddrescue非常成功(我的成功率为 99.5%)。很遗憾:

  • 由于某种原因,有时但并非总是如此,当ddrescue遇到严重损坏的部分时,磁盘会“变得疯狂”,并且要么只返回磁盘其余部分的读取错误,要么报告未对齐的读取错误并终止;需要重新启动计算机才能再次读取这些部分。
  • 第一个包含分区表的块被破坏,当内核一次又一次地重试读取分区表时,系统启动需要大约一个小时。

有趣的是:我根本不需要读取分区表,我正在执行“整个磁盘”救援。

那么有没有办法告诉内核

  • 不读取分区表或
  • 限制重试次数?

系统启动加速将显着提高恢复速度,因为在此阶段系统启动一个小时,然后继续恢复几分钟,然后由于上述错误之一而重新启动(我已通过启动脚本自动执行此操作)。

dmesg输出:https://cloud.oprendek.sk/index.php/s/Mk8figkaspD8xRE

答案1

我好像以前回答过这个问题,但现在找不到了……

如果您的问题不仅在初始启动期间仍然存在,而且在将有问题的驱动器热插拔到已运行的系统时仍然存在,那么您或多或少运气不好。

在完整的 Linux 安装中,您几乎无法阻止每次连接时扫描驱动器的分区、UUID 和其他元数据。内核检测分区表,udev 创建磁盘/by-uuid 链接,等等。

但是,分区表支持在内核中是可选的(CONFIG_*_PARTITION,是, , , ...*之一)。因此,您可以编译一个不支持任何/禁用所有内核的自定义内核,然后(也防止 UUID 扫描等)将其与仅包含 ddrescue 的最小 initramfs 环境一起使用。MSDOSEFIMAC

这也会禁止您访问任何其他驱动器上的分区,除非您使用losetup偏移量/大小限制或设备映射器 ( dmsetup) 来模拟它。因此,您必须解决整体上缺少分区的问题。

  • 限制重试次数?

不确定它是否会重试,您可以做的是设置超时(在 中/sys/block/*/device/timeouts),我猜这只有在驱动器根本没有响应时才有用。

对于内置的不可移动设备,您还可以使用libata.force=<port.device>:disable内核参数来完全禁用它。

相关内容