由于作为btrfs 不跟踪坏块,作为解决方法这个 btrfs 邮件列表帖子建议使用底层 mdadm RAID0 配置来支持坏块。
可以使用 LVM 代替 mdadm 来实现此目的吗?
答案1
一般来说,正如在一篇文章中提到的评论在这里以及您链接到的邮件列表线程中,现代硬盘驱动器到目前为止已经消失,它们已经具有不可替换的坏块,应该被丢弃。 (您已经解释了为什么您对此感兴趣,但其他读者值得注意。)
我不认为 LVM 中有任何东西可以避免坏块;通常您会在 LVM 下面的设备层解决这个问题。处理该问题的一种方法是使用设备映射器:创建一个表,给出跳过所有坏块所需的扇区映射,并使用该表构建设备。这样的表看起来像
0 98 linear /dev/sda 0
98 98 linear /dev/sda 99
等等(这将创建一个 196 扇区的设备,使用/dev/sda
但跳过 98 扇区)。你把这个给dmsetup
:
dmsetup create nobbsda --table mytable
然后在生成的设备上创建 PV /dev/nobbsda
(而不是/dev/sda
)。
使用这种方法,通过一些前瞻性规划,您甚至可以处理将来出现故障的扇区,就像驱动器固件一样:在驱动器末尾保留一些空闲扇区(或者如果您愿意,甚至可以在驱动器周围点缀)分散风险),然后用它们来填补失败扇区留下的漏洞。使用上面的例子,如果我们认为从 200 开始的扇区是备用扇区,那么扇区 57 就会变成坏扇区:
0 57 linear /dev/sda 0
57 1 linear /dev/sda 200
58 40 linear /dev/sda 58
98 98 linear /dev/sda 99
使用由 给出的坏扇区列表创建设备映射器表badblocks
作为读者的练习。
另一种适用于现有 LVM 设置的解决方案是使用pvmove
移动物理范围以便将 LV 移出坏区域的能力。但这并不能阻止每当创建新 LV 或调整现有 LV 大小或移动时重新使用这些区域。