Chaos Mesh® 技术内幕 | 如何注入 I/O 故障?

本文介绍了Chaos Mesh运行时注入文件系统错误的实现方式。此前使用IOChaos有性能开销大等问题,Chaos Mesh 1.0提供了运行时注入功能。文章阐述了错误注入方式,包括侵入命名空间、动态替换fd等,还提及了实现中遇到的细枝末节问题及解决办法。

在生产环境中,时常会因为磁盘故障、误操作等原因出现文件系统的错误。Chaos Mesh 很早就提供了注入文件系统错误的能力。用户只需要添加一个 IOChaos 资源,就能够让对指定文件的文件系统操作失败或返回错误的数据。在 Chaos Mesh 1.0 之前,使用 IOChaos 需要对 Pod 注入 sidecar 容器,并且需要改写启动命令;哪怕没有注入错误,被注入 sidecar 的容器也总是有较大的性能开销。随着 Chaos Mesh 1.0 的发布,提供了运行时注入文件系统错误的功能,使得 IOChaos 的使用和其他所有类型的 Chaos 一样简单方便。这篇文章将会介绍它的实现方式。

前置

本文的内容假定你已经掌握以下知识。当然,你不必在此时就去阅读;但当遇到没见过的名词的时可以回过头来搜索学习。

我会尽我所能提供相关的学习资料,但我不会将它们提炼和复述,一是因为这些知识通过简单的 Google 就能学到;二是因为大部分时候学习一手的知识效果远比二手要好,学习 n 手的知识效果远比(n+1)手的要好。

  1. FUSE. Wikipedia, man(4)

  2. mount_namespaces. man, k8s Mount propagation

  3. x86 assembly language. Wikipedia

  4. mount. man(2) 特别是 MS_MOVE

  5. Mutating admission webhooks. k8s Document

  6. syscall. man(2) 注意浏览一下调用约定

  7. ptrace. man(2)

  8. Device node, char devices Device names, device nodes, and major/minor numbers

阅读与 TimeChaos 相关的 文章 对理解本文也有很大的帮助,因为它们使用着相似的技术。

此外,我希望在阅读这份文档时,读者能够主动地思考每一步的原因和效果。这之中没有复杂的需要头脑高速运转的知识,只有一步一步的(给计算机的)行动指南。也希望你能够在大脑里不断地构思“如果我自己要实现运行时文件系统注入,应该怎样做?”,这样这篇文章就从单纯的灌输变为了见解的交流,会有趣很多。

错误注入

寻找错误注入方式的一个普遍方法就是先观察未注入时的调用路径:我们在 TimeChaos 的实现过程当中,通过观察应用程序获取时间的方式,了解到大部分程序会通过 vDSO 访问时间,从而选取了修改目标程序 vDSO 部分内存来修改时间的方式。

那么在应用程序发起 read, write 等系统调用,到这些请求到达目标文件系统,这之间是否存在可供注入的突破口呢?事实上是存在的,你可以使用 bp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值