ljw*_*ker 2 raid hard-drive mdadm fault-tolerance
我最近在我的 RAID 阵列中丢失了一个驱动器(并且收到了一封来自系统的电子邮件警告我这件事,这非常好),经过一些驱动器洗牌并换入新驱动器后,我一切都安然无恙。但是一路上,我发现了这个线程,这让我开始思考如何在不实际发生的情况下实际测试磁盘错误和其他坏事。当我运行建议的 tar 命令时:
tar c /my/raid/device/mount/point > /dev/null
Run Code Online (Sandbox Code Playgroud)
它在几秒钟内完成,这显然不足以让系统实际读取所有文件(远远超过 TiB) - 所以我想我的第一个问题是为什么这可能不起作用。如果我做这样的事情:
find . -type f | xargs md5sum
Run Code Online (Sandbox Code Playgroud)
该命令运行得很好,需要很长时间才能完成……但它也会加载 CPU 来完成所有求和。这可能会也可能不会比“tar”更快或更容易 - 我更好奇为什么 tar 命令没有按我预期的那样工作。
无论如何 - 第二个问题,更普遍的是:有没有办法按照这些方式做一些事情来进行故障注入测试:
这似乎是可行的,但我对 linux 工具没有足够详细的知识,这些知识可以让我在设备级别将块标记为坏块,而实际上它不是坏块...
对此有何想法?或者,如果有更优雅的方法来解决这个问题,我也很高兴听到......
小智 5
Linux 中有很多有用的故障注入基础设施。其中之一可能对您的测试工作有所帮助。
本演示文稿的第 7 页显示了使用dmsetup
.
https://mbroz.fedorapeople.org/talks/DeviceMapperBasics/dm.pdf
md(4)本身有一个模式FAULTY
,你可以用它来模拟读/写错误。
故障
FAULTY md 模块用于测试目的。一个有故障的数组只有一个组件设备,并且通常在没有超级块的情况下组装,因此创建的 md 数组提供对组件设备中所有数据的直接访问。
可能会要求 FAULTY 模块模拟故障以允许测试其他 md 级别或文件系统。可以选择故障来触发读请求或写请求,并且可以是暂时的(对该地址的后续读/写可能会成功)或持久的(同一地址的后续读/写将失败)。此外,读取错误可以是“可修复的”,这意味着它们会持续到同一地址的写入请求为止。
可以用句点请求故障类型。在这种情况下,在相关类型的给定数量的请求之后,故障将重复发生。例如,如果持续读取故障的周期为 100,那么每 100 个读取请求都会产生一个故障,并且会记录故障扇区,以便对该扇区的后续读取也将失败。
记住的错误扇区的数量是有限的。用尽此限制后产生的故障被视为瞬态。
可以刷新故障扇区列表,并且可以清除故障模式的活动列表。
控制它的选项列在mdadm(8)下-p, --layout=
。
设置故障级别的故障模式时,选项有:write-transient、wt、read-transient、rt、write-persistent、wp、read-persistent、rp、write-all、read-fixable、rf、clear、flush , 没有任何。
每个故障模式后面都可以跟一个数字,用作故障发生之间的时间段。如果没有编号,则在第一个相关请求时会生成一次故障。有一个数字,那么多次请求后就会产生故障,并且每经过一段时间就会继续产生。
通过使用 --grow 选项设置后续故障模式,可以同时存在多个故障模式。
“clear”或“none”将删除任何未决或周期性故障模式,“flush”将清除任何持续故障。
错误注入linux-raid
下的邮件列表档案中有一些示例,它们也应该可以帮助您开始使用 md 故障注入选项。=)