LVM 可以标记/避免坏块吗?

Tom*_*ale 2 mdadm lvm btrfs

由于btrfs 不跟踪坏块,因此作为解决方法,此 btrfs 邮件列表帖子建议使用底层 mdadm RAID0 配置来支持坏块

为此,可以使用 LVM 代替 mdadm 吗?

Ste*_*itt 6

一般来说,正如这里的评论和您链接到的邮件列表线程中所提到的,现代硬盘驱动器到目前为止已经消失,它们具有不可更换的坏块,应该丢弃。(您已经解释了为什么您对此感兴趣,但对于其他读者来说值得注意。)

我认为 LVM 中没有任何东西可以避免这样的坏块;通常你会在 LVM 下的设备层解决这个问题。处理这个问题的一种方法是使用设备映射器:创建一个表,给出跳过所有坏块所需的扇区映射,并使用它构建一个设备。这样的桌子看起来像

0 98 linear /dev/sda 0
98 98 linear /dev/sda 99
Run Code Online (Sandbox Code Playgroud)

等(这将创建一个 196 扇区的设备,使用/dev/sda但跳过扇区 98)。你把这个给dmsetup

dmsetup create nobbsda --table mytable
Run Code Online (Sandbox Code Playgroud)

然后在生成的/dev/nobbsda设备上创建一个 PV (而不是/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
Run Code Online (Sandbox Code Playgroud)

使用由 给出的坏扇区列表创建设备映射表badblocks留给读者作为练习。

另一种适用于现有 LVM 设置的解决方案是使用pvmove移动物理范围的能力,以便将 LV 移出坏区。但这不会阻止在创建新 LV 或调整现有 LV 大小或移动时重新使用这些区域。

  • @Tom,您还可以保留一堆未分配的扇区,并使用它们使用“dmsetup”手动重新映射扇区(这不会改变其他扇区的偏移量)。 (2认同)