我的硬盘损坏了,其中有许多损坏的块。我的救援ddrescue
非常成功(我的成功率为 99.5%)。很遗憾:
- 由于某种原因,有时但并非总是如此,当
ddrescue
遇到严重损坏的部分时,磁盘会“变得疯狂”,并且要么只返回磁盘其余部分的读取错误,要么报告未对齐的读取错误并终止;需要重新启动计算机才能再次读取这些部分。 - 第一个包含分区表的块被破坏,当内核一次又一次地重试读取分区表时,系统启动需要大约一个小时。
有趣的是:我根本不需要读取分区表,我正在执行“整个磁盘”救援。
那么有没有办法告诉内核
- 不读取分区表或
- 限制重试次数?
系统启动加速将显着提高恢复速度,因为在此阶段系统启动一个小时,然后继续恢复几分钟,然后由于上述错误之一而重新启动(我已通过启动脚本自动执行此操作)。
dmesg
输出:https://cloud.oprendek.sk/index.php/s/Mk8figkaspD8xRE
答案1
我好像以前回答过这个问题,但现在找不到了……
如果您的问题不仅在初始启动期间仍然存在,而且在将有问题的驱动器热插拔到已运行的系统时仍然存在,那么您或多或少运气不好。
在完整的 Linux 安装中,您几乎无法阻止每次连接时扫描驱动器的分区、UUID 和其他元数据。内核检测分区表,udev 创建磁盘/by-uuid 链接,等等。
但是,分区表支持在内核中是可选的(CONFIG_*_PARTITION
,是, , , ...*
之一)。因此,您可以编译一个不支持任何/禁用所有内核的自定义内核,然后(也防止 UUID 扫描等)将其与仅包含 ddrescue 的最小 initramfs 环境一起使用。MSDOS
EFI
MAC
这也会禁止您访问任何其他驱动器上的分区,除非您使用losetup
偏移量/大小限制或设备映射器 ( dmsetup
) 来模拟它。因此,您必须解决整体上缺少分区的问题。
- 限制重试次数?
不确定它是否会重试,您可以做的是设置超时(在 中/sys/block/*/device/timeouts
),我猜这只有在驱动器根本没有响应时才有用。
对于内置的不可移动设备,您还可以使用libata.force=<port.device>:disable
内核参数来完全禁用它。